Merge pull request #3057 from okriuchykhin/ok_SCI_5317

Add project permissions check to projects toolbar [SCI-5317]
This commit is contained in:
Alex Kriuchykhin 2021-01-07 13:25:34 +01:00 committed by GitHub
commit 962b3a532e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 40 additions and 14 deletions

View file

@ -11,6 +11,7 @@
dropdownSelector Sidebar Turbolinks */
(function(global) {
const PERMISSIONS = ['editable', 'archivable', 'restorable'];
var toolbarWrapper = '#toolbarWrapper';
var editProjectModal = '#edit-modal';
@ -300,22 +301,35 @@
});
}
function checkActionPermission(permission) {
return selectedProjects.every(function(projectId) {
return $(`.project-card[data-id="${projectId}"]`).data(permission);
});
}
function updateProjectsToolbar() {
let projectsToolbar = $('#projectsToolbar');
if (selectedProjects.length === 0 && selectedProjectFolders.length === 0) {
projectsToolbar.find('.single-object-action, .multiple-object-action').addClass('hidden');
} else if (selectedProjects.length + selectedProjectFolders.length === 1) {
projectsToolbar.find('.single-object-action, .multiple-object-action').removeClass('hidden');
if (selectedProjectFolders.length === 1) {
projectsToolbar.find('.project-only-action').addClass('hidden');
}
} else {
projectsToolbar.find('.single-object-action').addClass('hidden');
projectsToolbar.find('.multiple-object-action').removeClass('hidden');
if (selectedProjectFolders.length > 0) {
projectsToolbar.find('.project-only-action').addClass('hidden');
if (selectedProjects.length + selectedProjectFolders.length === 1) {
projectsToolbar.find('.single-object-action, .multiple-object-action').removeClass('hidden');
if (selectedProjectFolders.length === 1) {
projectsToolbar.find('.project-only-action').addClass('hidden');
}
} else {
projectsToolbar.find('.single-object-action').addClass('hidden');
projectsToolbar.find('.multiple-object-action').removeClass('hidden');
if (selectedProjectFolders.length > 0) {
projectsToolbar.find('.project-only-action').addClass('hidden');
}
}
PERMISSIONS.forEach((permission) => {
if (!checkActionPermission(permission)) {
projectsToolbar.find(`.btn[data-for="${permission}"]`).addClass('hidden');
}
});
}
}

View file

@ -84,13 +84,14 @@ class ProjectsOverviewService
@team.projects
.visible_to(@user, @team)
.left_outer_joins(:project_comments)
.preload(:user_projects, team: :user_teams)
.select('projects.*')
.select('COUNT(DISTINCT comments.id) AS comment_count')
.group('projects.id')
end
def fetch_project_folder_records
project_folders = @team.project_folders.left_outer_joins(:projects, :project_folders)
project_folders = @team.project_folders.preload(team: :user_teams).left_outer_joins(:projects, :project_folders)
project_folders.select('project_folders.*')
.select('COUNT(DISTINCT projects.id) AS projects_count')
.select('COUNT(DISTINCT project_folders.id) AS folders_count')

View file

@ -1,4 +1,9 @@
<div class="card folder-card" data-id="<%= folder.id %>" data-edit-url="<%= edit_project_folder_path(folder) %>">
<div class="card folder-card"
data-id="<%= folder.id %>"
data-edit-url="<%= edit_project_folder_path(folder) %>"
data-editable="<%= can_update_team?(current_team) %>"
data-archivable="<%= folder.active? && can_update_team?(current_team) %>"
data-restorable="<%= folder.archived? && can_update_team?(current_team) %>">
<div class="checkbox-cell">
<div class="sci-checkbox-container">
<input value="1" type="checkbox" class="sci-checkbox folder-card-selector">

View file

@ -1,4 +1,9 @@
<div class="card project-card" data-id="<%= project.id %>" data-edit-url="<%= edit_project_path(project) %>">
<div class="card project-card"
data-id="<%= project.id %>"
data-edit-url="<%= edit_project_path(project) %>"
data-editable="<%= can_manage_project?(project) %>"
data-archivable="<%= project.active? && can_archive_project?(project) %>"
data-restorable="<%= project.archived? && can_restore_project?(project) %>">
<div class="checkbox-cell">
<div class="sci-checkbox-container">
<input value="1" type="checkbox" class="sci-checkbox project-card-selector">

View file

@ -19,17 +19,18 @@
<span class="hidden-xs"><%= t('projects.index.new_folder') %></span>
<% end %>
<% end %>
<a href="#" class="btn btn-light edit-btn single-object-action hidden" data-view-mode="active">
<a href="#" class="btn btn-secondary edit-btn single-object-action hidden" data-for="editable" data-view-mode="active">
<span class="fas fa-folder" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.edit_button') %></span>
</a>
<a href="#" class="btn btn-light move-projects-btn multiple-object-action hidden">
<a href="#" class="btn btn-light move-projects-btn multiple-object-action hidden" data-for="editable">
<span class="fas fa-arrow-right" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.move_button') %></span>
</a>
<%= button_to archive_group_projects_path,
class: 'btn btn-light archive-projects-btn multiple-object-action project-only-action hidden',
form_class: 'archive-projects-form',
data: { for: :archivable },
remote: true,
method: :post do %>
<span class="fas fa-archive" aria-hidden="true"></span>