diff --git a/app/assets/javascripts/channels/broadcasts.coffee b/app/assets/javascripts/channels/broadcasts.coffee index 9ed744f..f163bee 100644 --- a/app/assets/javascripts/channels/broadcasts.coffee +++ b/app/assets/javascripts/channels/broadcasts.coffee @@ -21,7 +21,8 @@ $(document).on "turbolinks:load", -> refreshBroadcastVideo: (data) -> $("#broadcast_updates").html data.status_content - if data.streamer_status == 'recording' && data.status == 'active' + stream_selected = $("#broadcast_video").attr('video-type') == 'stream'; + if data.streamer_status == 'recording' && data.status == 'active' && stream_selected $("#broadcast_video").html data.video_content new (Clappr.Player)( parentId: '#broadcast_video' diff --git a/app/assets/javascripts/group_qr_code.js b/app/assets/javascripts/group_qr_code.js new file mode 100644 index 0000000..e297cc2 --- /dev/null +++ b/app/assets/javascripts/group_qr_code.js @@ -0,0 +1,50 @@ +$(document).on("click", "[data-behavior=select_contract_template]", function() { + var _this = this; + var checkbox = $(this).children("input:checkbox"); + + selectContractTemplate(_this, checkbox); +}); + +$(document).on("click", "[data-behavior=select_contract_template] input[type='checkbox']", function(e) { + e.stopPropagation(); + + var _this = this; + var checkbox = $(this); + + selectContractTemplate(_this, checkbox); +}); + +function selectContractTemplate(clicked_element, checkbox) { + if (clicked_element.hasChildNodes()) { + if(checkbox.prop("checked")) { + checkbox.prop('checked', false); + } else { + checkbox.prop('checked', true); + } + } + + var checked = checkbox.prop("checked"); + var project_id = JSON.parse($('#group_qr_code').attr('data-project-id')); + var contract_template_ids = JSON.parse($('#group_qr_code').attr('data-contract-template-ids')); + var selected_contract_template_id = checkbox.val(); + + if (checked && !contract_template_ids.includes(selected_contract_template_id)) { + contract_template_ids.push(selected_contract_template_id); + } else if(!checked && contract_template_ids.includes(selected_contract_template_id)) { + contract_template_ids.splice( $.inArray(selected_contract_template_id, contract_template_ids), 1 ); + } + + $('#group_qr_code').attr('data-contract-template-ids', JSON.stringify(contract_template_ids)); + + if (contract_template_ids.length >= 2) { + multi_sign_ids = $.param({multi_sign_ids: contract_template_ids}); + contract_template_url = "/en/contract_templates/" + contract_template_ids[0] + "/qr_codes?" + multi_sign_ids + + $("#group_qr_code").attr("href", contract_template_url); + $("#group_qr_code").attr("target", "_blank"); + $("#group_qr_code").removeClass('disabled'); + } else if (contract_template_ids.length < 2) { + $("#group_qr_code").attr("href", "javascript:void(0);"); + $("#group_qr_code").addClass('disabled'); + } +} diff --git a/app/assets/javascripts/play_previous_recordings.js.erb b/app/assets/javascripts/stream_player.js.erb similarity index 80% rename from app/assets/javascripts/play_previous_recordings.js.erb rename to app/assets/javascripts/stream_player.js.erb index c3c7b49..4a9f00d 100644 --- a/app/assets/javascripts/play_previous_recordings.js.erb +++ b/app/assets/javascripts/stream_player.js.erb @@ -3,7 +3,7 @@ $(document).on("click", "[data-behavior=play_recording]", function() { return false; } - console.warn('Play prev : ', playback_url); + $("#broadcast_video").attr('video-type', 'recording'); var playback_url = $(this).attr("data-playback-url") $("#broadcast_video").empty(); @@ -23,4 +23,6 @@ $(document).on("click", "[data-behavior=play_recording]", function() { $(this).siblings().children("i").remove(); $(this).addClass('active'); $(this).prepend(' '); -}); \ No newline at end of file +}); + +$(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").attr('video-type', 'stream'); }); \ No newline at end of file diff --git a/app/controllers/approvals_controller.rb b/app/controllers/approvals_controller.rb index ad7bdd9..8b680cd 100644 --- a/app/controllers/approvals_controller.rb +++ b/app/controllers/approvals_controller.rb @@ -1,21 +1,28 @@ class ApprovalsController < ApplicationController - include MedicalReleaseContext - - before_action :set_medical_release + before_action :set_releasable before_action :set_project layout "project" def create - @medical_release.approve_by(current_user) - if @medical_release.save - redirect_to [@project, :medical_releases], notice: t('.release_approved') + @releasable.approve_by(current_user) + + if @releasable.save + redirect_to [@project, "#{@releasable_param.name.pluralize}"], notice: t('.release_approved', release_type: @releasable.model_name.human) end end private + def releasable_param + @releasable_param ||= ReleasableParam.new(params.to_unsafe_h) + end + + def set_releasable + @releasable = authorize policy_scope(releasable_param.type).find(releasable_param.id) + end + def set_project - @project = @medical_release.project + @project = @releasable.project end end diff --git a/app/controllers/contract_templates/qr_codes_controller.rb b/app/controllers/contract_templates/qr_codes_controller.rb index ffb9ee7..a0bebbb 100644 --- a/app/controllers/contract_templates/qr_codes_controller.rb +++ b/app/controllers/contract_templates/qr_codes_controller.rb @@ -16,7 +16,12 @@ class ContractTemplates::QrCodesController < ApplicationController end def qr_code - authorize QrCode.build_from_contract_template(@contract_template) + if params[:multi_sign_ids].present? + contract_templates_group = authorize contract_templates.where(id: params[:multi_sign_ids]).order_by_recent + authorize QrCode.build_from_multiple_contract_templates(contract_templates_group, @contract_template.project) + else + authorize QrCode.build_from_contract_template(@contract_template) + end end def download_attributes diff --git a/app/controllers/public/contract_templates_controller.rb b/app/controllers/public/contract_templates_controller.rb new file mode 100644 index 0000000..52dfba9 --- /dev/null +++ b/app/controllers/public/contract_templates_controller.rb @@ -0,0 +1,18 @@ +class Public::ContractTemplatesController < Public::BaseController + skip_after_action :verify_authorized, :verify_policy_scoped + before_action :set_account, :set_project + + def index + @contract_templates = @project.contract_templates.where(id: params[:contract_template_ids]).order_by_name.paginate(page: params[:page]) + end + + private + + def set_project + @project = @account.projects.find(params[:project_id]) + end + + def set_account + @account = Account.find_by(slug: params[:account_id]) + end +end \ No newline at end of file diff --git a/app/helpers/tooltip_helper.rb b/app/helpers/tooltip_helper.rb index f409b97..b401e60 100644 --- a/app/helpers/tooltip_helper.rb +++ b/app/helpers/tooltip_helper.rb @@ -6,11 +6,11 @@ module TooltipHelper end end - def get_approval_data_for_medical_release(medical_release) - if medical_release.approved_by_user_name.present? - "#{medical_release.approved_by_user_name} [#{medical_release.approved_by_user_email}]" + def get_approval_data_for_releasable(release) + if release.approved_by_user_name.present? + "#{release.approved_by_user_name} [#{release.approved_by_user_email}]" else - medical_release.approved_by_user_email + release.approved_by_user_email end end end diff --git a/app/models/acquired_media_release.rb b/app/models/acquired_media_release.rb index 8b7a7b0..d05f127 100644 --- a/app/models/acquired_media_release.rb +++ b/app/models/acquired_media_release.rb @@ -10,6 +10,7 @@ class AcquiredMediaRelease < ApplicationRecord include Syncable include PersonName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/appearance_release.rb b/app/models/appearance_release.rb index c9bb4c0..00576e1 100644 --- a/app/models/appearance_release.rb +++ b/app/models/appearance_release.rb @@ -16,6 +16,7 @@ class AppearanceRelease < ApplicationRecord include GuardianName include SecondGuardianName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/concerns/approvable.rb b/app/models/concerns/approvable.rb new file mode 100644 index 0000000..d55b64b --- /dev/null +++ b/app/models/concerns/approvable.rb @@ -0,0 +1,17 @@ +module Approvable + extend ActiveSupport::Concern + + included do + def approve_by(user) + return unless approved_at.nil? + + self.approved_by_user_name = user.full_name + self.approved_by_user_email = user.email + self.approved_at = Time.zone.now + end + + def approved? + self.approved_at.present? + end + end +end diff --git a/app/models/concerns/csv_exportable.rb b/app/models/concerns/csv_exportable.rb index 4619e86..3b03f59 100644 --- a/app/models/concerns/csv_exportable.rb +++ b/app/models/concerns/csv_exportable.rb @@ -3,7 +3,7 @@ module CsvExportable extend ActiveSupport::Concern - COMMON_HEADERS = %i[notes tags signed_at].freeze + COMMON_HEADERS = %i[approved? notes tags signed_at].freeze COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze included do diff --git a/app/models/location_release.rb b/app/models/location_release.rb index 1e49d73..f6063e8 100644 --- a/app/models/location_release.rb +++ b/app/models/location_release.rb @@ -11,6 +11,7 @@ class LocationRelease < ApplicationRecord include Taggable include PersonName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/material_release.rb b/app/models/material_release.rb index dc5380e..874981b 100644 --- a/app/models/material_release.rb +++ b/app/models/material_release.rb @@ -11,6 +11,7 @@ class MaterialRelease < ApplicationRecord include Taggable include PersonName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/medical_release.rb b/app/models/medical_release.rb index e037ef5..6e12549 100644 --- a/app/models/medical_release.rb +++ b/app/models/medical_release.rb @@ -12,10 +12,11 @@ class MedicalRelease < ApplicationRecord include GuardianName include SecondGuardianName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers - %i[approved? name contact_info] + %i[name contact_info] end end @@ -107,18 +108,6 @@ class MedicalRelease < ApplicationRecord "#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}" end - def approve_by(user) - return unless approved_at.nil? - - self.approved_by_user_name = user.full_name - self.approved_by_user_email = user.email - self.approved_at = Time.zone.now - end - - def approved? - approved_at.present? - end - private def valid_answers diff --git a/app/models/misc_release.rb b/app/models/misc_release.rb index 2679542..f59dbec 100644 --- a/app/models/misc_release.rb +++ b/app/models/misc_release.rb @@ -10,6 +10,7 @@ class MiscRelease < ApplicationRecord include GuardianName include GuardianPhotoable include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/music_release.rb b/app/models/music_release.rb index b324b9f..9c8454e 100644 --- a/app/models/music_release.rb +++ b/app/models/music_release.rb @@ -8,6 +8,7 @@ class MusicRelease < ApplicationRecord include Taggable include PersonName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/qr_code.rb b/app/models/qr_code.rb index 2dd13de..a26a0df 100644 --- a/app/models/qr_code.rb +++ b/app/models/qr_code.rb @@ -13,6 +13,18 @@ class QrCode new(url, "#{filename}.png") end + def self.build_from_multiple_contract_templates(contract_templates, project) + account = project.account + locale = I18n.locale + host = AppHost.new.domain_with_port + route = [account, project, :contract_templates, contract_template_ids: contract_templates.ids, locale: I18n.locale, host: AppHost.new.domain_with_port] + + url = Rails.application.routes.url_helpers.url_for(route) + filename = [project.account.name, project.name].map(&:parameterize).join("_") + + new(url, "#{filename}.png") + end + def initialize(url, filename = "qrcode.png") @url = url @filename = filename diff --git a/app/models/talent_release.rb b/app/models/talent_release.rb index f507ba7..74efb83 100644 --- a/app/models/talent_release.rb +++ b/app/models/talent_release.rb @@ -15,6 +15,7 @@ class TalentRelease < ApplicationRecord include GuardianName include SecondGuardianName include CsvExportable + include Approvable class << self def custom_csv_exportable_headers diff --git a/app/models/task_request.rb b/app/models/task_request.rb index 04345ac..7f43e18 100644 --- a/app/models/task_request.rb +++ b/app/models/task_request.rb @@ -6,5 +6,5 @@ class TaskRequest < ApplicationRecord scope :order_by_recent, -> { order(created_at: :desc) } - validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 } + validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 }, allow_blank: true end diff --git a/app/policies/acquired_media_release_policy.rb b/app/policies/acquired_media_release_policy.rb index f2e5108..9d59ba8 100644 --- a/app/policies/acquired_media_release_policy.rb +++ b/app/policies/acquired_media_release_policy.rb @@ -30,4 +30,12 @@ class AcquiredMediaReleasePolicy < ApplicationPolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/appearance_release_policy.rb b/app/policies/appearance_release_policy.rb index b49287b..dd58643 100644 --- a/app/policies/appearance_release_policy.rb +++ b/app/policies/appearance_release_policy.rb @@ -26,4 +26,12 @@ class AppearanceReleasePolicy < ReleasePolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/location_release_policy.rb b/app/policies/location_release_policy.rb index 66e2114..ead9d02 100644 --- a/app/policies/location_release_policy.rb +++ b/app/policies/location_release_policy.rb @@ -34,4 +34,12 @@ class LocationReleasePolicy < ReleasePolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/material_release_policy.rb b/app/policies/material_release_policy.rb index 4c834f7..4d1192f 100644 --- a/app/policies/material_release_policy.rb +++ b/app/policies/material_release_policy.rb @@ -34,4 +34,12 @@ class MaterialReleasePolicy < ReleasePolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/misc_release_policy.rb b/app/policies/misc_release_policy.rb index 06bae3b..df9e59c 100644 --- a/app/policies/misc_release_policy.rb +++ b/app/policies/misc_release_policy.rb @@ -38,4 +38,12 @@ class MiscReleasePolicy < ReleasePolicy def download_multiple? download_single? end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/music_release_policy.rb b/app/policies/music_release_policy.rb index 14d0224..20688f7 100644 --- a/app/policies/music_release_policy.rb +++ b/app/policies/music_release_policy.rb @@ -22,4 +22,12 @@ class MusicReleasePolicy < ReleasePolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/policies/talent_release_policy.rb b/app/policies/talent_release_policy.rb index 5d3a308..ec440b9 100644 --- a/app/policies/talent_release_policy.rb +++ b/app/policies/talent_release_policy.rb @@ -34,4 +34,12 @@ class TalentReleasePolicy < ReleasePolicy def download_multiple? true end + + def review? + user.account_manager? + end + + def approve? + review? + end end diff --git a/app/views/acquired_media_releases/_acquired_media_release.html.erb b/app/views/acquired_media_releases/_acquired_media_release.html.erb index 4741e61..2ebcc67 100644 --- a/app/views/acquired_media_releases/_acquired_media_release.html.erb +++ b/app/views/acquired_media_releases/_acquired_media_release.html.erb @@ -1,5 +1,13 @@