Compare commits

...

7 Commits

Author SHA1 Message Date
Bilal
62ef25e511 fix casting submission view page 2020-07-23 12:12:45 +02:00
Bilal
b82aaf77ff remove specs related to zoom url validation 2020-07-22 14:13:04 +02:00
Bilal
e08dd36d68 remove zoom url validation 2020-07-22 14:05:31 +02: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
140 changed files with 2241 additions and 1129 deletions

View File

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

View File

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

View File

@@ -17,7 +17,7 @@ class AccountsController < ApplicationController
if sign_in(user) 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) 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 redirect_to signed_in_root_path
else else
redirect_to new_session_path, alert: t(".notice") redirect_to new_session_path, alert: t(".notice")

View File

@@ -0,0 +1,61 @@
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)
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)) @appearance_releases = (AppearanceRelease.where(project: accessible_projects))
@location_releases = (LocationRelease.where(project: accessible_projects)) @location_releases = (LocationRelease.where(project: accessible_projects))
@material_releases = (MaterialRelease.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)) @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: { render json: {
data: { data: {
@@ -24,8 +22,6 @@ class Api::SyncController < Api::ApiController
appearance_releases: releases_query(@appearance_releases), appearance_releases: releases_query(@appearance_releases),
location_releases: releases_query(@location_releases), location_releases: releases_query(@location_releases),
material_releases: releases_query(@material_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), talent_releases: releases_query(@talent_releases),
notes: @notes notes: @notes
} }

View File

@@ -1,21 +0,0 @@
class ApprovalsController < ApplicationController
include MedicalReleaseContext
before_action :set_medical_release
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')
end
end
private
def set_project
@project = @medical_release.project
end
end

View File

@@ -0,0 +1,75 @@
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]
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 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,30 @@
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])
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

@@ -62,11 +62,10 @@ class ContractTemplatesController < ApplicationController
def contract_template_params def contract_template_params
params params
.require(:contract_template) .require(:contract_template)
.permit(:name, :release_type, :body, :guardian_clause, .permit(:name, :release_type, :body, :guardian_clause, :fee,
:signature_legal_text, :fee,
:applicable_medium_id, :applicable_medium_text, :applicable_medium_id, :applicable_medium_text,
:territory_id, :territory_text, :territory_id, :territory_text,
:term_id, :term_text, :accessibility, :term_id, :term_text,
:restriction_id, :restriction_text, :restriction_id, :restriction_text,
:question_1_text, :question_2_text, :question_1_text, :question_2_text,
:question_3_text, :question_4_text, :question_3_text, :question_4_text,

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

@@ -28,9 +28,8 @@ class StreamNotificationsController < ApplicationController
asset_uid = notification.dig(:object, :id) asset_uid = notification.dig(:object, :id)
playback_uid = notification.dig(:data, :playback_ids, 0, :id) playback_uid = notification.dig(:data, :playback_ids, 0, :id)
file_name = notification.dig(:data, :static_renditions, :files, -1, :name) 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]) recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank") link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")

View File

@@ -19,7 +19,7 @@ class TaskRequestsController < ApplicationController
if @task_request.save if @task_request.save
log_create_analytics log_create_analytics
taskme_url = url_for([:admin, @task_request]) 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 else
render :new render :new
end end

View File

@@ -5,12 +5,4 @@ module TooltipHelper
concat tag.div(class: "tooltip-inner") concat tag.div(class: "tooltip-inner")
end end
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}]"
else
medical_release.approved_by_user_email
end
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| before_perform do |job|
@project = job.arguments.first @project = job.arguments.first
@download = job.arguments.second @download = job.arguments.second
@release_type = job.arguments.third release_type = job.arguments.third
@folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}" @folder_name = "#{@project.name.parameterize}_#{get_release_name(release_type).gsub('_', '-')}"
@download.update!(name: @folder_name, status: :pending) @download.update!(name: @folder_name, status: :pending)
end end
@@ -20,14 +20,9 @@ class GenerateContractsZipJob < ApplicationJob
files.each do |attachment| files.each do |attachment|
zipfile.add(attachment, File.join("#{dir}/", attachment)) zipfile.add(attachment, File.join("#{dir}/", attachment))
end 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 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 end
rescue StandardError => e rescue StandardError => e
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message) 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 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) def get_release_name(release_type)
release_type.constantize.model_name.plural release_type.constantize.model_name.plural
end end

View File

@@ -1,19 +1,11 @@
class SubmitHubspotFormJob < ApplicationJob class SubmitHubspotFormJob < ApplicationJob
queue_as :default queue_as :default
def perform(first_name, last_name, email, company_name, additional_params = {}) def perform(params = {})
hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"] return unless params[:form_guid].present?
return unless hubspot_form_guid.present?
submission_params = { form = Hubspot::Form.new("guid" => params[:form_guid])
first_name: first_name, is_form_sumitted = form.submit(params.except(:form_guid))
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)
raise StandardError.new "Failed to submit the hubspot form data: #{is_form_sumitted}" unless is_form_sumitted raise StandardError.new "Failed to submit the hubspot form data: #{is_form_sumitted}" unless is_form_sumitted
end 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 :account_auths
has_many :users, through: :account_auths has_many :users, through: :account_auths
has_many :projects, dependent: :destroy has_many :projects, dependent: :destroy
has_many :casting_calls, through: :projects
has_many :casting_submissions, through: :projects
has_many :videos, through: :projects has_many :videos, through: :projects
has_many :contract_templates, through: :projects has_many :contract_templates, through: :projects
@@ -59,6 +61,8 @@ class Account < ApplicationRecord
MedicalRelease.where(project: projects), MedicalRelease.where(project: projects),
MiscRelease.where(project: projects), MiscRelease.where(project: projects),
MatchingRequest.where(project: projects), MatchingRequest.where(project: projects),
CastingCall.where(project: projects),
self.casting_submissions,
self self
])).sum(:byte_size).to_f ])).sum(:byte_size).to_f
end end
@@ -87,6 +91,10 @@ class Account < ApplicationRecord
ENV["TASKME_ENABLED"] && (plan_uid.to_s == "me_suite" || plan_uid.to_s == "taskme") ENV["TASKME_ENABLED"] && (plan_uid.to_s == "me_suite" || plan_uid.to_s == "taskme")
end end
def castme_enabled?
plan_uid.to_s == "me_suite" || plan_uid.to_s == "castme"
end
def plan_name def plan_name
case plan_uid.to_s case plan_uid.to_s
when "deliverme" when "deliverme"
@@ -97,6 +105,8 @@ class Account < ApplicationRecord
"ReleaseME" "ReleaseME"
when "taskme" when "taskme"
"TaskME" "TaskME"
when "castme"
"CastME"
when "me_suite" when "me_suite"
"ME Suite" "ME Suite"
end end

