Compare commits

..

6 Commits

Author SHA1 Message Date
Senad Uka
9a29f1d13a Usptream sync castme 2020-07-29 05:15:44 +00:00
Senad Uka
4f1ebb27d0 Upstream sync 2020-07-27 10:18:49 +00:00
Senad Uka
95e9a70c4b Upstream cast me sync 2020-07-22 13:37:34 +00:00
Senad Uka
e3acdb4d0e Cast me sync 2020-07-17 04:50:04 +02:00
Senad Uka
96b31b71cf cast me sync 2020-07-16 18:03:37 +02:00
Senad Uka
da8e187430 Cast me 2020-07-15 11:57:21 +02:00
239 changed files with 2754 additions and 5538 deletions

View File

@@ -21,13 +21,11 @@ $(document).on "turbolinks:load", ->
refreshBroadcastVideo: (data) ->
$("#broadcast_updates").html data.status_content
stream_selected = $("#broadcast_video").data('videoType') == 'stream';
if data.streamer_status == 'recording' && data.status == 'active' && stream_selected
if data.streamer_status == 'recording' && data.status == 'active'
$("#broadcast_video").html data.video_content
new (Clappr.Player)(
<%= "baseUrl: 'http://cdn.clappr.io/latest'," if Rails.env.test? %>
parentId: '#broadcast_video'
source: data.full_live_stream_playback_url
source: data.playback_url
width: '100%',
height: '100%',
mute: true,

View File

@@ -1,9 +0,0 @@
$(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();
}
});
});

View File

@@ -1,50 +0,0 @@
$(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');
}
}

View File

@@ -3,7 +3,7 @@ $(document).on("click", "[data-behavior=play_recording]", function() {
return false;
}
$("#broadcast_video").data('videoType', 'recording');
console.warn('Play prev : ', playback_url);
var playback_url = $(this).attr("data-playback-url")
$("#broadcast_video").empty();
@@ -23,6 +23,4 @@ $(document).on("click", "[data-behavior=play_recording]", function() {
$(this).siblings().children("i").remove();
$(this).addClass('active');
$(this).prepend('<i class="fa fa-check">&nbsp;</i>');
});
$(document).on("click", "[data-behavior=play_stream]", function() { $("#broadcast_video").data('videoType', 'stream'); });
});

View File

@@ -11,6 +11,7 @@ $body-color: #4A4A4A;
$primary: #6F89FF;
$blue: #0092ff;
$red: #F9002B;
$dark-red: #CE004A;
$green: #51B61B;
$teal: #32C498;
$purple: #5139EE;

View File

@@ -69,6 +69,13 @@ label {
}
}
&.cast-me {
span:last-child {
background-color: $dark-red;
color: $white;
}
}
&.disabled {
span:last-child {
background-color: $gray-500 !important;

View File

@@ -16,7 +16,6 @@ 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

View File

@@ -17,7 +17,7 @@ class AccountsController < ApplicationController
if sign_in(user)
TrackAnalyticsJob.perform_later(user, user.primary_account, :track_guest_sign_up, user_agent: request.user_agent, user_ip: request.remote_ip)
SubmitHubspotFormJob.perform_later(user.first_name, user.last_name, user.email, account.name, i_m_interested_in: user.interested_product_name)
SubmitHubspotFormJob.perform_later(first_name: user.first_name, last_name: user.last_name, email: user.email, company: account.name, i_m_interested_in: user.interested_product_name, form_guid: ENV["HUBSPOT_FORM_GUID"])
redirect_to signed_in_root_path
else
redirect_to new_session_path, alert: t(".notice")

View File

@@ -56,74 +56,35 @@ 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(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
])
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
]
)
end
def build_acquired_media_release(attrs = {})

View File

@@ -0,0 +1,70 @@
class Admin::CastingSubmissionsController < Admin::ApplicationController
before_action :set_casting_submission, only: [:edit, :update, :show, :complete]
before_action :build_casting_submission, only: [:new, :create]
before_action :set_accounts, only: %i[new create edit]
def index
@casting_submissions = casting_submissions.order_by_recent.paginate(page: params[:page])
end
def create
@casting_submission.attributes = casting_submission_params
if @casting_submission.save
redirect_to [:admin, :casting_submissions], notice: t(".notice")
else
render :new
end
end
def update
if @casting_submission.update(casting_submission_params)
redirect_to [:admin, :casting_submissions], notice: t(".notice")
else
render :edit
end
end
def complete
if @casting_submission.update(interviewed_at: Time.zone.now)
redirect_to [:admin, :casting_submissions], notice: t(".notice")
else
redirect_to [:admin, :casting_submissions], notice: t(".alert")
end
end
private
def set_accounts
@accounts = accounts
end
def casting_submission_params
params.require(:casting_submission).permit(
:casting_call_id, :performer_name, :interview_date,
:zoom_meeting_url, :interview_recording, :time_elapsed_1,
:time_elapsed_2, :time_elapsed_3, :time_elapsed_4, :time_elapsed_5,
:time_elapsed_6, :time_elapsed_7, :time_elapsed_8, :time_elapsed_9,
:time_elapsed_10, :time_elapsed_11, :time_elapsed_12, :time_elapsed_13,
:time_elapsed_14, :time_elapsed_15, :note_1 , :note_2 , :note_3 , :note_4,
:note_5, :note_6, :note_7, :note_8, :note_9, :note_10, :note_11, :note_12, :note_13,
:note_14, :note_15
)
end
def casting_submissions
policy_scope CastingSubmission
end
def set_casting_submission
@casting_submission = authorize policy_scope(CastingSubmission).find(params[:id])
end
def accounts
policy_scope Account
end
def build_casting_submission
@casting_submission = authorize policy_scope(CastingSubmission).build
end
end

View File

@@ -1,11 +0,0 @@
class Api::MedicalReleasesController < Api::ReleasesController
deserializable_resource :medical_release, only: [:create, :update]
def model_name
"medical_release"
end
def attributes_for_index
[:name]
end
end

View File

@@ -1,11 +0,0 @@
class Api::MiscReleasesController < Api::ReleasesController
deserializable_resource :misc_release, only: [:create, :update]
def model_name
"misc_release"
end
def attributes_for_index
[:name]
end
end

View File

