mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-12-29 19:51:01 +08:00
183 lines
4.9 KiB
Ruby
183 lines
4.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class RepositoryMismatchError < StandardError; end
|
|
|
|
module Toolbars
|
|
class RepositoryRowsService
|
|
attr_reader :current_user
|
|
|
|
include Canaid::Helpers::PermissionsHelper
|
|
include Rails.application.routes.url_helpers
|
|
|
|
def initialize(current_user, repository_row_ids: [])
|
|
@current_user = current_user
|
|
@repository_rows = RepositoryRow.where(id: repository_row_ids)
|
|
|
|
return if @repository_rows.none?
|
|
|
|
if @repository_rows.pluck(:repository_id).uniq.size != 1
|
|
raise RepositoryMismatchError, 'Items are not from the same repository!'
|
|
end
|
|
|
|
@repository = @repository_rows.first.repository
|
|
|
|
@single = @repository_rows.length == 1
|
|
end
|
|
|
|
def actions
|
|
return [] if @repository_rows.none?
|
|
|
|
[
|
|
restore_action,
|
|
edit_action,
|
|
assign_action,
|
|
duplicate_action,
|
|
export_actions,
|
|
print_label_action,
|
|
archive_action,
|
|
delete_action
|
|
].compact
|
|
end
|
|
|
|
private
|
|
|
|
def restore_action
|
|
return unless can_manage_repository_rows?(@repository) && !@repository.is_a?(SoftLockedRepository)
|
|
|
|
return unless @repository_rows.all?(&:archived?)
|
|
|
|
{
|
|
name: 'restore',
|
|
label: I18n.t('repositories.restore_record'),
|
|
icon: 'sn-icon sn-icon-restore',
|
|
button_class: 'resotre-repository-row-btn',
|
|
button_id: 'restoreRepositoryRecords',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def edit_action
|
|
return unless can_manage_repository_rows?(@repository) && !@repository.is_a?(SoftLockedRepository)
|
|
|
|
return unless @repository_rows.all?(&:active?)
|
|
|
|
{
|
|
name: 'edit',
|
|
label: I18n.t('repositories.edit_record'),
|
|
icon: 'sn-icon sn-icon-edit',
|
|
button_class: 'edit-repository-row-btn',
|
|
button_id: 'editRepositoryRecord',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def assign_action
|
|
return unless can_read_repository?(@repository)
|
|
|
|
return unless @repository_rows.all?(&:active?)
|
|
|
|
{
|
|
name: 'assign',
|
|
label: I18n.t('repositories.assign_record'),
|
|
icon: 'sn-icon sn-icon-assign-to-task',
|
|
button_class: 'assign-repository-rows-btn',
|
|
button_id: 'assignRepositoryRecords',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def duplicate_action
|
|
return unless can_create_repository_rows?(@repository) && !@repository.is_a?(SoftLockedRepository)
|
|
|
|
return unless @repository_rows.all?(&:active?)
|
|
|
|
{
|
|
name: 'duplicate',
|
|
label: I18n.t('repositories.copy_record'),
|
|
icon: 'sn-icon sn-icon-duplicate',
|
|
button_class: 'copy-repository-row-btn',
|
|
button_id: 'copyRepositoryRecords',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def export_items_action
|
|
return unless can_read_repository?(@repository)
|
|
|
|
{
|
|
name: 'export_records',
|
|
label: I18n.t('repositories.exports.records'),
|
|
icon: 'sn-icon sn-icon-export',
|
|
button_class: 'export-repository-row-btn',
|
|
button_id: 'exportRepositoryRowsButton',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def export_consumption_action
|
|
return unless can_export_repository_stock?(@repository)
|
|
|
|
{
|
|
name: 'export_consumption',
|
|
label: I18n.t('repositories.exports.stock_consumption'),
|
|
icon: 'sn-icon sn-icon-reports',
|
|
button_class: 'export-consumption-button',
|
|
button_id: 'exportStockConsumptionButton',
|
|
item_id: @repository.id,
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def export_actions
|
|
{
|
|
name: 'export_group',
|
|
type: :group,
|
|
group_label: I18n.t('repositories.exports.export'),
|
|
actions: [export_items_action, export_consumption_action].compact
|
|
}
|
|
end
|
|
|
|
def print_label_action
|
|
return unless can_read_repository?(@repository)
|
|
|
|
{
|
|
name: 'print_label',
|
|
label: I18n.t('repositories.print_label'),
|
|
icon: 'sn-icon sn-icon-printer',
|
|
button_class: 'print-label-button',
|
|
button_id: 'toolbarPrintLabel',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def archive_action
|
|
return unless can_manage_repository_rows?(@repository) && !@repository.is_a?(SoftLockedRepository)
|
|
|
|
return unless @repository_rows.all?(&:active?)
|
|
|
|
{
|
|
name: 'archive',
|
|
label: I18n.t('repositories.archive_record'),
|
|
icon: 'sn-icon sn-icon-archive',
|
|
button_class: 'resotre-repository-row-btn',
|
|
button_id: 'archiveRepositoryRecordsButton',
|
|
type: :legacy
|
|
}
|
|
end
|
|
|
|
def delete_action
|
|
return unless can_delete_repository_rows?(@repository) && !@repository.is_a?(SoftLockedRepository)
|
|
|
|
return unless @repository_rows.all?(&:archived?)
|
|
|
|
{
|
|
name: 'delete',
|
|
label: I18n.t('repositories.delete_record'),
|
|
icon: 'sn-icon sn-icon-delete',
|
|
button_class: 'resotre-repository-row-btn',
|
|
button_id: 'deleteRepositoryRecords',
|
|
type: :legacy
|
|
}
|
|
end
|
|
end
|
|
end
|