Compare commits
34 Commits
task-me-mv
...
allow-task
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c17f41525d | ||
|
|
d12cec8487 | ||
|
|
bde18ab0f1 | ||
|
|
fc320a3421 | ||
|
|
7f49f31ebf | ||
|
|
4c49a5db03 | ||
|
|
35303cb570 | ||
|
|
1127f09263 | ||
|
|
19b1e75384 | ||
|
|
93a4ce462d | ||
|
|
0e16791d8b | ||
|
|
7cdb814d6d | ||
|
|
2dea0f29b9 | ||
|
|
d6a3542308 | ||
|
|
e49498bbbf | ||
|
|
dd0ac5b110 | ||
|
|
8951667e61 | ||
|
|
fe131491cd | ||
|
|
290dbfa48b | ||
|
|
319cd89b29 | ||
|
|
6b0ea5b7df | ||
|
|
afee9d9bc9 | ||
|
|
072142811f | ||
|
|
b924b99762 | ||
|
|
988ef2beab | ||
|
|
1168bcdfdd | ||
|
|
a7b90c223b | ||
|
|
9a540efc74 | ||
|
|
028e946fcf | ||
|
|
fbf3173747 | ||
|
|
5f5e6c18b5 | ||
|
|
dc9ba08e1b | ||
|
|
cd5bbaeb62 | ||
|
|
64bda6eab6 |
4
Gemfile
4
Gemfile
@@ -30,9 +30,9 @@ gem "active_storage_base64", "~> 1.0.0"
|
||||
gem "image_processing", "~> 1.2"
|
||||
|
||||
# Use Amazon Web Services S3 for file uploads in production
|
||||
gem "aws-sdk-s3", "~> 1.31.0", require: false, group: [:production, :review]
|
||||
gem "aws-sdk-s3", "~> 1.48", require: false, group: [:production, :review]
|
||||
# Allow AWS API requests to be signed using IAM credentials
|
||||
gem "aws-sigv4", "~> 1.0.2"
|
||||
gem "aws-sigv4", "~> 1.1"
|
||||
|
||||
# Reduces boot times through caching; required in config/boot.rb
|
||||
gem "bootsnap", ">= 1.1.0", require: false
|
||||
|
||||
31
Gemfile.lock
31
Gemfile.lock
@@ -117,21 +117,22 @@ GEM
|
||||
ast (2.4.0)
|
||||
autoprefixer-rails (9.7.3)
|
||||
execjs
|
||||
aws-eventstream (1.0.3)
|
||||
aws-partitions (1.210.0)
|
||||
aws-sdk-core (3.46.2)
|
||||
aws-eventstream (~> 1.0)
|
||||
aws-partitions (~> 1.0)
|
||||
aws-sigv4 (~> 1.0)
|
||||
aws-eventstream (1.1.0)
|
||||
aws-partitions (1.337.0)
|
||||
aws-sdk-core (3.102.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
aws-partitions (~> 1, >= 1.239.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
jmespath (~> 1.0)
|
||||
aws-sdk-kms (1.13.0)
|
||||
aws-sdk-core (~> 3, >= 3.39.0)
|
||||
aws-sigv4 (~> 1.0)
|
||||
aws-sdk-s3 (1.31.0)
|
||||
aws-sdk-core (~> 3, >= 3.39.0)
|
||||
aws-sdk-kms (1.35.0)
|
||||
aws-sdk-core (~> 3, >= 3.99.0)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sdk-s3 (1.72.0)
|
||||
aws-sdk-core (~> 3, >= 3.102.1)
|
||||
aws-sdk-kms (~> 1)
|
||||
aws-sigv4 (~> 1.0)
|
||||
aws-sigv4 (1.0.3)
|
||||
aws-sigv4 (~> 1.1)
|
||||
aws-sigv4 (1.2.1)
|
||||
aws-eventstream (~> 1, >= 1.0.2)
|
||||
axlsx (3.0.0.pre)
|
||||
htmlentities (~> 4.3, >= 4.3.4)
|
||||
mimemagic (~> 0.3)
|
||||
@@ -514,8 +515,8 @@ DEPENDENCIES
|
||||
activeresource (= 5.1.0)
|
||||
acts-as-taggable-on!
|
||||
analytics-ruby
|
||||
aws-sdk-s3 (~> 1.31.0)
|
||||
aws-sigv4 (~> 1.0.2)
|
||||
aws-sdk-s3 (~> 1.48)
|
||||
aws-sigv4 (~> 1.1)
|
||||
axlsx (~> 3.0.0.pre)
|
||||
axlsx_rails (~> 0.5.2)
|
||||
axlsx_styler (~> 0.2.0)
|
||||
|
||||
13
app/assets/javascripts/update_required_status.js
Normal file
13
app/assets/javascripts/update_required_status.js
Normal file
@@ -0,0 +1,13 @@
|
||||
$(document).on("turbolinks:load", function() {
|
||||
$("[data-behavior=update-required-status]").click(function(e) {
|
||||
const required = !!($(this)[0] && $(this)[0].checked);
|
||||
|
||||
|
||||
$("[data-required-tag=guardian]").each(function(index, element) {
|
||||
const labelForField = element.previousSibling;
|
||||
|
||||
element.required = required;
|
||||
labelForField.classList.add("required");
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -17,7 +17,7 @@ class AccountsController < ApplicationController
|
||||
|
||||
if sign_in(user)
|
||||
TrackAnalyticsJob.perform_later(user, user.primary_account, :track_guest_sign_up, user_agent: request.user_agent, user_ip: request.remote_ip)
|
||||
SubmitHubspotFormJob.perform_later(user.email, account.name, i_m_interested_in: user.interested_product_name)
|
||||
SubmitHubspotFormJob.perform_later(user.first_name, user.last_name, user.email, account.name, i_m_interested_in: user.interested_product_name)
|
||||
redirect_to signed_in_root_path
|
||||
else
|
||||
redirect_to new_session_path, alert: t(".notice")
|
||||
|
||||
@@ -17,7 +17,9 @@ class Api::ApiController < ActionController::Base
|
||||
def return_error(exception)
|
||||
raise exception if Rails.env.test?
|
||||
|
||||
logger.error "==Handled======="
|
||||
Raven.capture_exception(exception)
|
||||
|
||||
logger.error "==Handled======"
|
||||
logger.error exception.message
|
||||
logger.error exception.backtrace.join("\n")
|
||||
logger.error "==Handled======="
|
||||
|
||||
@@ -19,5 +19,11 @@ class Api::AppearanceReleasesController < Api::ReleasesController
|
||||
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
||||
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
||||
end
|
||||
|
||||
guardian_2_photo = release_create_params[:guardian_2_photo]
|
||||
if guardian_2_photo
|
||||
guardian_2_photo[:io] = StringIO.new(Base64.decode64(guardian_2_photo[:io]))
|
||||
release.guardian_2_photo.attach(io: guardian_2_photo[:io], filename: guardian_2_photo[:filename])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
11
app/controllers/api/medical_releases_controller.rb
Normal file
11
app/controllers/api/medical_releases_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
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
|
||||
11
app/controllers/api/misc_releases_controller.rb
Normal file
11
app/controllers/api/misc_releases_controller.rb
Normal file
@@ -0,0 +1,11 @@
|
||||
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
|
||||
@@ -103,10 +103,16 @@ class Api::ReleasesController < Api::ApiController
|
||||
if ["appearance_release", "talent_release"].include?(name)
|
||||
has_many :guardian_photos do
|
||||
data do
|
||||
[@object.guardian_photo.try(:attachment)].compact
|
||||
[
|
||||
@object.guardian_photo.try(:attachment),
|
||||
@object.guardian_2_photo.try(:attachment)
|
||||
].compact
|
||||
end
|
||||
meta do
|
||||
{ count: @object.try(:guardian_photo).try(:attached?) ? 1 : 0 }
|
||||
{ count:
|
||||
(@object.try(:guardian_photo).try(:attached?) ? 1 : 0) +
|
||||
(@object.try(:guardian_2_photo).try(:attached?) ? 1 : 0)
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -170,7 +176,7 @@ class Api::ReleasesController < Api::ApiController
|
||||
|
||||
def release_create_params
|
||||
parameters = params.require(model_name).permit!
|
||||
keys = model_constant.new.attributes.keys + [:guardian_photo, :person_photo, :photos, :signature, :signature_base64, :file_infos_attributes]
|
||||
keys = model_constant.new.attributes.keys + [:guardian_photo, :guardian_2_photo, :person_photo, :photos, :signature, :signature_base64, :file_infos_attributes]
|
||||
parameters[:signature_base64] = parameters[:signature]
|
||||
parameters = parameters.slice(*keys).except(:created_at, :updated_at, :id, :user_id, :signature)
|
||||
parameters
|
||||
|
||||
@@ -10,8 +10,10 @@ class Api::SyncController < Api::ApiController
|
||||
@appearance_releases = (AppearanceRelease.where(project: accessible_projects))
|
||||
@location_releases = (LocationRelease.where(project: accessible_projects))
|
||||
@material_releases = (MaterialRelease.where(project: accessible_projects))
|
||||
@medical_releases = MedicalRelease.where(project: accessible_projects)
|
||||
@misc_releases = MiscRelease.where(project: accessible_projects)
|
||||
@talent_releases = (TalentRelease.where(project: accessible_projects))
|
||||
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @talent_releases + @acquired_media_releases ))
|
||||
@notes = notes_query(Note.where(notable: @appearance_releases + @location_releases + @material_releases + @medical_releases + @misc_releases + @talent_releases + @acquired_media_releases ))
|
||||
|
||||
render json: {
|
||||
data: {
|
||||
@@ -22,6 +24,8 @@ class Api::SyncController < Api::ApiController
|
||||
appearance_releases: releases_query(@appearance_releases),
|
||||
location_releases: releases_query(@location_releases),
|
||||
material_releases: releases_query(@material_releases),
|
||||
medical_releases: releases_query(@medical_releases),
|
||||
misc_releases: releases_query(@misc_releases),
|
||||
talent_releases: releases_query(@talent_releases),
|
||||
notes: @notes
|
||||
}
|
||||
|
||||
@@ -17,5 +17,11 @@ class Api::TalentReleasesController < Api::ReleasesController
|
||||
guardian_photo[:io] = StringIO.new(Base64.decode64(guardian_photo[:io]))
|
||||
release.guardian_photo.attach(io: guardian_photo[:io], filename: guardian_photo[:filename])
|
||||
end
|
||||
|
||||
guardian_2_photo = release_create_params[:guardian_2_photo]
|
||||
if guardian_2_photo
|
||||
guardian_2_photo[:io] = StringIO.new(Base64.decode64(guardian_2_photo[:io]))
|
||||
release.guardian_2_photo.attach(io: guardian_2_photo[:io], filename: guardian_2_photo[:filename])
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -5,6 +5,8 @@ class Api::UserTokenController < Knock::AuthTokenController
|
||||
|
||||
# Catch exception and return JSON-formatted error
|
||||
def return_error(exception)
|
||||
Raven.capture_exception(exception)
|
||||
|
||||
logger.error "==Handled======="
|
||||
logger.error exception.message
|
||||
logger.error exception.backtrace.join("\n")
|
||||
|
||||
21
app/controllers/approvals_controller.rb
Normal file
21
app/controllers/approvals_controller.rb
Normal file
@@ -0,0 +1,21 @@
|
||||
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
|
||||
@@ -5,6 +5,7 @@ class BroadcastsController < ApplicationController
|
||||
before_action :build_broadcast, only: [:new, :create]
|
||||
before_action :set_broadcast, only: [:show, :destroy, :update]
|
||||
before_action :set_multi_view_broadcasts, only: [:show]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def index
|
||||
@broadcasts = filtered_broadcasts.order_by_recent.paginate(page: params[:page])
|
||||
@@ -32,6 +33,11 @@ class BroadcastsController < ApplicationController
|
||||
end
|
||||
|
||||
def update
|
||||
unless params.has_key?(:broadcast)
|
||||
@broadcast.regenerate_token
|
||||
redirect_to([@project, @broadcast], notice: t('.reset_notice')) and return
|
||||
end
|
||||
|
||||
@broadcast.update(broadcast_params)
|
||||
@files = @broadcast.files.order("created_at DESC").paginate(page: 1)
|
||||
|
||||
@@ -49,6 +55,10 @@ class BroadcastsController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if broadcasts.count.zero?
|
||||
end
|
||||
|
||||
def broadcast_params
|
||||
params.require(:broadcast).permit(:name, files: [])
|
||||
end
|
||||
|
||||
@@ -7,6 +7,7 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
before_action :set_project, except: [:destroy]
|
||||
before_action :set_contract_template, only: [:destroy]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def index
|
||||
@contract_templates = contract_templates.non_archived.order_by_name.paginate(page: params[:page])
|
||||
@@ -38,6 +39,10 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if contract_templates.non_archived.count.zero?
|
||||
end
|
||||
|
||||
def set_contract_template
|
||||
@contract_template = authorize contract_templates.find(params[:id])
|
||||
end
|
||||
@@ -57,18 +62,19 @@ class ContractTemplatesController < ApplicationController
|
||||
def contract_template_params
|
||||
params
|
||||
.require(:contract_template)
|
||||
.permit(:name, :release_type, :body, :guardian_clause, :fee,
|
||||
.permit(:name, :release_type, :body, :guardian_clause,
|
||||
:signature_legal_text, :fee,
|
||||
:applicable_medium_id, :applicable_medium_text,
|
||||
:territory_id, :territory_text,
|
||||
:term_id, :term_text,
|
||||
:term_id, :term_text, :accessibility,
|
||||
:restriction_id, :restriction_text,
|
||||
:question_1_text, :question_2_text,
|
||||
:question_3_text, :question_4_text,
|
||||
:question_5_text, :question_6_text,
|
||||
:question_7_text, :question_8_text,
|
||||
:question_1_text, :question_2_text,
|
||||
:question_3_text, :question_4_text,
|
||||
:question_5_text, :question_6_text,
|
||||
:question_7_text, :question_8_text,
|
||||
:question_9_text, :question_10_text,
|
||||
:question_11_text, :question_12_text,
|
||||
:question_13_text, :question_14_text,
|
||||
:question_11_text, :question_12_text,
|
||||
:question_13_text, :question_14_text,
|
||||
:question_15_text)
|
||||
end
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@ class Public::MiscReleasesController < Public::BaseController
|
||||
.permit(
|
||||
person_params,
|
||||
guardian_params,
|
||||
questionnaire_params,
|
||||
:signature_base64,
|
||||
:locale,
|
||||
:contract_template,
|
||||
@@ -85,6 +86,26 @@ class Public::MiscReleasesController < Public::BaseController
|
||||
]
|
||||
end
|
||||
|
||||
def questionnaire_params
|
||||
[
|
||||
:question_1_answer,
|
||||
:question_2_answer,
|
||||
:question_3_answer,
|
||||
:question_4_answer,
|
||||
:question_5_answer,
|
||||
:question_6_answer,
|
||||
:question_7_answer,
|
||||
:question_8_answer,
|
||||
:question_9_answer,
|
||||
:question_10_answer,
|
||||
:question_11_answer,
|
||||
:question_12_answer,
|
||||
:question_13_answer,
|
||||
:question_14_answer,
|
||||
:question_15_answer,
|
||||
]
|
||||
end
|
||||
|
||||
def misc_release_params_with_locale
|
||||
misc_release_params.merge(locale: I18n.locale)
|
||||
end
|
||||
|
||||
@@ -28,8 +28,9 @@ class StreamNotificationsController < ApplicationController
|
||||
asset_uid = notification.dig(:object, :id)
|
||||
playback_uid = notification.dig(:data, :playback_ids, 0, :id)
|
||||
file_name = notification.dig(:data, :static_renditions, :files, -1, :name)
|
||||
duration = notification.dig(:data, :duration)
|
||||
|
||||
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name)
|
||||
recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration)
|
||||
recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
|
||||
|
||||
link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank")
|
||||
@@ -60,9 +61,14 @@ class StreamNotificationsController < ApplicationController
|
||||
def set_broadcast
|
||||
if notification_type == "video.asset.static_renditions.ready"
|
||||
live_stream_id = notification.dig(:stream_notification, :data, :live_stream_id)
|
||||
@broadcast = Broadcast.find_by!(stream_uid: live_stream_id)
|
||||
@broadcast = Broadcast.find_by(stream_uid: live_stream_id)
|
||||
else
|
||||
@broadcast = Broadcast.find_by!(stream_uid: notification_object_id)
|
||||
@broadcast = Broadcast.find_by(stream_uid: notification_object_id)
|
||||
end
|
||||
|
||||
if @broadcast.nil?
|
||||
logger.info "Ignoring broadcast from other environment. Type = #{notification_type}. Id = #{live_stream_id} / #{notification_object_id}"
|
||||
head :ok
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ class TaskRequestsController < ApplicationController
|
||||
before_action :set_project
|
||||
before_action :build_task_request, only: [:new, :create]
|
||||
before_action :set_task_request, only: [:show, :edit, :update, :cancel]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def index
|
||||
@task_requests = task_requests.order_by_recent.paginate(page: params[:page])
|
||||
@@ -46,6 +47,10 @@ class TaskRequestsController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if task_requests.count.zero?
|
||||
end
|
||||
|
||||
def task_request_params
|
||||
params.require(:task_request).permit(:description, :deadline, :time_allowed, :additional_notes, files: [])
|
||||
end
|
||||
|
||||
@@ -3,6 +3,7 @@ class VideosController < ApplicationController
|
||||
|
||||
before_action :set_project, only: [:index, :new, :create, :landing]
|
||||
before_action :set_video, only: [:edit, :update]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def landing
|
||||
authorize Video, :new?
|
||||
@@ -60,6 +61,10 @@ class VideosController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if videos.count.zero?
|
||||
end
|
||||
|
||||
def set_project
|
||||
@project = policy_scope(Project).find(params[:project_id])
|
||||
end
|
||||
|
||||
@@ -5,4 +5,12 @@ module TooltipHelper
|
||||
concat tag.div(class: "tooltip-inner")
|
||||
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
|
||||
|
||||
@@ -13,10 +13,13 @@ module WordmarkHelper
|
||||
css += options[:class].to_s
|
||||
|
||||
content_tag(:div, class: css) do
|
||||
safe_join [
|
||||
elements = [
|
||||
content_tag(:span, t("shared.#{product_name}")),
|
||||
content_tag(:span, t("shared.me"))
|
||||
]
|
||||
prefix = options[:prefix]
|
||||
elements.unshift content_tag(:span, "#{prefix} ") unless prefix.blank?
|
||||
safe_join elements
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -6,8 +6,8 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
before_perform do |job|
|
||||
@project = job.arguments.first
|
||||
@download = job.arguments.second
|
||||
release_type = job.arguments.third
|
||||
@folder_name = "#{@project.name.parameterize}_#{get_release_name(release_type).gsub('_', '-')}"
|
||||
@release_type = job.arguments.third
|
||||
@folder_name = "#{@project.name.parameterize}_#{get_release_name(@release_type).gsub('_', '-')}"
|
||||
@download.update!(name: @folder_name, status: :pending)
|
||||
end
|
||||
|
||||
@@ -20,9 +20,14 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
files.each do |attachment|
|
||||
zipfile.add(attachment, File.join("#{dir}/", attachment))
|
||||
end
|
||||
|
||||
if @release_type.constantize.include?(CsvExportable)
|
||||
csv_file = generate_csv releases
|
||||
zipfile.get_output_stream("#{@folder_name}.csv") { |f| f.puts(csv_file) }
|
||||
end
|
||||
end
|
||||
|
||||
@download.file.attach(io: File.open(zipfile_name), filename: @folder_name)
|
||||
@download.file.attach(io: File.open(zipfile_name), filename: "#{@folder_name}.zip")
|
||||
end
|
||||
rescue StandardError => e
|
||||
Rails.logger.error("Failed to generate download for project (##{project.id}) with release type #{release_type}\n" + e.message)
|
||||
@@ -43,6 +48,19 @@ class GenerateContractsZipJob < ApplicationJob
|
||||
|
||||
private
|
||||
|
||||
def generate_csv(releases)
|
||||
release_class = @release_type.constantize
|
||||
headers = release_class.csv_headers
|
||||
|
||||
CSV.generate(headers: true) do |csv|
|
||||
csv << headers
|
||||
releases.each do |release|
|
||||
csv_row_data = release.to_csv_row
|
||||
csv << csv_row_data
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def get_release_name(release_type)
|
||||
release_type.constantize.model_name.plural
|
||||
end
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
class SubmitHubspotFormJob < ApplicationJob
|
||||
queue_as :default
|
||||
|
||||
def perform(email, company_name, additional_params = {})
|
||||
def perform(first_name, last_name, email, company_name, additional_params = {})
|
||||
hubspot_form_guid = ENV["HUBSPOT_FORM_GUID"]
|
||||
return unless hubspot_form_guid.present?
|
||||
|
||||
submission_params = {
|
||||
email: email,
|
||||
first_name: first_name,
|
||||
last_name: last_name,
|
||||
email: email,
|
||||
company: company_name
|
||||
}.merge(additional_params)
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ class Account < ApplicationRecord
|
||||
end
|
||||
|
||||
def 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
|
||||
|
||||
def plan_name
|
||||
|
||||
@@ -9,6 +9,13 @@ class AcquiredMediaRelease < ApplicationRecord
|
||||
include Signable
|
||||
include Syncable
|
||||
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
|
||||
|
||||
@@ -57,4 +64,8 @@ class AcquiredMediaRelease < ApplicationRecord
|
||||
def uses_edl?
|
||||
true
|
||||
end
|
||||
|
||||
def file_infos_count
|
||||
file_infos.any? ? file_infos.size : I18n.t('acquired_media_releases.acquired_media_release.no_media')
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,6 +15,13 @@ class AppearanceRelease < ApplicationRecord
|
||||
include SecondGuardianPhotoable
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[name contact_info]
|
||||
end
|
||||
end
|
||||
|
||||
has_one_attached :person_photo
|
||||
|
||||
|
||||
56
app/models/concerns/csv_exportable.rb
Normal file
56
app/models/concerns/csv_exportable.rb
Normal file
@@ -0,0 +1,56 @@
|
||||
# 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
|
||||
@@ -5,6 +5,8 @@ class ContractTemplate < ApplicationRecord
|
||||
include Syncable
|
||||
include PgSearch
|
||||
|
||||
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||
|
||||
belongs_to :project
|
||||
belongs_to :parent, class_name: 'ContractTemplate', optional: true
|
||||
has_many :duplicates, class_name: 'ContractTemplate', foreign_key: 'parent_id'
|
||||
@@ -19,6 +21,7 @@ class ContractTemplate < ApplicationRecord
|
||||
monetize :fee_cents
|
||||
has_rich_text :body
|
||||
has_rich_text :guardian_clause
|
||||
has_rich_text :signature_legal_text
|
||||
|
||||
validates :name, presence: true
|
||||
validates :release_type, presence: true
|
||||
@@ -40,6 +43,8 @@ class ContractTemplate < ApplicationRecord
|
||||
scope :non_archived, -> { where(archived_at: nil) }
|
||||
scope :order_by_name, -> { order(:name) }
|
||||
|
||||
enum accessibility: [:public_template, :private_template]
|
||||
|
||||
def fee?
|
||||
!fee.zero?
|
||||
end
|
||||
@@ -59,4 +64,14 @@ class ContractTemplate < ApplicationRecord
|
||||
def archive
|
||||
update(archived_at: Time.zone.now)
|
||||
end
|
||||
|
||||
def has_questionnaire?
|
||||
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
|
||||
end
|
||||
|
||||
def attributes
|
||||
result = super()
|
||||
result[:signature_legal_text] = signature_legal_text.as_json
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
@@ -10,6 +10,13 @@ class LocationRelease < ApplicationRecord
|
||||
include Syncable
|
||||
include Taggable
|
||||
include PersonName
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[name address]
|
||||
end
|
||||
end
|
||||
|
||||
composed_of :address,
|
||||
mapping: [
|
||||
|
||||
@@ -10,8 +10,15 @@ class MaterialRelease < ApplicationRecord
|
||||
include Syncable
|
||||
include Taggable
|
||||
include PersonName
|
||||
|
||||
composed_of :person_address,
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[name]
|
||||
end
|
||||
end
|
||||
|
||||
composed_of :person_address,
|
||||
class_name: "Address",
|
||||
mapping: [
|
||||
%w(person_address_street1 street1),
|
||||
@@ -30,15 +37,15 @@ class MaterialRelease < ApplicationRecord
|
||||
validates :signature, attached: true
|
||||
end
|
||||
|
||||
searchable_on %i[
|
||||
name
|
||||
searchable_on %i[
|
||||
name
|
||||
person_address_street1 person_address_street2 person_address_city person_address_state person_address_zip person_address_country
|
||||
]
|
||||
|
||||
def contact_person
|
||||
@contact_person ||= Contact.new(person_name, person_address, person_email, person_phone)
|
||||
end
|
||||
|
||||
|
||||
def minor?
|
||||
false
|
||||
end
|
||||
|
||||
@@ -11,18 +11,47 @@ class MedicalRelease < ApplicationRecord
|
||||
include SecondGuardianPhotoable
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[approved? name contact_info]
|
||||
end
|
||||
end
|
||||
|
||||
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||
|
||||
composed_of :person_address,
|
||||
composed_of :person_address,
|
||||
class_name: "Address",
|
||||
mapping: [
|
||||
%w(person_address_street1 street1),
|
||||
%w(person_address_street2 street2),
|
||||
%w(person_address_city city),
|
||||
%w(person_address_state state),
|
||||
%w(person_address_zip zip),
|
||||
%w(person_address_country country)
|
||||
mapping: [
|
||||
%w[person_address_street1 street1],
|
||||
%w[person_address_street2 street2],
|
||||
%w[person_address_city city],
|
||||
%w[person_address_state state],
|
||||
%w[person_address_zip zip],
|
||||
%w[person_address_country country]
|
||||
]
|
||||
|
||||
composed_of :guardian_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_address_street1 street1],
|
||||
%w[guardian_address_street2 street2],
|
||||
%w[guardian_address_city city],
|
||||
%w[guardian_address_state state],
|
||||
%w[guardian_address_zip zip],
|
||||
%w[guardian_address_country country]
|
||||
]
|
||||
|
||||
composed_of :guardian_2_address,
|
||||
class_name: 'Address',
|
||||
mapping: [
|
||||
%w[guardian_2_address_street1 street1],
|
||||
%w[guardian_2_address_street2 street2],
|
||||
%w[guardian_2_address_city city],
|
||||
%w[guardian_2_address_state state],
|
||||
%w[guardian_2_address_zip zip],
|
||||
%w[guardian_2_address_country country]
|
||||
]
|
||||
|
||||
def self.face_photo_acceptable_content_types
|
||||
@@ -32,6 +61,7 @@ class MedicalRelease < ApplicationRecord
|
||||
# These validations apply to all releases
|
||||
validates :person_first_name, :person_last_name, presence: true
|
||||
validates :person_email, email: true, allow_blank: true
|
||||
validate :valid_answers
|
||||
|
||||
acts_as_taggable_on :internal_tags, :tags
|
||||
|
||||
@@ -76,4 +106,27 @@ class MedicalRelease < ApplicationRecord
|
||||
def contract_file_name
|
||||
"#{project.name.parameterize}_#{contract_template.release_type}_#{(signed_at || created_at).strftime("%Y.%m.%d")}_#{release_number}_#{filename_suffix.parameterize}"
|
||||
end
|
||||
|
||||
def approve_by(user)
|
||||
return unless approved_at.nil?
|
||||
|
||||
self.approved_by_user_name = user.full_name
|
||||
self.approved_by_user_email = user.email
|
||||
self.approved_at = Time.zone.now
|
||||
end
|
||||
|
||||
def approved?
|
||||
approved_at.present?
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def valid_answers
|
||||
(1..ContractTemplate::NUMBER_OF_CUSTOM_FIELDS).each do |index|
|
||||
if contract_template && contract_template["question_#{index}_text"].present? &&
|
||||
public_send("question_#{index}_answer").blank?
|
||||
errors.add("question_#{index}", I18n.t('medical_releases.custom_validation_errors.question_answer_is_required'))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -9,6 +9,15 @@ class MiscRelease < ApplicationRecord
|
||||
include PersonName
|
||||
include GuardianName
|
||||
include GuardianPhotoable
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[name contact_info]
|
||||
end
|
||||
end
|
||||
|
||||
NUMBER_OF_CUSTOM_FIELDS = 15
|
||||
|
||||
composed_of :person_address,
|
||||
class_name: "Address",
|
||||
|
||||
@@ -7,7 +7,14 @@ class MusicRelease < ApplicationRecord
|
||||
include Searchable
|
||||
include Taggable
|
||||
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 :composers, dependent: :destroy
|
||||
has_many :publishers, dependent: :destroy
|
||||
@@ -72,6 +79,18 @@ class MusicRelease < ApplicationRecord
|
||||
false
|
||||
end
|
||||
|
||||
def file_infos_count
|
||||
file_infos.size
|
||||
end
|
||||
|
||||
def composers_count
|
||||
composers.size
|
||||
end
|
||||
|
||||
def publishers_count
|
||||
publishers.size
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def publisher_percentages_add_up_to_100
|
||||
|
||||
@@ -10,7 +10,7 @@ class QrCode
|
||||
url = Rails.application.routes.url_helpers.url_for(route)
|
||||
filename = [contract_template.project.name, contract_template.name].map(&:parameterize).join("_")
|
||||
|
||||
new(url, filename)
|
||||
new(url, "#{filename}.png")
|
||||
end
|
||||
|
||||
def initialize(url, filename = "qrcode.png")
|
||||
|
||||
@@ -14,6 +14,13 @@ class TalentRelease < ApplicationRecord
|
||||
include SecondGuardianPhotoable
|
||||
include GuardianName
|
||||
include SecondGuardianName
|
||||
include CsvExportable
|
||||
|
||||
class << self
|
||||
def custom_csv_exportable_headers
|
||||
%i[name phone email]
|
||||
end
|
||||
end
|
||||
|
||||
composed_of :person_address,
|
||||
class_name: "Address",
|
||||
@@ -86,6 +93,14 @@ class TalentRelease < ApplicationRecord
|
||||
person_name
|
||||
end
|
||||
|
||||
def phone
|
||||
person_phone
|
||||
end
|
||||
|
||||
def email
|
||||
person_email
|
||||
end
|
||||
|
||||
def filename_suffix
|
||||
"#{person_last_name} #{person_first_name}"
|
||||
end
|
||||
|
||||
@@ -6,5 +6,5 @@ class TaskRequest < ApplicationRecord
|
||||
|
||||
scope :order_by_recent, -> { order(created_at: :desc) }
|
||||
|
||||
validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 }
|
||||
validates :time_allowed, numericality: { only_integer: true, greater_than_or_equal_to: 2 }, allow_blank: true
|
||||
end
|
||||
|
||||
@@ -3,8 +3,10 @@ class ContractTemplatePolicy < ApplicationPolicy
|
||||
def resolve
|
||||
if user.account_manager?
|
||||
scope.left_outer_joins(:project).where(projects: {account: user.account})
|
||||
else
|
||||
elsif user.manager?
|
||||
scope.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
|
||||
else
|
||||
scope.public_template.left_outer_joins(project: :project_memberships).where(project_memberships: { user_id: user.id })
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -15,6 +15,14 @@ class MedicalReleasePolicy < ReleasePolicy
|
||||
user.manager? || user.account_manager?
|
||||
end
|
||||
|
||||
def review?
|
||||
user.account_manager?
|
||||
end
|
||||
|
||||
def approve?
|
||||
review?
|
||||
end
|
||||
|
||||
def edit_photos?
|
||||
true
|
||||
end
|
||||
|
||||
@@ -11,12 +11,14 @@
|
||||
<hr class="divider-light mx-n4">
|
||||
<nav>
|
||||
<ul class="nav nav-pills nav-pills-dark flex-column">
|
||||
<li class="nav-item">
|
||||
<%= link_to [project, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") do %>
|
||||
<%= lock_icon_for(Current.account, :taskme) %>
|
||||
<%= product_wordmark :task_me, class: class_string("d-inline-block", "disabled" => !Current.account.taskme_enabled?) %>
|
||||
<% end %>
|
||||
</li>
|
||||
<% if Current.account.taskme_enabled? %>
|
||||
<li class="nav-item">
|
||||
<%= link_to [project, :task_requests], class: class_string("nav-link", "active" => controller_name == "task_requests") do %>
|
||||
<%= lock_icon_for(Current.account, :taskme) %>
|
||||
<%= product_wordmark :task_me, class: class_string("d-inline-block", "disabled" => !Current.account.taskme_enabled?) %>
|
||||
<% end %>
|
||||
</li>
|
||||
<% end %>
|
||||
<li class="nav-item">
|
||||
<%= link_to [project, :contract_templates], class: class_string("nav-link", "active" => %w(contract_templates release_template_imports).include?(controller_name)) do %>
|
||||
<%= lock_icon_for Current.account, :releaseme %>
|
||||
|
||||
15
app/views/approvals/new.html.erb
Normal file
15
app/views/approvals/new.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<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>
|
||||
@@ -102,6 +102,7 @@
|
||||
<i class="fa fa-clipboard"></i>
|
||||
Copy URL
|
||||
</button>
|
||||
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
|
||||
</div>
|
||||
<% else %>
|
||||
<input type="text" class="form-control" value="<%= broadcast_url(@broadcast.token) %>" readonly>
|
||||
@@ -110,6 +111,7 @@
|
||||
<i class="fa fa-clipboard"></i>
|
||||
Copy URL
|
||||
</button>
|
||||
<%= link_to t('.actions.reset_url'), [@project, @broadcast], method: :patch, class: "btn btn-danger" %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
51
app/views/broadcasts/splash.html.erb
Normal file
51
app/views/broadcasts/splash.html.erb
Normal file
@@ -0,0 +1,51 @@
|
||||
<div class="d-flex flex-row">
|
||||
<div class="d-flex flex-column">
|
||||
<%= product_wordmark :direct_me, prefix: t('.headings.welcome'), class: "h2" %>
|
||||
<p class="text-muted"><%= t '.headings.subtitle' %>
|
||||
</div>
|
||||
|
||||
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
|
||||
<% if policy(Broadcast).new? %>
|
||||
<%= link_to t(".actions.create_stream"), [:new, @project, :broadcast], class: "btn btn-success border align-self-center h-50 pb-2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="pt-2">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card-body p-0">
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<div class="embed-responsive-item">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.how_it_works' %></h3>
|
||||
<ol>
|
||||
<li><%= t '.list_items.create_stream' %></li>
|
||||
<li><%= t '.list_items.share_stream' %></li>
|
||||
<li><%= t '.list_items.launch_video_conference' %></li>
|
||||
<li><%= t '.list_items.share_files' %></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.benefits' %></h3>
|
||||
<ul class="fa-ul ml-5">
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.stream_from_mobile_app'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.direct_shoots_anywhere'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.share_live_stream'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.stream_multiple_cameras'))) %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -15,7 +15,7 @@
|
||||
<td>
|
||||
<%= contract_template.releases.size %>
|
||||
</td>
|
||||
<td class="text-right">
|
||||
<td class="text-right" nowrap>
|
||||
<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">
|
||||
@@ -27,7 +27,7 @@
|
||||
<%= link_to fa_icon("print", text: "Print"), [:new, contract_template, :blank_contracts], class: "dropdown-item", target: :_blank %>
|
||||
<% end %>
|
||||
<% if policy(contract_template).destroy? %>
|
||||
<%= link_to fa_icon("archive", text: "Archive"), contract_template, class: "dropdown-item", method: :delete, data: { confirm: "Are you sure?" } %>
|
||||
<%= link_to fa_icon("trash", text: "Delete"), contract_template, class: "dropdown-item", method: :delete, data: { confirm: "Are you sure?" } %>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -2,7 +2,11 @@
|
||||
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :name, wrapper_class: "col-sm-6" %>
|
||||
<%= form.select :release_type, options_for_release_type_select(project, @release_type), { wrapper_class: "col-sm-6" }, data: { toggle: "collapse-select", target_show_values_mapping: { "#guardian_clause": %w(appearance talent misc medical), "#fee_field": %w(appearance talent location material acquired_media), "#exploitable_rights_fields": %w(appearance talent location material acquired_media), "#custom_fields": %w(medical) } }, 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 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">
|
||||
<%= form.number_field :fee, min:"0", max:"99999999", step: "0.01", prepend: "$", wrapper_class: "col-sm-6" %>
|
||||
@@ -25,6 +29,11 @@
|
||||
<%= form.rich_text_area :guardian_clause %>
|
||||
<% end %>
|
||||
</div>
|
||||
<div id="signature_legal_text">
|
||||
<%= form.form_group do %>
|
||||
<%= form.rich_text_area :signature_legal_text %>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<%= field_set_tag content_tag(:span, t(".custom_fields.heading"), class: "h6 text-muted text-uppercase"), id: "custom_fields", style: "display: none;" do %>
|
||||
|
||||
50
app/views/contract_templates/splash.html.erb
Normal file
50
app/views/contract_templates/splash.html.erb
Normal file
@@ -0,0 +1,50 @@
|
||||
<div class="d-flex flex-row">
|
||||
<div class="d-flex flex-column">
|
||||
<%= product_wordmark :release_me, prefix: t('.headings.welcome'), class: "h2" %>
|
||||
<p class="text-muted"><%= t '.headings.subtitle' %>
|
||||
</div>
|
||||
|
||||
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
|
||||
<% if policy(ContractTemplate).new? %>
|
||||
<%= link_to t(".actions.create_template"), [:new, @project, :contract_template], class: "btn btn-success border align-self-center h-50 pb-2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="pt-2">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card-body p-0">
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<div class="embed-responsive-item">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.how_it_works' %></h3>
|
||||
<ol>
|
||||
<li><%= t '.list_items.create_releases' %></li>
|
||||
<li><%= t '.list_items.download_mobile_app' %></li>
|
||||
<li><%= t '.list_items.print_QR_code' %></li>
|
||||
<li><%= t '.list_items.releases_automatically_organized' %></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.benefits' %></h3>
|
||||
<ul class="fa-ul ml-5">
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.all_releases_available'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.manage_large_audience'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.add_tags_and_notes'))) %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
13
app/views/contracts/_for_office_use_only.erb
Normal file
13
app/views/contracts/_for_office_use_only.erb
Normal file
@@ -0,0 +1,13 @@
|
||||
<% 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>
|
||||
@@ -1,8 +1,8 @@
|
||||
<p class="heading"><strong><u><%= t ".heading" %></u></strong></p>
|
||||
<p class="heading"><strong><u><%= t ".heading.#{releasable.model_name.param_key}" %></u></strong></p>
|
||||
|
||||
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
|
||||
<% (1..releasable.class::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
|
||||
<% if contract_template.public_send("question_#{n}_text").present? %>
|
||||
<p><strong><%= contract_template.public_send("question_#{n}_text") %></strong></p>
|
||||
<p><%= releasable.public_send("question_#{n}_answer") %></p>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@@ -16,15 +16,22 @@
|
||||
<%= contract_template.guardian_clause %>
|
||||
<% end %>
|
||||
|
||||
<% if releasable.model_name == "MedicalRelease" %>
|
||||
<% if releasable.model_name.in? %w(MedicalRelease MiscRelease) %>
|
||||
<div class="page">
|
||||
<%= render "contracts/medical_questionnaire", releasable: releasable, contract_template: contract_template, preview: preview %>
|
||||
<%= render "contracts/questionnaire", releasable: releasable, contract_template: contract_template, preview: preview %>
|
||||
</div>
|
||||
<% end %>
|
||||
|
||||
<div class="page">
|
||||
<%= render "contracts/signature_page", releasable: releasable, contract_template: contract_template, preview: preview %>
|
||||
</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 %>
|
||||
<div class="page">
|
||||
<%= render "contracts/files", release: releasable, preview: preview %>
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
<tr id="<%= dom_id(medical_release) %>">
|
||||
<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>
|
||||
<% if medical_release.photo.attached? %>
|
||||
<%= image_tag medium_variant(medical_release.photo), class: "img-fluid" %>
|
||||
@@ -37,6 +45,9 @@
|
||||
<% 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 %>
|
||||
<% 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?) %>
|
||||
<%= link_to fa_icon("download fw", text: "Download"), [medical_release, :contracts, format: "pdf"], class: "dropdown-item", target: "_blank" %>
|
||||
<% end %>
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
<thead class="thead-light">
|
||||
<tr>
|
||||
<th data-behavior="all-selectable"><%= check_box_tag "medical_release_ids[]", false, false %></th>
|
||||
<th><%= t '.table_headers.approved'%></th>
|
||||
<th></th>
|
||||
<th><%= MedicalRelease.human_attribute_name(:person_name) %></th>
|
||||
<th><%= MedicalRelease.human_attribute_name(:contact_info) %></th>
|
||||
|
||||
15
app/views/medical_releases/review.html.erb
Normal file
15
app/views/medical_releases/review.html.erb
Normal file
@@ -0,0 +1,15 @@
|
||||
<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>
|
||||
@@ -50,7 +50,7 @@
|
||||
<hr>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { behavior: "update-required-status", target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_clause.heading") do %>
|
||||
@@ -72,12 +72,12 @@
|
||||
<div class="<%= class_string("collapse" => !@appearance_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_email, required: @appearance_release.minor?, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_first_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_last_name, required: @appearance_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.phone_field :guardian_phone, required: @appearance_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_email, required: @appearance_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", required: @appearance_release.minor? %>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", required: @appearance_release.minor?, data: { required_tag: "guardian" } %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -156,7 +156,7 @@
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory' %>
|
||||
<%= render "shared/signature_fields", form: form, instruction: 'An Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
<hr>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory' %>
|
||||
<%= render "shared/signature_fields", form: form, instruction: 'For Owner or Authorized Signatory', signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.medical_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.medical_release.minor"), data: { behavior: "update-required-status", target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_clause.heading") do %>
|
||||
@@ -30,7 +30,7 @@
|
||||
<% (1..MedicalRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
|
||||
<% if @contract_template.public_send("question_#{n}_text").present? %>
|
||||
<div class="form-row">
|
||||
<%= form.text_area "question_#{n}_answer", wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>
|
||||
<%= form.text_area "question_#{n}_answer", required: true, wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
@@ -59,14 +59,12 @@
|
||||
<div class="<%= class_string("collapse" => !@medical_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: @medical_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: @medical_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, required: @medical_release.minor?, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_first_name, required: @medical_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_last_name, required: @medical_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.phone_field :guardian_phone, required: @medical_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_email, required: @medical_release.minor?, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_email, required: @medical_release.minor?, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", required: @medical_release.minor? %>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", required: @medical_release.minor?, data: { required_tag: "guardian" } %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -147,7 +145,7 @@
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { behavior: "update-required-status", target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_clause.heading") do %>
|
||||
@@ -20,15 +20,26 @@
|
||||
<hr>
|
||||
<% end %>
|
||||
|
||||
<% if @contract_template.has_questionnaire? %>
|
||||
<%= card_field_set_tag t(".questionnaire.heading") do %>
|
||||
<% (1..MiscRelease::NUMBER_OF_CUSTOM_FIELDS).each do |n| %>
|
||||
<% if @contract_template.public_send("question_#{n}_text").present? %>
|
||||
<div class="form-row">
|
||||
<%= form.text_area "question_#{n}_answer", wrapper_class: "col-sm-12", label: @contract_template.public_send("question_#{n}_text") %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<hr>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".personal_info.heading") do %>
|
||||
<div class="alert alert-warning font-weight-bold"><%= t ".personal_info.instructions" %></div>
|
||||
<div class="form-row">
|
||||
<%= 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.phone_field :person_phone, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<%= form.email_field :person_email, wrapper_class: "col-sm-6" %>
|
||||
<%= form.email_field :person_email, required: true, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "person" %>
|
||||
<% end %>
|
||||
@@ -43,14 +54,12 @@
|
||||
<div class="<%= class_string("collapse" => !@misc_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: @misc_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: @misc_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_first_name, required: @misc_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_last_name, required: @misc_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian" %>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", data: { required_tag: "guardian" } %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -86,7 +95,7 @@
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
<% unless @contract_template.guardian_clause.blank? %>
|
||||
<%= form.form_group :minor do %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<%= form.check_box :minor, label: t("helpers.label.appearance_release.minor"), data: { behavior: "update-required-status", target: "[data-ujs-target=guardian-fields]", toggle: "collapse" } %>
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".guardian_clause.heading") do %>
|
||||
@@ -46,12 +46,12 @@
|
||||
<div class="<%= class_string("collapse" => !@talent_release.minor?) %>" data-ujs-target="guardian-fields">
|
||||
<%= card_field_set_tag t(".guardian_info.heading") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :guardian_first_name, required: @talent_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field :guardian_last_name, required: @talent_release.minor?, wrapper_class: "col-sm-3" %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field :guardian_first_name, required: @talent_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_last_name, required: @talent_release.minor?, wrapper_class: "col-sm-3", data: { required_tag: "guardian" } %>
|
||||
<%= form.phone_field :guardian_phone, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
<%= form.text_field :guardian_email, wrapper_class: "col-sm-6", data: { required_tag: "guardian" } %>
|
||||
</div>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian" %>
|
||||
<%= render "shared/address_fields", form: form, subject: "guardian", data: { required_tag: "guardian" } %>
|
||||
<% end %>
|
||||
|
||||
<hr>
|
||||
@@ -131,7 +131,7 @@
|
||||
<% end %>
|
||||
|
||||
<%= card_field_set_tag t(".signature.heading") do %>
|
||||
<%= render "shared/signature_fields", form: form %>
|
||||
<%= render "shared/signature_fields", form: form, signature_legal_text: @contract_template.signature_legal_text %>
|
||||
<% end %>
|
||||
|
||||
<div class="mt-5">
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
<% field_name_prefix = subject.present? ? "#{subject}_" : "" %>
|
||||
<% required = required || false %>
|
||||
<% data = data || nil %>
|
||||
|
||||
<div class="form-row">
|
||||
<%= form.text_field "#{field_name_prefix}address_street1", required: required, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field "#{field_name_prefix}address_street1", required: required, wrapper_class: "col-sm-6", data: data %>
|
||||
<%= form.text_field "#{field_name_prefix}address_street2", wrapper_class: "col-sm-6" %>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<%= form.text_field "#{field_name_prefix}address_city", required: required, wrapper_class: "col-sm-6" %>
|
||||
<%= form.text_field "#{field_name_prefix}address_state", required: required, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field "#{field_name_prefix}address_zip", required: required, wrapper_class: "col-sm-3" %>
|
||||
<%= form.text_field "#{field_name_prefix}address_city", required: required, wrapper_class: "col-sm-6", data: data %>
|
||||
<%= form.text_field "#{field_name_prefix}address_state", required: required, wrapper_class: "col-sm-3", data: data %>
|
||||
<%= form.text_field "#{field_name_prefix}address_zip", required: required, wrapper_class: "col-sm-3", data: data %>
|
||||
</div>
|
||||
<%= form.form_group "#{field_name_prefix}address_country" do %>
|
||||
<%= form.label "#{field_name_prefix}address_country" %>
|
||||
|
||||
@@ -12,4 +12,8 @@
|
||||
<%= fa_icon "refresh" %> <%= t "shared.clear" %>
|
||||
<% end %>
|
||||
</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 %>
|
||||
@@ -1,9 +1,19 @@
|
||||
<%= errors_summary_for task_request %>
|
||||
|
||||
<%= bootstrap_form_with model: model, url: [@project, @task_request, 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 class="d-flex">
|
||||
<div class="row">
|
||||
<div class="col-xl-10 col-12">
|
||||
<div class="alert alert-info text-center text-md-left">
|
||||
<%= fa_icon "info-circle" %>
|
||||
<strong><%= t '.info_message' %></strong>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-2 col-12">
|
||||
<%= form.submit t('.actions.chat_now'), class: "btn btn-block btn-warning pt-4 pb-4 mb-1", data: { disable_with: t("shared.disable_with") } %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<%= form.text_area :description, label: t('.labels.description') %>
|
||||
|
||||
@@ -13,3 +13,4 @@
|
||||
<% end %>
|
||||
<% end %>
|
||||
<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" %>
|
||||
|
||||
58
app/views/task_requests/splash.html.erb
Normal file
58
app/views/task_requests/splash.html.erb
Normal file
@@ -0,0 +1,58 @@
|
||||
<div class="d-flex flex-row">
|
||||
<div class="d-flex flex-column">
|
||||
<%= product_wordmark :task_me, prefix: t('.headings.welcome'), class: "h2" %>
|
||||
<p class="text-muted"><%= t '.headings.subtitle' %>
|
||||
</div>
|
||||
|
||||
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
|
||||
<% if policy(TaskRequest).new? %>
|
||||
<%= link_to t(".actions.create_task_request"), [:new, @project, :task_request], class: "btn btn-success border align-self-center h-50 pb-2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="pt-2">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card-body p-0">
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<div class="embed-responsive-item">
|
||||
<table class="w-100 h-100 bg-secondary">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="text-center align-middle text-white">
|
||||
Video tutorial will be available soon
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.how_it_works' %></h3>
|
||||
<ol>
|
||||
<li><%= t '.list_items.enter_task_request' %></li>
|
||||
<li><%= t '.list_items.state_deadline' %></li>
|
||||
<li><%= t '.list_items.enter_number_of_hours' %></li>
|
||||
<li><%= t '.list_items.virtual_assistant_delivers_task' %></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.benefits' %></h3>
|
||||
<ul class="fa-ul ml-5">
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.reduces_need_for_full_time_staff'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.reduces_workload'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.spend_per_task'))) %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
51
app/views/videos/splash.html.erb
Normal file
51
app/views/videos/splash.html.erb
Normal file
@@ -0,0 +1,51 @@
|
||||
<div class="d-flex flex-row">
|
||||
<div class="d-flex flex-column">
|
||||
<%= product_wordmark :deliver_me, prefix: t('.headings.welcome'), class: "h2" %>
|
||||
<p class="text-muted"><%= t '.headings.subtitle' %>
|
||||
</div>
|
||||
|
||||
<%= link_to t(".actions.book_demo"), 'https://meetings.hubspot.com/bray2', class: "btn btn-primary border align-self-center h-50 ml-auto mr-2 pb-2", target: '_blank' %>
|
||||
<% if policy(Video).new? %>
|
||||
<%= link_to t(".actions.upload_video"), [:landing, @project, :videos], class: "btn btn-success border align-self-center h-50 pb-2" %>
|
||||
<% end %>
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="pt-2">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="card-body p-0">
|
||||
<div class="embed-responsive embed-responsive-16by9">
|
||||
<div class="embed-responsive-item">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.how_it_works' %></h3>
|
||||
<ol>
|
||||
<li><%= t '.list_items.import_video' %></li>
|
||||
<li><%= t '.list_items.import_EDLs' %></li>
|
||||
<li><%= t '.list_items.AI_generates_documents' %></li>
|
||||
<li><%= t '.list_items.download_documents' %></li>
|
||||
</ol>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3><%= t '.headings.benefits' %></h3>
|
||||
<ul class="fa-ul ml-5">
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.reduces_labor_cost'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.more_accurate'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.simplifies_cue_sheets'))) %>
|
||||
<%= content_tag(:li, fa_icon("check li", text: t('.list_items.production_elements_logs'))) %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -50,6 +50,7 @@ en:
|
||||
empty: Acquired Media Releases will appear here
|
||||
table_headers:
|
||||
file_infos_count: No. Files
|
||||
name: Name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
@@ -151,6 +152,8 @@ en:
|
||||
empty: Appearance Releases will appear here
|
||||
imported_appearance_release_missing_attachment: Person photo or contract missing for imported appearance release
|
||||
table_headers:
|
||||
contact_info: Contact info
|
||||
name: Name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
@@ -171,6 +174,13 @@ en:
|
||||
sidebar:
|
||||
files: Files
|
||||
team_member: Team Member
|
||||
approvals:
|
||||
create:
|
||||
release_approved: Medical release has been approved
|
||||
new:
|
||||
actions:
|
||||
approve: Approve
|
||||
heading: Review Medical Release
|
||||
blank_contracts:
|
||||
new:
|
||||
number_of_copies_label: Number of copies
|
||||
@@ -207,6 +217,29 @@ en:
|
||||
new:
|
||||
heading:
|
||||
Create Live Stream
|
||||
show:
|
||||
actions:
|
||||
reset_url: Reset URL
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo
|
||||
create_stream: Create New Live Stream
|
||||
headings:
|
||||
benefits: Benefits
|
||||
how_it_works: How It Works
|
||||
subtitle: Remote directing and video village solution
|
||||
welcome: Welcome to
|
||||
list_items:
|
||||
create_stream: Create a live stream
|
||||
direct_shoots_anywhere: Direct shoots anywhere around the world
|
||||
launch_video_conference: Launch Video Conference using plugin
|
||||
share_files: Share files via the ME Suite mobile app
|
||||
share_live_stream: Share live stream with clients all over the the world
|
||||
share_stream: Share live stream link with clients
|
||||
stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera
|
||||
stream_multiple_cameras: Stream multiple cameras at one time
|
||||
update:
|
||||
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
|
||||
bulk_taggings:
|
||||
new_bulk_tag_modal:
|
||||
submit: Add
|
||||
@@ -233,7 +266,7 @@ en:
|
||||
archived_notice: The release template has been archived
|
||||
form:
|
||||
custom_fields:
|
||||
heading: Medical Questionnaire
|
||||
heading: Questionnaire
|
||||
instructions: Please list the questions you wish the signer to answer. Any unused question fields will be hidden.
|
||||
exploitable_rights:
|
||||
heading: Exploitable Rights
|
||||
@@ -252,9 +285,32 @@ en:
|
||||
signed_release_count: No. Signed Releases
|
||||
new:
|
||||
heading: New Release Template
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo
|
||||
create_template: Create New Release Template
|
||||
headings:
|
||||
benefits: Benefits
|
||||
how_it_works: How It Works
|
||||
subtitle: The easiest way to create and manage releases.
|
||||
welcome: Welcome to
|
||||
list_items:
|
||||
add_tags_and_notes: Add tags and notes to releases for added organization and searchability
|
||||
all_releases_available: All release types available including Covid Medical, Appearance, Location and more
|
||||
create_releases: Create releases for your video shoot
|
||||
download_mobile_app: Download the ME Suite mobile app
|
||||
manage_large_audience: Easily manage large audiences with the crowd control feature
|
||||
print_QR_code: Print out release QR codes
|
||||
releases_automatically_organized: Releases are automatically organized as they’re submitted
|
||||
contracts:
|
||||
medical_questionnaire:
|
||||
heading: Medical Questionnaire
|
||||
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:
|
||||
guardian_2_photo_heading: Second guardian photo
|
||||
guardian_photo_heading: Guardian photo
|
||||
@@ -264,6 +320,10 @@ en:
|
||||
minor_photos_heading:
|
||||
one: Minor photo
|
||||
other: Minor photos
|
||||
questionnaire:
|
||||
heading:
|
||||
medical_release: Medical Questionnaire
|
||||
misc_release: Questionnaire
|
||||
signature_page:
|
||||
heading: Signature Page
|
||||
instructions: "By signing this signature page, as of the date listed below, I hereby agree, acknowledge and accept the terms and conditions listed in this %{releasable_name}."
|
||||
@@ -324,11 +384,12 @@ en:
|
||||
notice: The release has been updated
|
||||
helpers:
|
||||
help:
|
||||
task_request:
|
||||
time_allowed: Minimum of 2 hours, no partial hours allowed
|
||||
contract_template:
|
||||
fee: Leave at $0.00 for no-fee
|
||||
guardian_clause: Leave blank if not required for this contract
|
||||
signature_legal_text: Leave blank if not required for this contract
|
||||
task_request:
|
||||
time_allowed: Minimum of 2 hours, no partial hours allowed
|
||||
video:
|
||||
audio_only_edl_file: If you do not upload an Audio Only EDL, the software will not generate a BiG Music Cue Sheet.
|
||||
edl_file: Please follow our directions on exporting the All Tracks EDL. Failure to do so could result in inaccurate and incomplete reporting.
|
||||
@@ -451,6 +512,30 @@ en:
|
||||
person_last_name: Last name
|
||||
person_name: Name
|
||||
person_phone: Phone number
|
||||
misc_release:
|
||||
guardian_address_city: Guardian city
|
||||
guardian_address_country: Guardian country
|
||||
guardian_address_state: Guardian state
|
||||
guardian_address_street1: Guardian address
|
||||
guardian_address_street2: Guardian address (Line 2)
|
||||
guardian_address_zip: Guardian zip code
|
||||
guardian_email: Guardian email
|
||||
guardian_first_name: Guardian first name
|
||||
guardian_last_name: Guardian last name
|
||||
guardian_phone: Guardian phone
|
||||
minor: Is the person a minor?
|
||||
person_address_city: City
|
||||
person_address_country: Country
|
||||
person_address_state: State
|
||||
person_address_street1: Address
|
||||
person_address_street2: Address (Line 2)
|
||||
person_address_zip: Zip code
|
||||
person_date_of_birth: Date of birth
|
||||
person_email: Email address
|
||||
person_first_name: First name
|
||||
person_last_name: Last name
|
||||
person_name: Name
|
||||
person_phone: Phone number
|
||||
music_release:
|
||||
person_address: Address
|
||||
person_address_city: City
|
||||
@@ -665,6 +750,7 @@ en:
|
||||
empty: Location Releases will appear here
|
||||
table_headers:
|
||||
address: Address
|
||||
name: Name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
@@ -699,6 +785,7 @@ en:
|
||||
search: Search
|
||||
empty: Material Releases will appear here
|
||||
table_headers:
|
||||
name: Name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
@@ -711,6 +798,8 @@ en:
|
||||
update:
|
||||
notice: The material release has been updated
|
||||
medical_releases:
|
||||
custom_validation_errors:
|
||||
question_answer_is_required: answer is required
|
||||
destroy:
|
||||
alert: The medical release has been deleted
|
||||
index:
|
||||
@@ -718,12 +807,19 @@ en:
|
||||
search: Search
|
||||
empty: Medical releases will appear here
|
||||
table_headers:
|
||||
approved: Approved
|
||||
approved?: Approved
|
||||
contact_info: Contact info
|
||||
name: Person name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
medical_release:
|
||||
actions:
|
||||
manage: Manage
|
||||
review: Review
|
||||
messages:
|
||||
approved_tooltip: Approved by %{user} on %{timestamp}
|
||||
misc_releases:
|
||||
destroy:
|
||||
alert: The misc release has been deleted
|
||||
@@ -732,6 +828,8 @@ en:
|
||||
search: Search
|
||||
empty: Misc Releases will appear here
|
||||
table_headers:
|
||||
contact_info: Contact info
|
||||
name: Person name
|
||||
notes: Notes
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
@@ -766,6 +864,7 @@ en:
|
||||
table_headers:
|
||||
composers_count: No. Composers
|
||||
file_infos_count: No. Files
|
||||
name: Name
|
||||
notes: Notes
|
||||
publishers_count: No. Publishers
|
||||
signed_at: Date Signed
|
||||
@@ -1024,6 +1123,8 @@ en:
|
||||
instructions: Now, enter your personal information.
|
||||
photo:
|
||||
heading: Photos
|
||||
questionnaire:
|
||||
heading: Questionnaire
|
||||
signature:
|
||||
heading: Signature
|
||||
talent_releases:
|
||||
@@ -1160,7 +1261,10 @@ en:
|
||||
search: Search
|
||||
empty: Talent Releases will appear here
|
||||
table_headers:
|
||||
email: Email
|
||||
name: Name
|
||||
notes: Notes
|
||||
phone: Phone
|
||||
signed_at: Date Signed
|
||||
tags: Tags
|
||||
new:
|
||||
@@ -1180,7 +1284,9 @@ en:
|
||||
heading:
|
||||
Edit Task Request
|
||||
form:
|
||||
info_message: After submitting this task request, you'll be connected via chat with a ME Suite representative.
|
||||
actions:
|
||||
chat_now: Chat Now
|
||||
info_message: For best results, please fill out this form prior to being connected with a TaskME assistant. However, if urgent, you can start speaking with a TaskME assistant by pressing the Chat Now button to the right
|
||||
labels:
|
||||
additional_notes: Please add any additional notes we should be aware of regarding this task.
|
||||
deadline: What is the deadline for this task?
|
||||
@@ -1202,6 +1308,23 @@ en:
|
||||
heading: New Task Request
|
||||
show:
|
||||
empty: Attached files will appear here.
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo
|
||||
create_task_request: Create Task Request
|
||||
headings:
|
||||
benefits: Benefits
|
||||
how_it_works: How It Works
|
||||
subtitle: Pay-by-the-hour, digitally-enabled remote assistants
|
||||
welcome: Welcome to
|
||||
list_items:
|
||||
enter_number_of_hours: Enter the number of hours you want the task worked on
|
||||
enter_task_request: Enter your task request
|
||||
reduces_need_for_full_time_staff: Reduces need to hire full-time staff
|
||||
reduces_workload: Reduces workload for current staff
|
||||
spend_per_task: Spend as little as $60 per task
|
||||
state_deadline: State your deadline
|
||||
virtual_assistant_delivers_task: Virtual assistant delivers task via TaskME portal
|
||||
task_request:
|
||||
actions:
|
||||
manage: Manage
|
||||
@@ -1273,6 +1396,24 @@ en:
|
||||
new:
|
||||
heading: Upload Video
|
||||
subheading: 2 of 2 Files
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo
|
||||
upload_video: Upload New Video
|
||||
headings:
|
||||
benefits: Benefits
|
||||
how_it_works: How It Works
|
||||
subtitle: Automate your deliverable documents
|
||||
welcome: Welcome to
|
||||
list_items:
|
||||
AI_generates_documents: AI generates deliverable documents
|
||||
download_documents: Download deliverable documents
|
||||
import_EDLs: Import your EDLs
|
||||
import_video: Import your video
|
||||
more_accurate: More accurate than human-generated reports
|
||||
production_elements_logs: Production Elements Logs, and more
|
||||
reduces_labor_cost: Reduces labor costs
|
||||
simplifies_cue_sheets: Simplifies Music Cue Sheets, Graphic Cue Sheets
|
||||
update:
|
||||
notice: The video has been updated
|
||||
video:
|
||||
|
||||
@@ -1,4 +1,14 @@
|
||||
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:
|
||||
attributes:
|
||||
appearance_release:
|
||||
@@ -41,6 +51,12 @@ es:
|
||||
heading: Person Photo (ES)
|
||||
index:
|
||||
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:
|
||||
imported_appearance_release_contract_name: Contrato Importado
|
||||
imported_appearance_release_headshot_name: Retrato Importado
|
||||
@@ -50,6 +66,13 @@ es:
|
||||
all_releases: All Releases (ES)
|
||||
complete_releases: Complete 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:
|
||||
new:
|
||||
number_of_copies_label: Number of copies (ES)
|
||||
@@ -57,6 +80,30 @@ es:
|
||||
pdf:
|
||||
do_not_copy_warning: "Do not copy (ES)"
|
||||
serial_number_label: "Serial Number (ES)"
|
||||
broadcasts:
|
||||
show:
|
||||
actions:
|
||||
reset_url: Reset URL (ES)
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo
|
||||
create_stream: Create New Live Stream
|
||||
headings:
|
||||
benefits: Benefits
|
||||
how_it_works: How It Works
|
||||
subtitle: Remote directing and video village solution
|
||||
welcome: Welcome to
|
||||
list_items:
|
||||
create_stream: Create a live stream
|
||||
direct_shoots_anywhere: Direct shoots anywhere around the world
|
||||
launch_video_conference: Launch Video Conference using plugin
|
||||
share_files: Share files via the ME Suite mobile app
|
||||
share_live_stream: Share live stream with clients all over the the world
|
||||
share_stream: Share live stream link with clients
|
||||
stream_from_mobile_app: Stream from ME Suite Mobile app, or via a professional camera
|
||||
stream_multiple_cameras: Stream multiple cameras at one time
|
||||
update:
|
||||
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
|
||||
contract_templates:
|
||||
blank_contracts:
|
||||
create:
|
||||
@@ -70,7 +117,32 @@ es:
|
||||
heading: Legal (ES)
|
||||
release_info:
|
||||
heading: Release Info (ES)
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo (ES)
|
||||
create_template: Create New Release Template (ES)
|
||||
headings:
|
||||
benefits: ""
|
||||
how_it_works: How It Works (ES)
|
||||
subtitle: The easiest way to create and manage releases. (ES)
|
||||
welcome: Welcome to (ES)
|
||||
list_items:
|
||||
add_tags_and_notes: Add tags and notes to releases for added organization and searchability (ES)
|
||||
all_releases_available: All release types available including Covid Medical, Appearance, Location and more (ES)
|
||||
create_releases: Create releases for your video shoot (ES)
|
||||
download_mobile_app: Download the ME Suite mobile app (ES)
|
||||
manage_large_audience: Easily manage large audiences with the crowd control feature (ES)
|
||||
print_QR_code: Print out release QR codes (ES)
|
||||
releases_automatically_organized: Releases are automatically organized as they’re submitted (ES)
|
||||
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:
|
||||
guardian_2_photo_heading: Second guardian photo (ES)
|
||||
guardian_photo_heading: Guardian photo (ES)
|
||||
@@ -124,6 +196,7 @@ es:
|
||||
contract_template:
|
||||
fee: Leave at $0.00 for no-fee (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:
|
||||
appearance_release:
|
||||
guardian_2_address_city: Guardian 2 city (ES)
|
||||
@@ -237,15 +310,64 @@ es:
|
||||
create: Create Live Stream (ES)
|
||||
update: Save Changes (ES)
|
||||
create: 'Crear %{model}'
|
||||
medical_release:
|
||||
update: Approve (ES)
|
||||
update: 'Actualizar %{model}'
|
||||
location_releases:
|
||||
form:
|
||||
photos:
|
||||
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:
|
||||
form:
|
||||
photos:
|
||||
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:
|
||||
custom_validation_errors:
|
||||
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:
|
||||
appearance_releases:
|
||||
create:
|
||||
@@ -350,16 +472,62 @@ es:
|
||||
heading: Second Guardian Photo (ES)
|
||||
guardian_photo:
|
||||
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:
|
||||
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)
|
||||
form:
|
||||
info_message: After submitting this task request, you'll be connected via chat with a ME Suite representative. (ES)
|
||||
actions:
|
||||
chat_now: Chat Now (ES)
|
||||
info_message: For best results, please fill out this form prior to being connected with a TaskME assistant. However, if urgent, you can start speaking with a TaskME assistant by pressing the Chat Now button to the right (ES)
|
||||
index:
|
||||
table_headers:
|
||||
task_request_description: Description (ES)
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo (ES)
|
||||
create_task_request: Create Task Request
|
||||
headings:
|
||||
benefits: Benefits (ES)
|
||||
how_it_works: How It Works (ES)
|
||||
subtitle: Pay-by-the-hour, digitally-enabled remote assistants (ES)
|
||||
welcome: Welcome to (ES)
|
||||
list_items:
|
||||
enter_number_of_hours: Enter the number of hours you want the task worked on (ES)
|
||||
enter_task_request: Enter your task request (ES)
|
||||
reduces_need_for_full_time_staff: Reduces need to hire full-time staff (ES)
|
||||
reduces_workload: Reduces workload for current staff (ES)
|
||||
spend_per_task: Spend as little as $60 per task (ES)
|
||||
state_deadline: State your deadline (ES)
|
||||
virtual_assistant_delivers_task: Virtual assistant delivers task via TaskME portal (ES)
|
||||
task_request:
|
||||
actions:
|
||||
manage: Manage (ES)
|
||||
open_deliverable: Open Deliverable (ES)
|
||||
read_more: read more (ES)
|
||||
videos:
|
||||
splash:
|
||||
actions:
|
||||
book_demo: Schedule a Demo (ES)
|
||||
upload_video: Upload New Video (ES)
|
||||
headings:
|
||||
benefits: Benefits (ES)
|
||||
how_it_works: How It Works (ES)
|
||||
subtitle: Automate your deliverable documents (ES)
|
||||
welcome: Welcome to (ES)
|
||||
list_items:
|
||||
AI_generates_documents: AI generates deliverable documents (ES)
|
||||
download_documents: Download deliverable documents (ES)
|
||||
import_EDLs: Import your EDLs (ES)
|
||||
import_video: Import your video (ES)
|
||||
more_accurate: More accurate than human-generated reports (ES)
|
||||
production_elements_logs: Production Elements Logs, and more (ES)
|
||||
reduces_labor_cost: Reduces labor costs (ES)
|
||||
simplifies_cue_sheets: Simplifies Music Cue Sheets, Graphic Cue Sheets (ES)
|
||||
|
||||
@@ -2,7 +2,7 @@ require 'oath/constraints/signed_in'
|
||||
require 'sidekiq/web'
|
||||
|
||||
Rails.application.routes.draw do
|
||||
AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/
|
||||
AVAILABLE_LOCALES_REGEX = /#{I18n.available_locales.join("|")}/.freeze
|
||||
|
||||
concern :confirmable do
|
||||
resources :video_release_confirmations, only: [:new, :create, :destroy]
|
||||
@@ -136,13 +136,18 @@ Rails.application.routes.draw do
|
||||
end
|
||||
end
|
||||
|
||||
RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :location_releases]
|
||||
ALL_RELEASES = RELEASES + [:music_releases, :medical_releases, :misc_releases]
|
||||
RELEASES = [:acquired_media_releases, :appearance_releases, :talent_releases, :material_releases, :medical_releases, :misc_releases, :location_releases].freeze
|
||||
ALL_RELEASES = RELEASES + [:music_releases]
|
||||
|
||||
ALL_RELEASES.each do |release|
|
||||
resources release, only: [], concerns: :taggable
|
||||
end
|
||||
|
||||
# Customization for medical releases
|
||||
resources :medical_releases, only: [], concerns: :taggable do
|
||||
resource :approvals, only: [:new, :create]
|
||||
end
|
||||
|
||||
resources :bulk_taggings, only: [:new, :create]
|
||||
|
||||
namespace :api do
|
||||
@@ -158,7 +163,7 @@ Rails.application.routes.draw do
|
||||
resources :contract_templates, only: [:index]
|
||||
end
|
||||
resources :contract_templates, only: [:show] do
|
||||
RELEASES.each do |release|
|
||||
(RELEASES - [:misc_releases, :medical_releases]).each do |release|
|
||||
resources release, controller: release, only: [:create]
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
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
|
||||
@@ -0,0 +1,20 @@
|
||||
class AddQuestionAnswersToMiscReleases < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :misc_releases, :question_1_answer, :text
|
||||
add_column :misc_releases, :question_2_answer, :text
|
||||
add_column :misc_releases, :question_3_answer, :text
|
||||
add_column :misc_releases, :question_4_answer, :text
|
||||
add_column :misc_releases, :question_5_answer, :text
|
||||
add_column :misc_releases, :question_6_answer, :text
|
||||
add_column :misc_releases, :question_7_answer, :text
|
||||
add_column :misc_releases, :question_8_answer, :text
|
||||
add_column :misc_releases, :question_9_answer, :text
|
||||
add_column :misc_releases, :question_10_answer, :text
|
||||
add_column :misc_releases, :question_11_answer, :text
|
||||
add_column :misc_releases, :question_12_answer, :text
|
||||
add_column :misc_releases, :question_13_answer, :text
|
||||
add_column :misc_releases, :question_14_answer, :text
|
||||
add_column :misc_releases, :question_15_answer, :text
|
||||
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,7 @@
|
||||
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
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddAccessibilityToContractTemplates < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :contract_templates, :accessibility, :integer, default: 0
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
class AddDurationToBroadcastRecordings < ActiveRecord::Migration[6.0]
|
||||
def change
|
||||
add_column :broadcast_recordings, :duration, :float
|
||||
end
|
||||
end
|
||||
@@ -9,20 +9,6 @@ SET xmloption = content;
|
||||
SET client_min_messages = warning;
|
||||
SET row_security = off;
|
||||
|
||||
--
|
||||
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -
|
||||
--
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
|
||||
|
||||
|
||||
--
|
||||
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -
|
||||
--
|
||||
|
||||
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
|
||||
|
||||
|
||||
--
|
||||
-- Name: fuzzystrmatch; Type: EXTENSION; Schema: -; Owner: -
|
||||
--
|
||||
@@ -331,8 +317,8 @@ CREATE TABLE public.appearance_releases (
|
||||
person_last_name character varying,
|
||||
guardian_first_name character varying,
|
||||
guardian_last_name character varying,
|
||||
guardian_email character varying,
|
||||
identifier character varying,
|
||||
guardian_email character varying,
|
||||
person_address_street2 character varying,
|
||||
person_address_city character varying,
|
||||
person_address_state character varying,
|
||||
@@ -508,7 +494,8 @@ CREATE TABLE public.broadcast_recordings (
|
||||
asset_playback_uid character varying NOT NULL,
|
||||
file_name character varying NOT NULL,
|
||||
created_at timestamp(6) without time zone NOT NULL,
|
||||
updated_at timestamp(6) without time zone NOT NULL
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
duration double precision
|
||||
);
|
||||
|
||||
|
||||
@@ -643,7 +630,8 @@ CREATE TABLE public.contract_templates (
|
||||
question_12_text text,
|
||||
question_13_text text,
|
||||
question_14_text text,
|
||||
question_15_text text
|
||||
question_15_text text,
|
||||
accessibility integer DEFAULT 0
|
||||
);
|
||||
|
||||
|
||||
@@ -666,15 +654,6 @@ CREATE SEQUENCE public.contract_templates_id_seq
|
||||
ALTER SEQUENCE public.contract_templates_id_seq OWNED BY public.contract_templates.id;
|
||||
|
||||
|
||||
--
|
||||
-- Name: data_migrations; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
CREATE TABLE public.data_migrations (
|
||||
version character varying NOT NULL
|
||||
);
|
||||
|
||||
|
||||
--
|
||||
-- Name: directories; Type: TABLE; Schema: public; Owner: -
|
||||
--
|
||||
@@ -1068,7 +1047,10 @@ CREATE TABLE public.medical_releases (
|
||||
guardian_2_address_city character varying,
|
||||
guardian_2_address_state character varying,
|
||||
guardian_2_address_zip character varying,
|
||||
guardian_2_address_country character varying
|
||||
guardian_2_address_country character varying,
|
||||
approved_by_user_name text,
|
||||
approved_by_user_email text,
|
||||
approved_at timestamp without time zone
|
||||
);
|
||||
|
||||
|
||||
@@ -1124,7 +1106,22 @@ CREATE TABLE public.misc_releases (
|
||||
signed_at timestamp without time zone,
|
||||
minor boolean DEFAULT false,
|
||||
created_at timestamp(6) without time zone NOT NULL,
|
||||
updated_at timestamp(6) without time zone NOT NULL
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
question_1_answer text,
|
||||
question_2_answer text,
|
||||
question_3_answer text,
|
||||
question_4_answer text,
|
||||
question_5_answer text,
|
||||
question_6_answer text,
|
||||
question_7_answer text,
|
||||
question_8_answer text,
|
||||
question_9_answer text,
|
||||
question_10_answer text,
|
||||
question_11_answer text,
|
||||
question_12_answer text,
|
||||
question_13_answer text,
|
||||
question_14_answer text,
|
||||
question_15_answer text
|
||||
);
|
||||
|
||||
|
||||
@@ -1401,6 +1398,7 @@ CREATE TABLE public.settings (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.settings_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
@@ -1436,6 +1434,7 @@ CREATE TABLE public.taggings (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.taggings_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
@@ -1466,6 +1465,7 @@ CREATE TABLE public.tags (
|
||||
--
|
||||
|
||||
CREATE SEQUENCE public.tags_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
@@ -1826,9 +1826,9 @@ CREATE TABLE public.zoom_meetings (
|
||||
api_meeting_id character varying,
|
||||
created_at timestamp(6) without time zone NOT NULL,
|
||||
updated_at timestamp(6) without time zone NOT NULL,
|
||||
status integer DEFAULT 0,
|
||||
zoom_user_id bigint,
|
||||
project_id bigint
|
||||
project_id bigint,
|
||||
status integer DEFAULT 0
|
||||
);
|
||||
|
||||
|
||||
@@ -2305,14 +2305,6 @@ ALTER TABLE ONLY public.contract_templates
|
||||
ADD CONSTRAINT contract_templates_pkey PRIMARY KEY (id);
|
||||
|
||||
|
||||
--
|
||||
-- Name: data_migrations data_migrations_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
|
||||
ALTER TABLE ONLY public.data_migrations
|
||||
ADD CONSTRAINT data_migrations_pkey PRIMARY KEY (version);
|
||||
|
||||
|
||||
--
|
||||
-- Name: directories directories_pkey; Type: CONSTRAINT; Schema: public; Owner: -
|
||||
--
|
||||
@@ -3914,6 +3906,10 @@ INSERT INTO "schema_migrations" (version) VALUES
|
||||
('20200619085823'),
|
||||
('20200619134853'),
|
||||
('20200622180507'),
|
||||
('20200625144713');
|
||||
('20200625144713'),
|
||||
('20200702152130'),
|
||||
('20200707155717'),
|
||||
('20200709120630'),
|
||||
('20200712181139');
|
||||
|
||||
|
||||
|
||||
@@ -57,6 +57,8 @@ RSpec.describe AccountsController, type: :controller do
|
||||
expect {
|
||||
post :create, params: params
|
||||
}.to have_enqueued_job(SubmitHubspotFormJob).with(
|
||||
"John",
|
||||
"Doe",
|
||||
"test_user+1@test.com",
|
||||
"Test Dev account",
|
||||
i_m_interested_in: "DirectME"
|
||||
|
||||
@@ -37,23 +37,26 @@ RSpec.describe Api::AppearanceReleasesController, type: :controller do
|
||||
|
||||
it 'includes photos' do
|
||||
project = create(:project, account_id: current_user.primary_account.id)
|
||||
appearance_release = create(:appearance_release, person_first_name: 'Release', person_last_name: 'Name', project: project)
|
||||
appearance_release = create(:appearance_release,
|
||||
:with_person_photo, :with_guardian_photo, :with_guardian_2_photo,
|
||||
project: project)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: appearance_release.id }
|
||||
|
||||
photo = appearance_release.person_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
[appearance_release.person_photo, appearance_release.guardian_photo, appearance_release.guardian_2_photo].each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -184,7 +187,46 @@ RSpec.describe Api::AppearanceReleasesController, type: :controller do
|
||||
expect(appearance_release.guardian_photo).to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor without second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(appearance_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
})
|
||||
|
||||
expect(response.status).to eq 201
|
||||
expect(AppearanceRelease.last.signature).to be_attached
|
||||
expect(AppearanceRelease.last.guardian_2_photo).not_to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor with second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(appearance_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
guardian_2_photo: {
|
||||
io: guardian_photo_base64,
|
||||
filename: 'guardian_2_photo.jpeg'
|
||||
}
|
||||
})
|
||||
expect(response.status).to eq 201
|
||||
|
||||
appearance_release = AppearanceRelease.last
|
||||
photo = appearance_release.guardian_2_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(appearance_release.signature).to be_attached
|
||||
expect(appearance_release.guardian_2_photo).to be_attached
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@ -30,6 +30,21 @@ RSpec.describe Api::ContractTemplatesController, type: :controller do
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it 'returns electronic signature legal text when present' do
|
||||
ct = create(:contract_template, name: 'ct1', project_id: project.id)
|
||||
ct.signature_legal_text = "some electronic signature legal text"
|
||||
ct.save
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: ct.id }
|
||||
|
||||
expect(response).to be_successful
|
||||
|
||||
expect(response.body).to include("signature_legal_text")
|
||||
expect(response.body).to include(ct.signature_legal_text.body.as_json)
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
42
spec/controllers/api/medical_releases_controller_spec.rb
Normal file
42
spec/controllers/api/medical_releases_controller_spec.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Api::MedicalReleasesController, type: :controller do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:project) { create(:project, name: 'first', account: current_user.primary_account) }
|
||||
|
||||
describe '#index' do
|
||||
it 'returns a succesful response' do
|
||||
create(:medical_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
|
||||
create(:medical_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :index, params: { project_id: project.id }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).to include 'John'
|
||||
expect(response.body).to include 'Jane'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#show' do
|
||||
it 'returns a succesful response' do
|
||||
release1 = create(:medical_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
|
||||
release2 = create(:medical_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: release1 }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).to include 'John'
|
||||
expect(response.body).not_to include 'Jane'
|
||||
|
||||
get :show, params: { id: release2 }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).not_to include 'John'
|
||||
expect(response.body).to include 'Jane'
|
||||
end
|
||||
end
|
||||
end
|
||||
42
spec/controllers/api/misc_releases_controller_spec.rb
Normal file
42
spec/controllers/api/misc_releases_controller_spec.rb
Normal file
@@ -0,0 +1,42 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Api::MiscReleasesController, type: :controller do
|
||||
let(:current_user) { create(:user) }
|
||||
let(:project) { create(:project, name: 'first', account: current_user.primary_account) }
|
||||
|
||||
describe '#index' do
|
||||
it 'returns a succesful response' do
|
||||
create(:misc_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
|
||||
create(:misc_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :index, params: { project_id: project.id }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).to include 'John'
|
||||
expect(response.body).to include 'Jane'
|
||||
end
|
||||
end
|
||||
|
||||
describe '#show' do
|
||||
it 'returns a succesful response' do
|
||||
release1 = create(:misc_release, person_first_name: 'John', person_last_name: 'Lee', project_id: project.id)
|
||||
release2 = create(:misc_release, person_first_name: 'Jane', person_last_name: 'Lee', project_id: project.id)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: release1 }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).to include 'John'
|
||||
expect(response.body).not_to include 'Jane'
|
||||
|
||||
get :show, params: { id: release2 }
|
||||
|
||||
expect(response).to be_successful
|
||||
expect(response.body).not_to include 'John'
|
||||
expect(response.body).to include 'Jane'
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -18,6 +18,14 @@ releases = [
|
||||
{
|
||||
type: :material_release,
|
||||
obligatory_attribute: :name
|
||||
},
|
||||
{
|
||||
type: :medical_release,
|
||||
obligatory_attribute: :person_name
|
||||
},
|
||||
{
|
||||
type: :misc_release,
|
||||
obligatory_attribute: :person_name
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
@@ -110,6 +110,33 @@ RSpec.describe Api::SyncController, type: :controller do
|
||||
expect(guardian_photo).to include('id', 'type', 'attributes')
|
||||
expect(photo_attributes).to include('filename', 'content_type', 'url', 'thumbnail_url')
|
||||
end
|
||||
|
||||
it 'contains misc releases' do
|
||||
create_default_data
|
||||
|
||||
get :index
|
||||
|
||||
misc_releases = attributes_for_type('misc_releases')
|
||||
|
||||
expect(misc_releases.first).to include('id')
|
||||
end
|
||||
|
||||
it 'contains misc releases' do
|
||||
create_default_data
|
||||
|
||||
get :index
|
||||
|
||||
medical_releases = attributes_for_type('medical_releases')
|
||||
expect(medical_releases.first).to include('id')
|
||||
end
|
||||
|
||||
it 'contains signature legal text for contract templates' do
|
||||
create_default_data_with_signature_legal_text
|
||||
get :index
|
||||
contract_templates = attributes_for_type('contract_templates')
|
||||
expect(contract_templates.first).to include('signature_legal_text')
|
||||
expect(contract_templates.first['signature_legal_text']).to eq ContractTemplate.first.signature_legal_text.as_json
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
@@ -120,6 +147,8 @@ RSpec.describe Api::SyncController, type: :controller do
|
||||
create(:talent_release, project: project)
|
||||
create(:location_release, project: project)
|
||||
create(:material_release, project: project)
|
||||
create(:medical_release, project: project)
|
||||
create(:misc_release, project: project)
|
||||
end
|
||||
|
||||
def create_default_data_with_guardian_info
|
||||
@@ -127,6 +156,13 @@ RSpec.describe Api::SyncController, type: :controller do
|
||||
create(:appearance_release, :minor_with_guardian_photo, project: project)
|
||||
end
|
||||
|
||||
def create_default_data_with_signature_legal_text
|
||||
create_default_data
|
||||
ct = create(:contract_template, name: "with signature legal text", project: Project.first)
|
||||
ct.signature_legal_text = "legal text example"
|
||||
ct.save
|
||||
end
|
||||
|
||||
def response_body_json
|
||||
JSON.parse(response.body)
|
||||
end
|
||||
|
||||
@@ -32,26 +32,28 @@ RSpec.describe Api::TalentReleasesController, type: :controller do
|
||||
end
|
||||
|
||||
it 'includes photos' do
|
||||
tested_release = create("talent_release_with_photo", person_name: 'Release 1', project: project)
|
||||
project = create(:project, account_id: current_user.primary_account.id)
|
||||
talent_release = create(:talent_release,
|
||||
:with_guardian_photo, :with_guardian_2_photo,
|
||||
project: project)
|
||||
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: tested_release.id }
|
||||
sign_in_to_api(current_user)
|
||||
get :show, params: { id: talent_release.id }
|
||||
|
||||
tested_release.photos.each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
[talent_release.photos, talent_release.guardian_photo, talent_release.guardian_2_photo].flatten.each do |photo|
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
@@ -180,6 +182,47 @@ RSpec.describe Api::TalentReleasesController, type: :controller do
|
||||
expect(talent_release.signature).to be_attached
|
||||
expect(talent_release.guardian_photo).to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor without second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(talent_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
})
|
||||
|
||||
expect(response.status).to eq 201
|
||||
expect(TalentRelease.last.signature).to be_attached
|
||||
expect(TalentRelease.last.guardian_2_photo).not_to be_attached
|
||||
end
|
||||
|
||||
it 'returns 201 for minor with second guardian photo' do
|
||||
post :create, params: @parameters.deep_merge(talent_release: {
|
||||
minor: true,
|
||||
guardian_2_name: 'Guardian 2 Name',
|
||||
guardian_2_phone: '101010',
|
||||
guardian_2_photo: {
|
||||
io: guardian_photo_base64,
|
||||
filename: 'guardian_2_photo.jpeg'
|
||||
}
|
||||
})
|
||||
expect(response.status).to eq 201
|
||||
|
||||
talent_release = TalentRelease.last
|
||||
photo = talent_release.guardian_2_photo
|
||||
data = {
|
||||
'id' => photo.id.to_s,
|
||||
'type' => 'active_storage_attachment',
|
||||
'attributes' => {
|
||||
'content_type' => photo.content_type,
|
||||
'filename' => photo.filename.to_s,
|
||||
'url' => photo_path_for(photo),
|
||||
'thumbnail_url' => photo_variant_path_for(photo, '150x150')
|
||||
}
|
||||
}
|
||||
expect(response_body_included_attributes).to include(data)
|
||||
expect(talent_release.signature).to be_attached
|
||||
expect(talent_release.guardian_2_photo).to be_attached
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
36
spec/controllers/approvals_controller_spec.rb
Normal file
36
spec/controllers/approvals_controller_spec.rb
Normal file
@@ -0,0 +1,36 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe ApprovalsController, type: :controller do
|
||||
render_views
|
||||
|
||||
let(:user) { create(:user) }
|
||||
let(:account) { user.primary_account }
|
||||
let(:project) { create(:project, account: user.primary_account) }
|
||||
|
||||
before do
|
||||
sign_in user
|
||||
end
|
||||
|
||||
describe "#new" do
|
||||
let!(:medical_release) { create(:medical_release, project: project) }
|
||||
|
||||
it "responds successfully" do
|
||||
get :new, params: { medical_release_id: medical_release }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
end
|
||||
|
||||
describe "#create" do
|
||||
it "changes approval status successfully" do
|
||||
medical_release = create(:medical_release, project: project)
|
||||
|
||||
expect(MedicalRelease.last.approved?).to eq false
|
||||
|
||||
post :create, params: { medical_release_id: medical_release }
|
||||
|
||||
expect(response).to redirect_to [project, :medical_releases]
|
||||
expect(MedicalRelease.last.approved?).to eq true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -22,7 +22,7 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
it "renders content if theere are existing broadcasts" do
|
||||
create(:broadcast, project: project, name: "Another Broadcast")
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
@@ -34,12 +34,13 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
end
|
||||
|
||||
context "when there are no active broadcasts" do
|
||||
it "renders an empty message" do
|
||||
it "renders splash screen" do
|
||||
Broadcast.destroy_all
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_content("Live streams will appear here")
|
||||
expect(response.body).to have_link create_stream
|
||||
expect(response.body).to have_link schedule_demo
|
||||
end
|
||||
end
|
||||
|
||||
@@ -55,10 +56,8 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
|
||||
context "for xhr request" do
|
||||
it "filters the broadcasts by a query param" do
|
||||
appearance_releases = [
|
||||
create(:broadcast, skip_create_callback: true, name: "Stream by Adam"),
|
||||
create(:broadcast, skip_create_callback: true, name: "Stream by Zoe"),
|
||||
]
|
||||
create(:broadcast, project: project, skip_create_callback: true, name: "Stream by Adam")
|
||||
create(:broadcast, project: project, skip_create_callback: true, name: "Stream by Zoe")
|
||||
|
||||
get :index, params: { project_id: project, query: "Zoe" }, xhr: true
|
||||
|
||||
@@ -204,6 +203,15 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
|
||||
expect(BroadcastsChannel).to have_received(:broadcast_file_upload_updates)
|
||||
end
|
||||
|
||||
it "regenerates token if #update is called without broadcast param" do
|
||||
old_token = broadcast.token
|
||||
patch :update, params: { project_id: project.id, id: broadcast.id }
|
||||
|
||||
expect(response).to redirect_to [project, broadcast]
|
||||
expect(flash.notice).to eq token_reset_notice
|
||||
expect(Broadcast.last.token).not_to eq old_token
|
||||
end
|
||||
end
|
||||
|
||||
describe "#destroy" do
|
||||
@@ -245,4 +253,16 @@ RSpec.describe BroadcastsController, type: :controller do
|
||||
|
||||
{ files: [contract_file] }
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'broadcasts.splash.actions.book_demo'
|
||||
end
|
||||
|
||||
def create_stream
|
||||
t 'broadcasts.splash.actions.create_stream'
|
||||
end
|
||||
|
||||
def token_reset_notice
|
||||
t 'broadcasts.update.reset_notice'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,7 +19,7 @@ describe ContractTemplatesController do
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it 'renders content' do
|
||||
it 'renders content if there are contract templates' do
|
||||
contract_template = create(:contract_template,
|
||||
name: 'My Contract Template', fee: 50, release_type: 'appearance',
|
||||
project: project)
|
||||
@@ -39,10 +39,11 @@ describe ContractTemplatesController do
|
||||
end
|
||||
|
||||
context 'when there are no contract templates' do
|
||||
it 'renders an empty message' do
|
||||
it 'renders splash screen' do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_content('Release Templates will appear here')
|
||||
expect(response.body).to have_link "Create New Release Template"
|
||||
expect(response.body).to have_link schedule_demo
|
||||
end
|
||||
end
|
||||
|
||||
@@ -50,6 +51,7 @@ describe ContractTemplatesController do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
it 'does not show the new contract template button' do
|
||||
create(:contract_template, project: project)
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).not_to have_link('Create New Release Template')
|
||||
@@ -166,4 +168,8 @@ describe ContractTemplatesController do
|
||||
restriction_text: 'restrictions'
|
||||
}
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'contract_templates.splash.actions.book_demo'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -19,14 +19,29 @@ RSpec.describe Public::MedicalReleasesController, type: :controller do
|
||||
end
|
||||
|
||||
it "displays validation errors" do
|
||||
contract_template = create(:contract_template, project: project)
|
||||
contract_template = create(:contract_template,
|
||||
project: project,
|
||||
question_1_text: "Question 1",
|
||||
question_2_text: "Question 2"
|
||||
)
|
||||
sign_in(user)
|
||||
|
||||
post :create, params: { account_id: user.primary_account.to_param, project_id: project, contract_template_id: contract_template, medical_release: { person_address_city: "Albuquerque" } }
|
||||
post :create, params: {
|
||||
account_id: user.primary_account.to_param,
|
||||
project_id: project,
|
||||
contract_template_id: contract_template,
|
||||
medical_release: {
|
||||
person_address_city: "Albuquerque",
|
||||
question_2_answer: "Answer 2"
|
||||
}
|
||||
}
|
||||
|
||||
body = CGI.unescape_html(response.body)
|
||||
expect(body).to match /Person first name can't be blank/
|
||||
expect(body).to match /Person last name can't be blank/
|
||||
expect(body).to match />can't be blank</
|
||||
expect(body).to match /Question 1 #{question_answer_validation_error}/
|
||||
expect(body).not_to match /Question 2 #{question_answer_validation_error}/
|
||||
end
|
||||
|
||||
it "responds with success " do
|
||||
@@ -68,4 +83,8 @@ RSpec.describe Public::MedicalReleasesController, type: :controller do
|
||||
|
||||
{ signature_base64: data_uri }
|
||||
end
|
||||
|
||||
def question_answer_validation_error
|
||||
t 'medical_releases.custom_validation_errors.question_answer_is_required'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -7,6 +7,7 @@ RSpec.describe StreamNotificationsController, type: :controller do
|
||||
let(:active_status) { {type: "video.live_stream.active", object: { id: "mux_stream" }} }
|
||||
let(:disconnected_status) { {type: "video.live_stream.disconnected", object: { id: "mux_stream" }} }
|
||||
let(:idle_status) { {type: "video.live_stream.idle", object: { id: "mux_stream" }} }
|
||||
let(:idle_status_for_unknown_broadcast) { {type: "video.live_stream.idle", object: { id: "unknown-id" }} }
|
||||
let(:asset_ready) { {
|
||||
type: "video.asset.static_renditions.ready",
|
||||
object: { id: "asset_uid" },
|
||||
@@ -59,6 +60,12 @@ RSpec.describe StreamNotificationsController, type: :controller do
|
||||
|
||||
expect(BroadcastsChannel).to have_received(:stream_recording_ready)
|
||||
end
|
||||
|
||||
it "returns OK response even for non-existing broadcast" do
|
||||
post :create, params: idle_status_for_unknown_broadcast
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
|
||||
@@ -18,7 +18,14 @@ RSpec.describe TaskRequestsController, type: :controller do
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
it "renders content" do
|
||||
it "renders splash page if there are no task requests" do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_link "Create Task Request"
|
||||
expect(response.body).to have_link schedule_demo
|
||||
end
|
||||
|
||||
it "renders task requests table if there are task requests" do
|
||||
create(:task_request, project: project, description: "Another Request")
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
@@ -126,4 +133,8 @@ RSpec.describe TaskRequestsController, type: :controller do
|
||||
def update_params
|
||||
{ description: "This is updated description" }
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'task_requests.splash.actions.book_demo'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -20,6 +20,7 @@ RSpec.describe VideosController, type: :controller do
|
||||
end
|
||||
|
||||
it "has a search form" do
|
||||
create(:video, project: project)
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_button("search-button")
|
||||
@@ -43,7 +44,7 @@ RSpec.describe VideosController, type: :controller do
|
||||
end
|
||||
|
||||
|
||||
it "renders content" do
|
||||
it "renders content if there are existing videos" do
|
||||
video = create(:video, project: project, name: "My Video", number: "001", created_at: 1.day.ago)
|
||||
|
||||
get :index, params: { project_id: project }
|
||||
@@ -58,10 +59,11 @@ RSpec.describe VideosController, type: :controller do
|
||||
end
|
||||
|
||||
context "when there are no records" do
|
||||
it "renders an empty message" do
|
||||
it "renders splash screen" do
|
||||
get :index, params: { project_id: project }
|
||||
|
||||
expect(response.body).to have_content("Videos will appear here")
|
||||
expect(response.body).to have_link "Upload New Video"
|
||||
expect(response.body).to have_link schedule_demo
|
||||
end
|
||||
end
|
||||
|
||||
@@ -277,4 +279,8 @@ RSpec.describe VideosController, type: :controller do
|
||||
def video_update_params
|
||||
attributes_for(:video, :with_graphics_only_edl_file, :with_audio_only_edl_file, name: "Test Video").except(:file)
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'videos.splash.actions.book_demo'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -58,10 +58,7 @@ FactoryBot.define do
|
||||
guardian_address_state "State"
|
||||
guardian_address_zip "ZIP"
|
||||
guardian_address_country "Country"
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
with_guardian_photo
|
||||
end
|
||||
|
||||
trait :without_person_photo do
|
||||
@@ -74,6 +71,20 @@ FactoryBot.define do
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_photo do
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_2_photo do
|
||||
guardian_2_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_person_photo_only do
|
||||
end
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ FactoryBot.define do
|
||||
body "This is a test contract template."
|
||||
guardian_clause "Is the signer a minor?"
|
||||
fee "$0.00"
|
||||
accessibility "public_template"
|
||||
|
||||
trait :archived do
|
||||
archived_at Time.zone.now
|
||||
|
||||
@@ -16,6 +16,7 @@ FactoryBot.define do
|
||||
appearance_release: true,
|
||||
location_release: true,
|
||||
material_release: true,
|
||||
misc_release: true,
|
||||
medical_release: true,
|
||||
music_release: true,
|
||||
talent_release: true,
|
||||
@@ -48,12 +49,18 @@ FactoryBot.define do
|
||||
predefined_client_name "nat_geo"
|
||||
end
|
||||
|
||||
factory :project_with_contract_template do
|
||||
factory :project_with_contract_template_public do
|
||||
after(:build) do |project, _|
|
||||
project.contract_templates << build(:contract_template, project: nil)
|
||||
end
|
||||
end
|
||||
|
||||
factory :project_with_contract_template_private do
|
||||
after(:build) do |project, _|
|
||||
project.contract_templates << build(:contract_template, project: nil, accessibility: "private_template")
|
||||
end
|
||||
end
|
||||
|
||||
factory :project_with_directories do
|
||||
after(:build) do |project, _|
|
||||
project.directories << build(:directory, project: nil, name: "Shared")
|
||||
|
||||
@@ -35,12 +35,23 @@ FactoryBot.define do
|
||||
guardian_first_name "Jamie"
|
||||
guardian_last_name "Doe"
|
||||
guardian_phone "123-555-1234"
|
||||
with_guardian_photo
|
||||
end
|
||||
|
||||
trait :with_guardian_photo do
|
||||
guardian_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
trait :with_guardian_2_photo do
|
||||
guardian_2_photo do
|
||||
path = Rails.root.join("spec", "fixtures", "files", "pratt.jpg")
|
||||
Rack::Test::UploadedFile.new(path, "image/jpeg")
|
||||
end
|
||||
end
|
||||
|
||||
factory :talent_release_with_contract_template do
|
||||
after(:build) do |talent_release, _|
|
||||
talent_release.contract_template = build(:talent_release_contract_template)
|
||||
|
||||
@@ -21,6 +21,7 @@ RSpec.feature 'User creates task request', type: :feature do
|
||||
click_on 'Create Task request'
|
||||
|
||||
expect(page).to have_content task_created_message
|
||||
expect(page).to have_link("Back")
|
||||
end
|
||||
|
||||
scenario 'user can view task request details' do
|
||||
@@ -89,4 +90,4 @@ RSpec.feature 'User creates task request', type: :feature do
|
||||
def task_created_message
|
||||
t 'task_requests.create.success_message'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -13,6 +13,7 @@ feature "User imports release templates", type: :feature do
|
||||
end
|
||||
|
||||
scenario "importing two existing templates into a project" do
|
||||
create(:contract_template, project: project)
|
||||
visit project_contract_templates_path(project)
|
||||
click_on "Import Release Template"
|
||||
select_templates([project_one_template.id, project_two_template.id])
|
||||
@@ -31,6 +32,7 @@ feature "User imports release templates", type: :feature do
|
||||
end
|
||||
|
||||
scenario "searching for a template", js: true do
|
||||
create(:contract_template, project: project)
|
||||
visit project_contract_templates_path(project)
|
||||
click_on "Import Release Template"
|
||||
fill_in "query", with: "Second"
|
||||
|
||||
@@ -11,6 +11,13 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
scenario 'splash page is shown if tehre are no contract templates' do
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).to have_content create_release_template
|
||||
end
|
||||
|
||||
scenario 'creating a new release template' do
|
||||
visit new_project_contract_template_path(project)
|
||||
|
||||
@@ -25,7 +32,25 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
select 'None', from: 'Restriction'
|
||||
click_on 'Create Release Template'
|
||||
|
||||
expect(page).to have_content('The release template has been created')
|
||||
expect(page).to have_content(create_contract_template_success_message)
|
||||
end
|
||||
|
||||
scenario 'creating new release template, all release types accept signature legal text' do
|
||||
all_release_types = ['Acquired Media', 'Appearance', 'Location', 'Material', 'Medical', 'Misc', 'Talent']
|
||||
|
||||
all_release_types.each do |release_type|
|
||||
visit new_project_contract_template_path(project)
|
||||
|
||||
dropdown_selection = "#{release_type} Release"
|
||||
select dropdown_selection, from: 'Release type'
|
||||
|
||||
fill_in 'Name', with: "My #{release_type} template"
|
||||
fill_in_trix signature_legal_text_field, with: 'LL'
|
||||
|
||||
expect do
|
||||
click_on 'Create Release Template'
|
||||
end.to change(ContractTemplate, :count).by(1)
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'medical release template has a guardian clause field' do
|
||||
@@ -36,10 +61,28 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
fill_hidden guardian_clause_field, with: 'Guardian clause text'
|
||||
click_on 'Create Release Template'
|
||||
|
||||
expect(page).to have_content('The release template has been created')
|
||||
expect(page).to have_content(create_contract_template_success_message)
|
||||
expect(ContractTemplate.last.guardian_clause.body.to_s).to match /Guardian clause text/
|
||||
end
|
||||
|
||||
scenario 'misc release templates has guardian clause and questionnaire', js: true do
|
||||
visit new_project_contract_template_path(project)
|
||||
|
||||
fill_in 'Name', with: 'My Misc Release'
|
||||
select 'Misc Release', from: 'Release type'
|
||||
|
||||
expect(page).to have_selector('label', text: 'Guardian Clause')
|
||||
MiscRelease::NUMBER_OF_CUSTOM_FIELDS.times do |n|
|
||||
expect(page).to have_field(question_field(n+1))
|
||||
end
|
||||
|
||||
fill_in_trix 'contract_template_guardian_clause', with: 'Guardian clause text'
|
||||
fill_in question_field(1), with: 'How much experience do you have in the industry?'
|
||||
click_on 'Create Release Template'
|
||||
|
||||
expect(page).to have_content(create_contract_template_success_message)
|
||||
end
|
||||
|
||||
scenario 'preview new talent release template without guardian clause' do
|
||||
visit new_project_contract_template_path(project)
|
||||
select 'Talent Release', from: 'Release type'
|
||||
@@ -143,13 +186,13 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
scenario 'Should not allow negative fees' do
|
||||
fill_in 'Fee', with: '-200'
|
||||
click_on 'Create Release Template'
|
||||
expect(page).not_to have_content('The release template has been created')
|
||||
expect(page).not_to have_content(create_contract_template_success_message)
|
||||
end
|
||||
|
||||
scenario 'Should not allow fees with more than 9 digits' do
|
||||
fill_in 'Fee', with: '9999999999'
|
||||
click_on 'Create Release Template'
|
||||
expect(page).not_to have_content('The release template has been created')
|
||||
expect(page).not_to have_content(create_contract_template_success_message)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -197,7 +240,7 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
|
||||
click_on 'Manage'
|
||||
accept_alert do
|
||||
click_on 'Archive'
|
||||
click_on 'Delete'
|
||||
end
|
||||
|
||||
expect(page).to have_content('The release template has been archived')
|
||||
@@ -223,12 +266,20 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
it 'does not show management buttons for release templates' do
|
||||
create(:contract_template, project: project)
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).not_to have_content('Create New Release Template')
|
||||
expect(page).not_to have_content(import_template_button)
|
||||
expect(page).not_to have_content('Delete')
|
||||
end
|
||||
|
||||
it 'does not show create release button on splash page' do
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).not_to have_content create_release_template
|
||||
end
|
||||
end
|
||||
|
||||
context 'When the user is account manager' do
|
||||
@@ -240,7 +291,14 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
click_on 'Manage'
|
||||
expect(page).to have_content('Archive')
|
||||
expect(page).to have_content('Delete')
|
||||
end
|
||||
|
||||
it 'does not show create release button on splash page' do
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).to have_content create_release_template
|
||||
end
|
||||
end
|
||||
|
||||
@@ -270,7 +328,31 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
'contract_template_guardian_clause_trix_input_contract_template'
|
||||
end
|
||||
|
||||
def signature_legal_text_field
|
||||
'contract_template_signature_legal_text'
|
||||
end
|
||||
|
||||
def create_contract_template_success_message
|
||||
'The release template has been created'
|
||||
end
|
||||
|
||||
def question_field(n)
|
||||
"Question #{n} text"
|
||||
end
|
||||
|
||||
def fill_hidden(id, with:)
|
||||
find(:xpath, "//input[@id='#{id}']", visible: false).set with
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'contract_templates.splash.actions.book_demo'
|
||||
end
|
||||
|
||||
def create_release_template
|
||||
t 'contract_templates.splash.actions.create_template'
|
||||
end
|
||||
|
||||
def signature_legal_text_trix_field
|
||||
'Signature legal text'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -41,6 +41,13 @@ feature "User managing acquired_media releases" do
|
||||
expect(AcquiredMediaRelease.last.categories).to include("Still Photograph")
|
||||
expect(page).to have_content("Your release was successfully submitted. Thank you.")
|
||||
end
|
||||
|
||||
scenario "creating a release, if contract template contains signature legal language, it is shown" do
|
||||
contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
|
||||
visit new_account_project_contract_template_acquired_media_release_path(project.account, project, contract_template)
|
||||
|
||||
expect(page).to have_content dummy_signature_legal_text
|
||||
end
|
||||
end
|
||||
|
||||
context "when signed in" do
|
||||
@@ -357,4 +364,8 @@ feature "User managing acquired_media releases" do
|
||||
def destroy_release_alert
|
||||
t "acquired_media_releases.destroy.alert"
|
||||
end
|
||||
|
||||
def dummy_signature_legal_text
|
||||
'Some signature legal language'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,6 +30,24 @@ feature 'User managing appearance releases' do
|
||||
expect(page).to have_content(successful_submission_message)
|
||||
end
|
||||
|
||||
scenario "creating a release for a minor - guardian fields are required when minor checkbox is checked", js: true do
|
||||
contract_template = create(:contract_template, project: project)
|
||||
|
||||
visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template)
|
||||
|
||||
all('input[data-required-tag="guardian"]').each do |field|
|
||||
expect(field['required']).to eq 'false'
|
||||
expect(field).not_to be_visible
|
||||
end
|
||||
|
||||
page.check person_is_minor_checkbox
|
||||
|
||||
all('input[data-required-tag="guardian"]').each do |field|
|
||||
expect(field['required']).to eq 'true'
|
||||
expect(field).to be_visible
|
||||
end
|
||||
end
|
||||
|
||||
scenario 'creating a release for a minor', js: true do
|
||||
allow(BrayniacAI::Validation).to receive(:create).and_return(double(:validation, valid: true))
|
||||
|
||||
@@ -50,6 +68,7 @@ feature 'User managing appearance releases' do
|
||||
fill_in guardian_first_name_field, with: 'Guardian'
|
||||
fill_in guardian_last_name_field, with: 'Name'
|
||||
fill_in guardian_phone_field, with: '001101'
|
||||
fill_in guardian_email_field, with: 'valid@email.com'
|
||||
fill_in person_first_name_field, with: 'Jane'
|
||||
fill_in person_last_name_field, with: 'Doe'
|
||||
fill_in_person_address_fields
|
||||
@@ -60,11 +79,6 @@ feature 'User managing appearance releases' do
|
||||
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
|
||||
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
|
||||
|
||||
fill_in guardian_email_field, with: 'invalid@email'
|
||||
click_button submit_release_button
|
||||
expect(page).to have_content('Guardian email is not an email')
|
||||
|
||||
fill_in guardian_email_field, with: 'valid@email.com'
|
||||
fill_in_guardian_address_fields
|
||||
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
|
||||
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
|
||||
@@ -99,6 +113,7 @@ feature 'User managing appearance releases' do
|
||||
fill_in guardian_first_name_field, with: 'Guardian'
|
||||
fill_in guardian_last_name_field, with: 'Name'
|
||||
fill_in guardian_phone_field, with: '001101'
|
||||
fill_in guardian_email_field, with: 'valid@email.com'
|
||||
fill_in person_first_name_field, with: 'Jane'
|
||||
fill_in person_last_name_field, with: 'Doe'
|
||||
fill_in_person_address_fields
|
||||
@@ -109,11 +124,6 @@ feature 'User managing appearance releases' do
|
||||
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
|
||||
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
|
||||
|
||||
fill_in guardian_email_field, with: 'invalid@email'
|
||||
click_button submit_release_button
|
||||
expect(page).to have_content('Guardian email is not an email')
|
||||
|
||||
fill_in guardian_email_field, with: 'valid@email.com'
|
||||
fill_in_guardian_address_fields
|
||||
attach_file guardian_photo_field, file_fixture('hemsworth.jpeg'), visible: :all
|
||||
draw_signature file_fixture('signature.png'), 'appearance_release_signature_base64'
|
||||
@@ -127,6 +137,13 @@ feature 'User managing appearance releases' do
|
||||
expect(page).to have_content(successful_submission_message)
|
||||
expect(AppearanceRelease.last.guardian_2_first_name).to eq 'Second'
|
||||
end
|
||||
|
||||
scenario "creating a release, if contract template contains signature legal language, it is shown" do
|
||||
contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
|
||||
visit new_account_project_contract_template_appearance_release_path(project.account, project, contract_template)
|
||||
|
||||
expect(page).to have_content dummy_signature_legal_text
|
||||
end
|
||||
end
|
||||
|
||||
context 'when signed in' do
|
||||
@@ -696,4 +713,8 @@ feature 'User managing appearance releases' do
|
||||
def guardian_2_photo_heading
|
||||
t 'appearance_releases.form.photos.guardian_2_photo.heading'
|
||||
end
|
||||
|
||||
def dummy_signature_legal_text
|
||||
'Some signature legal language'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -12,6 +12,13 @@ feature 'User managing broadcasts' do
|
||||
allow(MuxLiveStream).to receive(:new).and_return(double(id: 'id', key: 'key', playback_id: 'playback_id'))
|
||||
end
|
||||
|
||||
scenario "splash page is shown if there are no existing streams" do
|
||||
visit project_broadcasts_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).to have_content create_stream
|
||||
end
|
||||
|
||||
scenario 'creating and deleting a broadcast', js: true do
|
||||
visit new_project_broadcast_path(project)
|
||||
|
||||
@@ -56,6 +63,21 @@ feature 'User managing broadcasts' do
|
||||
expect(page).to have_content(recording.download_file_name)
|
||||
end
|
||||
|
||||
scenario 'Clicking Reset URL regenerates broadcast token' do
|
||||
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||
old_token = broadcast.token
|
||||
|
||||
visit project_broadcast_path(project, broadcast)
|
||||
|
||||
expect(page).to have_content reset_url
|
||||
expect(page).to have_xpath "//input[@readonly][@value='#{broadcast_url(old_token)}']"
|
||||
|
||||
click_link reset_url
|
||||
expect(Broadcast.last.token).not_to eq old_token
|
||||
expect(page).to have_xpath "//input[@readonly][@value='#{broadcast_url(Broadcast.last.token)}']"
|
||||
expect(page).to have_content token_reset_notice
|
||||
end
|
||||
|
||||
scenario 'user can go back and forth between live session and previous sessions', js: true do
|
||||
broadcast = create(:broadcast, :with_stream, :with_files, project: project)
|
||||
recording = create(:broadcast_recording, broadcast: broadcast)
|
||||
@@ -131,6 +153,29 @@ feature 'User managing broadcasts' do
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'When the user is associate' do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
it 'does not show button to create new live stream' do
|
||||
visit project_broadcasts_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).not_to have_content create_stream
|
||||
end
|
||||
end
|
||||
|
||||
context 'When the user is account manager' do
|
||||
let(:current_user) { create(:user, :account_manager) }
|
||||
|
||||
it 'does show button to create new live stream' do
|
||||
visit project_broadcasts_path(project)
|
||||
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).to have_content create_stream
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
private
|
||||
@@ -151,4 +196,20 @@ feature 'User managing broadcasts' do
|
||||
def switch_view_dropdown
|
||||
'Switch View'
|
||||
end
|
||||
|
||||
def schedule_demo
|
||||
t 'broadcasts.splash.actions.book_demo'
|
||||
end
|
||||
|
||||
def create_stream
|
||||
t 'broadcasts.splash.actions.create_stream'
|
||||
end
|
||||
|
||||
def reset_url
|
||||
t 'broadcasts.show.actions.reset_url'
|
||||
end
|
||||
|
||||
def token_reset_notice
|
||||
t 'broadcasts.update.reset_notice'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -71,6 +71,13 @@ feature "User managing location releases" do
|
||||
expect(page).to have_content("Your release was successfully submitted. Thank you.")
|
||||
expect(LocationRelease.last.photos.attached?).to eq true
|
||||
end
|
||||
|
||||
scenario "creating a release, if contract template contains signature legal language, it is shown" do
|
||||
contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
|
||||
visit new_account_project_contract_template_location_release_path(project.account, project, contract_template)
|
||||
|
||||
expect(page).to have_content dummy_signature_legal_text
|
||||
end
|
||||
end
|
||||
|
||||
context "when signed in" do
|
||||
@@ -375,4 +382,8 @@ feature "User managing location releases" do
|
||||
select "Other", from: "Restriction"
|
||||
fill_in "Describe other restrictions", with: "Test"
|
||||
end
|
||||
|
||||
def dummy_signature_legal_text
|
||||
'Some signature legal language'
|
||||
end
|
||||
end
|
||||
|
||||
@@ -84,6 +84,13 @@ feature "User managing material releases" do
|
||||
click_button submit_release_button
|
||||
expect(page).to have_content success_submit_message
|
||||
end
|
||||
|
||||
scenario "creating a release, if contract template contains signature legal language, it is shown" do
|
||||
contract_template = create(:contract_template, project: project, signature_legal_text: dummy_signature_legal_text)
|
||||
visit new_account_project_contract_template_material_release_path(project.account, project, contract_template)
|
||||
|
||||
expect(page).to have_content dummy_signature_legal_text
|
||||
end
|
||||
end
|
||||
|
||||
context "when signed in" do
|
||||
@@ -382,4 +389,8 @@ feature "User managing material releases" do
|
||||
click_button submit_release_button
|
||||
expect(page).not_to have_content success_submit_message
|
||||
end
|
||||
|
||||
def dummy_signature_legal_text
|
||||
'Some signature legal language'
|
||||
end
|
||||
end
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user