Compare commits
8 Commits
add-guardi
...
implement-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
744480740e | ||
|
|
bc1ff4cf39 | ||
|
|
7d4ff7cdb8 | ||
|
|
e41d7603d0 | ||
|
|
0741f8a230 | ||
|
|
f44eca5328 | ||
|
|
cefa30b331 | ||
|
|
2b95849229 |
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
33
app/controllers/contract_templates/duplicates_controller.rb
Normal file
@@ -0,0 +1,33 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class ContractTemplates::DuplicatesController < ApplicationController
|
||||
before_action :set_contract_template
|
||||
|
||||
def create
|
||||
authorize(ContractTemplate)
|
||||
new_contract_template = @contract_template.dup
|
||||
new_contract_template.name = I18n.t('contract_templates.duplicate.name_prefix', template_name: @contract_template.name)
|
||||
|
||||
# Duplicate rich text fields
|
||||
|
||||
new_contract_template.body = @contract_template.body
|
||||
new_contract_template.guardian_clause = @contract_template.guardian_clause
|
||||
new_contract_template.signature_legal_text = @contract_template.signature_legal_text
|
||||
|
||||
if new_contract_template.save
|
||||
redirect_to [:edit, new_contract_template]
|
||||
else
|
||||
redirect_to [@contract_template.project, :contract_templates], alert: t('.error')
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def contract_templates
|
||||
policy_scope(ContractTemplate)
|
||||
end
|
||||
|
||||
def set_contract_template
|
||||
@contract_template = contract_templates.find(params[:contract_template_id])
|
||||
end
|
||||
end
|
||||
@@ -5,8 +5,9 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
layout 'project'
|
||||
|
||||
before_action :set_project, except: [:destroy]
|
||||
before_action :set_contract_template, only: [:destroy]
|
||||
before_action :set_project, except: [:destroy, :edit, :update]
|
||||
before_action :set_contract_template, only: [:destroy, :edit, :update]
|
||||
before_action :set_project_from_contract_template, only: [:edit, :update]
|
||||
before_action :show_splash_screen, only: :index
|
||||
|
||||
def index
|
||||
@@ -32,6 +33,20 @@ class ContractTemplatesController < ApplicationController
|
||||
end
|
||||
end
|
||||
|
||||
def edit
|
||||
@release_type = @contract_template.release_type
|
||||
end
|
||||
|
||||
def update
|
||||
@contract_template.attributes = contract_template_params
|
||||
|
||||
if @contract_template.save
|
||||
redirect_to [@project, :contract_templates], notice: t('.notice')
|
||||
else
|
||||
render :edit
|
||||
end
|
||||
end
|
||||
|
||||
def destroy
|
||||
@contract_template.archive
|
||||
redirect_to [@contract_template.project, :contract_templates], alert: t('.archived_notice')
|
||||
@@ -39,6 +54,10 @@ class ContractTemplatesController < ApplicationController
|
||||
|
||||
private
|
||||
|
||||
def set_project_from_contract_template
|
||||
@project = @contract_template.project
|
||||
end
|
||||
|
||||
def show_splash_screen
|
||||
render :splash if contract_templates.non_archived.count.zero?
|
||||
end
|
||||
|
||||
@@ -69,9 +69,13 @@ class ContractTemplate < ApplicationRecord
|
||||
(1..NUMBER_OF_CUSTOM_FIELDS).any? { |n| public_send("question_#{n}_text").presence }
|
||||
end
|
||||
|
||||
def editable?
|
||||
releases.size.zero?
|
||||
end
|
||||
|
||||
def attributes
|
||||
result = super()
|
||||
result[:signature_legal_text] = signature_legal_text.as_json
|
||||
result[:signature_legal_text] = signature_legal_text.as_json
|
||||
result
|
||||
end
|
||||
end
|
||||
|
||||
@@ -23,6 +23,18 @@ class ContractTemplatePolicy < ApplicationPolicy
|
||||
create?
|
||||
end
|
||||
|
||||
def edit?
|
||||
record.editable? && create?
|
||||
end
|
||||
|
||||
def update?
|
||||
edit?
|
||||
end
|
||||
|
||||
def duplicate?
|
||||
create?
|
||||
end
|
||||
|
||||
def import?
|
||||
if user.account_manager?
|
||||
record.project.account = user.account
|
||||
|
||||
@@ -19,6 +19,12 @@
|
||||
<div class="btn-group">
|
||||
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>
|
||||
<div class="dropdown-menu dropdown-menu-right">
|
||||
<% if policy(contract_template).edit? %>
|
||||
<%= link_to fa_icon("pencil fw", text: t(".actions.edit")), [:edit, contract_template], class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(ContractTemplate).duplicate? %>
|
||||
<%= link_to fa_icon("clone fw", text: t(".actions.duplicate")), contract_template_duplicates_path(contract_template), method: :post, class: "dropdown-item" %>
|
||||
<% end %>
|
||||
<% if policy(QrCode).show? %>
|
||||
<%= link_to fa_icon("qrcode", text: t(".actions.qr_code")), [contract_template, :qr_codes], class: "dropdown-item", target: :_blank %>
|
||||
<% end %>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<%= bootstrap_form_with model: [project, contract_template], local: true do |form| %>
|
||||
<%= bootstrap_form_with model: model, local: true do |form| %>
|
||||
<%= field_set_tag content_tag(:span, t(".release_info.heading"), class: "h6 text-muted text-uppercase") do %>
|
||||
<div class="form-row">
|
||||
<%= form.text_field :name, wrapper_class: "col-sm-6" %>
|
||||
|
||||
6
app/views/contract_templates/edit.html.erb
Normal file
6
app/views/contract_templates/edit.html.erb
Normal file
@@ -0,0 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", model: @contract_template, project: @project, contract_template: @contract_template %>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,6 +1,6 @@
|
||||
<div class="card shadow-sm">
|
||||
<%= card_header text: t(".heading"), close_action_path: [@project, :contract_templates] %>
|
||||
<div class="card-body">
|
||||
<%= render "form", project: @project, contract_template: @contract_template %>
|
||||
<%= render "form", model: [@project, @contract_template], project: @project, contract_template: @contract_template %>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -250,6 +250,8 @@ en:
|
||||
contract_template:
|
||||
actions:
|
||||
copy_url: Copy Release URL
|
||||
duplicate: Duplicate
|
||||
edit: Edit
|
||||
manage: Manage
|
||||
qr_code: QR Code
|
||||
sign: Sign
|
||||
@@ -259,6 +261,13 @@ en:
|
||||
destroy:
|
||||
archived_failure: Failed to archive the release template
|
||||
archived_notice: The release template has been archived
|
||||
duplicate:
|
||||
name_prefix: Copy of %{template_name}
|
||||
duplicates:
|
||||
create:
|
||||
error: Failed to duplicate release template
|
||||
edit:
|
||||
heading: Edit Contract Template
|
||||
form:
|
||||
custom_fields:
|
||||
heading: Questionnaire
|
||||
@@ -297,6 +306,8 @@ en:
|
||||
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
|
||||
update:
|
||||
notice: The release template has been updated
|
||||
contracts:
|
||||
for_office_use_only:
|
||||
description_labels:
|
||||
@@ -689,6 +700,7 @@ en:
|
||||
update: Save Changes
|
||||
contract_template:
|
||||
create: Create Release Template
|
||||
update: Save Changes
|
||||
directory:
|
||||
create: Create Folder
|
||||
new_file: Upload Files
|
||||
|
||||
@@ -103,6 +103,17 @@ es:
|
||||
blank_contracts:
|
||||
create:
|
||||
number_of_copies_invalid_notice: Please enter valid number greater than 0 (ES)
|
||||
contract_template:
|
||||
actions:
|
||||
duplicate: Duplicate (ES)
|
||||
edit: Edit (ES)
|
||||
duplicate:
|
||||
name_prefix: Copy of %{template_name} (ES)
|
||||
duplicates:
|
||||
create:
|
||||
error: Failed to duplicate release template (ES)
|
||||
edit:
|
||||
heading: Edit Contract Template (ES)
|
||||
form:
|
||||
custom_fields:
|
||||
heading: Medical Questionnaire (ES)
|
||||
@@ -129,6 +140,8 @@ 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)
|
||||
update:
|
||||
notice: The release template has been updated (ES)
|
||||
contracts:
|
||||
for_office_use_only:
|
||||
description_labels:
|
||||
@@ -304,6 +317,8 @@ es:
|
||||
broadcast:
|
||||
create: Create Live Stream (ES)
|
||||
update: Save Changes (ES)
|
||||
contract_template:
|
||||
update: Save changes (ES)
|
||||
create: 'Crear %{model}'
|
||||
medical_release:
|
||||
update: Approve (ES)
|
||||
|
||||
@@ -56,9 +56,10 @@ Rails.application.routes.draw do
|
||||
resources :talent_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
|
||||
resources :medical_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
|
||||
resources :misc_releases, except: [:show], concerns: [:contractable, :notable, :photoable]
|
||||
resources :contract_templates, only: [:index, :new, :create, :destroy] do
|
||||
resources :contract_templates, only: [:index, :new, :create, :edit, :update, :destroy] do
|
||||
resource :qr_codes, only: [:show], controller: "contract_templates/qr_codes"
|
||||
resource :blank_contracts, only: [:show, :new, :create], controller: "contract_templates/blank_contracts"
|
||||
resource :duplicates, only: [:create], controller: "contract_templates/duplicates"
|
||||
end
|
||||
resource :release_template_imports, only: [:new, :create]
|
||||
resources :project_memberships, only: [:index, :create, :destroy]
|
||||
|
||||
@@ -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: -
|
||||
--
|
||||
|
||||
30
spec/controllers/contract_templates/duplicates_controller.rb
Normal file
30
spec/controllers/contract_templates/duplicates_controller.rb
Normal file
@@ -0,0 +1,30 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe ContractTemplates::DuplicatesController do
|
||||
let(:account) { build(:account) }
|
||||
let(:current_user) { create(:user, :manager, primary_account: account) }
|
||||
let(:project) { create(:project, members: [current_user], account: account) }
|
||||
|
||||
before do
|
||||
sign_in(current_user)
|
||||
end
|
||||
|
||||
describe '#create' do
|
||||
it "responds with redirect to the edit page for newly created duplicate" do
|
||||
contract_template = create(:contract_template, project: project)
|
||||
|
||||
expect do
|
||||
post :create, params: { contract_template_id: contract_template }
|
||||
end.to change(ContractTemplate, :count).by(1)
|
||||
|
||||
new_ct = ContractTemplate.last
|
||||
|
||||
expect(new_ct.name).to eq t('contract_templates.duplicate.name_prefix', template_name: contract_template.name)
|
||||
expect(new_ct.release_type).to eq contract_template.release_type
|
||||
|
||||
expect(response).to redirect_to [:edit, new_ct]
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -118,6 +118,57 @@ describe ContractTemplatesController do
|
||||
end
|
||||
end
|
||||
|
||||
describe '#edit' do
|
||||
let(:contract_template) do
|
||||
create(:contract_template,
|
||||
name: 'My Contract Template', fee: 50, release_type: 'appearance',
|
||||
project: project)
|
||||
end
|
||||
|
||||
it 'responds ok' do
|
||||
get :edit, params: { project_id: project, id: contract_template }
|
||||
|
||||
expect(response).to be_successful
|
||||
end
|
||||
|
||||
context 'when current user is an associate' do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
it 'raises exception' do
|
||||
expect do
|
||||
get :edit, params: { project_id: project, id: contract_template }
|
||||
end.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
||||
describe '#update' do
|
||||
let(:contract_template) do
|
||||
create(:contract_template,
|
||||
name: 'My Contract Template', fee: 50, release_type: 'appearance',
|
||||
project: project)
|
||||
end
|
||||
|
||||
it 'redirects' do
|
||||
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
|
||||
|
||||
expect(response).to redirect_to(project_contract_templates_path(project))
|
||||
end
|
||||
|
||||
|
||||
context 'when current user is an associate' do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
it 'raises exception' do
|
||||
expect do
|
||||
patch :update, params: { project_id: project, id: contract_template, contract_template: contract_template_params }
|
||||
end.to raise_error(Pundit::NotAuthorizedError)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#destroy' do
|
||||
let!(:contract_template) { create(:contract_template, project: project) }
|
||||
|
||||
|
||||
@@ -262,6 +262,93 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
expect(page).to have_content('Active template')
|
||||
end
|
||||
|
||||
scenario 'edit button is visible for not-signed contract template' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(edit_button_label, exact: true, count: 1)
|
||||
end
|
||||
|
||||
scenario 'edit button is not visible for signed contract template' do
|
||||
ct = create(:contract_template, project: project)
|
||||
create(:appearance_release, contract_template: ct)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(edit_button_label, exact: true, count: 0)
|
||||
end
|
||||
|
||||
scenario 'duplicate button is visible for not signed contract template' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
|
||||
end
|
||||
|
||||
scenario 'duplicate button is visible for signed contract template' do
|
||||
ct = create(:contract_template, project: project)
|
||||
create(:appearance_release, contract_template: ct)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
|
||||
end
|
||||
|
||||
scenario 'clicking edit button opens edit page for contract template' do
|
||||
ct = create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_content ct.name
|
||||
|
||||
expect(page).not_to have_content 'Updated CT'
|
||||
expect(page).not_to have_content 'Medical'
|
||||
|
||||
click_link edit_button_label
|
||||
|
||||
expect(page).to have_content edit_page_heading
|
||||
|
||||
fill_in name_field, with: 'Updated CT'
|
||||
select 'Medical Release', from: 'Release type'
|
||||
fill_in_trix body_field, with: 'Updated legal text'
|
||||
click_on update_contract_template_button_label
|
||||
|
||||
expect(page).to have_content 'Updated CT'
|
||||
expect(page).to have_content 'Medical'
|
||||
end
|
||||
|
||||
scenario 'clicking duplicate button opens edit page for newly created contract template' do
|
||||
ct = create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_content ct.name
|
||||
|
||||
expect(page).not_to have_content 'Modified duplicate'
|
||||
expect(page).not_to have_content 'Misc'
|
||||
|
||||
expect do
|
||||
click_link duplicate_button_label
|
||||
end.to change(ContractTemplate, :count).by(1)
|
||||
|
||||
expect(page).to have_content edit_page_heading
|
||||
name_input = find("##{name_field}")
|
||||
expect(name_input.value).to eq duplicate_release_name(ct.name)
|
||||
|
||||
fill_in name_field, with: 'Modified duplicate'
|
||||
select 'Misc Release', from: 'Release type'
|
||||
fill_in_trix body_field, with: 'Legal text for duplicate'
|
||||
click_on update_contract_template_button_label
|
||||
|
||||
expect(page).to have_content 'Modified duplicate'
|
||||
expect(page).to have_content 'Misc'
|
||||
expect(ct.body.id).not_to eq ContractTemplate.last.body.id
|
||||
expect(ct.guardian_clause.id).not_to eq ContractTemplate.last.guardian_clause.id
|
||||
expect(ct.signature_legal_text.id).not_to eq ContractTemplate.last.signature_legal_text.id
|
||||
end
|
||||
|
||||
context 'When the user is associate' do
|
||||
let(:current_user) { create(:user, :associate) }
|
||||
|
||||
@@ -280,6 +367,22 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).not_to have_content create_release_template
|
||||
end
|
||||
|
||||
it 'does not show edit button' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(edit_button_label, exact: true, count: 0)
|
||||
end
|
||||
|
||||
it 'does not show duplicate button' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(duplicate_button_label, exact: true, count: 0)
|
||||
end
|
||||
end
|
||||
|
||||
context 'When the user is account manager' do
|
||||
@@ -300,6 +403,40 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
expect(page).to have_content schedule_demo
|
||||
expect(page).to have_content create_release_template
|
||||
end
|
||||
|
||||
it 'shows edit button when contract template is not signed' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(edit_button_label, exact: true, count: 1)
|
||||
end
|
||||
|
||||
it 'does not show edit button when contract template is signed' do
|
||||
ct = create(:contract_template, project: project)
|
||||
create(:appearance_release, contract_template: ct)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(edit_button_label, exact: true, count: 0)
|
||||
end
|
||||
|
||||
it 'shows duplicate button when contract template is not signed' do
|
||||
create(:contract_template, project: project)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
|
||||
end
|
||||
|
||||
it 'shows duplicate button when contract template is signed' do
|
||||
ct = create(:contract_template, project: project)
|
||||
create(:appearance_release, contract_template: ct)
|
||||
|
||||
visit project_contract_templates_path(project)
|
||||
|
||||
expect(page).to have_link(duplicate_button_label, exact: true, count: 1)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
@@ -355,4 +492,28 @@ RSpec.feature 'User manages contract templates', type: :feature do
|
||||
def signature_legal_text_trix_field
|
||||
'Signature legal text'
|
||||
end
|
||||
|
||||
def edit_button_label
|
||||
t 'contract_templates.contract_template.actions.edit'
|
||||
end
|
||||
|
||||
def duplicate_button_label
|
||||
t 'contract_templates.contract_template.actions.duplicate'
|
||||
end
|
||||
|
||||
def edit_page_heading
|
||||
t 'contract_templates.edit.heading'
|
||||
end
|
||||
|
||||
def name_field
|
||||
'contract_template_name'
|
||||
end
|
||||
|
||||
def update_contract_template_button_label
|
||||
t 'helpers.submit.contract_template.update'
|
||||
end
|
||||
|
||||
def duplicate_release_name(template_name = '')
|
||||
t 'contract_templates.duplicate.name_prefix', template_name: template_name
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user