@@ -10,10 +10,8 @@ class Api::SyncController < Api::ApiController
@appearance_releases = (AppearanceRelease.where(project: accessible_projects))
@location_releases = (LocationRelease.where(project: accessible_projects))
@material_releases = (MaterialRelease.where(project: accessible_projects))
@medical_releases = MedicalRelease.where(project: accessible_projects)
@misc_releases = MiscRelease.where(project: accessible_projects)
@talent_releases = (TalentRelease.where(project: accessible_projects))
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @medical_releases + @misc_releases + @talent_releases + @acquired_media_releases ))
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @talent_releases + @acquired_media_releases ))
render json: {
data: {
@@ -24,8 +22,6 @@ class Api::SyncController < Api::ApiController
appearance_releases: releases_query(@appearance_releases),
location_releases: releases_query(@location_releases),
material_releases: releases_query(@material_releases),
medical_releases: releases_query(@medical_releases),
misc_releases: releases_query(@misc_releases),
talent_releases: releases_query(@talent_releases),
notes: @notes
}

View File

@@ -1,12 +1,5 @@
# frozen_string_literal: true
require './lib/knock_monkeypatch'
class Api::UserTokenController < Knock::AuthTokenController
include Oath::ControllerHelpers
skip_before_action :verify_authenticity_token
before_action :sign_in_user
rescue_from Exception, :with => :return_error
@@ -17,7 +10,7 @@ class Api::UserTokenController < Knock::AuthTokenController
logger.error "==Handled======="
logger.error exception.message
logger.error exception.backtrace.join("\n")
logger.error "==Handled======="
logger.error "==Handled======="
case exception
when ActiveRecord::RecordNotFound
@status = 404
@@ -34,18 +27,12 @@ class Api::UserTokenController < Knock::AuthTokenController
end
# for some reason render json_errors is not working
# simulating JSON API support
render json: {
# simulating JSON API support
render json: {
errors: [{
status: @status.to_s,
title: @message
}]
}
end
private
def sign_in_user
sign_in(entity)
end
end

View File

@@ -1,28 +0,0 @@
class ApprovalsController < ApplicationController
before_action :set_releasable
before_action :set_project
layout "project"
def create
@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 = @releasable.project
end
end

View File

@@ -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, :destroy_file]
before_action :set_broadcast, only: [:show, :destroy, :update]
before_action :set_multi_view_broadcasts, only: [:show]
before_action :show_splash_screen, only: :index
@@ -33,13 +33,11 @@ class BroadcastsController < ApplicationController
end
def update
unless params.has_key?(:broadcast)
@broadcast.regenerate_token
redirect_to([@project, @broadcast], notice: t('.reset_notice')) and return
end
@broadcast.update(broadcast_params)
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 destroy
@@ -50,29 +48,14 @@ 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, :shoot_location_time_zone, files: [])
params.require(:broadcast).permit(:name, files: [])
end
def set_project

View File

@@ -0,0 +1,80 @@
class CastingCallsController < ApplicationController
layout "project"
before_action :set_project
before_action :build_casting_call, only: [:new, :create]
before_action :set_casting_call, only: [:show, :edit, :update, :cancel]
before_action :show_splash_screen, only: :index
def index
@casting_calls = casting_calls.order_by_recent.paginate(page: params[:page])
end
def new
end
def create
@casting_call.attributes = casting_call_params_with_email
if @casting_call.save
log_create_analytics
redirect_to [@project, :casting_calls], notice: t(".notice")
else
render :new
end
end
def show
render layout: 'application'
end
def edit
end
def update
if @casting_call.update(casting_call_params)
redirect_to [@project, :casting_calls], notice: t(".notice")
else
render :edit
end
end
def cancel
@casting_call.update(cancelled_at: Time.zone.now)
redirect_to [@project, :casting_calls], notice: t(".notice")
end
private
def show_splash_screen
render :splash if casting_calls.count.zero?
end
def casting_call_params
params.require(:casting_call).permit(:title, :description, :project_description, :interview_instructions, :interview_requirements, :questions)
end
def casting_call_params_with_email
casting_call_params.merge(user_email: Current.user.email)
end
def set_project
@project = policy_scope(Project).find(params[:project_id])
end
def set_casting_call
@casting_call = authorize casting_calls.find(params[:id])
end
def casting_calls
authorize policy_scope(@project.casting_calls)
end
def build_casting_call
@casting_call = authorize @project.casting_calls.build
end
def log_create_analytics
TrackAnalyticsJob.perform_later(Current.user, Current.account, :track_create_casting_call, user_agent: request.user_agent, user_ip: request.remote_ip)
end
end

View File

@@ -0,0 +1,30 @@
class CastingSubmissionDownloadsController < ApplicationController
include ProjectContext
before_action :set_project, only: [:create]
before_action :set_casting_submission, only: :create
include ProjectLayout
def create
download = @project.downloads.create!(name: @casting_submission.zip_file_name, release_type: "CastingSubmission")
other_downloads_in_progress = @project.downloads.unfinished_desc_order.offset(1)
if other_downloads_in_progress.any?
in_progress_downloads_details = render_to_string "_other_pending_downloads", locals: { downloads: other_downloads_in_progress, release_type: "CastingSubmission" }, :layout => false
ProjectsChannel.broadcast_download_generation_update(download, in_progress_downloads_details)
else
ProjectsChannel.broadcast_download_generation_update(download, I18n.t("casting_submission_downloads.download.pending", release_type: "CastingSubmission"))
end
GenerateCastingSubmissionFilesZipJob.perform_later(@project, download, @casting_submission)
end
private
def set_casting_submission
authorize(Download)
@casting_submission = policy_scope(@project.casting_submissions).find(params[:casting_submission_id])
end
end

View File

@@ -0,0 +1,32 @@
class CastingSubmissionsController < ApplicationController
before_action :set_project
before_action :set_casting_submission, only: [:show]
include ProjectLayout
def index
@casting_submissions = casting_submissions.completed.order_by_recent.paginate(page: params[:page])
end
def show
@casting_call = @casting_submission.casting_call
@files = @casting_submission.files.order("created_at DESC").paginate(page: params[:files_page])
@markers = @casting_submission.markers
render layout: 'application'
end
private
def set_project
@project = policy_scope(Project).find(params[:project_id])
end
def set_casting_submission
@casting_submission = authorize casting_submissions.find(params[:id])
end
def casting_submissions
authorize policy_scope(CastingSubmission)
end
end

View File

@@ -1,33 +0,0 @@
# 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

View File

