mirror of https://github.com/docusealco/docuseal
				
				
				
			
							parent
							
								
									fefd138dfd
								
							
						
					
					
						commit
						1e57c1ace7
					
				| @ -0,0 +1,22 @@ | ||||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class TemplatesPreferencesController < ApplicationController | ||||
|   load_and_authorize_resource :template | ||||
| 
 | ||||
|   def show; end | ||||
| 
 | ||||
|   def create | ||||
|     authorize!(:update, @template) | ||||
| 
 | ||||
|     @template.preferences = @template.preferences.merge(template_params[:preferences]) | ||||
|     @template.save! | ||||
| 
 | ||||
|     head :ok | ||||
|   end | ||||
| 
 | ||||
|   private | ||||
| 
 | ||||
|   def template_params | ||||
|     params.require(:template).permit(preferences: %i[bcc_completed request_email_subject request_email_body]) | ||||
|   end | ||||
| end | ||||
| @ -0,0 +1,35 @@ | ||||
| export default class extends HTMLElement { | ||||
|   connectedCallback () { | ||||
|     document.addEventListener('turbo:submit-end', this.onSubmitEnd) | ||||
| 
 | ||||
|     this.form.addEventListener('submit', this.onSubmit) | ||||
|   } | ||||
| 
 | ||||
|   disconnectedCallback () { | ||||
|     document.removeEventListener('turbo:submit-end', this.onSubmitEnd) | ||||
| 
 | ||||
|     this.form.removeEventListener('submit', this.onSubmit) | ||||
|   } | ||||
| 
 | ||||
|   onSubmit = () => { | ||||
|     this.element.classList.add('invisible') | ||||
|   } | ||||
| 
 | ||||
|   onSubmitEnd = (event) => { | ||||
|     if (event.target === this.form) { | ||||
|       const resp = event.detail?.formSubmission?.result?.fetchResponse?.response | ||||
| 
 | ||||
|       if (resp?.status / 100 === 2) { | ||||
|         this.element.classList.remove('invisible') | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   get element () { | ||||
|     return document.getElementById(this.dataset.elementId) | ||||
|   } | ||||
| 
 | ||||
|   get form () { | ||||
|     return this.closest('form') | ||||
|   } | ||||
| } | ||||
| After Width: | Height: | Size: 602 B | 
| After Width: | Height: | Size: 872 B | 
| @ -0,0 +1,22 @@ | ||||
| <turbo-frame id="drawer"> | ||||
|   <turbo-modal class="modal modal-open items-start !animate-none justify-end overflow-y-auto !justify-normal md:!justify-end" data-close-after-submit="<%= local_assigns.key?(:close_after_submit) ? local_assigns[:close_after_submit] : true %>"> | ||||
|     <div class="absolute top-0 bottom-0 right-0 left-0" data-action="click:turbo-modal#close"></div> | ||||
|     <div class="bg-base-100 min-h-screen max-h-screen relative w-full relative overflow-y-auto"> | ||||
|       <% if local_assigns[:title] %> | ||||
|         <div class="flex justify-between bg-base-100 py-2 px-4 items-center border-b pb-2 font-medium"> | ||||
|           <span> | ||||
|             <%= local_assigns[:title] %> | ||||
|           </span> | ||||
|           <a href="#" class="text-xl" data-action="click:turbo-modal#close">×</a> | ||||
|         </div> | ||||
|       <% else %> | ||||
|         <span data-action="click:turbo-modal#close" class="absolute btn border border-base-100 bg-base-100 hover:bg-base-300 hover:border-base-300 btn-primary !text-base btn-sm btn-circle" style="left: -40px; top: 6px"> | ||||
|           × | ||||
|         </span> | ||||
|       <% end %> | ||||
|       <div class="w-full md:w-[620px] overflow-y-auto" style="max-height: calc(100vh - <%= local_assigns[:title] ? '45px' : '0px' %>)"> | ||||
|         <%= yield %> | ||||
|       </div> | ||||
|     </div> | ||||
|   </turbo-modal> | ||||
| </turbo-frame> | ||||
| @ -0,0 +1,100 @@ | ||||
| <%= render 'shared/turbo_drawer', title: 'Preferences', close_after_submit: false do %> | ||||
|   <% options = [['General', 'general'], ['API and Embedding', 'api']] %> | ||||
|   <toggle-visible data-element-ids="<%= options.map(&:last).to_json %>" class="relative text-center mt-3 block"> | ||||
|     <div class="join"> | ||||
|       <% options.each_with_index do |(label, value), index| %> | ||||
|         <span> | ||||
|           <%= radio_button_tag 'option', value, value == 'general', class: 'peer hidden', data: { action: 'change:toggle-visible#trigger' } %> | ||||
|           <label for="option_<%= value %>" class="<%= '!rounded-s-full' if index.zero? %> btn btn-focus btn-sm join-item md:w-48 peer-checked:btn-active normal-case <%= 'px-8 md:px-0' if value == 'general' %>"> | ||||
|             <%= label %> | ||||
|           </label> | ||||
|         </span> | ||||
|       <% end %> | ||||
|     </div> | ||||
|   </toggle-visible> | ||||
|   <div id="general" class="px-4 mb-4"> | ||||
|     <%= form_for @template, url: template_preferences_path(@template), method: :post, html: { autocomplete: 'off', class: 'mt-1' } do |f| %> | ||||
|       <toggle-on-submit data-element-id="email_saved_alert"></toggle-on-submit> | ||||
|       <%= f.fields_for :preferences, Struct.new(:request_email_subject, :request_email_body).new(*(@template.preferences.values_at('request_email_subject', 'request_email_body').compact_blank.presence || AccountConfigs.find_or_initialize_for_key(current_account, AccountConfig::SUBMITTER_INVITATION_EMAIL_KEY).value.values_at('subject', 'body'))) do |ff| %> | ||||
|         <div class="form-control"> | ||||
|           <%= ff.label :request_email_subject, 'Email subject', class: 'label' %> | ||||
|           <%= ff.text_field :request_email_subject, required: true, class: 'base-input', dir: 'auto' %> | ||||
|         </div> | ||||
|         <div class="form-control"> | ||||
|           <div class="flex items-center"> | ||||
|             <%= ff.label :request_email_body, 'Email body', class: 'label' %> | ||||
|             <span class="tooltip tooltip-right" data-tip="Use following placeholders text: <%= AccountConfig::DEFAULT_VALUES.dig(AccountConfig::SUBMITTER_INVITATION_EMAIL_KEY, 'body').scan(/{{.*?}}/).join(', ') %>"> | ||||
|               <%= svg_icon('info_circle', class: 'w-4 h-4') %> | ||||
|             </span> | ||||
|           </div> | ||||
|           <autoresize-textarea> | ||||
|             <%= ff.text_area :request_email_body, required: true, class: 'base-input w-full py-2', dir: 'auto' %> | ||||
|           </autoresize-textarea> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div class="form-control pt-2"> | ||||
|         <%= f.button button_title(title: 'Save', disabled_with: 'Saving'), class: 'base-button' %> | ||||
|         <div class="flex justify-center"> | ||||
|           <span id="email_saved_alert" class="text-sm invisible font-normal mt-0.5">Changes have been saved</span> | ||||
|         </div> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <%= form_for @template, url: template_preferences_path(@template), method: :post, html: { autocomplete: 'off', class: 'mt-2' } do |f| %> | ||||
|       <toggle-on-submit data-element-id="bcc_saved_alert"></toggle-on-submit> | ||||
|       <%= f.fields_for :preferences, Struct.new(:bcc_completed).new(@template.preferences['bcc_completed']) do |ff| %> | ||||
|         <div class="form-control"> | ||||
|           <%= ff.label :bcc_completed, class: 'label' do %> | ||||
|             <span class="flex items-center space-x-1 justify-between w-full"> | ||||
|               <span> | ||||
|                 Completed documents BCC address | ||||
|               </span> | ||||
|             </span> | ||||
|           <% end %> | ||||
|           <%= ff.email_field :bcc_completed, autocomplete: 'off', class: 'base-input' %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div class="form-control pt-3"> | ||||
|         <%= f.button button_title(title: 'Save', disabled_with: 'Updating'), class: 'base-button' %> | ||||
|         <div class="flex justify-center"> | ||||
|           <span id="bcc_saved_alert" class="text-sm invisible font-normal mt-0.5">Changes have been saved</span> | ||||
|         </div> | ||||
|       </div> | ||||
|     <% end %> | ||||
|     <%= render 'templates_code_modal/preferences' %> | ||||
|   </div> | ||||
|   <div id="api" class="hidden mt-2 mb-4 px-4"> | ||||
|     <div> | ||||
|       <label class="text-sm font-semibold" for="template_id"> | ||||
|         Template ID | ||||
|       </label> | ||||
|       <div class="flex gap-2 mb-4 mt-2"> | ||||
|         <input id="template_id" type="text" value="<%= @template.id %>" class="base-input w-full" autocomplete="off" readonly> | ||||
|         <%= render 'shared/clipboard_copy', icon: 'copy', text: @template.id, class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy', copied_title: 'Copied' %> | ||||
|       </div> | ||||
|     </div> | ||||
|     <div> | ||||
|       <label class="text-sm font-semibold" for="embedding_url"> | ||||
|         Embedding URL | ||||
|       </label> | ||||
|       <div class="flex gap-2 mb-4 mt-2"> | ||||
|         <input id="embedding_url" type="text" value="<%= start_form_url(slug: @template.slug) %>" class="base-input w-full" autocomplete="off" readonly> | ||||
|         <%= render 'shared/clipboard_copy', icon: 'copy', text: start_form_url(slug: @template.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy', copied_title: 'Copied' %> | ||||
|       </div> | ||||
|     </div> | ||||
|     <%= render 'templates_code_modal/placeholder' %> | ||||
|     <%= render 'templates/embedding', template: @template %> | ||||
|     <% if can?(:manage, TemplateSharing.new(template: @template)) %> | ||||
|       <%= form_for '', url: template_sharings_testing_index_path, method: :post, html: { class: 'mt-1' } do |f| %> | ||||
|         <%= f.hidden_field :template_id, value: @template.id %> | ||||
|         <div class="flex items-center justify-between"> | ||||
|           <span> | ||||
|             Share template with Test Environment | ||||
|           </span> | ||||
|           <%= f.check_box :value, class: 'toggle', checked: @template.template_sharings.exists?(account_id: current_account.testing_accounts), onchange: 'this.form.requestSubmit()' %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|       <div class="mb-4"> | ||||
|       </div> | ||||
|     <% end %> | ||||
|   </div> | ||||
| <% end %> | ||||
| @ -0,0 +1,15 @@ | ||||
| # frozen_string_literal: true | ||||
| 
 | ||||
| class AddPreferencesToTemplates < ActiveRecord::Migration[7.1] | ||||
|   class MigrationTemplate < ApplicationRecord | ||||
|     self.table_name = 'templates' | ||||
|   end | ||||
| 
 | ||||
|   def change | ||||
|     add_column :templates, :preferences, :text | ||||
| 
 | ||||
|     MigrationTemplate.where(preferences: nil).update_all(preferences: '{}') | ||||
| 
 | ||||
|     change_column_null :templates, :preferences, false | ||||
|   end | ||||
| end | ||||
					Loading…
					
					
				
		Reference in new issue