diff --git a/app/controllers/contract_templates/duplicates_controller.rb b/app/controllers/contract_templates/duplicates_controller.rb new file mode 100644 index 0000000..495bfdf --- /dev/null +++ b/app/controllers/contract_templates/duplicates_controller.rb @@ -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 diff --git a/app/controllers/contract_templates_controller.rb b/app/controllers/contract_templates_controller.rb index 8e70811..10ed045 100644 --- a/app/controllers/contract_templates_controller.rb +++ b/app/controllers/contract_templates_controller.rb @@ -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 diff --git a/app/models/contract_template.rb b/app/models/contract_template.rb index ba2ce3d..e05ed72 100644 --- a/app/models/contract_template.rb +++ b/app/models/contract_template.rb @@ -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 diff --git a/app/policies/contract_template_policy.rb b/app/policies/contract_template_policy.rb index ca439b8..626cf51 100644 --- a/app/policies/contract_template_policy.rb +++ b/app/policies/contract_template_policy.rb @@ -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 diff --git a/app/views/contract_templates/_contract_template.html.erb b/app/views/contract_templates/_contract_template.html.erb index e5d2e65..464c17d 100644 --- a/app/views/contract_templates/_contract_template.html.erb +++ b/app/views/contract_templates/_contract_template.html.erb @@ -19,6 +19,12 @@