@@ -16,12 +16,7 @@ class ContractTemplates::QrCodesController < ApplicationController
end
def qr_code
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
authorize QrCode.build_from_contract_template(@contract_template)
end
def download_attributes

View File

@@ -5,9 +5,8 @@ class ContractTemplatesController < ApplicationController
layout 'project'
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 :set_project, except: [:destroy]
before_action :set_contract_template, only: [:destroy]
before_action :show_splash_screen, only: :index
def index
@@ -33,20 +32,6 @@ 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')
@@ -54,10 +39,6 @@ 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
@@ -81,19 +62,18 @@ class ContractTemplatesController < ApplicationController
def contract_template_params
params
.require(:contract_template)
.permit(:name, :release_type, :body, :guardian_clause,
:signature_legal_text, :fee, :amendment_clause,
.permit(:name, :release_type, :body, :guardian_clause, :fee,
:applicable_medium_id, :applicable_medium_text,
:territory_id, :territory_text,
:term_id, :term_text, :accessibility,
:term_id, :term_text,
:restriction_id, :restriction_text,
:question_1_text, :question_2_text,
:question_3_text, :question_4_text,
:question_5_text, :question_6_text,
:question_7_text, :question_8_text,
:question_1_text, :question_2_text,
:question_3_text, :question_4_text,
:question_5_text, :question_6_text,
:question_7_text, :question_8_text,
:question_9_text, :question_10_text,
:question_11_text, :question_12_text,
:question_13_text, :question_14_text,
:question_11_text, :question_12_text,
:question_13_text, :question_14_text,
:question_15_text)
end

View File

@@ -50,58 +50,11 @@ 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(person_params, guardian_params, second_guardian_params, :minor,
params.require(:material_release).permit(
: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,

View File

@@ -41,70 +41,31 @@ 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(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
])
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
]
)
end
def acquired_media_release_params_with_locale

View File

@@ -1,47 +0,0 @@
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

View File

@@ -0,0 +1,14 @@
class Public::CastingCallsController < Public::BaseController
skip_after_action :verify_authorized
before_action :set_casting_call, only: [:show]
def show
render layout: 'application'
end
private
def set_casting_call
@casting_call = CastingCall.find_by_token(params[:token])
end
end

View File

@@ -0,0 +1,25 @@
class Public::CastingSubmissionsController < Public::BaseController
skip_after_action :verify_authorized
before_action :set_casting_submission, only: [:show, :update]
def show
end
def update
if @casting_submission.update(casting_submission_params)
redirect_to casting_submission_url(token: @casting_submission.token), notice: t(".notice")
else
render :show
end
end
private
def set_casting_submission
@casting_submission = CastingSubmission.find_by_token(params[:token])
end
def casting_submission_params
params.require(:casting_submission).permit(files: [])
end
end

View File

@@ -1,18 +0,0 @@
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

View File

@@ -39,59 +39,11 @@ 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(person_params, guardian_params, second_guardian_params, :minor,
params.require(:material_release).permit(
: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: []
)

View File

@@ -14,10 +14,6 @@ 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
@@ -32,9 +28,8 @@ class StreamNotificationsController < ApplicationController
asset_uid = notification.dig(:object, :id)
playback_uid = notification.dig(:data, :playback_ids, 0, :id)
file_name = notification.dig(:data, :static_renditions, :files, -1, :name)
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)
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name)
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
@@ -63,8 +58,7 @@ class StreamNotificationsController < ApplicationController
end
def set_broadcast
case notification_type
when "video.asset.static_renditions.ready", "video.asset.ready"
if notification_type == "video.asset.static_renditions.ready"
live_stream_id = notification.dig(:stream_notification, :data, :live_stream_id)
@broadcast = Broadcast.find_by(stream_uid: live_stream_id)
else

View File

@@ -19,7 +19,7 @@ class TaskRequestsController < ApplicationController
if @task_request.save
log_create_analytics
taskme_url = url_for([:admin, @task_request])
SubmitHubspotTaskRequestFormJob.perform_later(@task_request.user_email, taskme_url)
SubmitHubspotFormJob.perform_later(email: @task_request.user_email, taskme_url: taskme_url, form_guid: ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"])
else
render :new
end

View File

@@ -5,12 +5,4 @@ module TooltipHelper
concat tag.div(class: "tooltip-inner")
end
end
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
release.approved_by_user_email
end
end
end

View File

@@ -0,0 +1,43 @@
class GenerateCastingSubmissionFilesZipJob < ApplicationJob
queue_as :default
include Rails.application.routes.url_helpers
include ActionView::Helpers::UrlHelper
before_perform do |job|
@project = job.arguments.first
@download = job.arguments.second
@casting_submission = job.arguments.third
@download.update!(status: :pending)
end
def perform(project, download, casting_submission)
::CastingSubmissionFilesCollectionService.new(casting_submission.files, @download.name).build do |dir, files|
zipfile_name = "#{dir}/#{@download.name}.zip"
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
files.each do |attachment|
zipfile.add(attachment, File.join("#{dir}/", attachment))
end
end
@download.file.attach(io: File.open(zipfile_name), filename: @download.name)
end
rescue StandardError => e
Raven.extra_context(
message: "Failed to generate download for project (##{project.id})",
release_type: "CastingSubmission"
)
@download.failure!
ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("casting_submission_downloads.download.failure"))
end
after_perform do |job|
if @download.pending? && @download.file.attached?
@download.success!
downloads_folder_link = link_to("Files > Downloads", project_downloads_path(I18n.locale, @project))
download_button = link_to("Download", rails_blob_path(@download.file, disposition: "attachment", only_path: true), class: "btn btn-success", target: :_blank)
ProjectsChannel.broadcast_download_generation_update(@download, I18n.t("casting_submission_downloads.download.success", downloads_folder_link: downloads_folder_link, download_button: download_button, release_type: "Casting Submission"))
end
end
end

View File

