scinote-web/app/serializers/protocol_serializer.rb

244 lines
6.6 KiB
Ruby

# frozen_string_literal: true
class ProtocolSerializer < ActiveModel::Serializer
include Canaid::Helpers::PermissionsHelper
include Rails.application.routes.url_helpers
include ApplicationHelper
include ActionView::Helpers::TextHelper
include InputSanitizeHelper
attributes :name, :id, :urls, :description, :description_view, :updated_at, :in_repository,
:created_at_formatted, :updated_at_formatted, :added_by, :authors, :keywords, :version,
:code, :published, :version_comment, :archived, :linked, :has_draft,
:published_on_formatted, :published_by, :created_from_version, :assignable_my_module_id
def updated_at
object.updated_at.to_i
end
def version
object.version_number
end
def created_from_version
object.previous_version&.version_number
end
def published
object.in_repository_published?
end
def published_on_formatted
return if object.published_on.blank?
I18n.l(object.published_on, format: :full)
end
def published_by
{
avatar: object.published_by&.avatar_url(:icon_small),
name: object.published_by&.full_name
}
end
def added_by
{
avatar: object.added_by&.avatar_url(:icon_small),
name: object.added_by&.full_name
}
end
def created_at_formatted
I18n.l(object.created_at, format: :full)
end
def updated_at_formatted
I18n.l(object.updated_at, format: :full)
end
def keywords
object.protocol_keywords.map { |i| { label: escape_input(i.name), value: escape_input(i.name) } }
end
def code
object&.parent&.code || object.code
end
def description_view
@user = @instance_options[:user]
custom_auto_link(object.tinymce_render('description'),
simple_format: false,
tags: %w(img),
team: object.team)
end
def description
sanitize_input(object.tinymce_render('description'))
end
def urls
{
load_from_repo_url: load_from_repo_url,
save_to_repo_url: save_to_repo_url,
export_url: export_url,
unlink_url: unlink_url,
revert_protocol_url: revert_protocol_url,
update_protocol_url: update_protocol_url,
steps_url: steps_url,
reorder_steps_url: reorder_steps_url,
add_step_url: add_step_url,
update_protocol_name_url: update_protocol_name_url,
update_protocol_description_url: update_protocol_description_url,
update_protocol_authors_url: update_protocol_authors_url,
update_protocol_keywords_url: update_protocol_keywords_url,
delete_steps_url: delete_steps_url,
publish_url: publish_url,
save_as_draft_url: save_as_draft_url,
versions_modal_url: versions_modal_url,
version_comment_url: version_comment_url,
print_protocol_url: print_protocol_url
}
end
def in_repository
!object.in_module?
end
# rubocop:disable Naming/PredicateName
def has_draft
return false unless object.in_repository_published?
(object.parent || object).draft.present?
end
# rubocop:enable Naming/PredicateName
def linked
object.linked?
end
def assignable_my_module_id
return if in_repository
object.my_module&.id
end
private
def load_from_repo_url
return unless can_manage_protocol_in_module?(object)
load_from_repository_modal_protocol_path(object, format: :json)
end
def save_to_repo_url
return unless can_read_protocol_in_module?(object) && can_create_protocols_in_repository?(object.team)
copy_to_repository_modal_protocol_path(object, format: :json)
end
def export_url
return unless can_read_protocol_in_module?(object)
export_protocols_path(protocol_ids: object.id, my_module_id: object.my_module.id)
end
def steps_url
return unless can_read_protocol_in_module?(object) || can_read_protocol_in_repository?(object)
steps_path(protocol_id: object.id)
end
def versions_modal_url
return unless can_read_protocol_in_repository?(object)
versions_modal_protocol_path(object.parent || object)
end
def print_protocol_url
return unless can_read_protocol_in_repository?(object)
print_protocol_path(object)
end
def reorder_steps_url
return unless can_manage_protocol_in_module?(object) || can_manage_protocol_draft_in_repository?(object)
reorder_protocol_steps_url(protocol_id: object.id)
end
def add_step_url
return unless can_manage_protocol_in_module?(object) || can_manage_protocol_draft_in_repository?(object)
protocol_steps_path(protocol_id: object.id)
end
def unlink_url
return unless can_manage_protocol_in_module?(object) && object.linked?
unlink_modal_protocol_path(object, format: :json)
end
def revert_protocol_url
return unless can_manage_protocol_in_module?(object) && object.linked? &&
object.parent.active? && object.newer_than_parent? &&
can_read_protocol_in_repository?(object.parent)
revert_modal_protocol_path(object, format: :json)
end
def update_protocol_url
return unless can_manage_protocol_in_module?(object) && object.linked? &&
object.parent.active? && object.parent_newer? &&
can_read_protocol_in_repository?(object.parent)
update_from_parent_modal_protocol_path(object, format: :json)
end
def update_protocol_name_url
if in_repository && can_manage_protocol_draft_in_repository?(object)
name_protocol_path(object)
elsif can_manage_protocol_in_module?(object)
protocol_my_module_path(object.my_module)
end
end
def update_protocol_description_url
if in_repository && can_manage_protocol_draft_in_repository?(object)
description_protocol_path(object)
elsif can_manage_protocol_in_module?(object)
protocol_my_module_path(object.my_module)
end
end
def update_protocol_authors_url
authors_protocol_path(object) if in_repository && can_manage_protocol_draft_in_repository?(object)
end
def update_protocol_keywords_url
keywords_protocol_path(object) if in_repository && can_manage_protocol_draft_in_repository?(object)
end
def delete_steps_url
return unless can_manage_protocol_in_module?(object) || can_manage_protocol_draft_in_repository?(object)
delete_steps_protocol_path(object)
end
def publish_url
return unless can_publish_protocol_in_repository?(object)
publish_protocol_path(object)
end
def version_comment_url
return unless can_publish_protocol_in_repository?(object)
version_comment_protocol_path(object)
end
def save_as_draft_url
return unless can_save_protocol_version_as_draft?(object)
save_as_draft_protocol_path(object)
end
end