View File

@@ -9,13 +9,6 @@ class AcquiredMediaRelease < ApplicationRecord
include Signable include Signable
include Syncable include Syncable
include PersonName include PersonName
include CsvExportable
class << self
def custom_csv_exportable_headers
%i[name file_infos_count]
end
end
has_many :file_infos, as: :releasable, dependent: :destroy has_many :file_infos, as: :releasable, dependent: :destroy
@@ -64,8 +57,4 @@ class AcquiredMediaRelease < ApplicationRecord
def uses_edl? def uses_edl?
true true
end end
def file_infos_count
file_infos.any? ? file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media')
end
end end

View File

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

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,15 @@
class CastingSubmission < ApplicationRecord
belongs_to :casting_call
has_many_attached :files
has_one_attached :interview_recording
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
end

View File

@@ -1,56 +0,0 @@
# frozen_string_literal: true
module CsvExportable
extend ActiveSupport::Concern
COMMON_HEADERS = %i[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,7 +21,6 @@ class ContractTemplate < ApplicationRecord
monetize :fee_cents monetize :fee_cents
has_rich_text :body has_rich_text :body
has_rich_text :guardian_clause has_rich_text :guardian_clause
has_rich_text :signature_legal_text
validates :name, presence: true validates :name, presence: true
validates :release_type, presence: true validates :release_type, presence: true
@@ -43,8 +42,6 @@ class ContractTemplate < ApplicationRecord
scope :non_archived, -> { where(archived_at: nil) } scope :non_archived, -> { where(archived_at: nil) }
scope :order_by_name, -> { order(:name) } scope :order_by_name, -> { order(:name) }
enum accessibility: [:public_template, :private_template]
def fee? def fee?
!fee.zero? !fee.zero?
end end
@@ -68,10 +65,4 @@ class ContractTemplate < ApplicationRecord
def has_questionnaire? def has_questionnaire?
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence } (1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
end end
def attributes
result = super()
result[:signature_legal_text] = signature_legal_text.as_json
result
end
end end

View File

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

View File

@@ -10,13 +10,6 @@ class MaterialRelease < ApplicationRecord
include Syncable include Syncable
include Taggable include Taggable
include PersonName include PersonName
include CsvExportable
class << self
def custom_csv_exportable_headers
%i[name]
end
end
composed_of :person_address, composed_of :person_address,
class_name: "Address", class_name: "Address",

View File

@@ -11,13 +11,6 @@ class MedicalRelease < ApplicationRecord
include SecondGuardianPhotoable include SecondGuardianPhotoable
include GuardianName include GuardianName
include SecondGuardianName include SecondGuardianName
include CsvExportable
class << self
def custom_csv_exportable_headers
%i[approved? name contact_info]
end
end
NUMBER_OF_CUSTOM_FIELDS = 15 NUMBER_OF_CUSTOM_FIELDS = 15
@@ -107,18 +100,6 @@ class MedicalRelease < ApplicationRecord
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}" "#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
end 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 private
def valid_answers def valid_answers

View File

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

View File

@@ -7,13 +7,6 @@ class MusicRelease < ApplicationRecord
include Searchable include Searchable
include Taggable include Taggable
include PersonName include PersonName
include CsvExportable
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 :file_infos, as: :releasable, dependent: :destroy
has_many :composers, dependent: :destroy has_many :composers, dependent: :destroy
@@ -79,18 +72,6 @@ class MusicRelease < ApplicationRecord
false false
end end
def file_infos_count
file_infos.size
end
def composers_count
composers.size
end
def publishers_count
publishers.size
end
private private
def publisher_percentages_add_up_to_100 def publisher_percentages_add_up_to_100

View File

@@ -15,6 +15,8 @@ class Project < ApplicationRecord
has_many :talent_releases, dependent: :destroy has_many :talent_releases, dependent: :destroy
has_many :medical_releases, dependent: :destroy has_many :medical_releases, dependent: :destroy
has_many :misc_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 :videos, dependent: :destroy
has_many :imports, dependent: :destroy has_many :imports, dependent: :destroy
has_many :contract_templates, dependent: :destroy has_many :contract_templates, dependent: :destroy

View File

@@ -10,7 +10,7 @@ class QrCode
url = Rails.application.routes.url_helpers.url_for(route) url = Rails.application.routes.url_helpers.url_for(route)
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_") filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
new(url, "#{filename}.png") new(url, filename)
end end
def initialize(url, filename = "qrcode.png") def initialize(url, filename = "qrcode.png")

View File

@@ -14,13 +14,6 @@ class TalentRelease < ApplicationRecord
include SecondGuardianPhotoable include SecondGuardianPhotoable
include GuardianName include GuardianName
include SecondGuardianName include SecondGuardianName
include CsvExportable
class << self
def custom_csv_exportable_headers
%i[name phone email]
end
end
composed_of :person_address, composed_of :person_address,
class_name: "Address", class_name: "Address",
@@ -93,14 +86,6 @@ class TalentRelease < ApplicationRecord
person_name person_name
end end
def phone
person_phone
end
def email
person_email
end
def filename_suffix def filename_suffix
"#{person_last_name} #{person_first_name}" "#{person_last_name} #{person_first_name}"
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 def resolve
if user.account_manager? if user.account_manager?
scope.left_outer_joins(:project).where(projects: {account: user.account}) 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 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 end
end end

View File

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

View File

@@ -40,4 +40,8 @@ class ProjectPolicy < ApplicationPolicy
def show_task_results? def show_task_results?
show? show?
end end
def show_casting_submission_results?
show?
end
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

@@ -170,6 +170,24 @@ class Analytics
end end
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 private
attr_reader :user, :account, :backend attr_reader :user, :account, :backend

View File

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

View File

@@ -0,0 +1,26 @@
<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 %>
</div>
</div>
</td>
</tr>

View File