@@ -6,8 +6,8 @@ class GenerateContractsZipJob < ApplicationJob
before_perform do |job|
@project = job.arguments.first
@download = job.arguments.second
@release_type = job.arguments.third
@folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}"
release_type = job.arguments.third
@folder_name = "#{@project.name.parameterize}_#{get_release_name(release_type).gsub('_', '-')}"
@download.update!(name: @folder_name, status: :pending)
end
@@ -20,14 +20,9 @@ class GenerateContractsZipJob < ApplicationJob
files.each do |attachment|
zipfile.add(attachment, File.join("#{dir}/", attachment))
end
if @release_type.constantize.include?(CsvExportable)
csv_file = generate_csv releases
zipfile.get_output_stream("#{@folder_name}.csv") { |f| f.puts(csv_file) }
end
end
@download.file.attach(io: File.open(zipfile_name), filename: "#{@folder_name}.zip")
@download.file.attach(io: File.open(zipfile_name), filename: @folder_name)
end
rescue StandardError => e
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
@@ -48,19 +43,6 @@ class GenerateContractsZipJob < ApplicationJob
private
def generate_csv(releases)
release_class = @release_type.constantize
headers = release_class.csv_headers
CSV.generate(headers: true) do |csv|
csv << headers
releases.each do |release|
csv_row_data = release.to_csv_row
csv << csv_row_data
end
end
end
def get_release_name(release_type)
release_type.constantize.model_name.plural
end

View File

@@ -1,19 +1,11 @@
class SubmitHubspotFormJob < ApplicationJob
queue_as :default
def perform(first_name, last_name, email, company_name, additional_params = {})
hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"]
return unless hubspot_form_guid.present?
def perform(params = {})
return unless params[:form_guid].present?
submission_params = {
first_name: first_name,
last_name: last_name,
email: email,
company: company_name
}.merge(additional_params)
form = Hubspot::Form.new("guid" => hubspot_form_guid)
is_form_sumitted = form.submit(submission_params)
form = Hubspot::Form.new("guid" => params[:form_guid])
is_form_sumitted = form.submit(params.except(:form_guid))
raise StandardError.new "Failed to submit the hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
end

View File

@@ -1,18 +0,0 @@
class SubmitHubspotTaskRequestFormJob < ApplicationJob
queue_as :default
def perform(user_email, taskme_url)
hubspot_task_request_form_guid = ENV["HUBSPOT_TASK_REQUEST_FORM_GUID"]
return unless hubspot_task_request_form_guid.present?
submission_params = {
email: user_email,
taskme_url: taskme_url
}
form = Hubspot::Form.new("guid" => hubspot_task_request_form_guid)
is_form_sumitted = form.submit(submission_params)
raise StandardError.new "Failed to submit the task request hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
end
end

View File

@@ -4,6 +4,8 @@ class Account < ApplicationRecord
has_many :account_auths
has_many :users, through: :account_auths
has_many :projects, dependent: :destroy
has_many :casting_calls, through: :projects
has_many :casting_submissions, through: :projects
has_many :videos, through: :projects
has_many :contract_templates, through: :projects
@@ -59,6 +61,8 @@ class Account < ApplicationRecord
MedicalRelease.where(project: projects),
MiscRelease.where(project: projects),
MatchingRequest.where(project: projects),
CastingCall.where(project: projects),
self.casting_submissions,
self
])).sum(:byte_size).to_f
end
@@ -86,6 +90,10 @@ class Account < ApplicationRecord
def taskme_enabled?
ENV["TASKME_ENABLED"] && (plan_uid.to_s == "me_suite" || plan_uid.to_s == "taskme")
end
def castme_enabled?
plan_uid.to_s == "me_suite" || plan_uid.to_s == "castme"
end
def plan_name
case plan_uid.to_s
@@ -97,6 +105,8 @@ class Account < ApplicationRecord
"ReleaseME"
when "taskme"
"TaskME"
when "castme"
"CastME"
when "me_suite"
"ME Suite"
end

View File

@@ -9,18 +9,6 @@ class AcquiredMediaRelease < ApplicationRecord
include Signable
include Syncable
include PersonName
include CsvExportable
include Approvable
include GuardianPhotoable
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
class << self
def custom_csv_exportable_headers
%i[name file_infos_count]
end
end
has_many :file_infos, as: :releasable, dependent: :destroy
@@ -37,38 +25,6 @@ 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
@@ -90,8 +46,8 @@ class AcquiredMediaRelease < ApplicationRecord
# CATEGORIES = ["Artwork", "Film Footage", "Video Footage", "Still Photograph"].freeze
CATEGORIES = ["Film Footage", "Video Footage", "Still Photograph"].freeze
def second_guardian_present?
guardian_2_first_name.present?
def minor?
false
end
def contact_person
@@ -101,8 +57,4 @@ class AcquiredMediaRelease < ApplicationRecord
def uses_edl?
true
end
def file_infos_count
file_infos.any? ? file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media')
end
end

View File

@@ -15,14 +15,6 @@ class AppearanceRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
include CsvExportable
include Approvable
class << self
def custom_csv_exportable_headers
%i[name contact_info]
end
end
has_one_attached :person_photo

View File

@@ -30,10 +30,6 @@ 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']
end

View File

@@ -14,6 +14,6 @@ class BroadcastRecording < ApplicationRecord
end
def download_file_name
"#{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
"#{broadcast_name}_Date_#{created_at.strftime("%Y-%m-%d")}_Time_#{created_at.strftime("%T")}".parameterize
end
end

View File

@@ -0,0 +1,18 @@
class CastingCall < ApplicationRecord
belongs_to :project
has_many :casting_submissions, dependent: :destroy
has_secure_token
def status
if cancelled?
"Cancelled"
else
"Active"
end
end
def cancelled?
self.cancelled_at.present?
end
end

View File

@@ -0,0 +1,25 @@
class CastingSubmission < ApplicationRecord
belongs_to :casting_call
has_many_attached :files
has_one_attached :interview_recording
NUMBER_OF_MARKER_FIELDS = 15
has_secure_token
validates :performer_name, presence: true
scope :completed, -> { where.not(interviewed_at: nil) }
def zip_file_name
"#{self.casting_call.title.parameterize}_#{self.performer_name.parameterize}_#{Time.now.strftime('%Y-%m-%d_%H-%M-%S')}"
end
def markers
(1..NUMBER_OF_MARKER_FIELDS).map do |n|
if public_send("time_elapsed_#{n}").present?
OpenStruct.new(id: n, time_elapsed: public_send("time_elapsed_#{n}"), note: public_send("note_#{n}") )
end
end.compact
end
end

View File

@@ -1,32 +0,0 @@
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

View File

@@ -1,17 +0,0 @@
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

View File

