Compare commits
13 Commits
implement-
...
change-big
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
015ed83ac2 | ||
|
|
1045a8c328 | ||
|
|
8214ba9e67 | ||
|
|
9cbd8d31a8 | ||
|
|
9c3fac4ab9 | ||
|
|
8f13589c55 | ||
|
|
cd0de9154c | ||
|
|
2590b6bdc9 | ||
|
|
40f241b75f | ||
|
|
add8304eab | ||
|
|
f04d34d337 | ||
|
|
c033f5df17 | ||
|
|
7f49f31ebf |
@@ -16,9 +16,10 @@ REDIS_URL=
|
||||
# Required for Zoom.us integration
|
||||
ZOOM_API_KEY=
|
||||
ZOOM_API_SECRET=
|
||||
ZOOM_ACCOUNT_NUMBER=
|
||||
ZOOM_PRO_USERS_LIMIT= # defaults to 3
|
||||
ZOOM_USER_TYPE= # 'pro' / 'basic'
|
||||
ZOOM_ENABLE_RECORDINGS=0 # 0 / 1
|
||||
ZOOM_ENABLE_RECORDINGS= # true / false (default: false)
|
||||
# Token for webhooks authorization
|
||||
ZOOM_VERIFICATION_TOKEN=
|
||||
|
||||
|
||||
@@ -21,11 +21,13 @@ $(document).on "turbolinks:load", ->
|
||||
|
||||
refreshBroadcastVideo: (data) ->
|
||||
$("#broadcast_updates").html data.status_content
|
||||
if data.streamer_status == 'recording' && data.status == 'active'
|
||||
stream_selected = $("#broadcast_video").data('videoType') == 'stream';
|
||||
if data.streamer_status == 'recording' && data.status == 'active' && stream_selected
|
||||
$("#broadcast_video").html data.video_content
|
||||
new (Clappr.Player)(
|
||||
<%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %>
|
||||
parentId: '#broadcast_video'
|
||||
source: data.playback_url
|
||||
source: data.full_live_stream_playback_url
|
||||
width: '100%',
|
||||
height: '100%',
|
||||
mute: true,
|
||||
9
app/assets/javascripts/directory_files_input.js
Normal file
9
app/assets/javascripts/directory_files_input.js
Normal file
@@ -0,0 +1,9 @@
|
||||
$(document).on("turbolinks:load", function() {
|
||||
$("#upload_directory_files").on('click', function(e){
|
||||
const newFilesCount = $('input[name = "directory[files][]"][type = "hidden"]').length;
|
||||
|
||||
if (newFilesCount === 0){
|
||||
e.preventDefault();
|
||||
}
|
||||
});
|
||||
});
|
||||
50
app/assets/javascripts/group_qr_code.js
Normal file
50
app/assets/javascripts/group_qr_code.js
Normal file
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,7 @@ $(document).on("click", "[data-behavior=play_recording]", function() {
|
||||
return false;
|
||||
}
|
||||
|
||||
console.warn('Play prev : ', playback_url);
|
||||
$("#broadcast_video").data('videoType', '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('<i class="fa fa-check"> </i>');
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").data('videoType', 'stream'); });
|
||||
@@ -16,6 +16,7 @@ class BroadcastsChannel < ApplicationCable::Channel
|
||||
event: :broadcast_stream_update,
|
||||
status: broadcast.status,
|
||||
playback_url: broadcast.stream_playback_url,
|
||||
full_live_stream_playback_url: broadcast.full_live_stream_playback_url,
|
||||
video_content: video_content,
|
||||
status_content: status_content,
|
||||
streamer_status: broadcast.streamer_status
|
||||
|
||||
@@ -56,35 +56,74 @@ class AcquiredMediaReleasesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def person_params
|
||||
%i[
|
||||
person_first_name
|
||||
person_last_name
|
||||
person_phone
|
||||
person_company
|
||||
person_email
|
||||
person_title
|
||||
person_address_street1
|
||||
person_address_street2
|
||||
person_address_city
|
||||
person_address_state
|
||||
person_address_zip
|
||||
person_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def guardian_params
|
||||
%i[
|
||||
guardian_first_name
|
||||
guardian_last_name
|
||||
guardian_phone
|
||||
guardian_email
|
||||
guardian_photo
|
||||
guardian_address_street1
|
||||
guardian_address_street2
|
||||
guardian_address_city
|
||||
guardian_address_state
|
||||
guardian_address_zip
|
||||
guardian_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def second_guardian_params
|
||||
%i[
|
||||
guardian_2_first_name
|
||||
guardian_2_last_name
|
||||
guardian_2_phone
|
||||
guardian_2_email
|
||||
guardian_2_photo
|
||||
guardian_2_address_street1
|
||||
guardian_2_address_street2
|
||||
guardian_2_address_city
|
||||
guardian_2_address_state
|
||||
guardian_2_address_zip
|
||||
guardian_2_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def acquired_media_release_params
|
||||
params.require(:acquired_media_release).permit(
|
||||
:name,
|
||||
:territory,
|
||||
:term,
|
||||
:person_first_name,
|
||||
:person_last_name,
|
||||
:person_phone,
|
||||
:person_email,
|
||||
:person_company,
|
||||
:person_title,
|
||||
:person_address_street1,
|
||||
:person_address_street2,
|
||||
:person_address_city,
|
||||
:person_address_state,
|
||||
:person_address_zip,
|
||||
:person_address_country,
|
||||
:contract,
|
||||
:applicable_medium_id, :applicable_medium_text,
|
||||
:territory_id, :territory_text,
|
||||
:term_id, :term_text,
|
||||
:restriction_id, :restriction_text,
|
||||
categories: [],
|
||||
file_infos_attributes: [
|
||||
:filename,
|
||||
:content_type,
|
||||
:byte_size
|
||||
]
|
||||
)
|
||||
params.require(:acquired_media_release).permit(person_params,
|
||||
guardian_params,
|
||||
second_guardian_params,
|
||||
:minor,
|
||||
:name,
|
||||
:territory,
|
||||
:term,
|
||||
:contract,
|
||||
:applicable_medium_id, :applicable_medium_text,
|
||||
:territory_id, :territory_text,
|
||||
:term_id, :term_text,
|
||||
:restriction_id, :restriction_text,
|
||||
categories: [],
|
||||
file_infos_attributes: %i[
|
||||
filename
|
||||
content_type
|
||||
byte_size
|
||||
])
|
||||
end
|
||||
|
||||
def build_acquired_media_release(attrs = {})
|
||||
|
||||
@@ -20,6 +20,7 @@ class Admin::AccountsController < Admin::ApplicationController
|
||||
|
||||
def show
|
||||
@videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||
@broadcasts = account_broadcasts.order(created_at: :desc, project_id: :desc).paginate(page: params[:page])
|
||||
end
|
||||
|
||||
def edit
|
||||
@@ -70,4 +71,8 @@ class Admin::AccountsController < Admin::ApplicationController
|
||||
@account.videos
|
||||
end
|
||||
end
|
||||
|
||||
def account_broadcasts
|
||||
@account.broadcasts
|
||||
end
|
||||
end
|
||||
|
||||
24
app/controllers/admin/broadcasts_controller.rb
Normal file
24
app/controllers/admin/broadcasts_controller.rb
Normal file
@@ -0,0 +1,24 @@
|
||||
class Admin::BroadcastsController < Admin::ApplicationController
|
||||
before_action :set_broadcast, only: [:edit, :update]
|
||||
|
||||
def edit
|
||||
end
|
||||
|
||||
def update
|
||||
if @broadcast.update(broadcast_update_params)
|
||||
redirect_to [:admin, @broadcast.project.account], notice: t(".notice")
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_broadcast
|
||||
@broadcast = authorize policy_scope(Broadcast).find(params[:id])
|
||||
end
|
||||
|
||||
def broadcast_update_params
|
||||
params.require(:broadcast).permit(:stream_url_override, :stream_key_override, :director_mode_video_embed)
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
|
||||
26
app/controllers/broadcast_recordings_controller.rb
Normal file
26
app/controllers/broadcast_recordings_controller.rb
Normal file
@@ -0,0 +1,26 @@
|
||||
class BroadcastRecordingsController < ApplicationController
|
||||
layout "project"
|
||||
|
||||
before_action :set_project
|
||||
before_action :set_broadcast
|
||||
before_action :set_recording
|
||||
|
||||
def destroy
|
||||
@recording.update(hidden: true)
|
||||
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def set_project
|
||||
@project = policy_scope(Project).find(params[:project_id])
|
||||
end
|
||||
|
||||
def set_broadcast
|
||||
@broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id])
|
||||
end
|
||||
|
||||
def set_recording
|
||||
@recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id])
|
||||
end
|
||||
end
|
||||
@@ -3,7 +3,7 @@ class BroadcastsController < ApplicationController
|
||||
|
||||
before_action :set_project
|
||||
before_action :build_broadcast, only: [:new, :create]
|
||||
before_action :set_broadcast, only: [:show, :destroy, :update]
|
||||
before_action :set_broadcast, only: [:show, :destroy, :update, :destroy_file]
|
||||
before_action :set_multi_view_broadcasts, only: [:show]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
@@ -27,17 +27,19 @@ class BroadcastsController < ApplicationController
|
||||
|
||||
def show
|
||||
@conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting]
|
||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
||||
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||
render layout: 'application'
|
||||
end
|
||||
|
||||
def update
|
||||
@broadcast.update(broadcast_params)
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||
unless params.has_key?(:broadcast)
|
||||
@broadcast.regenerate_token
|
||||
redirect_to([@project, @broadcast], notice: t('.reset_notice')) and return
|
||||
end
|
||||
|
||||
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab], page: params[:page], active_files_tab: params[:active_files_tab] })
|
||||
BroadcastsChannel.broadcast_file_upload_updates(@broadcast, @files, pagination_content)
|
||||
@broadcast.update(broadcast_params)
|
||||
update_files_section
|
||||
end
|
||||
|
||||
def destroy
|
||||
@@ -48,14 +50,29 @@ class BroadcastsController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def destroy_file
|
||||
authorize Broadcast
|
||||
file = ActiveStorage::Attachment.find(params[:file_id])
|
||||
file.destroy
|
||||
|
||||
update_files_section
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_files_section
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||
|
||||
pagination_content = ApplicationController.render html: helpers.will_paginate(@files, params: { active_tab: params[:active_tab], page: params[:page], active_files_tab: params[:active_files_tab] })
|
||||
BroadcastsChannel.broadcast_file_upload_updates(@broadcast, @files, pagination_content)
|
||||
end
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if broadcasts.count.zero?
|
||||
end
|
||||
|
||||
def broadcast_params
|
||||
params.require(:broadcast).permit(:name, files: [])
|
||||
params.require(:broadcast).permit(:name, :shoot_location_time_zone, files: [])
|
||||
end
|
||||
|
||||
def set_project
|
||||
|
||||
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ContractTemplates::DuplicatesController < ApplicationController
|
||||
before_action :set_contract_template
|
||||
|
||||
def create
|
||||
authorize(ContractTemplate)
|
||||
new_contract_template = @contract_template.dup
|
||||
new_contract_template.name = I18n.t('contract_templates.duplicate.name_prefix', template_name: @contract_template.name)
|
||||
|
||||
# Duplicate rich text fields
|
||||
|
||||
new_contract_template.body = @contract_template.body
|
||||
new_contract_template.guardian_clause = @contract_template.guardian_clause
|
||||
new_contract_template.signature_legal_text = @contract_template.signature_legal_text
|
||||
|
||||
if new_contract_template.save
|
||||
redirect_to [:edit, new_contract_template]
|
||||
else
|
||||
redirect_to [@contract_template.project, :contract_templates], alert: t('.error')
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def contract_templates
|
||||
policy_scope(ContractTemplate)
|
||||
end
|
||||
|
||||
def set_contract_template
|
||||
@contract_template = contract_templates.find(params[:contract_template_id])
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
|
||||
@@ -5,8 +5,9 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
layout 'project'
|
||||
|
||||
before_action :set_project, except: [:destroy]
|
||||
before_action :set_contract_template, only: [:destroy]
|
||||
before_action :set_project, except: [:destroy, :edit, :update]
|
||||
before_action :set_contract_template, only: [:destroy, :edit, :update]
|
||||
before_action :set_project_from_contract_template, only: [:edit, :update]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def index
|
||||
@@ -32,6 +33,20 @@ class ContractTemplatesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
@release_type = @contract_template.release_type
|
||||
end
|
||||
|
||||
def update
|
||||
@contract_template.attributes = contract_template_params
|
||||
|
||||
if @contract_template.save
|
||||
redirect_to [@project, :contract_templates], notice: t('.notice')
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@contract_template.archive
|
||||
redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice')
|
||||
@@ -39,6 +54,10 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def set_project_from_contract_template
|
||||
@project = @contract_template.project
|
||||
end
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if contract_templates.non_archived.count.zero?
|
||||
end
|
||||
@@ -63,7 +82,7 @@ class ContractTemplatesController < ApplicationController
|
||||
params
|
||||
.require(:contract_template)
|
||||
.permit(:name, :release_type, :body, :guardian_clause,
|
||||
:signature_legal_text, :fee,
|
||||
:signature_legal_text, :fee, :amendment_clause,
|
||||
:applicable_medium_id, :applicable_medium_text,
|
||||
:territory_id, :territory_text,
|
||||
:term_id, :term_text, :accessibility,
|
||||
|
||||
@@ -50,11 +50,58 @@ class MaterialReleasesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def person_params
|
||||
%i[
|
||||
person_first_name
|
||||
person_last_name
|
||||
person_phone
|
||||
person_company
|
||||
person_email
|
||||
person_title
|
||||
person_address_street1
|
||||
person_address_street2
|
||||
person_address_city
|
||||
person_address_state
|
||||
person_address_zip
|
||||
person_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def guardian_params
|
||||
%i[
|
||||
guardian_first_name
|
||||
guardian_last_name
|
||||
guardian_phone
|
||||
guardian_email
|
||||
guardian_photo
|
||||
guardian_address_street1
|
||||
guardian_address_street2
|
||||
guardian_address_city
|
||||
guardian_address_state
|
||||
guardian_address_zip
|
||||
guardian_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def second_guardian_params
|
||||
%i[
|
||||
guardian_2_first_name
|
||||
guardian_2_last_name
|
||||
guardian_2_phone
|
||||
guardian_2_email
|
||||
guardian_2_photo
|
||||
guardian_2_address_street1
|
||||
guardian_2_address_street2
|
||||
guardian_2_address_city
|
||||
guardian_2_address_state
|
||||
guardian_2_address_zip
|
||||
guardian_2_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def material_release_params
|
||||
params.require(:material_release).permit(
|
||||
params.require(:material_release).permit(person_params, guardian_params, second_guardian_params, :minor,
|
||||
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
||||
:person_first_name, :person_last_name, :person_title, :person_company, :person_phone, :person_email,
|
||||
:person_address_street1, :person_address_street2, :person_address_city, :person_address_state, :person_address_zip, :person_address_country,
|
||||
:applicable_medium_id, :applicable_medium_text,
|
||||
:territory_id, :territory_text,
|
||||
:term_id, :term_text,
|
||||
|
||||
@@ -41,31 +41,70 @@ class Public::AcquiredMediaReleasesController < Public::BaseController
|
||||
end
|
||||
end
|
||||
|
||||
def person_params
|
||||
%i[
|
||||
person_first_name
|
||||
person_last_name
|
||||
person_phone
|
||||
person_fax
|
||||
person_email
|
||||
person_title
|
||||
person_address_street1
|
||||
person_address_street2
|
||||
person_address_city
|
||||
person_address_state
|
||||
person_address_zip
|
||||
person_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def guardian_params
|
||||
%i[
|
||||
guardian_first_name
|
||||
guardian_last_name
|
||||
guardian_phone
|
||||
guardian_email
|
||||
guardian_photo
|
||||
guardian_address_street1
|
||||
guardian_address_street2
|
||||
guardian_address_city
|
||||
guardian_address_state
|
||||
guardian_address_zip
|
||||
guardian_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def second_guardian_params
|
||||
%i[
|
||||
guardian_2_first_name
|
||||
guardian_2_last_name
|
||||
guardian_2_phone
|
||||
guardian_2_email
|
||||
guardian_2_photo
|
||||
guardian_2_address_street1
|
||||
guardian_2_address_street2
|
||||
guardian_2_address_city
|
||||
guardian_2_address_state
|
||||
guardian_2_address_zip
|
||||
guardian_2_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def acquired_media_release_params
|
||||
params.require(:acquired_media_release).permit(
|
||||
:name,
|
||||
:description,
|
||||
:person_first_name,
|
||||
:person_last_name,
|
||||
:person_email,
|
||||
:person_title,
|
||||
:person_phone,
|
||||
:person_fax,
|
||||
:person_address_street1,
|
||||
:person_address_street2,
|
||||
:person_address_city,
|
||||
:person_address_state,
|
||||
:person_address_zip,
|
||||
:person_address_country,
|
||||
:signature_base64,
|
||||
:locale, :contract_template,
|
||||
categories: [],
|
||||
file_infos_attributes: [
|
||||
:filename,
|
||||
:content_type,
|
||||
:byte_size
|
||||
]
|
||||
)
|
||||
params.require(:acquired_media_release).permit(person_params,
|
||||
guardian_params,
|
||||
second_guardian_params,
|
||||
:minor,
|
||||
:name,
|
||||
:description,
|
||||
:signature_base64,
|
||||
:locale, :contract_template,
|
||||
categories: [],
|
||||
file_infos_attributes: %i[
|
||||
filename
|
||||
content_type
|
||||
byte_size
|
||||
])
|
||||
end
|
||||
|
||||
def acquired_media_release_params_with_locale
|
||||
|
||||
47
app/controllers/public/amendments_controller.rb
Normal file
47
app/controllers/public/amendments_controller.rb
Normal file
@@ -0,0 +1,47 @@
|
||||
class Public::AmendmentsController < Public::BaseController
|
||||
skip_after_action :verify_authorized, :verify_policy_scoped
|
||||
before_action :set_account, :set_project, :set_contract_template, :set_release
|
||||
|
||||
def new
|
||||
if @release.amendment_signed?
|
||||
render :create, locals: { already_signed: true }
|
||||
end
|
||||
end
|
||||
|
||||
def create
|
||||
if @release.amendment_signed?
|
||||
render :create, locals: { already_signed: true }
|
||||
return
|
||||
end
|
||||
|
||||
@release.attributes = amendment_params
|
||||
|
||||
render :new unless @release.save(context: :amendment)
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def amendment_params
|
||||
params.require(releasable_param.name).permit(:amendment_signer_name, :amendment_signature_base64)
|
||||
end
|
||||
|
||||
def releasable_param
|
||||
@releasable_param ||= ReleasableParam.new(params.to_unsafe_h)
|
||||
end
|
||||
|
||||
def set_release
|
||||
@release = @contract_template.releases.find(releasable_param.id)
|
||||
end
|
||||
|
||||
def set_contract_template
|
||||
@contract_template = @project.contract_templates.find(params[:contract_template_id])
|
||||
end
|
||||
|
||||
def set_project
|
||||
@project = @account.projects.find(params[:project_id])
|
||||
end
|
||||
|
||||
def set_account
|
||||
@account = Account.find_by(slug: params[:account_id])
|
||||
end
|
||||
end
|
||||
@@ -5,7 +5,7 @@ class Public::BroadcastsController < Public::BaseController
|
||||
def show
|
||||
@conference_url = broadcast_zoom_meeting_url(@broadcast.token)
|
||||
@multi_view_broadcasts = multi_view_broadcasts
|
||||
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
||||
@recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
|
||||
|
||||
render 'broadcasts/show'
|
||||
|
||||
18
app/controllers/public/contract_templates_controller.rb
Normal file
18
app/controllers/public/contract_templates_controller.rb
Normal file
@@ -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
|
||||
@@ -39,11 +39,59 @@ class Public::MaterialReleasesController < Public::BaseController
|
||||
authorize material_releases.build(params)
|
||||
end
|
||||
|
||||
def person_params
|
||||
%i[
|
||||
person_first_name
|
||||
person_last_name
|
||||
person_phone
|
||||
person_email
|
||||
person_title
|
||||
person_company
|
||||
person_address_street1
|
||||
person_address_street2
|
||||
person_address_city
|
||||
person_address_state
|
||||
person_address_zip
|
||||
person_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def guardian_params
|
||||
%i[
|
||||
guardian_first_name
|
||||
guardian_last_name
|
||||
guardian_phone
|
||||
guardian_email
|
||||
guardian_photo
|
||||
guardian_address_street1
|
||||
guardian_address_street2
|
||||
guardian_address_city
|
||||
guardian_address_state
|
||||
guardian_address_zip
|
||||
guardian_address_country
|
||||
]
|
||||
end
|
||||
|
||||
def second_guardian_params
|
||||
%i[
|
||||
guardian_2_first_name
|
||||
guardian_2_last_name
|
||||
guardian_2_phone
|
||||
guardian_2_email
|
||||
guardian_2_photo
|
||||
guardian_2_address_street1
|
||||
guardian_2_address_street2
|
||||
guardian_2_address_city
|
||||
guardian_2_address_state
|
||||
guardian_2_address_zip
|
||||
guardian_2_address_country
|
||||
]
|
||||
end
|
||||
|
||||
|
||||
def material_release_params
|
||||
params.require(:material_release).permit(
|
||||
params.require(:material_release).permit(person_params, guardian_params, second_guardian_params, :minor,
|
||||
:name, :address_street1, :address_street2, :address_city, :address_state, :address_zip, :address_country,
|
||||
:person_first_name, :person_last_name, :person_title, :person_company, :person_phone, :person_email,
|
||||
:person_address_street1, :person_address_street2, :person_address_city, :person_address_state, :person_address_zip, :person_address_country,
|
||||
:signature_base64,
|
||||
:locale, :contract_template, :description, photos: []
|
||||
)
|
||||
|
||||
@@ -14,6 +14,10 @@ class StreamNotificationsController < ApplicationController
|
||||
when "video.live_stream.recording"
|
||||
@broadcast.streamer_recording!
|
||||
notify_users
|
||||
when "video.asset.ready"
|
||||
full_live_stream_playback_uid = notification.dig(:data, :playback_ids, 0, :id)
|
||||
@broadcast.update(full_live_stream_playback_uid: full_live_stream_playback_uid)
|
||||
notify_users
|
||||
when "video.live_stream.active"
|
||||
@broadcast.active!
|
||||
notify_users
|
||||
@@ -31,7 +35,7 @@ class StreamNotificationsController < ApplicationController
|
||||
duration = notification.dig(:data, :duration)
|
||||
|
||||
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration)
|
||||
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
||||
recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page])
|
||||
|
||||
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
||||
message = "Your recent live stream has been recorded and is available for download here: #{link}"
|
||||
@@ -59,7 +63,8 @@ class StreamNotificationsController < ApplicationController
|
||||
end
|
||||
|
||||
def set_broadcast
|
||||
if notification_type == "video.asset.static_renditions.ready"
|
||||
case notification_type
|
||||
when "video.asset.static_renditions.ready", "video.asset.ready"
|
||||
live_stream_id = notification.dig(:stream_notification, :data, :live_stream_id)
|
||||
@broadcast = Broadcast.find_by(stream_uid: live_stream_id)
|
||||
else
|
||||
|
||||
@@ -6,6 +6,6 @@ module MailHelper
|
||||
"1. Tell us the name of the video: \n\n" \
|
||||
"2. Attach each EDL to this email. Please make sure to indicate whether the EDL is a Video Only, Graphics Only, or Audio Only EDL."
|
||||
|
||||
mail_to "info@bigmedia.ai", content, subject: subject, body: body
|
||||
mail_to "info@mesuite.ai", content, subject: subject, body: body
|
||||
end
|
||||
end
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
class AdminMailer < ApplicationMailer
|
||||
default to: %w(bray@bigmedia.ai lee@bigmedia.ai)
|
||||
default to: %w[bray@mesuite.ai]
|
||||
|
||||
def new_video(video)
|
||||
@video = video
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
class ApplicationMailer < ActionMailer::Base
|
||||
default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@bigmedia.ai" }
|
||||
default from: ENV.fetch("MAILER_FROM_ADDRESS") { "support@mesuite.ai" }
|
||||
layout "mailer"
|
||||
end
|
||||
|
||||
@@ -5,6 +5,7 @@ class Account < ApplicationRecord
|
||||
has_many :users, through: :account_auths
|
||||
has_many :projects, dependent: :destroy
|
||||
has_many :videos, through: :projects
|
||||
has_many :broadcasts, through: :projects
|
||||
has_many :contract_templates, through: :projects
|
||||
|
||||
validates :name, presence: true
|
||||
|
||||
@@ -10,6 +10,11 @@ class AcquiredMediaRelease < ApplicationRecord
|
||||
include Syncable
|
||||
include PersonName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
include GuardianPhotoable
|
||||
include SecondGuardianPhotoable
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
@@ -32,6 +37,38 @@ class AcquiredMediaRelease < ApplicationRecord
|
||||
%w(person_address_country country)
|
||||
]
|
||||
|
||||
composed_of :guardian_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_address_street1 street1],
|
||||
%w[guardian_address_street2 street2],
|
||||
%w[guardian_address_city city],
|
||||
%w[guardian_address_state state],
|
||||
%w[guardian_address_zip zip],
|
||||
%w[guardian_address_country country]
|
||||
]
|
||||
|
||||
composed_of :guardian_2_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_2_address_street1 street1],
|
||||
%w[guardian_2_address_street2 street2],
|
||||
%w[guardian_2_address_city city],
|
||||
%w[guardian_2_address_state state],
|
||||
%w[guardian_2_address_zip zip],
|
||||
%w[guardian_2_address_country country]
|
||||
]
|
||||
|
||||
# We don't care for the argument but method WILL receive option name
|
||||
# when called from inside with_option block, hence * argument
|
||||
def self.face_photo_acceptable_content_types(*)
|
||||
['image/png', 'image/jpeg']
|
||||
end
|
||||
|
||||
def self.acceptable_import_file_extensions
|
||||
['.png', '.jpeg', '.jpg', '.pdf']
|
||||
end
|
||||
|
||||
validates :name, presence: true
|
||||
validates :person_email, email: true, allow_blank: true
|
||||
|
||||
@@ -53,8 +90,8 @@ class AcquiredMediaRelease < ApplicationRecord
|
||||
# CATEGORIES = ["Artwork", "Film Footage", "Video Footage", "Still Photograph"].freeze
|
||||
CATEGORIES = ["Film Footage", "Video Footage", "Still Photograph"].freeze
|
||||
|
||||
def minor?
|
||||
false
|
||||
def second_guardian_present?
|
||||
guardian_2_first_name.present?
|
||||
end
|
||||
|
||||
def contact_person
|
||||
|
||||
@@ -40,7 +40,7 @@ class AppHost
|
||||
use_ssl: false,
|
||||
},
|
||||
production: {
|
||||
host: "bigmedia.ai",
|
||||
host: "mesuite.ai",
|
||||
use_ssl: true,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@ class AppearanceRelease < ApplicationRecord
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
|
||||
@@ -30,8 +30,16 @@ class Broadcast < ApplicationRecord
|
||||
"https://stream.mux.com/#{stream_playback_uid}.m3u8"
|
||||
end
|
||||
|
||||
def full_live_stream_playback_url
|
||||
full_live_stream_playback_uid.blank? ? stream_playback_url : "https://stream.mux.com/#{full_live_stream_playback_uid}.m3u8"
|
||||
end
|
||||
|
||||
def stream_server_url
|
||||
ENV['MUX_BROADCAST_SERVER_URL']
|
||||
stream_url_override.presence || ENV["MUX_BROADCAST_SERVER_URL"]
|
||||
end
|
||||
|
||||
def stream_server_key
|
||||
stream_key_override.presence || stream_key
|
||||
end
|
||||
|
||||
def zoom_meeting_url
|
||||
|
||||
@@ -5,6 +5,8 @@ class BroadcastRecording < ApplicationRecord
|
||||
|
||||
validates :asset_uid, uniqueness: true
|
||||
|
||||
scope :visible, -> { where(hidden: false) }
|
||||
|
||||
def download_url
|
||||
"https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}"
|
||||
end
|
||||
@@ -14,6 +16,6 @@ class BroadcastRecording < ApplicationRecord
|
||||
end
|
||||
|
||||
def download_file_name
|
||||
"#{broadcast_name}_Date_#{created_at.strftime("%Y-%m-%d")}_Time_#{created_at.strftime("%T")}".parameterize
|
||||
"#{broadcast_name}_Date_#{created_at.in_time_zone(broadcast.shoot_location_time_zone).strftime("%Y-%m-%d")}_Time_#{created_at.in_time_zone(broadcast.shoot_location_time_zone).strftime("%T")}".parameterize
|
||||
end
|
||||
end
|
||||
|
||||
32
app/models/concerns/amendmenable.rb
Normal file
32
app/models/concerns/amendmenable.rb
Normal file
@@ -0,0 +1,32 @@
|
||||
module Amendmenable
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
included do
|
||||
include ActiveStorageSupport::SupportForBase64
|
||||
|
||||
has_one_base64_attached :amendment_signature
|
||||
|
||||
with_options on: :amendment do
|
||||
validates :amendment_signer_name, presence: true
|
||||
validates :amendment_signature, attached: true
|
||||
end
|
||||
end
|
||||
|
||||
def amendment_signable?
|
||||
contract_template.present? && contract_template.amendment_clause.present?
|
||||
end
|
||||
|
||||
def amendment_signed?
|
||||
amendment_signature.attached?
|
||||
end
|
||||
|
||||
def amendment_signature_base64
|
||||
nil
|
||||
end
|
||||
|
||||
def amendment_signature_base64=(data_uri)
|
||||
return if data_uri.blank?
|
||||
|
||||
amendment_signature.attach(data: data_uri, filename: "amendment_signature.png", content_type: "image/png", identify: "false")
|
||||
end
|
||||
end
|
||||
17
app/models/concerns/approvable.rb
Normal file
17
app/models/concerns/approvable.rb
Normal file
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -22,6 +22,7 @@ class ContractTemplate < ApplicationRecord
|
||||
has_rich_text :body
|
||||
has_rich_text :guardian_clause
|
||||
has_rich_text :signature_legal_text
|
||||
has_rich_text :amendment_clause
|
||||
|
||||
validates :name, presence: true
|
||||
validates :release_type, presence: true
|
||||
@@ -69,9 +70,13 @@ class ContractTemplate < ApplicationRecord
|
||||
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
|
||||
end
|
||||
|
||||
def editable?
|
||||
releases.size.zero?
|
||||
end
|
||||
|
||||
def attributes
|
||||
result = super()
|
||||
result[:signature_legal_text] = signature_legal_text.as_json
|
||||
result[:signature_legal_text] = signature_legal_text.as_json
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
@@ -11,6 +11,8 @@ class LocationRelease < ApplicationRecord
|
||||
include Taggable
|
||||
include PersonName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
include Amendmenable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
|
||||
@@ -11,6 +11,12 @@ class MaterialRelease < ApplicationRecord
|
||||
include Taggable
|
||||
include PersonName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
include GuardianPhotoable
|
||||
include SecondGuardianPhotoable
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
@@ -29,6 +35,39 @@ class MaterialRelease < ApplicationRecord
|
||||
%w(person_address_country country)
|
||||
]
|
||||
|
||||
composed_of :guardian_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_address_street1 street1],
|
||||
%w[guardian_address_street2 street2],
|
||||
%w[guardian_address_city city],
|
||||
%w[guardian_address_state state],
|
||||
%w[guardian_address_zip zip],
|
||||
%w[guardian_address_country country]
|
||||
]
|
||||
|
||||
composed_of :guardian_2_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_2_address_street1 street1],
|
||||
%w[guardian_2_address_street2 street2],
|
||||
%w[guardian_2_address_city city],
|
||||
%w[guardian_2_address_state state],
|
||||
%w[guardian_2_address_zip zip],
|
||||
%w[guardian_2_address_country country]
|
||||
]
|
||||
|
||||
# We don't care for the argument but method WILL receive option name
|
||||
# when called from inside with_option block, hence * argument
|
||||
def self.face_photo_acceptable_content_types(*)
|
||||
['image/png', 'image/jpeg']
|
||||
end
|
||||
|
||||
def self.acceptable_import_file_extensions
|
||||
['.png', '.jpeg', '.jpg', '.pdf']
|
||||
end
|
||||
|
||||
|
||||
validates :name, presence: true
|
||||
validates :person_email, email: true, allow_blank: true
|
||||
|
||||
@@ -46,8 +85,8 @@ class MaterialRelease < ApplicationRecord
|
||||
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
|
||||
end
|
||||
|
||||
def minor?
|
||||
false
|
||||
def second_guardian_present?
|
||||
guardian_2_first_name.present?
|
||||
end
|
||||
|
||||
def uses_edl?
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -10,6 +10,7 @@ class MiscRelease < ApplicationRecord
|
||||
include GuardianName
|
||||
include GuardianPhotoable
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
|
||||
@@ -8,6 +8,7 @@ class MusicRelease < ApplicationRecord
|
||||
include Taggable
|
||||
include PersonName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -15,6 +15,7 @@ class TalentRelease < ApplicationRecord
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
include CsvExportable
|
||||
include Approvable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
@@ -110,7 +111,7 @@ class TalentRelease < ApplicationRecord
|
||||
end
|
||||
|
||||
def uses_edl?
|
||||
false
|
||||
true
|
||||
end
|
||||
|
||||
def second_guardian_present?
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -30,4 +30,12 @@ class AcquiredMediaReleasePolicy < ApplicationPolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -26,4 +26,12 @@ class AppearanceReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -18,4 +18,12 @@ class BroadcastPolicy < ApplicationPolicy
|
||||
def update?
|
||||
true
|
||||
end
|
||||
|
||||
def destroy_file?
|
||||
if user.nil? || user.user.nil?
|
||||
return false
|
||||
end
|
||||
|
||||
user.manager? || user.account_manager?
|
||||
end
|
||||
end
|
||||
|
||||
9
app/policies/broadcast_recording_policy.rb
Normal file
9
app/policies/broadcast_recording_policy.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
class BroadcastRecordingPolicy < ApplicationPolicy
|
||||
def destroy?
|
||||
if user.nil? || user.user.nil?
|
||||
return false
|
||||
end
|
||||
|
||||
user.manager? || user.account_manager?
|
||||
end
|
||||
end
|
||||
@@ -23,6 +23,18 @@ class ContractTemplatePolicy < ApplicationPolicy
|
||||
create?
|
||||
end
|
||||
|
||||
def edit?
|
||||
record.editable? && create?
|
||||
end
|
||||
|
||||
def update?
|
||||
edit?
|
||||
end
|
||||
|
||||
def duplicate?
|
||||
create?
|
||||
end
|
||||
|
||||
def import?
|
||||
if user.account_manager?
|
||||
record.project.account = user.account
|
||||
|
||||
@@ -34,4 +34,16 @@ class LocationReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def sign_amendment?
|
||||
user.manager? || user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -34,4 +34,12 @@ class MaterialReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -38,4 +38,12 @@ class MiscReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
download_single?
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -22,4 +22,12 @@ class MusicReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -34,4 +34,12 @@ class TalentReleasePolicy < ReleasePolicy
|
||||
def download_multiple?
|
||||
true
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
end
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(acquired_media_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "acquired_media_release_ids[]", acquired_media_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if acquired_media_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(acquired_media_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: acquired_media_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= acquired_media_release.name %>
|
||||
</td>
|
||||
@@ -35,6 +43,9 @@
|
||||
<% if policy(Contract).show? && (acquired_media_release.contract.attached? || acquired_media_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [acquired_media_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(AcquiredMediaRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_acquired_media_release_approvals_path(acquired_media_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(acquired_media_release).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, acquired_media_release], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
<%= errors_summary_for acquired_media_release %>
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= field_set_tag content_tag(:span, t(".acquired_media_details.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.talent_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<div class="form-row">
|
||||
<%= form.text_field :name, required: true, wrapper_class: "col-12" %>
|
||||
</div>
|
||||
@@ -9,6 +13,28 @@
|
||||
<%= form.check_box :categories, { multiple: true, label: category }, category, false %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
<div class="<%= class_string("collapse" => !acquired_media_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: acquired_media_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: acquired_media_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian" %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_2_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian_2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -19,6 +45,44 @@
|
||||
<strong>For optimal accuracy, please ensure video file names and photo file names match the source file name in the editing sequence.</strong>
|
||||
</div>
|
||||
<%= render "shared/file_infos_dropzone", form: form, releasable: acquired_media_release %>
|
||||
|
||||
<div class="<%= class_string("collapse" => !acquired_media_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<br>
|
||||
<div class="text-left">
|
||||
<p><%= t(".photos.guardian_photo.heading") %></p>
|
||||
<div id="guardian-photo-preview" class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span>No photo yet</span>
|
||||
</div>
|
||||
</div>
|
||||
<% if acquired_media_release.guardian_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("#guardian-photo-preview", "<%= url_for(acquired_media_release.guardian_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="d-inline-block">
|
||||
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if acquired_media_release.guardian_photo.attached?%>
|
||||
<%= form.file_field :guardian_photo, hide_label: true, data: { ujs_target: "guardian-photo-input" }, help: "PNG or JPG only", accept: acquired_media_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
</div>
|
||||
|
||||
<p><%= t(".photos.guardian_2_photo.heading") %></p>
|
||||
<div id="guardian-2-photo-preview" class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-2-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span>No photo yet</span>
|
||||
</div>
|
||||
</div>
|
||||
<% if acquired_media_release.guardian_2_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("#guardian-2-photo-preview", "<%= url_for(acquired_media_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="d-inline-block">
|
||||
<%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if acquired_media_release.guardian_2_photo.attached?%>
|
||||
<%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, help: "PNG or JPG only", accept: acquired_media_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "acquired_media_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th><%= AcquiredMediaRelease.human_attribute_name(:name) %></th>
|
||||
<th><%= t(".table_headers.file_infos_count") %></th>
|
||||
<th><%= t(".table_headers.notes") %></th>
|
||||
|
||||
13
app/views/admin/accounts/_broadcast.html.erb
Normal file
13
app/views/admin/accounts/_broadcast.html.erb
Normal file
@@ -0,0 +1,13 @@
|
||||
<tr>
|
||||
<td><%= broadcast.project.name %></td>
|
||||
<td><%= broadcast.name %></td>
|
||||
<td class="text-right">
|
||||
<div class="btn-group">
|
||||
<%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<%= link_to "View on Mux", "#{ENV['MUX_LIVE_STREAM_DASHBOARD_URL']}/#{broadcast.stream_uid}", class: "dropdown-item", target: "_blank" %>
|
||||
<%= link_to "Edit", [:edit, :admin, broadcast, locale: I18n.locale], class: "dropdown-item" %>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@@ -34,5 +34,25 @@
|
||||
<%= will_paginate @videos %>
|
||||
</div>
|
||||
<% end %>
|
||||
<hr>
|
||||
<%= card_field_set_tag "Broadcasts" do %>
|
||||
<div class="table-responsive-sm">
|
||||
<table class="table table-striped tr-px-4 align-all-middle">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th>Project</th>
|
||||
<th>Name</th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody id="broadcasts">
|
||||
<%= render partial: "admin/accounts/broadcast", collection: @broadcasts %>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<div id="broadcasts_pagination">
|
||||
<%= will_paginate @broadcasts %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
14
app/views/admin/broadcasts/_form.html.erb
Normal file
14
app/views/admin/broadcasts/_form.html.erb
Normal file
@@ -0,0 +1,14 @@
|
||||
<%= errors_summary_for broadcast %>
|
||||
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= form.text_field :stream_url_override %>
|
||||
<%= form.text_field :stream_key_override %>
|
||||
<%= form.text_area :director_mode_video_embed %>
|
||||
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
<%= link_to t("shared.cancel"), [:admin, broadcast.project.account], class: "col-3 text-reset" %>
|
||||
<div class="col-9">
|
||||
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => broadcast.new_record?), data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
6
app/views/admin/broadcasts/edit.html.erb
Normal file
6
app/views/admin/broadcasts/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [:admin, @broadcast.project.account] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: [:admin, @broadcast], broadcast: @broadcast %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(appearance_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "appearance_release_ids[]", appearance_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if appearance_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(appearance_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: appearance_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if appearance_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(appearance_release.photo) %>
|
||||
@@ -39,6 +47,9 @@
|
||||
<% if policy(Contract).show? && (appearance_release.contract.attached? || appearance_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [appearance_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(AppearanceRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_appearance_release_approvals_path(appearance_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(appearance_release).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, appearance_release], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "appearance_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:person_name) %></th>
|
||||
<th><%= AppearanceRelease.human_attribute_name(:contact_info) %></th>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :medical_releases] %>
|
||||
<%= card_header text: t(".heading", release_type: @releasable_param.name.titleize), close_action_path: [@project, "#{@releasable_param.name.pluralize}"] %>
|
||||
<div class="card-body">
|
||||
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for [@medical_release, :contracts, format: "pdf"] %>" width="90%" height="1200" />
|
||||
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for [@releasable, :contracts, format: "pdf"] %>" width="90%" height="1200" />
|
||||
|
||||
<%= bootstrap_form_with model: @medical_release, method: :post, url: medical_release_approvals_path(@medical_release), local: true do |form| %>
|
||||
<%= bootstrap_form_with model: @releasable, method: :post, url: public_send("#{@releasable_param.name}_approvals_path", @releasable), local: true do |form| %>
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
<%= link_to t("shared.cancel"), [@medical_release.project, :medical_releases], class: "col-3 text-reset" %>
|
||||
<%= link_to t("shared.cancel"), [@releasable.project, "#{@releasable_param.name.pluralize}"], class: "col-3 text-reset" %>
|
||||
<div class="col-9">
|
||||
<%= form.button t('.actions.approve'), id: "approve_release", class: class_string("btn btn-block btn-success btn-primary"), data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
|
||||
6
app/views/broadcast_recordings/destroy.js.erb
Normal file
6
app/views/broadcast_recordings/destroy.js.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
var dom_id = "<%= dom_id(@recording) %>"
|
||||
$('[data-id="' + dom_id + '"]').remove();
|
||||
<% if @recordings.empty? %>
|
||||
$("#broadcast_recordings_nav").append('<p class="dropdown-item text-muted">Recordings will appear here</p>')
|
||||
<% end %>
|
||||
$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>");
|
||||
@@ -3,6 +3,9 @@
|
||||
<td>
|
||||
<%= broadcast.name %>
|
||||
</td>
|
||||
<td>
|
||||
<%= broadcast.shoot_location_time_zone %>
|
||||
</td>
|
||||
<td>
|
||||
<%= broadcast.status.titleize %>
|
||||
</td>
|
||||
@@ -13,8 +16,8 @@
|
||||
<div class="btn-group">
|
||||
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<%= link_to fa_icon("link fw", text: "Copy Stream URL"), ENV['MUX_BROADCAST_SERVER_URL'], class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||
<%= link_to fa_icon("key fw", text: "Copy Stream Key"), broadcast.stream_key, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||
<%= link_to fa_icon("link fw", text: "Copy Stream URL"), broadcast.stream_server_url, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||
<%= link_to fa_icon("key fw", text: "Copy Stream Key"), broadcast.stream_server_key, class: "dropdown-item", data: { behavior: "clipboard" } %>
|
||||
<% if policy(broadcast).show? %>
|
||||
<%= link_to fa_icon("file-video-o fw", text: "View"), [broadcast.project, broadcast], class: "dropdown-item", target: '_blank' %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
<%= link_to broadcast_recording.download_file_name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url } %>
|
||||
<%= link_to broadcast_recording.download_file_name, "javascript:void(0);", class: "dropdown-item", data: { behavior: "play_recording", playback_url: broadcast_recording.playback_url, id: dom_id(broadcast_recording) } %>
|
||||
|
||||
|
||||
|
||||
@@ -2,7 +2,12 @@
|
||||
<p>Click below to download the recordings of the live stream.</p>
|
||||
<ul class="mt-2">
|
||||
<% recordings.each do |recording| %>
|
||||
<li><%= link_to(recording.download_file_name, recording.download_url, target: "_blank") %></li>
|
||||
<li>
|
||||
<%= link_to(recording.download_file_name, recording.download_url, target: "_blank") %>
|
||||
<% if (controller.class.module_parent.to_s != "Public" && policy(BroadcastRecording).destroy?) %>
|
||||
<%= link_to "Hide", [broadcast.project, broadcast, recording], class: "btn-sm btn-primary ml-1 text-decoration-none", remote: true, method: :delete, data: { confirm: t('.confirm_hide') } %>
|
||||
<% end %>
|
||||
</li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<div id="recordings_pagination" class="row mt-5 justify-content-center">
|
||||
|
||||
@@ -1,12 +1,25 @@
|
||||
<li class="my-2" id="<%= dom_id(file) %>">
|
||||
<% if file.variable? %>
|
||||
<%= link_to image_tag(file.variant(resize_and_pad: [300, 300, background: "#F7F8F9"]), class: "bg-light img-thumbnail img-fluid"), file, target: "_blank" %>
|
||||
<% else %>
|
||||
<div class="border rounded bg-light text-muted d-flex justify-content-center align-items-center fix-h-and-w">
|
||||
<%= link_to file, target: "_blank" do %>
|
||||
<%= fa_icon("file", style: "font-size: 2rem") %>
|
||||
<div class="mt-2"><%= file.filename %></div>
|
||||
<div class="row">
|
||||
<% broadcast = file.record %>
|
||||
<% show_delete = controller.class.module_parent.to_s == "Public" ? false : policy(broadcast).destroy_file? %>
|
||||
<% file_class = show_delete ? "col-8" : "col-12" %>
|
||||
<div class="<%= file_class %>">
|
||||
<li class="my-2" id="<%= dom_id(file) %>">
|
||||
<% if file.variable? %>
|
||||
<%= link_to image_tag(file.variant(resize_and_pad: [300, 300, background: "#F7F8F9"]), class: "bg-light img-thumbnail img-fluid"), file, target: "_blank" %>
|
||||
<% else %>
|
||||
<div class="border rounded bg-light text-muted d-flex justify-content-center align-items-center img-fluid fix-h-and-w">
|
||||
<%= link_to file, target: "_blank" do %>
|
||||
<%= fa_icon("file", style: "font-size: 2rem") %>
|
||||
<div class="mt-2"><%= file.filename %></div>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</li>
|
||||
</div>
|
||||
<% if show_delete %>
|
||||
<div class="col-4 align-self-center p-0 m-0">
|
||||
<% url = url_for [:destroy_file, broadcast.project, broadcast, { file_id: file.id }] %>
|
||||
<%= link_to fa_icon("trash fw", text: t('.actions.delete_file')), url, class: "btn btn-danger", remote: true, method: :delete, data: { confirm: t('.confirm_delete') } %>
|
||||
</div>
|
||||
<% end %>
|
||||
</li>
|
||||
</div>
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= form.text_field :name %>
|
||||
<%= form.time_zone_select(:shoot_location_time_zone, nil, label: "Time zone of shoot location") %>
|
||||
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
<%= link_to t("shared.cancel"), [project, :broadcasts], class: "col-3 text-reset" %>
|
||||
|
||||
@@ -1,7 +1,11 @@
|
||||
<% if broadcast.streamer_recording? && broadcast.active? %>
|
||||
<div id="broadcast_video" class="embed-responsive-item"></div>
|
||||
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream"></div>
|
||||
<% elsif broadcast.director_mode_video_embed.present? && params[:director_mode] == "true" %>
|
||||
<div class="embed-responsive-item" data-video-type="stream">
|
||||
<%= raw broadcast.director_mode_video_embed %>
|
||||
</div>
|
||||
<% else %>
|
||||
<div id="broadcast_video" class="embed-responsive-item">
|
||||
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream">
|
||||
<table class="w-100 h-100 bg-secondary">
|
||||
<tbody>
|
||||
<tr>
|
||||
@@ -12,4 +16,4 @@
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<tr>
|
||||
<th></th>
|
||||
<th><%= t(".table_headers.broadcast_name") %></th>
|
||||
<th><%= t(".table_headers.broadcast_time_zone") %></th>
|
||||
<th><%= t(".table_headers.broadcast_status") %></th>
|
||||
<th><%= t(".table_headers.broadcast_created_at") %></th>
|
||||
<th></th>
|
||||
@@ -32,7 +33,7 @@
|
||||
<%= render @broadcasts %>
|
||||
<% else %>
|
||||
<tr>
|
||||
<td colspan="5" class="py-4 text-center text-muted"><%= t(".empty") %></td>
|
||||
<td colspan="6" class="py-4 text-center text-muted"><%= t(".empty") %></td>
|
||||
</tr>
|
||||
<% end %>
|
||||
</tbody>
|
||||
|
||||
@@ -33,10 +33,19 @@
|
||||
<%= link_to "Switch View", "#", class: "btn btn-light border dropdown-toggle", role: "button", id: "dropdownMenuLink", data: { toggle: "dropdown" }, aria: { haspopup: "true", expanded: "false" } %>
|
||||
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
|
||||
<h5 class="dropdown-header">Live Streams</h5>
|
||||
<%= link_to fa_icon("check", text: @broadcast.name.titleize), "#", class: "dropdown-item active" %>
|
||||
<%= link_to fa_icon("check", text: @broadcast.name.titleize), "#", data: { behavior: "play_stream"}, class: "dropdown-item active" %>
|
||||
<% @multi_view_broadcasts.each do |broadcast| %>
|
||||
<% if broadcast.id != @broadcast.id %>
|
||||
<%= link_to broadcast.name.titleize, broadcast.url, class: class_string("dropdown-item", "active" => @broadcast.id == broadcast.id) %>
|
||||
<%= link_to broadcast.name.titleize, broadcast.url, data: { behavior: "play_stream"}, class: class_string("dropdown-item", "active" => @broadcast.id == broadcast.id) %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if @broadcast.director_mode_video_embed.present? %>
|
||||
<h5 class="dropdown-header">Director Mode</h5>
|
||||
<% unless params[:director_mode] %>
|
||||
<%= link_to "Enable Director Mode", url_for(params.permit!.merge(director_mode: true)), class: "dropdown-item" %>
|
||||
<% else %>
|
||||
<%= link_to "Disable Director Mode", url_for(params.permit!.except(:director_mode)), class: "dropdown-item" %>
|
||||
|
||||
<% end %>
|
||||
<% end %>
|
||||
<h5 class="dropdown-header">Previous Sessions</h5>
|
||||
@@ -102,6 +111,7 @@
|
||||
<i class="fa fa-clipboard"></i>
|
||||
Copy URL
|
||||
</button>
|
||||
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
|
||||
</div>
|
||||
<% else %>
|
||||
<input type="text" class="form-control" value="<%= broadcast_url(@broadcast.token) %>" readonly>
|
||||
@@ -110,6 +120,7 @@
|
||||
<i class="fa fa-clipboard"></i>
|
||||
Copy URL
|
||||
</button>
|
||||
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<tr>
|
||||
<td data-behavior="select_contract_template"><%= check_box_tag "contract_template_ids[]", contract_template.id, false %></td>
|
||||
<td>
|
||||
<%= contract_template.name %>
|
||||
</td>
|
||||
@@ -19,6 +20,12 @@
|
||||
<div class="btn-group">
|
||||
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<% if policy(contract_template).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: t(".actions.edit")), [:edit, contract_template], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(ContractTemplate).duplicate? %>
|
||||
<%= link_to fa_icon("clone fw", text: t(".actions.duplicate")), contract_template_duplicates_path(contract_template), method: :post, class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(QrCode).show? %>
|
||||
<%= link_to fa_icon("qrcode", text: t(".actions.qr_code")), [contract_template, :qr_codes], class: "dropdown-item", target: :_blank %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<%= bootstrap_form_with model: [project, contract_template], local: true do |form| %>
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :name, wrapper_class: "col-sm-6" %>
|
||||
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(appearance talent misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical misc) } }, class: "form-control custom-select" %>
|
||||
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(acquired_media appearance talent material misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical misc), "#amendment_clause": %w(location) } }, class: "form-control custom-select" %>
|
||||
</div>
|
||||
<div class="form-row mb-3">
|
||||
<%= form.radio_button :accessibility, :public_template, label: "Public", wrapper_class: "mr-3" %>
|
||||
@@ -29,6 +29,11 @@
|
||||
<%= form.rich_text_area :guardian_clause %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div id="amendment_clause">
|
||||
<%= form.form_group do %>
|
||||
<%= form.rich_text_area :amendment_clause %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div id="signature_legal_text">
|
||||
<%= form.form_group do %>
|
||||
<%= form.rich_text_area :signature_legal_text %>
|
||||
|
||||
6
app/views/contract_templates/edit.html.erb
Normal file
6
app/views/contract_templates/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: @contract_template, project: @project, contract_template: @contract_template %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -5,12 +5,14 @@
|
||||
<%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :contract_template], class: "btn btn-primary" %>
|
||||
<%= link_to fa_icon("clone", text: t(".actions.import")), [:new, @project, :release_template_imports], class: "btn btn-secondary" %>
|
||||
<% end %>
|
||||
<%= link_to "Group QR Code", "javascript:void(0);", class: "btn btn-light border disabled", id: "group_qr_code", data: { project_id: @project.id, contract_template_ids: [] } %>
|
||||
</p>
|
||||
|
||||
<div class="border bg-white rounded shadow-sm pb-3 table-responsive">
|
||||
<table class="table table-striped tr-px-4 align-all-middle">
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th></th>
|
||||
<th><%= ContractTemplate.human_attribute_name(:name) %></th>
|
||||
<th><%= ContractTemplate.human_attribute_name(:fee) %></th>
|
||||
<th><%= t(".table_headers.release_type") %></th>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", project: @project, contract_template: @contract_template %>
|
||||
<%= render "form", model: [@project, @contract_template], project: @project, contract_template: @contract_template %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,8 @@
|
||||
|
||||
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
|
||||
<% if policy(ContractTemplate).new? %>
|
||||
<%= link_to t(".actions.create_template"), [:new, @project, :contract_template], class: "btn btn-success border align-self-center h-50 pb-2" %>
|
||||
<%= link_to t(".actions.create_template"), [:new, @project, :contract_template], class: "btn btn-success border align-self-center h-50 mr-2 pb-2" %>
|
||||
<%= link_to t(".actions.import_template"), [:new, @project, :release_template_imports], class: "btn btn-light border align-self-center h-50 pb-2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
@@ -47,4 +48,4 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
19
app/views/contracts/_amendment_page.html.erb
Normal file
19
app/views/contracts/_amendment_page.html.erb
Normal file
@@ -0,0 +1,19 @@
|
||||
<% if preview %>
|
||||
<h1>PREVIEW ONLY</h1>
|
||||
<% end %>
|
||||
|
||||
<p class="heading"><strong><u><%= t '.heading' %></u></strong></p>
|
||||
|
||||
<dl>
|
||||
<%= description_list_pair "#{t('.description_labels.amendment_clause')}:", releasable.contract_template.amendment_clause %>
|
||||
<%= description_list_pair "#{t('.description_labels.amendment_signer_name')}:", releasable.amendment_signer_name %>
|
||||
|
||||
<dt><%= t('.description_labels.amendment_signature') %>:</dt>
|
||||
<dd>
|
||||
<% if preview %>
|
||||
<%= image_tag dummy_signature %>
|
||||
<% elsif releasable.amendment_signature.attached? %>
|
||||
<%= image_tag releasable.amendment_signature.variant(auto_orient: true, resize: "200x200") %>
|
||||
<% end %>
|
||||
</dd>
|
||||
</dl>
|
||||
@@ -7,7 +7,7 @@
|
||||
<dl>
|
||||
<%= description_list_pair t('.description_labels.producer'), releasable.project.account.name %>
|
||||
<%= description_list_pair t('.description_labels.production'), releasable.project.name %>
|
||||
<%= description_list_pair t('.description_labels.employee_issued_to'), releasable.name %>
|
||||
<%= description_list_pair t('.description_labels.issued_to'), releasable.name %>
|
||||
<%= description_list_pair t('.description_labels.issued_by'), releasable.approved_by_user_name %>
|
||||
<%= description_list_pair t('.description_labels.date_issued'), releasable.approved_at %>
|
||||
</dl>
|
||||
@@ -18,10 +18,14 @@
|
||||
<% end %>
|
||||
</dd>
|
||||
<% end %>
|
||||
<%= description_list_pair_for releasable, :name, append: ":" %>
|
||||
<%= description_list_pair "Contact Address:", releasable.contact_person.address %>
|
||||
<%= description_list_pair "Contact Phone:", releasable.contact_person.phone %>
|
||||
<%= description_list_pair "Contact Email:", releasable.contact_person.email %>
|
||||
<%= description_list_pair t(".labels.#{releasable.model_name.param_key}.name", default: "Name"), releasable.name, append: ":" %>
|
||||
<% if releasable.model_name == "LocationRelease" %>
|
||||
<%= description_list_pair "Location Address:", releasable.address %>
|
||||
<%= description_list_pair "Owner Name", releasable.person_name, append: ":" %>
|
||||
<% end %>
|
||||
<%= description_list_pair t(".labels.#{releasable.model_name.param_key}.contact_person_address", default: "Contact Address"), releasable.contact_person.address, append: ":" %>
|
||||
<%= description_list_pair t(".labels.#{releasable.model_name.param_key}.contact_person_phone", default: "Contact Phone"), releasable.contact_person.phone, append: ":" %>
|
||||
<%= description_list_pair t(".labels.#{releasable.model_name.param_key}.contact_person_email", default: "Contact Email"), releasable.contact_person.email, append: ":" %>
|
||||
<% if releasable.model_name == "AppearanceRelease" %>
|
||||
<%= description_list_pair "Person Date of Birth:", releasable&.person_date_of_birth&.strftime("%D") %>
|
||||
<% end %>
|
||||
|
||||
@@ -26,7 +26,13 @@
|
||||
<%= render "contracts/signature_page", releasable: releasable, contract_template: contract_template, preview: preview %>
|
||||
</div>
|
||||
|
||||
<% if releasable.class == MedicalRelease && releasable.approved? %>
|
||||
<% if releasable.respond_to?(:amendment_signed?) && releasable.amendment_signed? %>
|
||||
<div class="page">
|
||||
<%= render "contracts/amendment_page", releasable: releasable, preview: preview %>
|
||||
</div>
|
||||
<%end %>
|
||||
|
||||
<% if releasable.respond_to?(:approved?) && releasable.approved? %>
|
||||
<div class="page">
|
||||
<%= render "contracts/for_office_use_only", releasable: releasable, preview: preview %>
|
||||
</div>
|
||||
|
||||
@@ -3,6 +3,6 @@
|
||||
<%= render "shared/files_dropzone_fields", form: form, directory: directory %>
|
||||
<% end %>
|
||||
<div class="pt-3">
|
||||
<%= form.submit t(".submit"), class: "btn btn-block btn-success", data: { disable_with: t("shared.disable_with") } %>
|
||||
<%= form.submit t(".submit"), id: "upload_directory_files", class: "btn btn-block btn-success", data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= I18n.locale %>">
|
||||
<head>
|
||||
<title>BiGMedia.ai App</title>
|
||||
<title>MESuite.ai App</title>
|
||||
<%= csrf_meta_tags %>
|
||||
<%= csp_meta_tag %>
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= I18n.locale %>">
|
||||
<head>
|
||||
<title>BiGMedia.ai App</title>
|
||||
<title>MESuite.ai App</title>
|
||||
<%= csrf_meta_tags %>
|
||||
<%= csp_meta_tag %>
|
||||
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(location_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "location_release_ids[]", location_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if location_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(location_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: location_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if location_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(location_release.photo), class: "img-fluid" %>
|
||||
@@ -8,10 +16,10 @@
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= location_release.name %>
|
||||
<%= contact_info(name: location_release.name, address: location_release.address) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= contact_info address: location_release.address %>
|
||||
<%= contact_info_for(location_release.contact_person) %>
|
||||
</td>
|
||||
<td>
|
||||
<%= notes_preview location_release.notes.order_by_recent %>
|
||||
@@ -22,6 +30,17 @@
|
||||
<td>
|
||||
<%= location_release.signed_on %>
|
||||
</td>
|
||||
<td class="text-center">
|
||||
<% if location_release.amendment_signed? %>
|
||||
<i class="fa fa-check-square-o text-dark"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.amendment_signed_tooltip' %>"></i>
|
||||
<% elsif location_release.amendment_signable? %>
|
||||
<i class="fa fa-square-o"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.amendment_not_signed_tooltip' %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
|
||||
<td class="text-right">
|
||||
<div class="btn-group">
|
||||
@@ -36,9 +55,15 @@
|
||||
<% if policy(location_release).edit_photos? %>
|
||||
<%= link_to fa_icon("picture-o fw", text: "Photos"), [:edit, location_release, :photos], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(location_release).sign_amendment? && location_release.amendment_signable? && !location_release.amendment_signed? %>
|
||||
<%= link_to fa_icon("file-text fw", text: t('.actions.sign_amendment')), [:new, location_release.project.account, location_release.project, location_release.contract_template, location_release, :amendment], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(Contract).show? && (location_release.contract.attached? || location_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [location_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(LocationRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_location_release_approvals_path(location_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(location_release).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, location_release], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
|
||||
@@ -26,13 +26,14 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "location_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th></th>
|
||||
<th><%= LocationRelease.human_attribute_name(:name) %></th>
|
||||
<th><%= t(".table_headers.address") %>
|
||||
<th><%= t(".table_headers.location_info") %></th>
|
||||
<th><%= t(".table_headers.owner_info") %>
|
||||
<th><%= t(".table_headers.notes") %></th>
|
||||
<th><%= t(".table_headers.tags") %></th>
|
||||
<th><%= t(".table_headers.signed_at") %></th>
|
||||
|
||||
<th><%= t(".table_headers.signed_at") %></th>
|
||||
<th><%= t(".table_headers.amendment_signed") %></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
<hr>
|
||||
|
||||
<%= field_set_tag content_tag(:span, t(".signer_details.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.material_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :person_first_name, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :person_last_name, wrapper_class: "col-sm-6" %>
|
||||
@@ -21,6 +24,28 @@
|
||||
<%= form.text_field :person_title, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "person" %>
|
||||
|
||||
<div class="<%= class_string("collapse" => !material_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: material_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: material_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian" %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_2_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian_2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -34,6 +59,44 @@
|
||||
|
||||
<%= field_set_tag content_tag(:span, t(".photos.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<%= render "shared/photos_dropzone_fields", form: form, release: material_release %>
|
||||
|
||||
<div class="<%= class_string("collapse" => !material_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<br>
|
||||
<div class="text-left">
|
||||
<p><%= t(".photos.guardian_photo.heading") %></p>
|
||||
<div id="guardian-photo-preview" class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span>No photo yet</span>
|
||||
</div>
|
||||
</div>
|
||||
<% if material_release.guardian_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("#guardian-photo-preview", "<%= url_for(material_release.guardian_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="d-inline-block">
|
||||
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if material_release.guardian_photo.attached?%>
|
||||
<%= form.file_field :guardian_photo, hide_label: true, data: { ujs_target: "guardian-photo-input" }, help: "PNG or JPG only", accept: material_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
</div>
|
||||
|
||||
<p><%= t(".photos.guardian_2_photo.heading") %></p>
|
||||
<div id="guardian-2-photo-preview" class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-2-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span>No photo yet</span>
|
||||
</div>
|
||||
</div>
|
||||
<% if material_release.guardian_2_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("#guardian-2-photo-preview", "<%= url_for(material_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="d-inline-block">
|
||||
<%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if material_release.guardian_2_photo.attached?%>
|
||||
<%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, help: "PNG or JPG only", accept: material_release.class.face_photo_acceptable_content_types.join(",") %>
|
||||
</div>
|
||||
</div>
|
||||
<hr>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<div class="row align-items-center text-center mt-4">
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(material_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "material_release_ids[]", material_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if material_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(material_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: material_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if material_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(material_release.photo), class: "img-fluid" %>
|
||||
@@ -36,6 +44,9 @@
|
||||
<% if policy(Contract).show? && (material_release.contract.attached? || material_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [material_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(MaterialRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_material_release_approvals_path(material_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(material_release).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, material_release], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "material_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th></th>
|
||||
<th><%= MaterialRelease.human_attribute_name(:name) %></th>
|
||||
<th><%= t(".table_headers.notes") %></th>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<td data-behavior="select"><%= check_box_tag "medical_release_ids[]", medical_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if medical_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_medical_release(medical_release) %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(medical_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: medical_release.approved_at %>"></i>
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(misc_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "misc_release_ids[]", misc_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if misc_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(misc_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: misc_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<% if misc_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(misc_release.photo), class: "img-fluid" %>
|
||||
@@ -36,6 +44,9 @@
|
||||
<% if policy(misc_release.tags).new? %>
|
||||
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, misc_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
|
||||
<% end %>
|
||||
<% if policy(MiscRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_misc_release_approvals_path(misc_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(MedicalRelease).download_single? && policy(Contract).show? && (misc_release.contract.attached? || misc_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [misc_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "misc_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th></th>
|
||||
<th><%= MiscRelease.human_attribute_name(:person_name) %></th>
|
||||
<th><%= MiscRelease.human_attribute_name(:contact_info) %></th>
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(music_release) %>">
|
||||
<td data-behavior="select"><%= check_box_tag "music_release_ids[]", music_release.id, false %></td>
|
||||
<td class="text-center">
|
||||
<% if music_release.approved? %>
|
||||
<% tooltip_user_data = get_approval_data_for_releasable(music_release) %>
|
||||
<i class="fa fa-check-circle fa-2x text-success"
|
||||
data-toggle="tooltip"
|
||||
title="<%= t '.messages.approved_tooltip', user: tooltip_user_data, timestamp: music_release.approved_at %>"></i>
|
||||
<% end %>
|
||||
</td>
|
||||
<td>
|
||||
<%= music_release.name %>
|
||||
</td>
|
||||
@@ -36,6 +44,9 @@
|
||||
<% if policy(Contract).show? && (music_release.contract.attached? || music_release.contract_template.present?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [music_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
<% if policy(MusicRelease).review? %>
|
||||
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_music_release_approvals_path(music_release), class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(music_release).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, music_release], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "music_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th><%= MusicRelease.human_attribute_name(:name) %></th>
|
||||
<th><%= t(".table_headers.file_infos_count") %></th>
|
||||
<th><%= t(".table_headers.composers_count") %></th>
|
||||
|
||||
@@ -13,6 +13,17 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { behavior: "update-required-status", target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_clause.heading") do %>
|
||||
<p><%= @contract_template.guardian_clause %></p>
|
||||
<% end %>
|
||||
<hr>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".acquired_media_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :name, required: true, wrapper_class: "col-12" %>
|
||||
@@ -49,6 +60,91 @@
|
||||
|
||||
<hr>
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<div class="<%= class_string("collapse" => !@acquired_media_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: @acquired_media_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_last_name, required: @acquired_media_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.phone_field :guardian_phone, required: @acquired_media_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_email, required: @acquired_media_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", required: @acquired_media_release.minor?, data: { required_tag: "guardian" } %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_photo.heading") do %>
|
||||
<div class="alert alert-warning font-weight-bold"><%= t ".guardian_photo.instructions" %></div>
|
||||
<div class="text-center">
|
||||
<div class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span><%= t ".photo.no_photo" %></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-inline-block text-left">
|
||||
<% if @acquired_media_release.guardian_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@acquired_media_release.guardian_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="hidden-file-input">
|
||||
<%= form.hidden_field :guardian_photo, value: form.object.guardian_photo.signed_id if @acquired_media_release.guardian_photo.attached? %>
|
||||
<%= form.file_field :guardian_photo, required: @acquired_media_release.minor?, hide_label: true, data: { ujs_target: "guardian-photo-input" }, accept: @acquired_media_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
|
||||
</div>
|
||||
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=guardian-photo-input]" } %>
|
||||
</div>
|
||||
<p class="p-2 font-weight-bold">
|
||||
<small class="text-muted"><%= t ".photo.warning" %></small>
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_2_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_2_first_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_2_last_name, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_2_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_2_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian_2" %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_2_photo.heading") do %>
|
||||
<div class="alert alert-warning font-weight-bold"><%= t ".guardian_2_photo.instructions" %></div>
|
||||
<div class="text-center">
|
||||
<div class="d-inline-block mb-2" data-behavior="guardian-photo-preview" data-file-input="[data-ujs-target=guardian-2-photo-input]">
|
||||
<div class="align-items-center d-flex photo-preview img-thumbnail justify-content-center">
|
||||
<span><%= t ".photo.no_photo" %></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-inline-block text-left">
|
||||
<% if @acquired_media_release.guardian_2_photo.attached? %>
|
||||
<%= javascript_tag nonce: true do %>
|
||||
App.PhotoPreview.set("[data-behavior=guardian-photo-preview]", "<%= url_for(@acquired_media_release.guardian_2_photo.variant(auto_orient: true, resize: '200x200')) %>");
|
||||
<% end %>
|
||||
<% end %>
|
||||
<div class="hidden-file-input">
|
||||
<%= form.hidden_field :guardian_2_photo, value: form.object.guardian_2_photo.signed_id if @acquired_media_release.guardian_2_photo.attached? %>
|
||||
<%= form.file_field :guardian_2_photo, hide_label: true, data: { ujs_target: "guardian-2-photo-input" }, accept: @acquired_media_release.class.face_photo_acceptable_content_types.join(","), direct_upload: true %>
|
||||
</div>
|
||||
<%= button_tag t(".photo.take_photo"), type: "button", class: "btn btn-lg btn-primary take-photo-button", data: { behavior: "trigger-click", target: "[data-ujs-target=guardian-2-photo-input]" } %>
|
||||
</div>
|
||||
<p class="p-2 font-weight-bold">
|
||||
<small class="text-muted"><%= t ".photo.warning" %></small>
|
||||
</p>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
3
app/views/public/amendments/create.html.erb
Normal file
3
app/views/public/amendments/create.html.erb
Normal file
@@ -0,0 +1,3 @@
|
||||
<% message = local_assigns[:already_signed] ? t('.amendment_already_signed_message') : t('.amendment_signed_message') %>
|
||||
<% alert_type = local_assigns[:already_signed] ? "alert-warning" : "alert-success" %>
|
||||
<p class="alert <%= alert_type %> p-3 lead text-center"><%= message %></p>
|
||||
34
app/views/public/amendments/new.html.erb
Normal file
34
app/views/public/amendments/new.html.erb
Normal file
@@ -0,0 +1,34 @@
|
||||
<button type="button" class="btn btn-success mb-3" data-behavior="clipboard" href="<%= polymorphic_url [:new, @account, @project, @contract_template, @release, :amendment] %>">
|
||||
<i class="fa fa-clipboard"></i>
|
||||
<%= t '.copy_url' %>
|
||||
</button>
|
||||
|
||||
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-body">
|
||||
<%= errors_summary_for @release %>
|
||||
<%= bootstrap_form_with model: @release, method: :post, url: public_send("account_project_contract_template_#{@contract_template.release_type}_release_amendments_path"), local: true do |form| %>
|
||||
<%= card_field_set_tag t('.signed_contract_preview') do %>
|
||||
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for([@release, :contracts, format: "pdf"]) %>" width="80%" height="1200" />
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".amendment.heading") do %>
|
||||
<p><%= @contract_template.amendment_clause %></p>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="form-row">
|
||||
<%= form.text_field :amendment_signer_name, required: true, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", signature_field: :amendment_signature_base64, form: form %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
<%= form.button t("shared.submit_release_long"), class: "btn btn-block btn-lg btn-success", data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,8 @@
|
||||
<tr>
|
||||
<td>
|
||||
<%= contract_template.name %>
|
||||
</td>
|
||||
<td class="text-right" nowrap>
|
||||
<%= link_to t(".actions.sign"), [:new, contract_template.project.account, contract_template.project, contract_template, "#{contract_template.release_type}_release"], class: "btn btn-sm btn-primary", target: :_blank %>
|
||||
</td>
|
||||
</tr>
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user