scinote-web/app/services/toolbars/storage_locations_service.rb

107 lines
2.8 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
module Toolbars
class StorageLocationsService
attr_reader :current_user
include Canaid::Helpers::PermissionsHelper
include Rails.application.routes.url_helpers
def initialize(current_user, storage_location_ids: [])
@current_user = current_user
@storage_locations = StorageLocation.where(id: storage_location_ids)
@single = @storage_locations.length == 1
end
def actions
return [] if @storage_locations.none?
[
edit_action,
move_action,
duplicate_action,
delete_action,
share_action
].compact
end
private
def edit_action
return unless @single
return unless can_manage_storage_locations?(current_user.current_team)
{
name: 'edit',
label: I18n.t('storage_locations.index.toolbar.edit'),
icon: 'sn-icon sn-icon-edit',
path: storage_location_path(@storage_locations.first),
type: :emit
}
end
def move_action
return unless @single
return unless can_manage_storage_locations?(current_user.current_team)
{
name: 'move',
label: I18n.t("storage_locations.index.toolbar.move"),
icon: 'sn-icon sn-icon-move',
path: move_storage_location_path(@storage_locations.first),
type: :emit
}
end
def duplicate_action
return unless @single
return unless can_manage_storage_locations?(current_user.current_team)
{
name: 'duplicate',
label: I18n.t('storage_locations.index.toolbar.duplicate'),
icon: 'sn-icon sn-icon-duplicate',
path: duplicate_storage_location_path(@storage_locations.first),
type: :emit
}
end
def delete_action
return unless @single
return unless can_manage_storage_locations?(current_user.current_team)
2024-07-23 20:50:39 +08:00
storage_location = @storage_locations.first
number_of_items = storage_location.storage_location_repository_rows.count +
StorageLocation.inner_storage_locations(current_user.current_team, storage_location)
.where(container: true)
.joins(:storage_location_repository_rows)
.count
{
name: 'delete',
label: I18n.t('storage_locations.index.toolbar.delete'),
icon: 'sn-icon sn-icon-delete',
2024-07-23 20:50:39 +08:00
number_of_items: number_of_items,
path: storage_location_path(storage_location),
type: :emit
}
end
def share_action
return unless @single && can_share_storage_location?(@storage_locations.first)
{
name: :share,
label: I18n.t('storage_locations.index.share'),
icon: 'sn-icon sn-icon-shared',
type: :emit
}
end
end
end