@@ -1,56 +0,0 @@
# frozen_string_literal: true
module CsvExportable
extend ActiveSupport::Concern
COMMON_HEADERS = %i[approved? notes tags signed_at].freeze
COMMON_VALUES = %w[clean_notes clean_tags signed_on].freeze
included do
class << self
def custom_csv_exportable_headers
[]
end
def csv_headers
headers = custom_csv_exportable_headers + COMMON_HEADERS
headers.map do |header|
I18n.t("#{model_name.plural}.index.table_headers.#{header}")
end
end
end
def to_csv_row
(self.class.custom_csv_exportable_headers + COMMON_VALUES).map do |function|
send(function)
end
end
private
def contact_info
contact_info = ''
contact_info += "#{person_address}; " if person_address.present?
contact_info += "P: #{person_phone}; " if person_phone.present?
contact_info += "E: #{person_email}" if person_email.present?
contact_info.delete_suffix '; '
end
def clean_notes
notes = ''
self.notes.order_by_recent.each do |note|
notes += "#{note.content}(#{note.email}), "
end
notes.delete_suffix ', '
end
def clean_tags
tags = ''
self.tags.each do |tag|
tags += "#{tag.name}, "
end
tags.delete_suffix ', '
end
end
end

View File

@@ -21,8 +21,6 @@ class ContractTemplate < ApplicationRecord
monetize :fee_cents
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
@@ -44,8 +42,6 @@ class ContractTemplate < ApplicationRecord
scope :non_archived, -> { where(archived_at: nil) }
scope :order_by_name, -> { order(:name) }
enum accessibility: [:public_template, :private_template]
def fee?
!fee.zero?
end
@@ -69,14 +65,4 @@ class ContractTemplate < ApplicationRecord
def has_questionnaire?
(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
end
end

View File

@@ -10,15 +10,6 @@ class LocationRelease < ApplicationRecord
include Syncable
include Taggable
include PersonName
include CsvExportable
include Approvable
include Amendmenable
class << self
def custom_csv_exportable_headers
%i[name address]
end
end
composed_of :address,
mapping: [

View File

@@ -10,21 +10,8 @@ class MaterialRelease < ApplicationRecord
include Syncable
include Taggable
include PersonName
include CsvExportable
include Approvable
include GuardianPhotoable
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
class << self
def custom_csv_exportable_headers
%i[name]
end
end
composed_of :person_address,
composed_of :person_address,
class_name: "Address",
mapping: [
%w(person_address_street1 street1),
@@ -35,39 +22,6 @@ 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
@@ -76,17 +30,17 @@ class MaterialRelease < ApplicationRecord
validates :signature, attached: true
end
searchable_on %i[
name
searchable_on %i[
name
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
]
def contact_person
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
end
def second_guardian_present?
guardian_2_first_name.present?
def minor?
false
end
def uses_edl?

View File

@@ -11,14 +11,6 @@ class MedicalRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
include CsvExportable
include Approvable
class << self
def custom_csv_exportable_headers
%i[name contact_info]
end
end
NUMBER_OF_CUSTOM_FIELDS = 15

View File

@@ -9,14 +9,6 @@ class MiscRelease < ApplicationRecord
include PersonName
include GuardianName
include GuardianPhotoable
include CsvExportable
include Approvable
class << self
def custom_csv_exportable_headers
%i[name contact_info]
end
end
NUMBER_OF_CUSTOM_FIELDS = 15

View File

@@ -7,15 +7,7 @@ class MusicRelease < ApplicationRecord
include Searchable
include Taggable
include PersonName
include CsvExportable
include Approvable
class << self
def custom_csv_exportable_headers
%i[name file_infos_count composers_count publishers_count]
end
end
has_many :file_infos, as: :releasable, dependent: :destroy
has_many :composers, dependent: :destroy
has_many :publishers, dependent: :destroy
@@ -80,18 +72,6 @@ class MusicRelease < ApplicationRecord
false
end
def file_infos_count
file_infos.size
end
def composers_count
composers.size
end
def publishers_count
publishers.size
end
private
def publisher_percentages_add_up_to_100

View File

@@ -15,6 +15,8 @@ class Project < ApplicationRecord
has_many :talent_releases, dependent: :destroy
has_many :medical_releases, dependent: :destroy
has_many :misc_releases, dependent: :destroy
has_many :casting_calls, dependent: :destroy
has_many :casting_submissions, through: :casting_calls
has_many :videos, dependent: :destroy
has_many :imports, dependent: :destroy
has_many :contract_templates, dependent: :destroy

View File

@@ -10,19 +10,7 @@ class QrCode
url = Rails.application.routes.url_helpers.url_for(route)
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
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")
new(url, filename)
end
def initialize(url, filename = "qrcode.png")

View File

@@ -14,14 +14,6 @@ class TalentRelease < ApplicationRecord
include SecondGuardianPhotoable
include GuardianName
include SecondGuardianName
include CsvExportable
include Approvable
class << self
def custom_csv_exportable_headers
%i[name phone email]
end
end
composed_of :person_address,
class_name: "Address",
@@ -94,14 +86,6 @@ class TalentRelease < ApplicationRecord
person_name
end
def phone
person_phone
end
def email
person_email
end
def filename_suffix
"#{person_last_name} #{person_first_name}"
end
@@ -111,7 +95,7 @@ class TalentRelease < ApplicationRecord
end
def uses_edl?
true
false
end
def second_guardian_present?

View File

@@ -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 }, allow_blank: true
validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 }
end

View File

@@ -30,12 +30,4 @@ class AcquiredMediaReleasePolicy < ApplicationPolicy
def download_multiple?
true
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -26,12 +26,4 @@ class AppearanceReleasePolicy < ReleasePolicy
def download_multiple?
true
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -18,12 +18,4 @@ 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

View File

@@ -0,0 +1,25 @@
class CastingCallPolicy < ApplicationPolicy
def index?
true
end
def show?
true
end
def create?
true
end
def destroy?
true
end
def update?
true
end
def cancel?
true
end
end

View File

@@ -0,0 +1,29 @@
class CastingSubmissionPolicy < ApplicationPolicy
def index?
true
end
def show?
true
end
def create?
true
end
def destroy?
true
end
def update?
true
end
def complete?
true
end
def download?
true
end
end

View File

@@ -3,10 +3,8 @@ class ContractTemplatePolicy < ApplicationPolicy
def resolve
if user.account_manager?
scope.left_outer_joins(:project).where(projects: {account: user.account})
elsif user.manager?
scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
else
scope.public_template.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
end
end
end
@@ -23,18 +21,6 @@ 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

View File

@@ -34,16 +34,4 @@ 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

View File

@@ -34,12 +34,4 @@ class MaterialReleasePolicy < ReleasePolicy
def download_multiple?
true
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -15,14 +15,6 @@ class MedicalReleasePolicy < ReleasePolicy
user.manager? || user.account_manager?
end
def review?
user.account_manager?
end
def approve?
review?
end
def edit_photos?
true
end

View File

@@ -38,12 +38,4 @@ class MiscReleasePolicy < ReleasePolicy
def download_multiple?
download_single?
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -22,12 +22,4 @@ class MusicReleasePolicy < ReleasePolicy
def download_multiple?
true
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -40,4 +40,8 @@ class ProjectPolicy < ApplicationPolicy
def show_task_results?
show?
end
def show_casting_submission_results?
show?
end
end

View File

@@ -34,12 +34,4 @@ class TalentReleasePolicy < ReleasePolicy
def download_multiple?
true
end
def review?
user.account_manager?
end
def approve?
review?
end
end

View File

@@ -0,0 +1,24 @@
class CastingSubmissionFilesCollectionService
def initialize(files, folder_name)
@files = files
@folder_name = folder_name
end
def build
Dir.mktmpdir { |dir|
files.each do |file|
open("#{dir}/#{file.filename}", 'wb') do |tmp_file|
tmp_file << open(file.service_url.to_s).read
end
end
read_files = Dir.entries("#{dir}/").select { |f| !File.directory? f }
raise StandardError.new "Files not found." unless read_files.any?
yield(dir, read_files)
}
end
private
attr_reader :files, :folder_name
end

View File

@@ -169,6 +169,24 @@ class Analytics
)
end
end
def track_create_casting_call(user_agent:, user_ip:)
if analytics_enabled?
identify
track(
{
user_id: user.id,
event: "Casting call created",
properties: {
account: account.try(:name),
account_id: account.try(:id),
user_agent: user_agent,
ip: user_ip,
},
}
)
end
end
private

View File

@@ -1,13 +1,5 @@
<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>
@@ -43,9 +35,6 @@
<% 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 %>

View File

@@ -1,10 +1,6 @@
<%= 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>
@@ -13,28 +9,6 @@
<%= 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>
@@ -45,44 +19,6 @@
<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>

View File

@@ -26,7 +26,6 @@
<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>

View File

@@ -10,6 +10,9 @@
<li class="nav-item">
<%= link_to fa_icon("tasks fw", text: "Task Requests"), [:admin, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") %>
</li>
<li class="nav-item">
<%= link_to fa_icon("video-camera fw", text: "Casting Submissions"), [:admin, :casting_submissions], class: class_string("nav-link", "active" => controller_name == "casting_submissions") %>
</li>
<li class="nav-item">
<%= link_to fa_icon("bug fw", text: "Errors"), "https://sentry.io/bigmedia/", class: "nav-link", target: :_blank %>
</li>

View File

@@ -0,0 +1,27 @@
<tr id="<%= dom_id(casting_submission) %>">
<td>
<%= casting_submission.casting_call.project.account.name.titleize %>
</td>
<td>
<%= casting_submission.casting_call.title.titleize %>
</td>
<td>
<%= casting_submission.performer_name %>
</td>
<td>
<%= casting_submission.interview_date %>
</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 fa_icon("video-camera", text: "View"), casting_submission_url(token: casting_submission.token), target: "_blank", class: "dropdown-item" %>
<%= link_to fa_icon("pencil", text: "Edit"), [:edit, :admin, casting_submission], class: "dropdown-item" %>
<% unless casting_submission.interviewed_at.present? %>
<%= link_to fa_icon("check", text: "Complete"), [:complete, :admin, casting_submission], method: :post, class: "dropdown-item" %>
<% end %>
<%= link_to fa_icon("link fw", text: "Copy URL"), casting_submission_url(token: casting_submission.token), class: "dropdown-item", data: { behavior: "clipboard" } %>
</div>
</div>
</td>
</tr>

View File

@@ -0,0 +1,37 @@
<%= errors_summary_for casting_submission %>
<%= bootstrap_form_with model: model, local: true do |form| %>
<%= form.text_field :performer_name, required: true %>
<%= form.grouped_collection_select(:casting_call_id, @accounts, :casting_calls, :name, :id, :title, { prompt: "Select a Casting Call", required: true, class: "form-control custom-select" }) %>
<%= form.text_field :interview_date, class: "datepicker-control" %>
<%= form.text_field :zoom_meeting_url %>
<% unless casting_submission.new_record? %>
<%= form.file_field :interview_recording, accept: "video/mp4", data: { direct_upload_url: rails_direct_uploads_url, aws_bucket: ENV['AWS_BUCKET'], aws_access_key_id: ENV['AWS_ACCESS_KEY_ID'], signer_url: multipart_signatures_url } %>
<% if casting_submission.interview_recording.attached? %>
<p>
<%= link_to casting_submission.interview_recording do %>
<%= fa_icon "file-text-o" %> <%= casting_submission.interview_recording.filename %>
<% end %>
<span class="text-muted"><%= fa_icon "long-arrow-left" %> <em>Current interview recording</em></span>
</p>
<% end %>
<hr>
<%= card_field_set_tag t(".casting_submission_markers.heading") do %>
<% (1..CastingSubmission::NUMBER_OF_MARKER_FIELDS).each do |n| %>
<div class="form-row">
<%= form.number_field "time_elapsed_#{n}", wrapper_class: "col-md-6", label: "Elapsed Time #{n} (in seconds)" %>
<%= form.text_area "note_#{n}", wrapper_class: "col-md-6", label: "Note #{n}" %>
</div>
<% end %>
<% end %>
<% end %>
<div class="row align-items-center text-center mt-4">
<%= link_to t("shared.cancel"), [:admin, :casting_submissions], class: "col-3 text-reset" %>
<div class="col-9">
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => casting_submission.new_record?), data: { disable_with: t("shared.disable_with") } %>
</div>
</div>
<% end %>

View File

@@ -0,0 +1,6 @@
<div class="card shadow-sm">
<%= card_header text: "Edit Casting Submission", close_action_path: [:admin, :casting_submissions] %>
<div class="card-body">
<%= render "form", model: [:admin, @casting_submission], casting_submission: @casting_submission %>
</div>
</div>

View File

@@ -0,0 +1,32 @@
<div class="d-flex flex-row justify-content-between align-items-center mb-3">
<% if policy(CastingCall).new? %>
<%= link_to fa_icon("plus", text: t(".actions.new")), [:new, :admin, :casting_submission], class: "btn btn-primary mb-3" %>
<% end %>
</div>
<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>Account Name</th>
<th>Casting Call Request</th>
<th>Perfomer's Name</th>
<th>Interview Date</th>
<th></th>
</tr>
</thead>
<tbody id="users">
<% if @casting_submissions.any? %>
<%= render @casting_submissions %>
<% else %>
<tr>
<td colspan="20" class="py-4 text-center text-muted"><%= t(".empty") %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div id="casting_submissions_pagination" class="mt-3">
<%= will_paginate @casting_submissions %>
</div>

View File

@@ -0,0 +1,6 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [:admin, :casting_submissions] %>
<div class="card-body">
<%= render "form", model: [:admin, @casting_submission], casting_submission: @casting_submission, casting_calls: @casting_calls %>
</div>
</div>

View File

@@ -1,13 +1,5 @@
<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) %>
@@ -47,9 +39,6 @@
<% 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 %>