@@ -0,0 +1,30 @@
<%= 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/*", 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 %>
<% 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

@@ -43,6 +43,12 @@
<%= product_wordmark :deliver_me, class: class_string("d-inline-block", "disabled" => !Current.account.deliverme_enabled?) %> <%= product_wordmark :deliver_me, class: class_string("d-inline-block", "disabled" => !Current.account.deliverme_enabled?) %>
<% end %> <% end %>
</li> </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> </ul>
</nav> </nav>
<hr class="divider-light mx-n4"> <hr class="divider-light mx-n4">

View File

@@ -1,15 +0,0 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :medical_releases] %>
<div class="card-body">
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for [@medical_release, :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| %>
<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" %>
<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

@@ -18,7 +18,7 @@
<div class="card-body p-0"> <div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9"> <div class="embed-responsive embed-responsive-16by9">
<div class="embed-responsive-item"> <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> </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,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>

View File

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

View File

@@ -0,0 +1,14 @@
<div class="overflow-auto mh-30">
<ul class="list-unstyled d-flex flex-column align-items-center text-center" id="casting_submission_file_list_<%= casting_submission.id %>">
<% if files.present? %>
<%= render partial: "casting_submissions/file", collection: files %>
<% else %>
<li class="my-3">
Files will appear here.
</li>
<% end %>
</ul>
<div class="d-flex mt-2 justify-content-center" id="casting_submission_files_pagination_<%= casting_submission.id %>">
<%= will_paginate(files, param_name: 'files_page', params: { active_files_tab: casting_submission.id }) if files.present? %>
</div>
</div>

View File

@@ -0,0 +1,15 @@
<% if casting_submission.interview_recording.present? %>
<div id="casting_submission_video" class="embed-responsive-item"></div>
<% else %>
<div id="casting_submission_video" class="embed-responsive-item">
<table class="w-100 h-100 bg-secondary">
<tbody>
<tr>
<td class="text-center align-middle text-white">
Video player will appear here when the interview recording is available.
</td>
</tr>
</tbody>
</table>
</div>
<% end %>

View File

@@ -0,0 +1,26 @@
<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>Interviewed At</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,79 @@
<% 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="row">
<div class="col-lg-8 col-md-12 mb-3">
<div class="card shadow-sm">
<div class="card-header">
<div class="d-flex justify-content-start flex-column">
<h1 class="h2 mb-1"><%= @casting_submission.performer_name %></h1>
<h1 class="h6 mb-1"><%= @casting_call.title %></h1>
</div>
</div>
<div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9">
<%= render partial: 'casting_submissions/video', locals: { casting_submission: @casting_submission } %>
<% if @casting_submission.interview_recording.present? %>
<%= javascript_tag nonce: true do %>
new Clappr.Player({
parentId: '#casting_submission_video',
source: "<%= rails_blob_url(@casting_submission.interview_recording, host: AppHost.new.domain_with_port) %>",
width: '100%',
height: '100%',
mute: true,
autoPlay: true,
hlsMinimumDvrSize: 1
});
<% end %>
<% end %>
</div>
</div>
</div>
</div>
<div class="col-lg-4 col-md-12 mb-3">
<div class="card shadow-sm mb-3">
<div class="card-header">
<ul class="nav nav-tabs card-header-tabs">
<li class="nav-item">
<%= link_to "Home", "#home", class: class_string("nav-link", "active" => !params[:active_tab].present?), data: { toggle: "tab" } %>
</li>
<li class="nav-item">
<%= link_to "Files", "#files", class: class_string("nav-link", "active" => params[:active_tab] == "files"), data: { toggle: "tab" } %>
</li>
</ul>
</div>
<div class="card-body p-3">
<div class="tab-content">
<div class="<%= class_string("tab-pane fade show", "active" => !params[:active_tab].present?) %>" id="home">
<div class="row">
<div class="col-md-12">
<dl>
<%= description_list_pair_for @casting_call, :title, append: ":" %>
<%= description_list_pair_for @casting_call, :status, append: ":" %>
<%= description_list_pair_for @casting_call, :created_at, append: ":" %>
<%= description_list_pair_for @casting_call, :description, append: ":" %>
<%= description_list_pair_for @casting_call, :project_description, 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>
</div>
<div class="<%= class_string("tab-pane fade show", "active" => params[:active_tab] == 'files') %>" id="files">
<div class="tab-pane fade show active" id="files_casting_submission_<%= @casting_submission.id %>">
<%= render partial: 'casting_submissions/files_section', locals: { casting_submission: @casting_submission, files: @files } %>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -15,7 +15,7 @@
<td> <td>
<%= contract_template.releases.size %> <%= contract_template.releases.size %>
</td> </td>
<td class="text-right" nowrap> <td class="text-right">
<div class="btn-group"> <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 } %> <%= 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"> <div class="dropdown-menu dropdown-menu-right">
@@ -27,7 +27,7 @@
<%= link_to fa_icon("print", text: "Print"), [:new, contract_template, :blank_contracts], class: "dropdown-item", target: :_blank %> <%= link_to fa_icon("print", text: "Print"), [:new, contract_template, :blank_contracts], class: "dropdown-item", target: :_blank %>
<% end %> <% end %>
<% if policy(contract_template).destroy? %> <% if policy(contract_template).destroy? %>
<%= link_to fa_icon("trash", text: "Delete"), contract_template, class: "dropdown-item", method: :delete, data: { confirm: "Are you sure?" } %> <%= link_to fa_icon("archive", text: "Archive"), contract_template, class: "dropdown-item", method: :delete, data: { confirm: "Are you sure?" } %>
<% end %> <% end %>
</div> </div>
</div> </div>

View File

@@ -4,10 +4,6 @@
<%= form.text_field :name, wrapper_class: "col-sm-6" %> <%= 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(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" %>
</div> </div>
<div class="form-row mb-3">
<%= form.radio_button :accessibility, :public_template, label: "Public", wrapper_class: "mr-3" %>
<%= form.radio_button :accessibility, :private_template, label: "Private" %>
</div>
<div class="form-row" id="fee_field"> <div class="form-row" id="fee_field">
<%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", wrapper_class: "col-sm-6" %> <%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", wrapper_class: "col-sm-6" %>
</div> </div>
@@ -29,11 +25,6 @@
<%= form.rich_text_area :guardian_clause %> <%= form.rich_text_area :guardian_clause %>
<% end %> <% end %>
</div> </div>
<div id="signature_legal_text">
<%= form.form_group do %>
<%= form.rich_text_area :signature_legal_text %>
<% end %>
</div>
<% end %> <% end %>
<%= field_set_tag content_tag(:span, t(".custom_fields.heading"), class: "h6 text-muted text-uppercase"), id: "custom_fields", style: "display: none;" do %> <%= field_set_tag content_tag(:span, t(".custom_fields.heading"), class: "h6 text-muted text-uppercase"), id: "custom_fields", style: "display: none;" do %>

View File

@@ -18,7 +18,7 @@
<div class="card-body p-0"> <div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9"> <div class="embed-responsive embed-responsive-16by9">
<div class="embed-responsive-item"> <div class="embed-responsive-item">
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/435942851" 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/435200486?app_id=122963" width="426" height="240" frameborder="0" allow="autoplay; fullscreen" allowfullscreen title="ReleaseME_How to_V5"></iframe>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,13 +0,0 @@
<% if preview %>
<h1>PREVIEW ONLY</h1>
<% end %>
<p class="heading"><strong><u><%= t '.heading' %></u></strong></p>
<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_by'), releasable.approved_by_user_name %>
<%= description_list_pair t('.description_labels.date_issued'), releasable.approved_at %>
</dl>

View File

@@ -25,13 +25,6 @@
<div class="page"> <div class="page">
<%= render "contracts/signature_page", releasable: releasable, contract_template: contract_template, preview: preview %> <%= render "contracts/signature_page", releasable: releasable, contract_template: contract_template, preview: preview %>
</div> </div>
<% if releasable.class == MedicalRelease && releasable.approved? %>
<div class="page">
<%= render "contracts/for_office_use_only", releasable: releasable, preview: preview %>
</div>
<% end %>
<% if releasable.class == AcquiredMediaRelease %> <% if releasable.class == AcquiredMediaRelease %>
<div class="page"> <div class="page">
<%= render "contracts/files", release: releasable, preview: preview %> <%= render "contracts/files", release: releasable, preview: preview %>

View File

@@ -1,13 +1,5 @@
<tr id="<%= dom_id(medical_release) %>"> <tr id="<%= dom_id(medical_release) %>">
<td data-behavior="select"><%= check_box_tag "medical_release_ids[]", medical_release.id, false %></td> <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) %>
<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>
<% end %>
</td>
<td> <td>
<% if medical_release.photo.attached? %> <% if medical_release.photo.attached? %>
<%= image_tag medium_variant(medical_release.photo), class: "img-fluid" %> <%= image_tag medium_variant(medical_release.photo), class: "img-fluid" %>
@@ -45,9 +37,6 @@
<% if policy(medical_release.tags).new? %> <% if policy(medical_release.tags).new? %>
<%= link_to fa_icon("tags fw", text: "Tags"), [:new, medical_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %> <%= link_to fa_icon("tags fw", text: "Tags"), [:new, medical_release, :acts_as_taggable_on_tag], class: "dropdown-item", remote: true %>
<% end %> <% end %>
<% if policy(MedicalRelease).review? %>
<%= link_to fa_icon("search fw", text: t('.actions.review')), new_medical_release_approvals_path(medical_release), class: "dropdown-item" %>
<% end %>
<% if policy(MedicalRelease).download_single? && policy(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %> <% if policy(MedicalRelease).download_single? && policy(Contract).show? && (medical_release.contract.attached? || medical_release.contract_template.present?) %>
<%= link_to fa_icon("download fw", text: "Download"), [medical_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %> <%= link_to fa_icon("download fw", text: "Download"), [medical_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
<% end %> <% end %>

View File

@@ -22,7 +22,6 @@
<thead class="thead-light"> <thead class="thead-light">
<tr> <tr>
<th data-behavior="all-selectable"><%= check_box_tag "medical_release_ids[]", false, false %></th> <th data-behavior="all-selectable"><%= check_box_tag "medical_release_ids[]", false, false %></th>
<th><%= t '.table_headers.approved'%></th>
<th></th> <th></th>
<th><%= MedicalRelease.human_attribute_name(:person_name) %></th> <th><%= MedicalRelease.human_attribute_name(:person_name) %></th>
<th><%= MedicalRelease.human_attribute_name(:contact_info) %></th> <th><%= MedicalRelease.human_attribute_name(:contact_info) %></th>

View File

@@ -1,15 +0,0 @@
<div class="card shadow-sm">
<%= card_header text: t(".heading"), close_action_path: [@project, :medical_releases] %>
<div class="card-body">
<embed class="embeded-contract-preview" type="application/pdf" src="<%= url_for [@medical_release, :contracts, format: "pdf"] %>" width="90%" height="1200" />
<%= bootstrap_form_with model: @medical_release, method: :patch, url: [:approve, @medical_release], 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" %>
<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

@@ -21,6 +21,11 @@
<%= link_to t("projects.show.tasks"), [@project, :tasks], class: "text-decoration-none text-reset stretched-link" %> <%= link_to t("projects.show.tasks"), [@project, :tasks], class: "text-decoration-none text-reset stretched-link" %>
<% end %> <% end %>
<% end %> <% end %>
<% if policy(Project).show_casting_submission_results? %>
<%= render "folder_card" do %>
<%= link_to t("projects.show.casting_submissions"), [@project, :casting_submissions], class: "text-decoration-none text-reset stretched-link" %>
<% end %>
<% end %>
</div> </div>
<hr/> <hr/>

View File

@@ -50,7 +50,7 @@
<hr> <hr>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -156,7 +156,7 @@
<% end %> <% end %>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -0,0 +1,29 @@
<% 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 %>
<div class="card-body">
<div class="row">
<div class="col-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: ":" %>
</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,51 @@
<div class="card shadow-sm">
<%= card_header text: "Casting submission details" %>
<div class="card-body">
<div class="row">
<div class="col-lg-12">
<dl>
<%= description_list_pair_for @casting_submission, :performer_name, append: ":" %>
<%= description_list_pair_for @casting_submission, :interview_date, append: ":" %>
</dl>
</div>
</div>
<h6>INTERVIEW FILES:</h6>
<hr/>
<div class="row">
<div class="col-lg-12">
<div class="card shadow-sm">
<%= card_header text: t(".heading") %>
<div class="card-body">
<%= errors_summary_for @casting_submission %>
<%= bootstrap_form_with model: @casting_submission, url: casting_submission_path(token: @casting_submission.token), local: true do |form| %>
<div class="field d-none">
<%= form.label :files %>
<%= form.file_field :files, disable: true, direct_upload: true, multiple: true, id: "casting_call_interivew_files", hide_label: true %>
<% @casting_submission.files.each do |file| %>
<% unless file.persisted? %>
<%= hidden_field_tag "#{@casting_submission.model_name.param_key}[files][]", file.signed_id %>
<% end %>
<% end %>
</div>
<div class="dropzone field border-dashed"
data-accepted-files="audio/*,image/*,video/*"
data-behavior="dropzone"
data-file-input-id="casting_call_interivew_files"
data-existing-files="<%= mock_photos_json(@casting_submission.files) %>"
data-placeholder="<%= dropzone_placeholder_message_for(@casting_submission) %>"
data-submit-button="#submit_folder"></div>
<div class="mt-5">
<%= form.button t(".update"), class: "btn btn-block btn-lg btn-success", data: { disable_with: t("shared.disable_with") } %>
</div>
<% end %>
</div>
</div>
</div>
</div>
<div class="row align-items-center justify-content-center mt-3">
<%= link_to "Start Interview", @casting_submission.zoom_meeting_url, target: "_blank", class: "btn btn-primary" %>
</div>
</div>
</div>

View File

@@ -50,7 +50,7 @@
<% end %> <% end %>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory' %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -41,7 +41,7 @@
<hr> <hr>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory' %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -145,7 +145,7 @@
<% end %> <% end %>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -39,7 +39,9 @@
<%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %> <%= form.text_field :person_first_name, required: true, wrapper_class: "col-sm-6" %>
<%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %> <%= form.text_field :person_last_name, required: true, wrapper_class: "col-sm-6" %>
<%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %> <%= form.phone_field :person_phone, wrapper_class: "col-sm-6" %>
<%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %> </div>
<div class="form-row">
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
</div> </div>
<%= render "shared/address_fields", form: form, subject: "person" %> <%= render "shared/address_fields", form: form, subject: "person" %>
<% end %> <% end %>
@@ -95,7 +97,7 @@
<% end %> <% end %>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -131,7 +131,7 @@
<% end %> <% end %>
<%= card_field_set_tag t(".signature.heading") do %> <%= card_field_set_tag t(".signature.heading") do %>
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %> <%= render "shared/signature_fields", form: form %>
<% end %> <% end %>
<div class="mt-5"> <div class="mt-5">

View File

@@ -0,0 +1,15 @@
<% if params[:show_chat] %>
<%= javascript_include_tag "//js.hs-scripts.com/7344617.js", defer: "defer", async: true, id: "hs-script-loader" %>
<%= javascript_tag nonce: true do %>
function onConversationsAPIReady() {
window.HubSpotConversations.widget.load({ widgetOpen: true });
window.HubSpotConversations.widget.open();
}
if (window.HubSpotConversations) {
onConversationsAPIReady();
} else {
window.hsConversationsOnReady = [onConversationsAPIReady];
}
<% end %>
<% end %>

View File

@@ -12,8 +12,4 @@
<%= fa_icon "refresh" %> <%= t "shared.clear" %> <%= fa_icon "refresh" %> <%= t "shared.clear" %>
<% end %> <% end %>
</div> </div>
<br>
<% if local_assigns[:signature_legal_text] && signature_legal_text.present? %>
<div class="alert alert-warning font-weight-bold"><%= signature_legal_text %></div>
<% end %>

View File

@@ -1,16 +1,2 @@
<% if params[:show_chat] %> <%= render "shared/initiate_hubspot_chat" %>
<%= javascript_include_tag "//js.hs-scripts.com/7344617.js", defer: "defer", async: true, id: "hs-script-loader" %>
<%= javascript_tag nonce: true do %>
function onConversationsAPIReady() {
window.HubSpotConversations.widget.load({ widgetOpen: true });
window.HubSpotConversations.widget.open();
}
if (window.HubSpotConversations) {
onConversationsAPIReady();
} else {
window.hsConversationsOnReady = [onConversationsAPIReady];
}
<% end %>
<% end %>
<p class="alert alert-success p-3 lead text-center"><%= t '.success_message' %></p> <p class="alert alert-success p-3 lead text-center"><%= t '.success_message' %></p>
<%= link_to fa_icon("arrow-left", text: "Back"), [@project, :task_requests], class: "btn btn-primary" %>

View File

@@ -6,7 +6,7 @@
<%= 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' %> <%= 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(Video).new? %> <% if policy(Video).new? %>
<%= link_to t(".actions.upload_video"), [:landing, @project, :videos], class: "btn btn-success border align-self-center h-50 pb-2" %> <%= link_to t(".actions.upload_video"), [:new, @project, :video], class: "btn btn-success border align-self-center h-50 pb-2" %>
<% end %> <% end %>
</div> </div>
@@ -18,7 +18,7 @@
<div class="card-body p-0"> <div class="card-body p-0">
<div class="embed-responsive embed-responsive-16by9"> <div class="embed-responsive embed-responsive-16by9">
<div class="embed-responsive-item"> <div class="embed-responsive-item">
<div style="padding:56.25% 0 0 0;position:relative;"><iframe src="https://player.vimeo.com/video/435943995" 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/435200434?app_id=122963" width="426" height="240" frameborder="0" allow="autoplay; fullscreen" allowfullscreen title="DeliverME_How to_V5"></iframe>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -50,7 +50,6 @@ en:
empty: Acquired Media Releases will appear here empty: Acquired Media Releases will appear here
table_headers: table_headers:
file_infos_count: No. Files file_infos_count: No. Files
name: Name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
@@ -71,6 +70,9 @@ en:
person_phone: Phone person_phone: Phone
person_photo: Photo person_photo: Photo
signed_on: Date signed_on: Date
casting_call:
interview_instructions: Welcome message
interview_requirements: Goodbye message
location_release: location_release:
person_company: Company person_company: Company
person_email: Email person_email: Email
@@ -98,6 +100,22 @@ en:
application: application:
header: header:
sign_out: Sign Out sign_out: Sign Out
casting_submissions:
complete:
notice: The casting submission has been completed
create:
notice: The casting submission has been created
index:
actions:
new: Create Casting Submission
empty: Casting submissions will appear here
mark_as_completed:
alert: Failed to mark casting submission as completed
notice: The casting submission has been marked as completed
new:
heading: New Casting Submission
update:
notice: The casting submission has been updated
task_requests: task_requests:
index: index:
empty: Task requests will appear here empty: Task requests will appear here
@@ -152,8 +170,6 @@ en:
empty: Appearance Releases will appear here empty: Appearance Releases will appear here
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release
table_headers: table_headers:
contact_info: Contact info
name: Name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
@@ -174,13 +190,6 @@ en:
sidebar: sidebar:
files: Files files: Files
team_member: Team Member team_member: Team Member
approvals:
create:
release_approved: Medical release has been approved
new:
actions:
approve: Approve
heading: Review Medical Release
blank_contracts: blank_contracts:
new: new:
number_of_copies_label: Number of copies number_of_copies_label: Number of copies
@@ -238,6 +247,42 @@ en:
bulk_taggings: bulk_taggings:
new_bulk_tag_modal: new_bulk_tag_modal:
submit: Add submit: Add
casting_calls:
cancel:
notice: The casting call request has been cancelled successfully
casting_call:
actions:
manage: Manage
create:
notice: The casting call request has been created successfully.
edit:
heading: Edit Casting Call
form:
headings:
chatbot: Chatbot Instructions
info_message: After submitting this casting call request, you'll be connected via chat with a ME Suite representative.
index:
actions:
new: Create Casting Call
empty: Casting calls will appear here
table_headers:
casting_call_created_on: Created On
casting_call_status: Status
casting_call_title: Casting Title
new:
heading: New Casting Call
update:
notice: The casting call request has been updated
casting_submission_downloads:
download:
failure: Your download could not be generated.
pending: "Your %{release_type} files are being prepared for download. You will be notified when it's ready."
success: "Your %{release_type} files are ready. Download now, or retrieve later in the %{downloads_folder_link} folder. %{download_button}"
casting_submissions:
index:
empty: Casting Submission results will appear here.
show:
empty: Casting Submission files and recorded meeetings will appear here.
contract_downloads: contract_downloads:
download: download:
failure: Your download could not be generated. failure: Your download could not be generated.
@@ -298,14 +343,6 @@ en:
print_QR_code: Print out release QR codes print_QR_code: Print out release QR codes
releases_automatically_organized: Releases are automatically organized as theyre submitted releases_automatically_organized: Releases are automatically organized as theyre submitted
contracts: contracts:
for_office_use_only:
description_labels:
date_issued: Date Issued
employee_issued_to: Employee Issued To
issued_by: Issued By
producer: Producer
production: Production
heading: For Office Use Only
photos: photos:
guardian_2_photo_heading: Second guardian photo guardian_2_photo_heading: Second guardian photo
guardian_photo_heading: Guardian photo guardian_photo_heading: Guardian photo
@@ -379,10 +416,13 @@ en:
notice: The release has been updated notice: The release has been updated
helpers: helpers:
help: help:
casting_call:
interview_instructions: This is the first message the chatbot, BiGGiE, will send. Please include all information and instructions you wish the person to read prior to starting the casting interview.
interview_requirements: Please enter a final message and include any post-interview instructions (for example, submitting a headshot, additional photos, videos, etc).
questions: Please list, one-by-one, all of the questions you wish the chatbot, BiGGiE, to ask the person.
contract_template: contract_template:
fee: Leave at $0.00 for no-fee fee: Leave at $0.00 for no-fee
guardian_clause: Leave blank if not required for this contract guardian_clause: Leave blank if not required for this contract
signature_legal_text: Leave blank if not required for this contract
task_request: task_request:
time_allowed: Minimum of 2 hours, no partial hours allowed time_allowed: Minimum of 2 hours, no partial hours allowed
video: video:
@@ -438,6 +478,13 @@ en:
person_last_name: Last name person_last_name: Last name
person_name: Name person_name: Name
person_phone: Phone number person_phone: Phone number
casting_call:
description: Casting search description
interview_instructions: Welcome message
interview_requirements: Goodbye message
project_description: Project description
questions: Questions
title: Casting search title
location_release: location_release:
address_city: City address_city: City
address_country: Country address_country: Country
@@ -687,6 +734,8 @@ en:
broadcast: broadcast:
create: Create Live Stream create: Create Live Stream
update: Save Changes update: Save Changes
casting_submission:
create: Create Casting Submission
contract_template: contract_template:
create: Create Release Template create: Create Release Template
directory: directory:
@@ -745,7 +794,6 @@ en:
empty: Location Releases will appear here empty: Location Releases will appear here
table_headers: table_headers:
address: Address address: Address
name: Name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
@@ -780,7 +828,6 @@ en:
search: Search search: Search
empty: Material Releases will appear here empty: Material Releases will appear here
table_headers: table_headers:
name: Name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
@@ -802,19 +849,12 @@ en:
search: Search search: Search
empty: Medical releases will appear here empty: Medical releases will appear here
table_headers: table_headers:
approved: Approved
approved?: Approved
contact_info: Contact info
name: Person name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
medical_release: medical_release:
actions: actions:
manage: Manage manage: Manage
review: Review
messages:
approved_tooltip: Approved by %{user} on %{timestamp}
misc_releases: misc_releases:
destroy: destroy:
alert: The misc release has been deleted alert: The misc release has been deleted
@@ -823,8 +863,6 @@ en:
search: Search search: Search
empty: Misc Releases will appear here empty: Misc Releases will appear here
table_headers: table_headers:
contact_info: Contact info
name: Person name
notes: Notes notes: Notes
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
@@ -859,7 +897,6 @@ en:
table_headers: table_headers:
composers_count: No. Composers composers_count: No. Composers
file_infos_count: No. Files file_infos_count: No. Files
name: Name
notes: Notes notes: Notes
publishers_count: No. Publishers publishers_count: No. Publishers
signed_at: Date Signed signed_at: Date Signed
@@ -962,6 +999,7 @@ en:
show: show:
acquired_media_release: Acquired Media Releases (%{count}) acquired_media_release: Acquired Media Releases (%{count})
appearance_release: Appearance Releases (%{count}) appearance_release: Appearance Releases (%{count})
casting_submissions: Casting Submissions
downloads: Downloads downloads: Downloads
location_release: Location Releases (%{count}) location_release: Location Releases (%{count})
material_release: Material Releases (%{count}) material_release: Material Releases (%{count})
@@ -1024,6 +1062,12 @@ en:
broadcasts: broadcasts:
show: show:
alert: That broadcast is no longer available alert: That broadcast is no longer available
casting_submissions:
show:
heading: Files
update: Upload
update:
notice: Your files have been uploaded successfully
location_releases: location_releases:
create: create:
notice: Your release has been signed. Thank you! notice: Your release has been signed. Thank you!
@@ -1200,6 +1244,7 @@ en:
ago: ago ago: ago
back: Back back: Back
cancel: Cancel cancel: Cancel
cast_me: Cast
clear: Clear clear: Clear
close: Close close: Close
csv: CSV csv: CSV
@@ -1256,10 +1301,7 @@ en:
search: Search search: Search
empty: Talent Releases will appear here empty: Talent Releases will appear here
table_headers: table_headers:
email: Email
name: Name
notes: Notes notes: Notes
phone: Phone
signed_at: Date Signed signed_at: Date Signed
tags: Tags tags: Tags
new: new:

View File

@@ -1,14 +1,4 @@
es: es:
acquired_media_releases:
acquired_media_release:
no_media: No Media (ES)
index:
table_headers:
file_infos_count: No. Files (ES)
name: Name (ES)
notes: Notes (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
activerecord: activerecord:
attributes: attributes:
appearance_release: appearance_release:
@@ -51,12 +41,6 @@ es:
heading: Person Photo (ES) heading: Person Photo (ES)
index: index:
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES) imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release (ES)
table_headers:
contact_info: ""
name: ""
notes: ""
signed_at: ""
tags: ""
shared: shared:
imported_appearance_release_contract_name: Contrato Importado imported_appearance_release_contract_name: Contrato Importado
imported_appearance_release_headshot_name: Retrato Importado imported_appearance_release_headshot_name: Retrato Importado
@@ -66,13 +50,6 @@ es:
all_releases: All Releases (ES) all_releases: All Releases (ES)
complete_releases: Complete Releases (ES) complete_releases: Complete Releases (ES)
incomplete_releases: Incomplete Releases (ES) incomplete_releases: Incomplete Releases (ES)
approvals:
create:
release_approved: Medical release has been approved (ES)
new:
actions:
approve: Approve (ES)
heading: Review Medical Release (ES)
blank_contracts: blank_contracts:
new: new:
number_of_copies_label: Number of copies (ES) number_of_copies_label: Number of copies (ES)
@@ -130,14 +107,6 @@ es:
print_QR_code: Print out release QR codes (ES) print_QR_code: Print out release QR codes (ES)
releases_automatically_organized: Releases are automatically organized as theyre submitted (ES) releases_automatically_organized: Releases are automatically organized as theyre submitted (ES)
contracts: contracts:
for_office_use_only:
description_labels:
date_issued: Date Issued (ES)
employee_issued_to: Employee Issued To (ES)
issued_by: Issued By (ES)
producer: Producer (ES)
production: Production (ES)
heading: For Office Use Only (ES)
photos: photos:
guardian_2_photo_heading: Second guardian photo (ES) guardian_2_photo_heading: Second guardian photo (ES)
guardian_photo_heading: Guardian photo (ES) guardian_photo_heading: Guardian photo (ES)
@@ -191,7 +160,6 @@ es:
contract_template: contract_template:
fee: Leave at $0.00 for no-fee (ES) fee: Leave at $0.00 for no-fee (ES)
guardian_clause: Leave blank if not required for this contract (ES) guardian_clause: Leave blank if not required for this contract (ES)
signature_legal_text: Leave blank if not required for this contract (ES)
label: label:
appearance_release: appearance_release:
guardian_2_address_city: Guardian 2 city (ES) guardian_2_address_city: Guardian 2 city (ES)
@@ -304,65 +272,21 @@ es:
broadcast: broadcast:
create: Create Live Stream (ES) create: Create Live Stream (ES)
update: Save Changes (ES) update: Save Changes (ES)
casting_submission:
create: Create casting submission (ES)
create: 'Crear %{model}' create: 'Crear %{model}'
medical_release:
update: Approve (ES)
update: 'Actualizar %{model}' update: 'Actualizar %{model}'
location_releases: location_releases:
form: form:
photos: photos:
dropzone_label: Tap to take a photo of the Property (optional) (ES) dropzone_label: Tap to take a photo of the Property (optional) (ES)
index:
table_headers:
address: Address (ES)
notes: Notes (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
material_releases: material_releases:
form: form:
photos: photos:
dropzone_label: Tap to take a photo of Licensed Material (optional) (ES) dropzone_label: Tap to take a photo of Licensed Material (optional) (ES)
index:
table_headers:
name: Name (ES)
notes: Notes (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
medical_releases: medical_releases:
custom_validation_errors: custom_validation_errors:
question_answer_is_required: answer is required (ES) question_answer_is_required: answer is required (ES)
index:
table_headers:
approved: Approved (ES)
approved?: Approved (ES)
contact_info: Contact info (ES)
name: Person name (ES)
notes: Notes (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
medical_release:
actions:
review: Review (ES)
messages:
approved_tooltip: ""
misc_releases:
index:
table_headers:
contact_info: Contact info (ES)
name: Person name (ES)
notes: Notes (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
music_releases:
index:
table_headers:
composers_count: No. Composers (ES)
file_infos_count: No. Files (ES)
name: Name (ES)
notes: Notes (ES)
publishers_count: No. Publishers (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
public: public:
appearance_releases: appearance_releases:
create: create:
@@ -467,14 +391,6 @@ es:
heading: Second Guardian Photo (ES) heading: Second Guardian Photo (ES)
guardian_photo: guardian_photo:
heading: Guardian Photo (ES) heading: Guardian Photo (ES)
index:
table_headers:
email: Email (ES)
name: Name (ES)
notes: Notes (ES)
phone: Phone (ES)
signed_at: Date Signed (ES)
tags: Tags (ES)
task_requests: task_requests:
create: create:
success_message: Your task request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds. (ES) success_message: Your task request was successfully submitted. Thank you. A chat window will pop up on the lower right in a few seconds. (ES)

View File

@@ -2,7 +2,7 @@ require 'oath/constraints/signed_in'
require 'sidekiq/web' require 'sidekiq/web'
Rails.application.routes.draw do Rails.application.routes.draw do
AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/.freeze AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/
concern :confirmable do concern :confirmable do
resources :video_release_confirmations, only: [:new, :create, :destroy] resources :video_release_confirmations, only: [:new, :create, :destroy]
@@ -32,6 +32,9 @@ Rails.application.routes.draw do
resource :masquerade, only: :create resource :masquerade, only: :create
end end
resources :task_requests, only: [:index, :edit, :update, :show] resources :task_requests, only: [:index, :edit, :update, :show]
resources :casting_submissions do
post :complete, on: :member
end
root to: "accounts#index", as: :signed_in_root root to: "accounts#index", as: :signed_in_root
end end
@@ -66,6 +69,7 @@ Rails.application.routes.draw do
resource :contract_downloads, only: [:create] resource :contract_downloads, only: [:create]
resources :downloads, only: [:index, :destroy] resources :downloads, only: [:index, :destroy]
resource :report_downloads, only: [:create] resource :report_downloads, only: [:create]
resource :casting_submission_downloads, only: [:create]
resources :videos, only: [:index, :new, :create, :edit, :update] do resources :videos, only: [:index, :new, :create, :edit, :update] do
collection do collection do
get :landing get :landing
@@ -105,7 +109,13 @@ Rails.application.routes.draw do
post :cancel post :cancel
end end
end end
resources :casting_calls, except: :destroy do
member do
post :cancel
end
end
resources :tasks, only: :index resources :tasks, only: :index
resources :casting_submissions, only: [:index, :show]
end end
resource :profile, only: [:show, :update] resource :profile, only: [:show, :update]
resources :videos, only: [] do resources :videos, only: [] do
@@ -134,20 +144,17 @@ Rails.application.routes.draw do
resources :broadcasts, param: :token, only: [:show, :update] do resources :broadcasts, param: :token, only: [:show, :update] do
resource :zoom_meeting, only: [:show] resource :zoom_meeting, only: [:show]
end end
resources :casting_calls, param: :token, only: [:show]
resources :casting_submissions, param: :token, only: [:show, :update]
end end
RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :medical_releases, :misc_releases, :location_releases].freeze RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :location_releases]
ALL_RELEASES = RELEASES + [:music_releases] ALL_RELEASES = RELEASES + [:music_releases, :medical_releases, :misc_releases]
ALL_RELEASES.each do |release| ALL_RELEASES.each do |release|
resources release, only: [], concerns: :taggable resources release, only: [], concerns: :taggable
end end
# Customization for medical releases
resources :medical_releases, only: [], concerns: :taggable do
resource :approvals, only: [:new, :create]
end
resources :bulk_taggings, only: [:new, :create] resources :bulk_taggings, only: [:new, :create]
namespace :api do namespace :api do
@@ -163,7 +170,7 @@ Rails.application.routes.draw do
resources :contract_templates, only: [:index] resources :contract_templates, only: [:index]
end end
resources :contract_templates, only: [:show] do resources :contract_templates, only: [:show] do
(RELEASES - [:misc_releases, :medical_releases]).each do |release| RELEASES.each do |release|
resources release, controller: release, only: [:create] resources release, controller: release, only: [:create]
end end
end end

View File

@@ -1,18 +0,0 @@
class AddDurationToBroadcastRecordings < ActiveRecord::DataMigration
def up
recordings = BroadcastRecording.where(duration: nil)
client = MuxRuby::AssetsApi.new
recordings.each do |recording|
begin
response = client.get_asset(recording.asset_uid)
duration = response.data.duration
recording.update(duration: duration)
rescue MuxRuby::ApiError => e
Rails.logger.error("Failed to update duration for broadcast recording with id #{recording.id}\n" + e.message)
end
sleep(1)
end
end
end

View File

@@ -0,0 +1,17 @@
class CreateCastingCalls < ActiveRecord::Migration[6.0]
def change
create_table :casting_calls do |t|
t.references :project
t.string :title
t.string :user_email
t.text :description
t.text :project_description
t.text :interview_instructions
t.text :interview_requirements
t.text :questions
t.datetime :cancelled_at
t.timestamps
end
end
end

View File

@@ -0,0 +1,12 @@
class CreateCastingCallInterviews < ActiveRecord::Migration[6.0]
def change
create_table :casting_call_interviews do |t|
t.references :casting_call, foreign_key: true
t.string :performer_name
t.string :zoom_meeting_url
t.datetime :interview_date
t.timestamps
end
end
end

View File

@@ -0,0 +1,6 @@
class AddTokenToCastingCalls < ActiveRecord::Migration[6.0]
def change
add_column :casting_calls, :token, :string
add_index :casting_calls, :token, unique: true
end
end

View File

@@ -0,0 +1,6 @@
class AddTokenToCastingCallInterviews < ActiveRecord::Migration[6.0]
def change
add_column :casting_call_interviews, :token, :string
add_index :casting_call_interviews, :token, unique: true
end
end

View File

@@ -0,0 +1,5 @@
class AddInterviewedAtToCastingCallInterview < ActiveRecord::Migration[6.0]
def change
add_column :casting_call_interviews, :interviewed_at, :datetime
end
end

View File

@@ -1,7 +0,0 @@
class AddApprovalInfoColumnsToMedicalReleases < ActiveRecord::Migration[6.0]
def change
add_column :medical_releases, :approved_by_user_name, :text
add_column :medical_releases, :approved_by_user_email, :text
add_column :medical_releases, :approved_at, :timestamp
end
end

View File

@@ -1,5 +0,0 @@
class AddAccessibilityToContractTemplates < ActiveRecord::Migration[6.0]
def change
add_column :contract_templates, :accessibility, :integer, default: 0
end
end

View File

@@ -1,5 +0,0 @@
class AddDurationToBroadcastRecordings < ActiveRecord::Migration[6.0]
def change
add_column :broadcast_recordings, :duration, :float
end
end

View File

@@ -0,0 +1,5 @@
class RenameCastingCallInterviewsToCastingSubmissions < ActiveRecord::Migration[6.0]
def change
rename_table :casting_call_interviews, :casting_submissions
end
end

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