mirror of
https://github.com/HangarMC/Hangar.git
synced 2025-01-30 14:30:08 +08:00
bunch of shit, load bunch of data from java instead of hardcoding it, finish create project
This commit is contained in:
parent
9953c75e87
commit
274d565b03
@ -1,5 +1,7 @@
|
||||
[#ftl]
|
||||
[#-- @implicitly included --]
|
||||
[#-- @ftlvariable name="routes" type="me.minidigger.hangar.util.RouteHelper" --]
|
||||
[#-- @ftlvariable name="templateHelper" type="me.minidigger.hangar.util.TemplateHelper" --]
|
||||
[#-- @ftlvariable name="modelData" type="me.minidigger.hangar.model.ModelData" --]
|
||||
[#-- @ftlvariable name="rc" type="org.springframework.web.servlet.support.RequestContext" --]
|
||||
[#-- @ftlvariable name="user" type="me.minidigger.hangar.model.User" --]
|
||||
|
@ -6,21 +6,32 @@ import freemarker.template.Configuration;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import me.minidigger.hangar.model.ModelData;
|
||||
import me.minidigger.hangar.service.UserService;
|
||||
import me.minidigger.hangar.util.RouteHelper;
|
||||
import me.minidigger.hangar.util.TemplateHelper;
|
||||
|
||||
public abstract class HangarController {
|
||||
|
||||
@Autowired
|
||||
private RouteHelper routeHelper;
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
@Autowired
|
||||
private TemplateHelper templateHelper;
|
||||
|
||||
protected ModelAndView fillModel(ModelAndView mav) {
|
||||
mav.addObject("modelData", new ModelData());
|
||||
// helpers
|
||||
mav.addObject("routes", routeHelper);
|
||||
mav.addObject("templateHelper", templateHelper);
|
||||
BeansWrapperBuilder builder = new BeansWrapperBuilder(Configuration.VERSION_2_3_30);
|
||||
builder.setExposeFields(true);
|
||||
builder.setUseModelCache(true);
|
||||
mav.addObject("@helper", builder.build().getStaticModels());
|
||||
|
||||
// user data
|
||||
mav.addObject("user", userService.getCurrentUser());
|
||||
mav.addObject("modelData", userService.getModelData());
|
||||
|
||||
return mav;
|
||||
}
|
||||
}
|
||||
|
@ -8,11 +8,21 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.servlet.ModelAndView;
|
||||
|
||||
import me.minidigger.hangar.controller.HangarController;
|
||||
import me.minidigger.hangar.model.Permission;
|
||||
import me.minidigger.hangar.service.OrgService;
|
||||
import me.minidigger.hangar.service.UserService;
|
||||
|
||||
@Controller
|
||||
public class ProjectsController extends HangarController {
|
||||
|
||||
private final UserService userService;
|
||||
private final OrgService orgService;
|
||||
|
||||
public ProjectsController(UserService userService, OrgService orgService) {
|
||||
this.userService = userService;
|
||||
this.orgService = orgService;
|
||||
}
|
||||
|
||||
@PostMapping("/")
|
||||
public Object createProject() {
|
||||
return null; // TODO implement createProject request controller
|
||||
@ -30,7 +40,9 @@ public class ProjectsController extends HangarController {
|
||||
|
||||
@RequestMapping("/new")
|
||||
public Object showCreator() {
|
||||
return fillModel(new ModelAndView("projects/create"));
|
||||
ModelAndView mav = new ModelAndView("projects/create");
|
||||
mav.addObject("createProjectOrgas", orgService.getOrgsWithPerm(userService.getCurrentUser(), Permission.CreateProject));
|
||||
return fillModel(mav);
|
||||
}
|
||||
|
||||
@RequestMapping("/{author}/{slug}")
|
||||
|
@ -13,8 +13,8 @@ import me.minidigger.hangar.controller.HangarController;
|
||||
public class UsersController extends HangarController {
|
||||
|
||||
@RequestMapping("/authors")
|
||||
public Object showAuthors(@RequestParam Object sort, @RequestParam Object page) {
|
||||
return null; // TODO implement showAuthors request controller
|
||||
public ModelAndView showAuthors(@RequestParam(required = false) Object sort, @RequestParam(required = false) Object page) {
|
||||
return fillModel(new ModelAndView("users/authors")); // TODO implement showAuthors request controller
|
||||
}
|
||||
|
||||
@RequestMapping("/login")
|
||||
|
@ -7,48 +7,50 @@ import com.fasterxml.jackson.annotation.JsonValue;
|
||||
* Gets or Sets NamedPermission
|
||||
*/
|
||||
public enum NamedPermission {
|
||||
VIEW_PUBLIC_INFO("view_public_info", Permission.ViewPublicInfo),
|
||||
EDIT_OWN_USER_SETTINGS("edit_own_user_settings", Permission.EditOwnUserSettings),
|
||||
EDIT_API_KEYS("edit_api_keys", Permission.EditApiKeys),
|
||||
VIEW_PUBLIC_INFO("view_public_info", Permission.ViewPublicInfo, "ViewPublicInfo"),
|
||||
EDIT_OWN_USER_SETTINGS("edit_own_user_settings", Permission.EditOwnUserSettings, "EditOwnUserSettings"),
|
||||
EDIT_API_KEYS("edit_api_keys", Permission.EditApiKeys, "EditApiKeys"),
|
||||
|
||||
EDIT_SUBJECT_SETTINGS("edit_subject_settings", Permission.EditSubjectSettings),
|
||||
MANAGE_SUBJECT_MEMBERS("manage_subject_members", Permission.ManageSubjectMembers),
|
||||
IS_SUBJECT_OWNER("is_subject_owner", Permission.IsSubjectOwner),
|
||||
IS_SUBJECT_MEMBER("is_subject_member", Permission.IsSubjectMember),
|
||||
EDIT_SUBJECT_SETTINGS("edit_subject_settings", Permission.EditSubjectSettings, "EditSubjectSettings"),
|
||||
MANAGE_SUBJECT_MEMBERS("manage_subject_members", Permission.ManageSubjectMembers, "ManageSubjectMembers"),
|
||||
IS_SUBJECT_OWNER("is_subject_owner", Permission.IsSubjectOwner, "IsSubjectOwner"),
|
||||
IS_SUBJECT_MEMBER("is_subject_member", Permission.IsSubjectMember, "IsSubjectMember"),
|
||||
|
||||
CREATE_PROJECT("create_project", Permission.CreateProject),
|
||||
EDIT_PAGE("edit_page", Permission.EditPage),
|
||||
DELETE_PROJECT("delete_project", Permission.DeleteProject),
|
||||
CREATE_PROJECT("create_project", Permission.CreateProject, "CreateProject"),
|
||||
EDIT_PAGE("edit_page", Permission.EditPage, "EditPage"),
|
||||
DELETE_PROJECT("delete_project", Permission.DeleteProject, "DeleteProject"),
|
||||
|
||||
CREATE_VERSION("create_version", Permission.CreateVersion),
|
||||
EDIT_VERSION("edit_version", Permission.EditVersion),
|
||||
DELETE_VERSION("delete_version", Permission.DeleteVersion),
|
||||
EDIT_TAGS("edit_tags", Permission.EditTags),
|
||||
CREATE_VERSION("create_version", Permission.CreateVersion, "CreateVersion"),
|
||||
EDIT_VERSION("edit_version", Permission.EditVersion, "EditVersion"),
|
||||
DELETE_VERSION("delete_version", Permission.DeleteVersion, "DeleteVersion"),
|
||||
EDIT_TAGS("edit_tags", Permission.EditTags, "EditTags"),
|
||||
|
||||
CREATE_ORGANIZATION("create_organization", Permission.CreateOrganization),
|
||||
POST_AS_ORGANIZATION("post_as_organization", Permission.PostAsOrganization),
|
||||
CREATE_ORGANIZATION("create_organization", Permission.CreateOrganization, "CreateOrganization"),
|
||||
POST_AS_ORGANIZATION("post_as_organization", Permission.PostAsOrganization, "PostAsOrganization"),
|
||||
|
||||
MOD_NOTES_AND_FLAGS("mod_notes_and_flags", Permission.ModNotesAndFlags),
|
||||
SEE_HIDDEN("see_hidden", Permission.SeeHidden),
|
||||
IS_STAFF("is_staff", Permission.IsStaff),
|
||||
REVIEWER("reviewer", Permission.Reviewer),
|
||||
MOD_NOTES_AND_FLAGS("mod_notes_and_flags", Permission.ModNotesAndFlags, "ModNotesAndFlags"),
|
||||
SEE_HIDDEN("see_hidden", Permission.SeeHidden, "SeeHidden"),
|
||||
IS_STAFF("is_staff", Permission.IsStaff, "IsStaff"),
|
||||
REVIEWER("reviewer", Permission.Reviewer, "Reviewer"),
|
||||
|
||||
VIEW_HEALTH("view_health", Permission.ViewHealth),
|
||||
VIEW_IP("view_ip", Permission.ViewIp),
|
||||
VIEW_STATS("view_stats", Permission.ViewStats),
|
||||
VIEW_LOGS("view_logs", Permission.ViewLogs),
|
||||
VIEW_HEALTH("view_health", Permission.ViewHealth, "ViewHealth"),
|
||||
VIEW_IP("view_ip", Permission.ViewIp, "ViewIp"),
|
||||
VIEW_STATS("view_stats", Permission.ViewStats, "ViewStats"),
|
||||
VIEW_LOGS("view_logs", Permission.ViewLogs, "ViewLogs"),
|
||||
|
||||
MANUAL_VALUE_CHANGES("manual_value_changes", Permission.ManualValueChanges),
|
||||
HARD_DELETE_PROJECT("hard_delete_project", Permission.HardDeleteProject),
|
||||
HARD_DELETE_VERSION("hard_delete_version", Permission.HardDeleteVersion),
|
||||
EDIT_ALL_USER_SETTINGS("edit_all_user_settings", Permission.EditAllUserSettings);
|
||||
MANUAL_VALUE_CHANGES("manual_value_changes", Permission.ManualValueChanges, "ManualValueChanges"),
|
||||
HARD_DELETE_PROJECT("hard_delete_project", Permission.HardDeleteProject, "HardDeleteProject"),
|
||||
HARD_DELETE_VERSION("hard_delete_version", Permission.HardDeleteVersion, "HardDeleteVersion"),
|
||||
EDIT_ALL_USER_SETTINGS("edit_all_user_settings", Permission.EditAllUserSettings, "EditAllUserSettings");
|
||||
|
||||
private final String value;
|
||||
private final Permission permission;
|
||||
private final String frontendName;
|
||||
|
||||
NamedPermission(String value, Permission permission) {
|
||||
NamedPermission(String value, Permission permission, String frontendName) {
|
||||
this.value = value;
|
||||
this.permission = permission;
|
||||
this.frontendName = frontendName;
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -60,7 +62,16 @@ public enum NamedPermission {
|
||||
@JsonCreator
|
||||
public static NamedPermission fromValue(String text) {
|
||||
for (NamedPermission b : NamedPermission.values()) {
|
||||
if (String.valueOf(b.value).equals(text)) {
|
||||
if (b.value.equals(text)) {
|
||||
return b;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static NamedPermission fromFrontendName(String text) {
|
||||
for (NamedPermission b : NamedPermission.values()) {
|
||||
if (b.frontendName.equals(text)) {
|
||||
return b;
|
||||
}
|
||||
}
|
||||
|
48
src/main/java/me/minidigger/hangar/model/Organization.java
Normal file
48
src/main/java/me/minidigger/hangar/model/Organization.java
Normal file
@ -0,0 +1,48 @@
|
||||
package me.minidigger.hangar.model;
|
||||
|
||||
public class Organization {
|
||||
|
||||
private int id;
|
||||
private int userId;
|
||||
private String name;
|
||||
private int ownerId;
|
||||
|
||||
public Organization(int id, int userId, String name, int ownerId) {
|
||||
this.id = id;
|
||||
this.userId = userId;
|
||||
this.name = name;
|
||||
this.ownerId = ownerId;
|
||||
}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public int getUserId() {
|
||||
return userId;
|
||||
}
|
||||
|
||||
public void setUserId(int userId) {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getOwnerId() {
|
||||
return ownerId;
|
||||
}
|
||||
|
||||
public void setOwnerId(int ownerId) {
|
||||
this.ownerId = ownerId;
|
||||
}
|
||||
}
|
@ -39,6 +39,25 @@ public class User {
|
||||
return this;
|
||||
}
|
||||
|
||||
private String avatarUrl;
|
||||
private String id;
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getAvatarUrl() {
|
||||
return avatarUrl;
|
||||
}
|
||||
|
||||
public void setAvatarUrl(String avatarUrl) {
|
||||
this.avatarUrl = avatarUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get createdAt
|
||||
*
|
||||
@ -56,11 +75,6 @@ public class User {
|
||||
this.createdAt = createdAt;
|
||||
}
|
||||
|
||||
public User name(String name) {
|
||||
this.name = name;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get name
|
||||
*
|
||||
|
17
src/main/java/me/minidigger/hangar/service/OrgService.java
Normal file
17
src/main/java/me/minidigger/hangar/service/OrgService.java
Normal file
@ -0,0 +1,17 @@
|
||||
package me.minidigger.hangar.service;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import me.minidigger.hangar.model.Organization;
|
||||
import me.minidigger.hangar.model.Permission;
|
||||
import me.minidigger.hangar.model.User;
|
||||
|
||||
@Service
|
||||
public class OrgService {
|
||||
|
||||
public List<Organization> getOrgsWithPerm(User user, Permission permission) {
|
||||
return List.of(new Organization(-1, -1, "TestOrg", -1));
|
||||
}
|
||||
}
|
24
src/main/java/me/minidigger/hangar/service/UserService.java
Normal file
24
src/main/java/me/minidigger/hangar/service/UserService.java
Normal file
@ -0,0 +1,24 @@
|
||||
package me.minidigger.hangar.service;
|
||||
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import me.minidigger.hangar.model.ModelData;
|
||||
import me.minidigger.hangar.model.User;
|
||||
|
||||
@Service
|
||||
public class UserService {
|
||||
|
||||
public User getCurrentUser() {
|
||||
User user = new User();
|
||||
user.setName("Test");
|
||||
user.setAvatarUrl("https://paper.readthedocs.io/en/latest/_images/papermc_logomark_500.png");
|
||||
user.setId("dummyid");
|
||||
return user;
|
||||
}
|
||||
|
||||
public ModelData getModelData() {
|
||||
ModelData modelData = new ModelData();
|
||||
|
||||
return modelData;
|
||||
}
|
||||
}
|
14
src/main/java/me/minidigger/hangar/util/TemplateHelper.java
Normal file
14
src/main/java/me/minidigger/hangar/util/TemplateHelper.java
Normal file
@ -0,0 +1,14 @@
|
||||
package me.minidigger.hangar.util;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
@Component
|
||||
public class TemplateHelper {
|
||||
|
||||
public Map<String, String> randomSponsor() {
|
||||
// TODO implement random sponsor stuff
|
||||
return Map.of("link", "https://minidigger.me", "image", "https://avatars2.githubusercontent.com/u/2185527?s=400&v=4");
|
||||
}
|
||||
}
|
@ -38,8 +38,7 @@
|
||||
</@form.form>
|
||||
|
||||
<#import "*/users/invite/form.ftlh" as userForm>
|
||||
<#-- <@userForm.form owner=request.headerData.currentUser roleCategory=RoleCategory.Organization />-->
|
||||
<@userForm.form owner="" roleCategory="" />
|
||||
<@userForm.form owner=user roleCategory=@helper["me.minidigger.hangar.model.PermissionType"].ORGANIZATION />
|
||||
|
||||
<button title="Continue" type="submit" name="create" form="form-continue"
|
||||
value="<@spring.message "general.continue" />"
|
||||
|
@ -1,5 +1,5 @@
|
||||
<#--
|
||||
The main entry point of Ore. This page displays a list of Projects that can be
|
||||
The main entry point of Hangar. This page displays a list of Projects that can be
|
||||
sorted according to different criteria.
|
||||
-->
|
||||
|
||||
@ -7,15 +7,6 @@ sorted according to different criteria.
|
||||
<#import "*/utils/hangar.ftlh" as hangar />
|
||||
<#import "*/layout/base.ftlh" as base>
|
||||
|
||||
<#function randomSponsor>
|
||||
val logos = config.sponge.sponsors
|
||||
|
||||
val index = new Random().nextInt(logos.size)
|
||||
logos(index)
|
||||
<#-- todo implement random sponsor stuff -->
|
||||
<#return { "link": "https://minidigger.me", "image": "https://avatars2.githubusercontent.com/u/2185527?s=400&v=4"}>
|
||||
</#function>
|
||||
|
||||
<#macro scripts>
|
||||
<script src="<@hangar.url "build/home.js" />"></script>
|
||||
</#macro>
|
||||
@ -37,7 +28,7 @@ sorted according to different criteria.
|
||||
<#assign stylesheetsVar><@stylesheets /></#assign>
|
||||
<#assign metaVar><@meta /></#assign>
|
||||
<@base.base title="${message}" additionalScripts=scriptsVar additionalMeta=metaVar additionalStyling=stylesheetsVar>
|
||||
<!-- Header -->
|
||||
<#-- Header -->
|
||||
<div class="index-header">
|
||||
<div class="row centered-content-row">
|
||||
<div class="col-md-9 ore-banner">
|
||||
@ -55,7 +46,7 @@ sorted according to different criteria.
|
||||
<div class="panel sponsor-panel">
|
||||
<span>Sponsored by</span>
|
||||
<div class="panel-body">
|
||||
<#assign sponsor=randomSponsor() />
|
||||
<#assign sponsor=templateHelper.randomSponsor() />
|
||||
<a href="${sponsor.link}">
|
||||
<img class="logo" src="${sponsor.image}" alt="Sponsor" />
|
||||
</a>
|
||||
|
@ -46,7 +46,7 @@
|
||||
<#-- Right navbar -->
|
||||
<#if authEnabled>
|
||||
<ul class="nav navbar-nav navbar-collapse collapse navbar-right">
|
||||
<#assign cu={ "name": "DumDum", "avatarUrl": "https://paper.readthedocs.io/en/latest/_images/papermc_logomark_500.png"}> <#-- todo login status -->
|
||||
<#assign cu=user>
|
||||
<#if cu??>
|
||||
<li class="dropdown nav-icon new-controls">
|
||||
<a href="#" class="drop-down-toggle" data-toggle="dropdown">
|
||||
|
@ -3,19 +3,7 @@
|
||||
<#import "*/layout/base.ftlh" as base />
|
||||
|
||||
<#--
|
||||
@*
|
||||
Page used for uploading and creating new projects.
|
||||
*@
|
||||
@import play.twirl.api.Html
|
||||
|
||||
@import controllers.sugar.Requests.OreRequest
|
||||
@import ore.OreConfig
|
||||
@import ore.data.project.Category
|
||||
@import ore.db.Model
|
||||
@import ore.models.organization.Organization
|
||||
@import ore.models.user.User
|
||||
@import views.html.helper.{CSRF, form}
|
||||
@(createProjectOrgas: Seq[Model[Organization]], user: Model[User])(implicit messages: Messages, flash: Flash, request: OreRequest[_], config: OreConfig, assetsFinder: AssetsFinder)
|
||||
-->
|
||||
<#assign scriptsVar>
|
||||
<script type="text/javascript" src="<@hangar.url "javascripts/projectCreateValidate.js" />"></script>
|
||||
@ -73,9 +61,9 @@ Page used for uploading and creating new projects.
|
||||
<div class="form-group">
|
||||
<label for="projectCategory"><@spring.message "project.owner" /></label>
|
||||
<select id="projectCategory" name="owner" class="form-control">
|
||||
<option value="${user.id.value}">${user.name}</option>
|
||||
<option value="${user.id}">${user.name}</option>
|
||||
<#list createProjectOrgas as orga>
|
||||
<option value="${orga.id.value}">${orga.name}</option>
|
||||
<option value="${orga.id}">${orga.name}</option>
|
||||
</#list>
|
||||
</select>
|
||||
</div>
|
||||
|
@ -2,6 +2,7 @@
|
||||
<#import "*/utils/hangar.ftlh" as hangar />
|
||||
<#import "*/layout/base.ftlh" as base />
|
||||
|
||||
<#--
|
||||
@import java.time.OffsetDateTime
|
||||
|
||||
@import controllers.sugar.Requests.OreRequest
|
||||
@ -17,6 +18,7 @@
|
||||
|
||||
@pageSize = @{ config.ore.users.authorPageSize }
|
||||
@direction = @{ if (ordering.startsWith("-")) "chevron-down" else "chevron-up" }
|
||||
-->
|
||||
|
||||
<#function isActiveSort td>
|
||||
var sort = ordering
|
||||
|
@ -14,15 +14,14 @@
|
||||
|
||||
<#macro form owner roleCategory loadedUsers=[]>
|
||||
|
||||
<!-- Template row -->
|
||||
<#import "*/utils/userAvatar.ftlh" as userAvatar>
|
||||
<#-- Template row -->
|
||||
<table style="display: none;">
|
||||
<tbody>
|
||||
<tr id="result-row">
|
||||
<td>
|
||||
<input type="hidden"/>
|
||||
<#import "*/utils/userAvatar.ftlh" as userAvatar>
|
||||
<@userAvatar.userAvatar clazz = "user-avatar-xs"/>
|
||||
<#-- @userAvatar(None, clazz = "user-avatar-xs")-->
|
||||
<i class="fas fa-times user-cancel"></i>
|
||||
<a class="username" target="_blank" rel="noopener" href=""></a>
|
||||
<span>@users.invite.roleSelect(roleCategory)</span>
|
||||
@ -31,7 +30,7 @@
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- User not found alert (hidden) -->
|
||||
<#-- User not found alert (hidden) -->
|
||||
<div class="alert alert-danger alert-dismissible" role="alert" style="display: none;">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
@ -42,10 +41,10 @@
|
||||
<div class="member-table-container">
|
||||
<table class="table table-members">
|
||||
<tbody>
|
||||
<!-- Owner (not submitted) -->
|
||||
<#-- Owner (not submitted) -->
|
||||
<tr>
|
||||
<td>
|
||||
@userAvatar(Some(owner.name), owner.avatarUrl, clazz = "user-avatar-xs")
|
||||
<@userAvatar.userAvatar userName=owner.name avatarUrl=owner.avatarUrl clazz="user-avatar-xs" />
|
||||
<strong>${owner.name}</strong>
|
||||
<span><i class="minor"><@spring.message "project.owner" /></i></span>
|
||||
</td>
|
||||
@ -55,7 +54,7 @@
|
||||
<tr>
|
||||
<td>
|
||||
<input form="form-continue" type="hidden" value="${user.id}" />
|
||||
@userAvatar(Some(user.name), user.avatarUrl, clazz = "user-avatar-xs")
|
||||
<@userAvatar.userAvatar userName=user.name avatarUrl=user.avatarUrl clazz="user-avatar-xs" />
|
||||
<a target="_blank" rel="noopener" href="${routes.getRouteUrl("users.showProjects", user.name)}">
|
||||
${user.name}
|
||||
</a>
|
||||
@ -64,7 +63,7 @@
|
||||
</tr>
|
||||
}
|
||||
|
||||
<!-- User search -->
|
||||
<#-- User search -->
|
||||
<tr>
|
||||
<td>@users.invite.userSearch()</td>
|
||||
</tr>
|
||||
|
Loading…
Reference in New Issue
Block a user