View File

@@ -44,7 +44,6 @@
<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>

View File

@@ -43,6 +43,12 @@
<%= product_wordmark :deliver_me, class: class_string("d-inline-block", "disabled" => !Current.account.deliverme_enabled?) %>
<% end %>
</li>
<li class="nav-item">
<%= link_to [project, :casting_calls], class: class_string("nav-link", "active" => controller_name == "casting_calls") do %>
<%= lock_icon_for(Current.account, :castme) %>
<%= product_wordmark :cast_me, class: class_string("d-inline-block", "disabled" => !Current.account.castme_enabled?) %>
<% end %>
</li>
</ul>
</nav>
<hr class="divider-light mx-n4">

View File

@@ -1,15 +0,0 @@
<div class="card shadow-sm">
<%= 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 [@releasable, :contracts, format: "pdf"] %>" width="90%" height="1200" />
<%= 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"), [@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>
</div>
<% end %>
</div>
</div>

View File

@@ -3,9 +3,6 @@
<td>
<%= broadcast.name %>
</td>
<td>
<%= broadcast.shoot_location_time_zone %>
</td>
<td>
<%= broadcast.status.titleize %>
</td>

View File

@@ -1,25 +1,12 @@
<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>
<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>
<% 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 %>
</div>
</li>

View File

