visibility chng reason shows on project pg

This commit is contained in:
Jake Potrebic 2020-08-03 13:43:08 -07:00
parent 0f8208addf
commit b4229370fe
No known key found for this signature in database
GPG Key ID: 7C58557EC9C421F8
10 changed files with 47 additions and 40 deletions

View File

@ -1,5 +1,6 @@
[#ftl]
[#-- @implicitly included --]
[#-- @ftlvariable name="markdownService" type="me.minidigger.hangar.service.MarkdownService" --]
[#-- @ftlvariable name="utils" type="me.minidigger.hangar.util.TemplateHelper" --]
[#-- @ftlvariable name="@helper" type="freemarker.template.TemplateHashModel" --]
[#-- @ftlvariable name="alerts" type="java.util.Map" --]

View File

@ -70,6 +70,7 @@ public class ApplicationController extends HangarController {
return null; // TODO implement
}
@GlobalPermission(NamedPermission.REVIEWER)
@Secured("ROLE_USER")
@RequestMapping("/admin/approval/projects")
public Object showProjectVisibility() {

View File

@ -17,7 +17,13 @@ public class StringToEnumConverterFactory implements ConverterFactory<String, En
@Override
@SuppressWarnings("unchecked")
public T convert(String s) {
return (T) Enum.valueOf(this.enumType, s.trim().toUpperCase());
int ordinal;
try {
ordinal = Integer.parseInt(s);
return enumType.getEnumConstants()[ordinal];
} catch (NumberFormatException e) {
return (T) Enum.valueOf(this.enumType, s.trim().toUpperCase());
}
}
}

View File

@ -2,6 +2,7 @@ package me.minidigger.hangar.db.dao;
import me.minidigger.hangar.db.model.ProjectVersionVisibilityChangesTable;
import me.minidigger.hangar.db.model.ProjectVisibilityChangesTable;
import org.jdbi.v3.sqlobject.config.KeyColumn;
import org.jdbi.v3.sqlobject.config.RegisterBeanMapper;
import org.jdbi.v3.sqlobject.customizer.BindBean;
import org.jdbi.v3.sqlobject.customizer.Timestamped;
@ -10,6 +11,8 @@ import org.jdbi.v3.sqlobject.statement.SqlQuery;
import org.jdbi.v3.sqlobject.statement.SqlUpdate;
import org.springframework.stereotype.Repository;
import java.util.Map;
@Repository
@RegisterBeanMapper(ProjectVisibilityChangesTable.class)
@RegisterBeanMapper(ProjectVersionVisibilityChangesTable.class)
@ -24,8 +27,9 @@ public interface VisibilityDao {
@SqlUpdate("UPDATE project_visibility_changes SET resolved_at = :resolvedAt, resolved_by = :resolvedBy") // I think these are the only two things that change after the fact
void update(@BindBean ProjectVisibilityChangesTable projectVisibilityChangesTable);
@SqlQuery("SELECT * FROM project_visibility_changes WHERE project_id = :projectId AND resolved_at IS NULL ORDER BY created_at LIMIT 1")
ProjectVisibilityChangesTable getLatestProjectVisibilityChange(long projectId);
@KeyColumn("user_name")
@SqlQuery("SELECT pvc.*, u.name user_name FROM project_visibility_changes pvc LEFT OUTER JOIN users u ON pvc.created_by = u.id WHERE project_id = :projectId ORDER BY created_at DESC LIMIT 1")
Map.Entry<String, ProjectVisibilityChangesTable> getLatestProjectVisibilityChange(long projectId);
@Timestamped
@SqlUpdate("UPDATE project_visibility_changes " +

View File

@ -1,6 +1,8 @@
package me.minidigger.hangar.db.model;
import me.minidigger.hangar.model.Visibility;
import org.jdbi.v3.core.enums.EnumByOrdinal;
import org.springframework.lang.Nullable;
import java.time.OffsetDateTime;
@ -16,9 +18,9 @@ public class ProjectVisibilityChangesTable {
private OffsetDateTime resolvedAt;
@Nullable
private Long resolvedBy;
private long visibility;
private Visibility visibility;
public ProjectVisibilityChangesTable(long createdBy, long projectId, String comment, @Nullable OffsetDateTime resolvedAt, @Nullable Long resolvedBy, long visibility) {
public ProjectVisibilityChangesTable(long createdBy, long projectId, String comment, @Nullable OffsetDateTime resolvedAt, @Nullable Long resolvedBy, Visibility visibility) {
this.createdBy = createdBy;
this.projectId = projectId;
this.comment = comment;
@ -89,16 +91,18 @@ public class ProjectVisibilityChangesTable {
return resolvedBy;
}
public void setResolvedBy(long resolvedBy) {
public void setResolvedBy(Long resolvedBy) {
this.resolvedBy = resolvedBy;
}
public long getVisibility() {
@EnumByOrdinal
public Visibility getVisibility() {
return visibility;
}
public void setVisibility(long visibility) {
@EnumByOrdinal
public void setVisibility(Visibility visibility) {
this.visibility = visibility;
}

View File

@ -7,6 +7,7 @@ import me.minidigger.hangar.db.model.ProjectsTable;
import me.minidigger.hangar.db.model.UsersTable;
import me.minidigger.hangar.model.Permission;
import me.minidigger.hangar.model.Visibility;
import me.minidigger.hangar.service.MarkdownService;
import java.util.List;
import java.util.Map;
@ -134,8 +135,18 @@ public class ProjectData {
public Map<ProjectMember, UsersTable> filteredMembers(HeaderData headerData) {
boolean hasEditMembers = headerData.globalPerm(Permission.ManageSubjectMembers);
boolean userIsOwner = headerData.isAuthenticated() ? headerData.getCurrentUser().getId() == projectOwner.getId() : false;
boolean userIsOwner = headerData.isAuthenticated() && headerData.getCurrentUser().getId() == projectOwner.getId();
if (hasEditMembers || userIsOwner) return members;
else return members.entrySet().stream().filter(member -> member.getKey().getIsAccepted()).collect(Collectors.toMap(Entry::getKey, Entry::getValue));
}
public String renderVisibilityChange(MarkdownService markdownService, String fallback) {
if (lastVisibilityChange != null) {
System.out.println(lastVisibilityChange.getComment());
if (!lastVisibilityChange.getComment().isBlank()) {
return markdownService.render(lastVisibilityChange.getComment());
}
}
return fallback;
}
}

View File

@ -77,8 +77,7 @@ public class ProjectService {
projectMembers.forEach(ProjectMember::setUser); // I don't know why the SQL query isn't doing this automatically...
List<ProjectFlag> flags = flagService.getProjectFlags(projectsTable.getId());
int noteCount = 0; // TODO a whole lot
ProjectVisibilityChangesTable lastVisibilityChange = null;
String lastVisibilityChangeUser = null;
Map.Entry<String, ProjectVisibilityChangesTable> latestProjectVisibilityChangeWithUser = visibilityDao.get().getLatestProjectVisibilityChange(projectsTable.getId());
ProjectVersionsTable recommendedVersion = null;
String iconUrl = "";
long starCount = userDao.get().getProjectStargazers(projectsTable.getId(), 0, null).size();
@ -99,8 +98,8 @@ public class ProjectService {
projectMembers,
flags,
noteCount,
lastVisibilityChange,
lastVisibilityChangeUser,
latestProjectVisibilityChangeWithUser.getValue(),
latestProjectVisibilityChangeWithUser.getKey(),
recommendedVersion,
iconUrl,
starCount,
@ -125,7 +124,7 @@ public class ProjectService {
visibilityDao.get().updateLatestChange(userService.getCurrentUser().getId(), project.getId());
visibilityDao.get().insert(new ProjectVisibilityChangesTable(project.getOwnerId(), project.getId(), comment, null, null, newVisibility.getValue()));
visibilityDao.get().insert(new ProjectVisibilityChangesTable(project.getOwnerId(), project.getId(), comment, null, null, newVisibility));
project.setVisibility(newVisibility);
projectDao.get().update(project);

View File

@ -2,14 +2,6 @@
<#import "*/utils/hangar.ftlh" as hangar />
<#import "*/layout/base.ftlh" as base />
<#--@import java.time.OffsetDateTime-->
<#--@import controllers.sugar.Requests.OreRequest-->
<#--@import models.viewhelper.ProjectData-->
<#--@import ore.OreConfig-->
<#--@import util.StringFormatterUtils._-->
<#--@(p: ProjectData)(implicit messages: Messages, request: OreRequest[_], config: OreConfig, flash: Flash, assetsFinder: AssetsFinder)-->
<#assign message><@spring.message "project.flag.plural" /></#assign>
<@base.base title="${message}">
<div class="row">

View File

@ -9,6 +9,7 @@ Base template for Project overview.
<#assign Permission=@helper["me.minidigger.hangar.model.Permission"]>
<#assign FlagReason=@helper["me.minidigger.hangar.model.FlagReason"]>
<#macro view p sp active noButtons=false additionalScripts="" additionalStyling="">
<#-- @ftlvariable name="p" type="me.minidigger.hangar.model.viewhelpers.ProjectData" -->
<#-- @ftlvariable name="sp" type="me.minidigger.hangar.model.viewhelpers.ScopedProjectData" -->
<#assign scriptsVar>
<script type="text/javascript" src="<@hangar.url "javascripts/projectDetail.js" />"></script>
@ -42,15 +43,15 @@ Base template for Project overview.
<#if sp.perms(Permission.EditPage)>
<a class="btn btn-success pull-right" href="${p.fullSlug}/manage/sendforapproval">Send for approval</a>
</#if>
<strong><@spring.message "visibility.notice." + p.visibility.getName() /></strong>
<br>
${p.renderVisibilityChange!"Unknown"}
<strong><@spring.message "visibility.notice." + p.visibility.getName() /></strong>
<br>
${p.renderVisibilityChange(markdownService, "Unknown")}
<#else>
<#if p.visibility == Visibility.SOFTDELETE>
<@spring.messageArgs "visibility.notice." + p.visibility.getName(), [p.lastVisibilityChangeUser] />
<#else>
<@spring.message "visibility.notice." + p.visibility.getName() />
${p.renderVisibilityChange!}
${p.renderVisibilityChange(markdownService, "")}
</#if>
</#if>
</div>

View File

@ -3,18 +3,6 @@
<#import "*/layout/base.ftlh" as base />
<#import "*/projects/helper/btnHide.ftlh" as hide />
<#--
@import controllers.sugar.Requests.OreRequest
@import models.querymodels.ShownFlag
@import ore.OreConfig
@import ore.models.user.User
@import util.StringFormatterUtils._
@import util.syntax._
@import views.html.utils.userAvatar
@* project perms for all visibilities *@
@(flags: Seq[ShownFlag])(implicit messages: Messages, request: OreRequest[_], config: OreConfig, flash: Flash, assetsFinder: AssetsFinder)
-->
<#assign scriptsVar>
<script type="text/javascript" src="<@hangar.url "javascripts/adminFlags.js" />"></script>
<script type="text/javascript" src="<@hangar.url "javascripts/hideProject.js" />"></script>
@ -24,7 +12,7 @@
<div class="row">
<div class="col-md-12 header-flags">
<h2>Flags</h2>
<h3 class="minor no-flags" <#if flags?size gt 0>style="display: none;"</#if>>
<h3 class="minor no-flags" <#if flags?has_content>style="display: none;"</#if>>
<i class="far fa-thumbs-up"></i> <@spring.message "user.flags.none" />
</h3>
</div>
@ -36,7 +24,7 @@
<li data-flag-id="${flag.flag.id}" class="list-group-item">
<div class="row">
<div class="col-xs-12 col-md-1" style="width: 40px;">
<a href="${routes.getRouteUrl("users.showProjects", flag)}">
<a href="${routes.getRouteUrl("users.showProjects", flag.reportedBy)}">
<#import "*/utils/userAvatar.ftlh" as userAvatar>
<@userAvatar.userAvatar userName=flag.reportedBy avatarUrl=utils.format(config.security.api.avatarUrl, flag.reportedBy) clazz="user-avatar-xs"></@userAvatar.userAvatar>
</a>