scinote-web/app/services/toolbars/repository_rows_service.rb
2024-07-11 15:41:13 +02:00

183 lines
4.8 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)
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