@@ -2,7 +2,6 @@
<%= 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" %>

View File

@@ -1,7 +1,7 @@
<% if broadcast.streamer_recording? && broadcast.active? %>
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream"></div>
<div id="broadcast_video" class="embed-responsive-item"></div>
<% else %>
<div id="broadcast_video" class="embed-responsive-item" data-video-type="stream">
<div id="broadcast_video" class="embed-responsive-item">
<table class="w-100 h-100 bg-secondary">
<tbody>
<tr>

View File

@@ -22,7 +22,6 @@
<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>
@@ -33,7 +32,7 @@
<%= render @broadcasts %>
<% else %>
<tr>
<td colspan="6" class="py-4 text-center text-muted"><%= t(".empty") %></td>
<td colspan="5" class="py-4 text-center text-muted"><%= t(".empty") %></td>
</tr>
<% end %>
</tbody>

View File

@@ -33,10 +33,10 @@
<%= 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), "#", data: { behavior: "play_stream"}, class: "dropdown-item active" %>
<%= link_to fa_icon("check", text: @broadcast.name.titleize), "#", class: "dropdown-item active" %>
<% @multi_view_broadcasts.each do |broadcast| %>
<% if 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) %>
<%= link_to broadcast.name.titleize, broadcast.url, class: class_string("dropdown-item", "active" => @broadcast.id == broadcast.id) %>
<% end %>
<% end %>
<h5 class="dropdown-header">Previous Sessions</h5>
@@ -102,7 +102,6 @@
<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>
@@ -111,7 +110,6 @@
<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>

View File

@@ -18,7 +18,7 @@
<div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9">
<div class="embed-responsive-item">
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/435943632" style="position:absolute;top:0;left:0;width:100%;height:100%;" frameborder="0" allow="autoplay; fullscreen" allowfullscreen></iframe></div><script src="https://player.vimeo.com/api/player.js"></script>
<iframe src="https://player.vimeo.com/video/435200320?app_id=122963" width="426" height="240" frameborder="0" allow="autoplay; fullscreen" allowfullscreen title="DirectME_How to_V5"></iframe>
</div>
</div>
</div>

View File

@@ -0,0 +1,28 @@
<tr>
<td>
<%= casting_call.created_at.strftime('%D') %>
</td>
<td>
<%= casting_call.title %>
</td>
<td>
<%= casting_call.status %>
</td>
<td class="text-right">
<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 Audition URL"), casting_call_url(casting_call.token), class: "dropdown-item", data: { behavior: "clipboard" } %>
<% if policy(casting_call).show? %>
<%= link_to fa_icon("tasks fw", text: "View"), [casting_call.project, casting_call], class: "dropdown-item", target: '_blank' %>
<% end %>
<% if policy(casting_call).edit? %>
<%= link_to fa_icon("pencil fw", text: "Edit"), [:edit, casting_call.project, casting_call], class: "dropdown-item" %>
<% end %>
<% if policy(casting_call).cancel? && !casting_call.cancelled? %>
<%= link_to fa_icon("ban fw", text: "Cancel"), [:cancel, casting_call.project, casting_call], class: "dropdown-item", method: :post %>
<% end %>
</div>
</div>
</td>
</tr>

View File

@@ -0,0 +1,24 @@
<%= errors_summary_for casting_call %>
<%= bootstrap_form_with model: model, url: [@project, @casting_call, show_chat: true], local: true do |form| %>
<div class="alert alert-info text-center text-md-left">
<%= fa_icon "info-circle" %>
<strong><%= t '.info_message' %></strong>
</div>
<%= form.text_field :title %>
<%= form.text_area :description %>
<%= form.text_area :project_description %>
<%= field_set_tag t(".headings.chatbot") do %>
<%= form.text_area :interview_instructions, rows: 6 %>
<%= form.text_area :questions, rows: 8 %>
<%= form.text_area :interview_requirements, rows: 6 %>
<% end %>
<div class="row align-items-center text-center mt-4">
<%= link_to t("shared.cancel"), [project, :casting_calls], class: "col-3 text-reset" %>
<div class="col-9">
<%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => casting_call.new_record?), data: { disable_with: t("shared.disable_with") } %>
</div>
</div>
<% end %>

