Add Restore button to the archived Projects screen [SCI-5344]

This commit is contained in:
Oleksii Kriuchykhin 2021-01-09 21:27:19 +01:00
parent f478ad91c3
commit 684674952c
8 changed files with 69 additions and 21 deletions

View file

@ -100,26 +100,26 @@
});
}
// init project toolbar archive/restore function
function initArchiveToolbarButton() {
// init project toolbar archive/restore functions
function initArchiveRestoreToolbarButtons() {
$(toolbarWrapper)
.on('ajax:before', '.archive-projects-form', function() {
let archiveForm = $(this);
archiveForm.find('input[name="projects_ids[]"]').remove();
.on('ajax:before', '.archive-projects-form, .restore-projects-form', function() {
let buttonForm = $(this);
buttonForm.find('input[name="projects_ids[]"]').remove();
selectedProjects.forEach(function(id) {
$('<input>').attr({
type: 'hidden',
name: 'projects_ids[]',
value: id
}).appendTo(archiveForm);
}).appendTo(buttonForm);
});
})
.on('ajax:success', '.archive-projects-form', function(ev, data) {
.on('ajax:success', '.archive-projects-form, .restore-projects-form', function(ev, data) {
HelperModule.flashAlertMsg(data.message, 'success');
// Project saved, reload view
refreshCurrentView();
})
.on('ajax:error', '.archive-projects-form', function(ev, data) {
.on('ajax:error', '.archive-projects-form, .restore-projects-form', function(ev, data) {
HelperModule.flashAlertMsg(data.responseJSON.message, 'danger');
});
}
@ -365,7 +365,7 @@
initManageUsersModal();
initExportProjectsModal();
initExportProjects();
initArchiveToolbarButton();
initArchiveRestoreToolbarButtons();
initUsersEditLink($('.project-card'));
initFormSubmitLinks($('.project-card'));

View file

@ -550,6 +550,10 @@ li.module-hover {
display: inline-block;
}
.restore-projects-form {
display: inline-block;
}
.header-actions {
align-items: center;
display: flex;
@ -1219,4 +1223,3 @@ li.module-hover {
margin: 1em 0;
}
}

View file

@ -65,8 +65,8 @@ class ProjectFoldersController < ApplicationController
def move_to_modal
view_state = current_team.current_view_state(current_user)
@current_view_mode = params[:mode] || :active
@current_sort = view_state.state.dig('projects', @current_view_mode.to_s, 'sort') || 'atoz'
@current_view_mode = params[:mode] || 'active'
@current_sort = view_state.state.dig('projects', @current_view_mode, 'sort') || 'atoz'
render json: {
html: render_to_string(partial: 'projects/index/modals/move_to_modal_contents.html.erb',

View file

@ -21,8 +21,8 @@ class ProjectsController < ApplicationController
def index
if current_team
view_state = current_team.current_view_state(current_user)
@current_view_mode = params[:mode] || :active
@current_sort = view_state.state.dig('projects', @current_view_mode.to_s, 'sort') || 'atoz'
@current_view_mode = params[:mode] || 'active'
@current_sort = view_state.state.dig('projects', @current_view_mode, 'sort') || 'atoz'
end
end
@ -228,6 +228,28 @@ class ProjectsController < ApplicationController
end
end
def restore_group
projects = current_team.projects.archived.where(id: params[:projects_ids])
counter = 0
projects.each do |project|
next unless can_restore_project?(project)
project.transaction do
project.restore!(current_user)
log_activity(:restore_project, project)
counter += 1
rescue StandardError => e
Rails.logger.error e.message
raise ActiveRecord::Rollback
end
end
if counter.positive?
render json: { message: t('projects.restore_group.success_flash', number: counter) }
else
render json: { message: t('projects.restore_group.error_flash') }, status: :unprocessable_entity
end
end
def show
redirect_to action: :experiment_archive if @project.archived?
# This is the "info" view

View file

@ -48,6 +48,9 @@ class ProjectsOverviewService
elsif @params[:folders_search] == 'true'
folders = ProjectFolder.inner_folders(@team, nil).or(ProjectFolder.where(id: nil))
fetch_project_records
elsif @view_mode == 'archived'
folders = ProjectFolder.where(id: nil)
fetch_project_records.where(team: @team)
else
folders = ProjectFolder.where(id: nil)
fetch_project_records.where(project_folder: nil, team: @team)
@ -63,8 +66,13 @@ class ProjectsOverviewService
end
def project_and_folder_cards
cards = filter_project_records(fetch_project_records.where(project_folder: @current_folder)) +
filter_project_folder_records(fetch_project_folder_records.where(parent_folder: @current_folder))
cards =
if @view_mode == 'archived'
filter_project_records(fetch_project_records) + filter_project_folder_records(fetch_project_folder_records)
else
filter_project_records(fetch_project_records.where(project_folder: @current_folder)) +
filter_project_folder_records(fetch_project_folder_records.where(parent_folder: @current_folder))
end
mixed_sort_records(cards)
end
@ -103,8 +111,8 @@ class ProjectsOverviewService
end
def filter_project_records(records)
records = records.where(archived: true) if @params[:view_mode] == 'archived'
records = records.where(archived: false) if @params[:view_mode] == 'active'
records = records.archived if @view_mode == 'archived'
records = records.active if @view_mode == 'active'
records = records.where_attributes_like('projects.name', @params[:search]) if @params[:search].present?
records = records.where_attributes_like('projects.name', @params[:search]) if @params[:search].present?
records = records.where('user_projects.user_id IN (?)', @params[:members]) if @params[:members]&.any?
@ -118,8 +126,8 @@ class ProjectsOverviewService
end
def filter_project_folder_records(records)
records = records.where(archived: true) if @params[:view_mode] == 'archived'
records = records.where(archived: false) if @params[:view_mode] == 'active'
records = records.archived if @view_mode == 'archived'
records = records.active if @view_mode == 'active'
records = records.where_attributes_like('project_folders.name', @params[:search]) if @params[:search].present?
records
end

View file

@ -5,6 +5,7 @@
<% if current_team && can_create_projects?(current_team) %>
<%= link_to new_project_path(project_folder_id: @current_folder),
class: 'btn btn-primary new-project-btn',
data: { view_mode: 'active' },
remote: true do %>
<span class="fas fa-plus" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.new') %></span>
@ -14,6 +15,7 @@
<% if current_team && can_create_project_folders?(current_team) %>
<%= link_to new_project_folder_path(project_folder_id: @current_folder),
class: 'btn btn-light new-project-folder-btn',
data: { view_mode: 'active' },
remote: true do %>
<span class="fas fa-folder" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.new_folder') %></span>
@ -30,12 +32,21 @@
<%= 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 },
data: { for: :archivable, view_mode: 'active' },
remote: true,
method: :post do %>
<span class="fas fa-archive" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.archive_button') %></span>
<% end %>
<%= button_to restore_group_projects_path,
class: 'btn btn-light restore-projects-btn multiple-object-action project-only-action hidden',
form_class: 'restore-projects-form',
data: { for: :restorable, view_mode: 'archived' },
remote: true,
method: :post do %>
<span class="fas fa-undo" aria-hidden="true"></span>
<span class="hidden-xs"><%= t('projects.index.restore_button') %></span>
<% end %>
<!-- export projects button -->
<a href="#" class="btn btn-light export-projects-btn multiple-object-action hidden"
data-export-projects-modal-url="<%= export_projects_modal_team_path(current_team) %>">

View file

@ -474,6 +474,9 @@ en:
archive_group:
success_flash: "<strong>%{number}</strong> project(s) successfully archived."
error_flash: "Failed to arhive project(s)."
restore_group:
success_flash: "<strong>%{number}</strong> project(s) successfully restored."
error_flash: "Failed to restore project(s)."
restore:
success_flash: "Project <strong>%{name}</strong> successfully restored."
error_flash: "Project <strong>%{name}</strong> not restored."

View file

@ -297,6 +297,7 @@ Rails.application.routes.draw do
get 'cards', to: 'projects#cards'
get 'users_filter'
post 'archive_group'
post 'restore_group'
end
end