mirror of
https://github.com/scinote-eln/scinote-web.git
synced 2024-11-15 13:45:25 +08:00
215 lines
7.3 KiB
Ruby
215 lines
7.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class LabelTemplatesController < ApplicationController
|
|
include InputSanitizeHelper
|
|
include TeamsHelper
|
|
|
|
before_action :check_feature_enabled, except: %i(index zpl_preview list)
|
|
before_action :load_label_templates, only: %i(index datatable list)
|
|
before_action :load_label_template, only: %i(show set_default update template_tags)
|
|
before_action :check_view_permissions, except: %i(create duplicate set_default delete update)
|
|
before_action :check_manage_permissions, only: %i(create duplicate set_default delete update)
|
|
before_action :set_breadcrumbs_items, only: %i(index show)
|
|
|
|
layout 'fluid'
|
|
|
|
def index
|
|
respond_to do |format|
|
|
format.json do
|
|
label_templates = Lists::LabelTemplatesService.new(@label_templates, params).call
|
|
render json: label_templates, each_serializer: Lists::LabelTemplateSerializer, user: current_user, meta: pagination_dict(label_templates)
|
|
end
|
|
format.html do
|
|
unless LabelTemplate.enabled?
|
|
render :promo
|
|
return
|
|
end
|
|
render 'index'
|
|
end
|
|
end
|
|
end
|
|
|
|
def list
|
|
render json: @label_templates, each_serializer: LabelTemplateSerializer, user: current_user
|
|
end
|
|
|
|
def show
|
|
respond_to do |format|
|
|
format.json { render json: @label_template, serializer: LabelTemplateSerializer, user: current_user }
|
|
format.html
|
|
end
|
|
end
|
|
|
|
def create
|
|
ActiveRecord::Base.transaction do
|
|
label_template = ZebraLabelTemplate.default
|
|
label_template.team = current_team
|
|
label_template.created_by = current_user
|
|
label_template.last_modified_by = current_user
|
|
label_template.save!
|
|
log_activity(:label_template_created, label_template)
|
|
render json: { redirect_url: label_template_path(label_template, new_label: true) }
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error(e.message)
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
end
|
|
|
|
def update
|
|
@label_template.transaction do
|
|
update_label_template_params = label_template_params.merge(last_modified_by_id: current_user.id)
|
|
@label_template.update!(update_label_template_params)
|
|
log_activity(:label_template_edited, @label_template)
|
|
end
|
|
render json: @label_template, serializer: LabelTemplateSerializer, user: current_user
|
|
rescue StandardError => e
|
|
Rails.logger.error e.message
|
|
render json: { error: @label_template.errors.messages }, status: :unprocessable_entity
|
|
end
|
|
|
|
def duplicate
|
|
ActiveRecord::Base.transaction do
|
|
LabelTemplate.where(team_id: current_team.id, id: params[:selected_ids]).each do |template|
|
|
new_template = template.dup
|
|
new_template.default = false
|
|
new_template.created_by = current_user
|
|
new_template.last_modified_by = current_user
|
|
new_template.name = template.name + '(1)'
|
|
new_template.save!
|
|
log_activity(
|
|
:label_template_copied,
|
|
new_template,
|
|
message_items: { label_template_new: new_template.id, label_template_original: template.id }
|
|
)
|
|
end
|
|
render json: { message: I18n.t('label_templates.index.templates_duplicated',
|
|
count: params[:selected_ids].length) }
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error(e.message)
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
render json: { error: I18n.t('errors.general') }, status: :unprocessable_entity
|
|
end
|
|
|
|
def delete
|
|
ActiveRecord::Base.transaction do
|
|
LabelTemplate.where(team_id: current_team.id, id: params[:selected_ids]).each do |template|
|
|
log_activity(:label_template_deleted, template)
|
|
template.destroy!
|
|
end
|
|
render json: { message: I18n.t('label_templates.index.templates_deleted') }
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error(e.message)
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
render json: { error: I18n.t('errors.general') }, status: :unprocessable_entity
|
|
end
|
|
|
|
def set_default
|
|
ActiveRecord::Base.transaction do
|
|
LabelTemplate.find_by(team_id: current_team.id,
|
|
type: @label_template.type,
|
|
default: true)&.update!(default: false)
|
|
@label_template.update!(default: true)
|
|
render json: { message: I18n.t('label_templates.index.template_set_as_default') }
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error(e.message)
|
|
Rails.logger.error(e.backtrace.join("\n"))
|
|
render json: { error: I18n.t('errors.general') }, status: :unprocessable_entity
|
|
end
|
|
|
|
def template_tags
|
|
render json: LabelTemplates::TagService.new(current_team, @label_template).tags
|
|
end
|
|
|
|
def zpl_preview
|
|
service = LabelTemplatesPreviewService.new(params, current_user)
|
|
|
|
# only render last generated label image
|
|
payload = service.generate_zpl_preview!.split.last
|
|
|
|
if service.error.blank? && payload.present?
|
|
render json: { base64_preview: payload }
|
|
else
|
|
render json: { error: service.error }, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def sync_fluics_templates
|
|
sync_service = LabelPrinters::Fluics::SyncService.new(current_user, current_team)
|
|
sync_service.sync_templates!
|
|
render json: { message: t('label_templates.fluics.sync.success') }
|
|
rescue StandardError => e
|
|
Rails.logger.error e.message
|
|
render json: { error: t('label_templates.fluics.sync.error') }, status: :unprocessable_entity
|
|
end
|
|
|
|
def actions_toolbar
|
|
render json: {
|
|
actions:
|
|
Toolbars::LabelTemplatesService.new(
|
|
current_user,
|
|
label_template_ids: JSON.parse(params[:items]).map { |i| i['id'] }
|
|
).actions
|
|
}
|
|
end
|
|
|
|
private
|
|
|
|
def check_feature_enabled
|
|
render :promo unless LabelTemplate.enabled?
|
|
end
|
|
|
|
def check_view_permissions
|
|
render_403 unless can_view_label_templates?(current_team)
|
|
end
|
|
|
|
def check_manage_permissions
|
|
render_403 unless can_manage_label_templates?(current_team)
|
|
end
|
|
|
|
def load_label_templates
|
|
@label_templates = LabelTemplate.enabled? ? current_team.label_templates : current_team.label_templates.default
|
|
end
|
|
|
|
def load_label_template
|
|
@label_template = LabelTemplate.find(params[:id])
|
|
|
|
current_team_switch(@label_template.team) if current_team != @label_template.team
|
|
end
|
|
|
|
def label_template_params
|
|
params.require(:label_template).permit(:name, :description, :content, :width_mm, :height_mm, :unit, :density)
|
|
end
|
|
|
|
def log_activity(type_of, label_template = @label_template, message_items: {})
|
|
message_items = { label_template: label_template.id } if message_items.blank?
|
|
message_items[:type] = I18n.t("label_templates.types.#{label_template.class.name.underscore}")
|
|
Activities::CreateActivityService
|
|
.call(activity_type: type_of,
|
|
owner: current_user,
|
|
subject: label_template,
|
|
team: label_template.team,
|
|
message_items: message_items)
|
|
end
|
|
|
|
def set_breadcrumbs_items
|
|
@breadcrumbs_items = []
|
|
|
|
@breadcrumbs_items.push({
|
|
label: t('breadcrumbs.templates'),
|
|
})
|
|
|
|
@breadcrumbs_items.push({
|
|
label: t('breadcrumbs.labels'),
|
|
url: label_templates_path
|
|
})
|
|
if @label_template
|
|
@breadcrumbs_items.push({
|
|
label: @label_template.name,
|
|
url: label_template_path(@label_template)
|
|
})
|
|
end
|
|
end
|
|
end
|