View File

@@ -0,0 +1,6 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :casting_calls] %>
<div class="card-body">
<%= render "form", model: [@project, @casting_call], casting_call: @casting_call, project: @project %>
</div>
</div>

View File

@@ -0,0 +1,37 @@
<%= product_wordmark :cast_me, class: "small mb-3" %>
<div class="row">
<div class="col-md-12">
<div class="d-md-flex d-sm-flex flex-sm-column flex-md-row flex-md-wrap mb-3">
<% if policy(CastingCall).new? %>
<%= link_to fa_icon("plus", text: t(".actions.new")), [:new, @project, :casting_call], class: "btn btn-primary mb-2" %>
<% end %>
</div>
</div>
</div>
<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><%= t(".table_headers.casting_call_created_on") %></th>
<th><%= t(".table_headers.casting_call_title") %></th>
<th><%= t(".table_headers.casting_call_status") %></th>
<th></th>
</tr>
</thead>
<tbody id="casting_calls">
<% if @casting_calls.any? %>
<%= render @casting_calls %>
<% else %>
<tr>
<td colspan="20" class="py-4 text-center text-muted"><%= t(".empty") %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
<div id="casting_calls_pagination" class="mt-3">
<%= will_paginate @casting_calls %>
</div>

View File

@@ -0,0 +1,6 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :casting_calls] %>
<div class="card-body">
<%= render "form", model: [@project, @casting_call], casting_call: @casting_call, project: @project %>
</div>
</div>

View File

@@ -0,0 +1,38 @@
<% content_for :header do %>
<header class="container-fluid py-3 border-bottom sticky-top bg-light">
<div class="row align-items-center justify-content-center">
<div class="col-4 text-center">
<%= product_wordmark(:cast_me, class: 'navbar-brand') %>
</div>
</div>
</header>
<% end %>
<div class="card shadow-sm">
<%= card_header text: @casting_call.title, close_action_path: [@project, :casting_calls] %>
<div class="card-body">
<div class="row">
<div class="col-md-6 col-sm-12">
<dl>
<%= description_list_pair_for @casting_call, :title, append: ":" %>
<%= description_list_pair_for @casting_call, :description, append: ":" %>
<%= description_list_pair_for @casting_call, :project_description, append: ":" %>
<%= description_list_pair_for @casting_call, :created_at, append: ":" %>
</dl>
</div>
<div class="col-md-6 col-sm-12">
<dl>
<%= description_list_pair_for @casting_call, :status, append: ":" %>
<%= description_list_pair_for @casting_call, :interview_instructions, append: ":" %>
<%= description_list_pair_for @casting_call, :interview_requirements, append: ":" %>
<%= description_list_pair_for @casting_call, :questions, append: ":" %>
</dl>
</div>
</div>
<% unless @casting_call.cancelled? %>
<div class="row align-items-center justify-content-center mt-3">
<%= link_to "Schedule an Audition", ENV["CASTME_AUDITION_BOOKING_URL"], target: "_blank", class: "btn btn-primary" %>
</div>
<% end %>
</div>
</div>

View File

@@ -0,0 +1,58 @@
<div class="d-flex flex-row">
<div class="d-flex flex-column">
<%= product_wordmark :cast_me, prefix: t('.headings.welcome'), class: "h2" %>
<p class="text-muted"><%= t '.headings.subtitle' %>
</div>
<%= 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(CastingCall).new? %>
<%= link_to t(".actions.create_casting_call"), [:new, @project, :casting_call], class: "btn btn-success border align-self-center h-50 pb-2" %>
<% end %>
</div>
<hr>
<div class="pt-2">
<div class="row">
<div class="col">
<div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9">
<div class="embed-responsive-item">
<table class="w-100 h-100 bg-secondary">
<tbody>
<tr>
<td class="text-center align-middle text-white">
Video tutorial will be available soon
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h3><%= t '.headings.how_it_works' %></h3>
<ol>
<li><%= t '.list_items.enter_information' %></li>
<li><%= t '.list_items.enter_questions' %></li>
<li><%= t '.list_items.copy_and_paste_submission_link' %></li>
<li><%= t '.list_items.wait_for_the_submission_video' %></li>
</ol>
</div>
</div>
<div class="row">
<div class="col">
<h3><%= t '.headings.benefits' %></h3>
<ul class="fa-ul ml-5">
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.fewer_team_members_needed'))) %>
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.fewer_resources_needed'))) %>
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.more_time_spent_with_quality_candidates'))) %>
</ul>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,17 @@
<p>Your <%= release_type.titleize %> files are being prepared for download. You will be notified when it's ready.
</p>
<p class="mt-3">The following downloads are also in progress:</p>
<ul>
<% downloads.each do |download| %>
<% if download.release_type == "reports"%>
<li><%= download.release_type.titleize %> (as of <%= time_ago_in_words(download.created_at) %> ago)
</li>
<% elsif download.release_type == "CastingSubmission"%>
<li><%= download.release_type.titleize %> files (as of <%= time_ago_in_words(download.created_at) %> ago)
</li>
<% else %>
<li><%= download.release_type.titleize %> contracts (as of <%= time_ago_in_words(download.created_at) %> ago)
</li>
<% end %>
<% end %>
</ul>

View File

@@ -0,0 +1,27 @@
<tr id="<%= dom_id(casting_submission) %>">
<td>
<%= casting_submission.casting_call.project.account.name.titleize %>
</td>
<td>
<%= casting_submission.casting_call.title&.titleize %>
</td>
<td>
<%= casting_submission.performer_name %>
</td>
<td>
<%= casting_submission.interviewed_at %>
</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">
<% if policy(CastingSubmission).show? %>
<%= link_to fa_icon("video-camera", text: "View"), [@project, casting_submission], target: "_blank", class: "dropdown-item" %>
<% end %>
<% if policy(CastingSubmission).download? %>
<%= link_to fa_icon("download", text: "Download"), [@project, :casting_submission_downloads, casting_submission_id: casting_submission.id], method: :post, remote: true, class: "dropdown-item" %>
<% end %>
</div>
</div>
</td>
</tr>

Some files were not shown because too many files have changed in this diff Show More