Merge pull request #5424 from G-Chubinidze/gc_SCI_8302

Implement the bottom action toolbar - reports [SI-8302]
This commit is contained in:
artoscinote 2023-05-18 09:44:53 +02:00 committed by GitHub
commit ef0bf65c19
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 122 additions and 50 deletions

View file

@ -100,6 +100,10 @@
}
function updateButtons() {
if (window.actionToolbarComponent) {
window.actionToolbarComponent.fetchActions({ report_ids: CHECKBOX_SELECTOR.selectedRows });
}
const rowsCount = CHECKBOX_SELECTOR.selectedRows.length;
if (rowsCount === 0) {
$('.single-object-action, .multiple-object-action').addClass('disabled hidden');
@ -205,6 +209,8 @@
},
createdRow: addAttributesToRow,
initComplete: function(settings) {
initActionToolbar();
const { nTableWrapper: dataTableWrapper } = settings;
CHECKBOX_SELECTOR = new DataTableCheckboxes(dataTableWrapper, {
checkboxSelector: '.report-row-selector',
@ -240,7 +246,7 @@
}
function initUpdatePDFReport() {
$('#updatePdf').click(function(ev) {
$(document).on('click', '#updatePdf', function(ev) {
ev.stopPropagation();
ev.preventDefault();
@ -260,7 +266,7 @@
}
function initGenerateDocxReport() {
$('#requestDocx').click(function(ev) {
$(document).on('click', '#requestDocx', function(ev) {
ev.stopPropagation();
ev.preventDefault();
$(this).closest('.dropdown-menu').dropdown('toggle');
@ -269,7 +275,7 @@
}
function initUpdateDocxReport() {
$('#updateDocx').click(function(ev) {
$(document).on('click', '#updateDocx', function(ev) {
ev.stopPropagation();
ev.preventDefault();
@ -302,7 +308,7 @@
}
function initSaveReportPDFToInventory() {
$('#savePdfToInventoryButton').click(function(ev) {
$(document).on('click', '#savePdfToInventoryButton', function(ev) {
ev.preventDefault();
ev.stopPropagation();
@ -322,14 +328,14 @@
}
function initDeleteReports() {
$('#delete-reports-btn').click(function() {
$(document).on('click', '#delete-reports-btn', function() {
if (CHECKBOX_SELECTOR.selectedRows.length > 0) {
$('#report-ids').attr('value', '[' + CHECKBOX_SELECTOR.selectedRows + ']');
$('#delete-reports-modal').modal('show');
}
});
$('#confirm-delete-reports-btn').click(function() {
$(document).on('click', '#confirm-delete-reports-btn', function() {
animateLoading();
});
}

View file

@ -12,7 +12,7 @@ class ReportsController < ApplicationController
before_action :load_available_repositories, only: %i(index save_pdf_to_inventory_modal available_repositories)
before_action :check_project_read_permissions, only: %i(create edit update generate_pdf
generate_docx new_template_values project_contents)
before_action :check_read_permissions, except: %i(index datatable new create edit update destroy generate_pdf
before_action :check_read_permissions, except: %i(index datatable new create edit update destroy actions_toolbar generate_pdf
generate_docx new_template_values project_contents
available_repositories)
before_action :check_create_permissions, only: %i(new create)
@ -332,6 +332,16 @@ class ReportsController < ApplicationController
) }
end
def actions_toolbar
render json: {
actions:
Toolbars::ReportsService.new(
current_user,
report_ids: params[:report_ids].split(',')
).actions
}
end
private
AvailableRepository = Struct.new(:id, :name)

View file

@ -0,0 +1,91 @@
# frozen_string_literal: true
module Toolbars
class ReportsService
attr_reader :current_user
include Canaid::Helpers::PermissionsHelper
include Rails.application.routes.url_helpers
def initialize(current_user, report_ids: [])
@current_user = current_user
@reports = Report.where(id: report_ids)
@report = @reports.first if @reports.length == 1
end
def actions
return [] if @reports.none?
[
edit_action,
update_pdf_action,
save_pdf_to_inventory_action,
generate_docx_action,
delete_action
].compact
end
private
def edit_action
return unless @report && can_manage_report?(@report)
{
name: 'edit',
label: I18n.t('projects.reports.index.edit'),
icon: 'fas fa-pencil-alt',
button_id: 'edit-report-btn',
path: edit_project_report_path(@report.project_id, @report.id),
type: :link
}
end
def update_pdf_action
return unless @report && can_manage_report?(@report)
{
name: 'update_pdf',
label: I18n.t('projects.reports.index.update_pdf'),
icon: 'fas fa-file-pdf',
button_id: 'updatePdf'
}
end
def save_pdf_to_inventory_action
return unless @report && can_manage_report?(@report)
{
name: 'save_pdf_to_inventory',
label: I18n.t('projects.reports.index.save_pdf_to_inventory'),
icon: 'fas fa-save',
button_id: 'savePdfToInventoryButton'
}
end
def generate_docx_action
return unless @report && can_manage_report?(@report)
button_id = @report.docx_file_status == 'docx_empty' ? 'requestDocx' : 'updateDocx'
label = @report.docx_file_status == 'docx_empty' ? I18n.t('projects.reports.index.request_docx') : I18n.t('projects.reports.index.update_docx')
{
name: 'generate_docx_action',
label: label,
icon: 'fas fa-file-word',
button_id: button_id
}
end
def delete_action
return unless @reports.all? { |report| can_manage_report?(report) }
{
name: 'delete',
label: I18n.t('projects.reports.index.delete'),
icon: 'fas fa-trash',
button_id: 'delete-reports-btn',
type: :link
}
end
end
end

View file

@ -4,47 +4,6 @@
<span class="fas fa-plus" aria-hidden="true"></span>
<span class="hidden-xs"><%= t("projects.reports.index.new") %></span>
<% end %>
<div class="report-actions-dropdown sci-dropdown">
<button class="btn btn-light dropdown-toggle single-object-action disabled hidden" type="button" id="reportMenu" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
<i class="fas fa-file"></i>
<%= t("projects.reports.index.report_button") %>
<span class="caret pull-right"></span>
</button>
<ul id="reportMenuDropdown" class="dropdown-menu report-actions-menu" aria-labelledby="reportMenu">
<li>
<%= link_to '#', remote: true, id: 'updatePdf' do %>
<i class="fas fa-file-pdf"></i>
<%= t("projects.reports.index.update_pdf") %>
<% end %>
</li>
<li>
<%= link_to '#savePdfToInventory', remote: true, id: 'savePdfToInventoryButton' do %>
<i class="fas fa-save"></i>
<%= t("projects.reports.index.save_pdf_to_inventory") %>
<% end %>
</li>
<li>
<%= link_to '#', remote: true, id: 'requestDocx', class: 'generate-docx' do %>
<i class="fas fa-file-word"></i>
<%= t("projects.reports.index.request_docx") %>
<% end %>
</li>
<li>
<%= link_to '#', remote: true, id: 'updateDocx', class: 'generate-docx' do %>
<i class="fas fa-file-word"></i>
<%= t("projects.reports.index.update_docx") %>
<% end %>
</li>
</ul>
</div>
<%= link_to "", remote: true, class: "btn btn-light disabled hidden single-object-action", id: "edit-report-btn" do %>
<span class="fas fa-pencil-alt" aria-hidden="true"></span>
<span class="hidden-xs"><%=t "projects.reports.index.edit" %></span>
<% end %>
<%= link_to "", remote: true, class: "btn btn-light disabled hidden multiple-object-action", id: "delete-reports-btn" do %>
<span class="fas fa-trash" aria-hidden="true"></span>
<span class="hidden-xs"><%=t "projects.reports.index.delete" %></span>
<% end %>
</div>
<div class="sci-input-container left-icon search-report-container">
<input type="text" class="sci-input-field report-search" placeholder="<%= t("projects.reports.index.search_reports") %>"></input>

View file

@ -66,9 +66,14 @@
<% end %>
</div>
<div id="actionToolbar" data-behaviour="vue">
<action-toolbar actions-url="<%= actions_toolbar_reports_url %>" />
</div>
<%= render partial: 'reports/modals/regenerate' %>
<%= javascript_include_tag 'reports/save_pdf_to_inventory' %>
<%= javascript_include_tag 'reports/reports_datatable' %>
<%= javascript_include_tag 'pdf_js' %>
<%= stylesheet_link_tag 'pdf_js_styles' %>
<%= javascript_include_tag "vue_components_action_toolbar" %>

View file

@ -609,8 +609,8 @@ en:
update_pdf: "Update PDF"
save_pdf_to_inventory: "Save PDF to Inventory"
search_reports: "Filter reports"
request_docx: "Generate DOCX"
update_docx: "Update DOCX"
request_docx: "Generate .DOCX"
update_docx: "Update .DOCX"
edit: "Edit"
delete: "Delete"
deleted: "(Deleted)"

View file

@ -250,6 +250,7 @@ Rails.application.routes.draw do
end
collection do
get :project_contents
get 'actions_toolbar'
end
end
get 'reports/datatable', to: 'reports#datatable'