mirror of
https://github.com/docusealco/docuseal
synced 2026-11-04 06:42:32 -05:00
adjust nav
This commit is contained in:
1 parent
44972fcc39
commit
073859a4b7
17 files changed
+287
-72
No files matched your search
@@ -4,9 +4,12 @@ class TemplatesVersionsController < ApplicationController
|
||||
load_and_authorize_resource :template
|
||||
|
||||
def index
|
||||
versions = @template.template_versions.order(id: :desc).preload(:author)
|
||||
@versions = @template.template_versions.order(id: :desc).preload(:author)
|
||||
|
||||
render json: versions.as_json(TemplateVersions::SERIALIZE_PARAMS)
|
||||
respond_to do |format|
|
||||
format.json { render json: @versions.as_json(TemplateVersions::SERIALIZE_PARAMS) }
|
||||
format.html
|
||||
end
|
||||
end
|
||||
|
||||
def show
|
||||
|
||||
@@ -10,12 +10,22 @@ class TestingAccountsController < ApplicationController
|
||||
|
||||
impersonate_user(Accounts.find_or_create_testing_user(true_user.account))
|
||||
|
||||
redirect_back(fallback_location: root_path)
|
||||
redirect_after_toggle
|
||||
end
|
||||
|
||||
def destroy
|
||||
stop_impersonating_user
|
||||
|
||||
redirect_back(fallback_location: root_path)
|
||||
redirect_after_toggle
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def redirect_after_toggle
|
||||
if turbo_native_app?
|
||||
redirect_to root_path
|
||||
else
|
||||
redirect_back(fallback_location: root_path)
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -12,6 +12,8 @@ import TurboModal from './elements/turbo_modal'
|
||||
import NativeAction from './elements/native_action'
|
||||
import NativeSearch from './elements/native_search'
|
||||
import NativeModal from './elements/native_modal'
|
||||
import NativeEvent from './elements/native_event'
|
||||
import ModalButton from './elements/modal_button'
|
||||
import FileDropzone from './elements/file_dropzone'
|
||||
import MenuActive from './elements/menu_active'
|
||||
import ClipboardCopy from './elements/clipboard_copy'
|
||||
@@ -89,11 +91,23 @@ document.addEventListener('turbo:submit-end', async (event) => {
|
||||
return
|
||||
}
|
||||
|
||||
const filename = decodeURIComponent(resp.headers.get('content-disposition').split('"')[1])
|
||||
const download = window.webkit?.messageHandlers?.download
|
||||
|
||||
if (download) {
|
||||
const reader = new FileReader()
|
||||
|
||||
reader.onload = () => download.postMessage({ name: filename, data: reader.result.split(',')[1] })
|
||||
reader.readAsDataURL(await resp.blob())
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const url = URL.createObjectURL(await resp.blob())
|
||||
const link = document.createElement('a')
|
||||
|
||||
link.href = url
|
||||
link.setAttribute('download', decodeURIComponent(resp.headers.get('content-disposition').split('"')[1]))
|
||||
link.setAttribute('download', filename)
|
||||
|
||||
document.body.appendChild(link)
|
||||
|
||||
@@ -112,6 +126,8 @@ safeRegisterElement('turbo-modal', TurboModal)
|
||||
safeRegisterElement('native-action', NativeAction)
|
||||
safeRegisterElement('native-search', NativeSearch)
|
||||
safeRegisterElement('native-modal', NativeModal)
|
||||
safeRegisterElement('native-event', NativeEvent)
|
||||
safeRegisterElement('modal-button', ModalButton)
|
||||
safeRegisterElement('file-dropzone', FileDropzone)
|
||||
safeRegisterElement('menu-active', MenuActive)
|
||||
safeRegisterElement('clipboard-copy', ClipboardCopy)
|
||||
|
||||
@@ -21,6 +21,7 @@ export default class extends HTMLElement {
|
||||
title: this.dataset.label || target?.textContent.trim(),
|
||||
icon: this.dataset.icon,
|
||||
placement: this.dataset.placement || 'menu',
|
||||
section: this.dataset.section,
|
||||
native: this.dataset.native,
|
||||
url: this.dataset.url,
|
||||
accept: this.dataset.accept,
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
export default class extends HTMLElement {
|
||||
connectedCallback () {
|
||||
this.addEventListener('click', this.dispatch)
|
||||
}
|
||||
|
||||
disconnectedCallback () {
|
||||
this.removeEventListener('click', this.dispatch)
|
||||
}
|
||||
|
||||
dispatch = async () => {
|
||||
const bridge = window.webkit?.messageHandlers?.modal
|
||||
|
||||
if (!bridge || this.dataset.loading) return
|
||||
|
||||
let detail = this.dataset.detail || 'null'
|
||||
|
||||
if (this.dataset.src) {
|
||||
this.dataset.loading = 'true'
|
||||
|
||||
try {
|
||||
const response = await fetch(this.dataset.src, { headers: { Accept: 'application/json' } })
|
||||
|
||||
if (!response.ok) return
|
||||
|
||||
detail = await response.text()
|
||||
} catch {
|
||||
return
|
||||
} finally {
|
||||
delete this.dataset.loading
|
||||
}
|
||||
}
|
||||
|
||||
bridge.postMessage({ action: 'dispatch', name: this.dataset.name, detail })
|
||||
}
|
||||
}
|
||||
@@ -55,10 +55,10 @@
|
||||
v-if="beforeRevisionSnapshot"
|
||||
class="top-1.5 sticky h-0 z-20 max-w-2xl mx-auto"
|
||||
>
|
||||
<div class="alert border-base-content/30 py-2 px-2.5">
|
||||
<div class="alert border-base-content/30 py-2 px-2.5 max-sm:flex max-sm:items-center max-sm:justify-between max-sm:gap-2 max-sm:text-left max-sm:text-sm">
|
||||
<IconInfoCircle class="stroke-info shrink-0 w-6 h-6" />
|
||||
<span>{{ t('viewing_revision_from').replace('{date}', formatRevisionTime(beforeRevisionSnapshot.revision.created_at)) }}</span>
|
||||
<div>
|
||||
<div class="max-sm:flex max-sm:gap-1 max-sm:shrink-0">
|
||||
<button
|
||||
class="btn btn-sm"
|
||||
@click.prevent="cancelRevision"
|
||||
@@ -104,6 +104,17 @@
|
||||
name="buttons"
|
||||
/>
|
||||
<template v-else>
|
||||
<native-action
|
||||
v-if="withSendButton && nativeApp"
|
||||
:data-label="t('send')"
|
||||
data-icon="send"
|
||||
>
|
||||
<a
|
||||
:href="`/templates/${template.id}/submissions/new?with_link=true`"
|
||||
data-turbo-frame="modal"
|
||||
@click="maybeShowErrorTemplateAlert"
|
||||
/>
|
||||
</native-action>
|
||||
<native-action
|
||||
v-if="withSignYourselfButton && undefinedSubmitters.length < 2 && (!template.variables_schema || Object.keys(template.variables_schema).length === 0)"
|
||||
:data-label="t('sign_yourself')"
|
||||
@@ -165,7 +176,7 @@
|
||||
</a>
|
||||
</native-action>
|
||||
<native-action
|
||||
v-if="withSendButton"
|
||||
v-if="withSendButton && !nativeApp"
|
||||
:data-label="t('send')"
|
||||
data-icon="users_plus"
|
||||
data-placement="bar"
|
||||
@@ -193,7 +204,7 @@
|
||||
>
|
||||
<native-action
|
||||
:data-label="t('save')"
|
||||
data-icon="device_floppy"
|
||||
data-icon="check"
|
||||
data-placement="bar"
|
||||
>
|
||||
<button
|
||||
@@ -276,7 +287,13 @@
|
||||
:data-label="t('revisions')"
|
||||
data-icon="history"
|
||||
>
|
||||
<a
|
||||
v-if="nativeApp"
|
||||
:href="`/templates/${template.id}/versions`"
|
||||
data-turbo-frame="modal"
|
||||
/>
|
||||
<button
|
||||
v-else
|
||||
class="flex space-x-2"
|
||||
@click.prevent="openRevisionsModal"
|
||||
@mouseenter="preloadRevisions"
|
||||
@@ -1426,6 +1443,7 @@ export default {
|
||||
})
|
||||
|
||||
document.addEventListener('keyup', this.onKeyUp)
|
||||
document.addEventListener('template-builder:apply-revision', this.onApplyRevisionEvent)
|
||||
window.addEventListener('keydown', this.onKeyDown)
|
||||
|
||||
window.addEventListener('resize', this.onWindowResize)
|
||||
@@ -1449,6 +1467,7 @@ export default {
|
||||
},
|
||||
unmounted () {
|
||||
document.removeEventListener('keyup', this.onKeyUp)
|
||||
document.removeEventListener('template-builder:apply-revision', this.onApplyRevisionEvent)
|
||||
window.removeEventListener('keydown', this.onKeyDown)
|
||||
|
||||
window.removeEventListener('resize', this.onWindowResize)
|
||||
@@ -2000,6 +2019,9 @@ export default {
|
||||
this.loadRevisionsPromise = null
|
||||
})
|
||||
},
|
||||
onApplyRevisionEvent (e) {
|
||||
this.onRevisionApply(e.detail)
|
||||
},
|
||||
onRevisionApply (revision) {
|
||||
this.beforeRevisionSnapshot = {
|
||||
template: JSON.parse(JSON.stringify(this.template)),
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<% uuid = local_assigns[:uuid] || SecureRandom.uuid %>
|
||||
<% title_id = "#{uuid}-title" %>
|
||||
<%= tag.dialog id: uuid, class: 'modal items-start overflow-y-auto', inert: true, 'aria-labelledby': (title_id if local_assigns[:title]) do %>
|
||||
<div class="modal-box pt-4 pb-6 px-6 mt-20 max-h-none">
|
||||
<div class="modal-box pt-4 pb-6 px-6 <%= turbo_native_app? ? 'mt-32' : 'mt-20' %> max-h-none">
|
||||
<% if local_assigns[:title] %>
|
||||
<div class="flex justify-between items-center border-b pb-2 mb-2 font-medium">
|
||||
<span id="<%= title_id %>">
|
||||
|
||||
@@ -5,6 +5,11 @@
|
||||
<native-action data-placement="profile" data-icon="settings">
|
||||
<%= link_to t('settings'), settings_path %>
|
||||
</native-action>
|
||||
<% if current_account.testing? && (can?(:manage, EncryptedConfig) || current_user != true_user) %>
|
||||
<native-action data-placement="test_mode" data-icon="code" data-label="<%= t('exit_test_mode') %>">
|
||||
<%= button_to '', testing_account_path, method: :delete, form: { data: { turbo_action: 'replace' } } %>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<native-action data-placement="profile" data-icon="logout" data-native="sign_out" data-label="<%= t('sign_out') %>" data-destructive="true"></native-action>
|
||||
<% if can?(:create, ::Template) && controller_name.in?(%w[templates_dashboard submissions_dashboard template_folders]) %>
|
||||
<% folder_name = @template_folder&.full_name %>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<% if turbo_native_app? && !turbo_frame_request? %>
|
||||
<% content_for(:html_title, local_assigns[:title]) if local_assigns[:title] %>
|
||||
<turbo-frame id="modal">
|
||||
<native-modal class="block max-w-lg mx-auto px-4 pb-6" data-close-after-submit="<%= local_assigns.key?(:close_after_submit) ? local_assigns[:close_after_submit] : true %>">
|
||||
<native-modal class="block max-w-lg mx-auto pb-6" data-close-after-submit="<%= local_assigns.key?(:close_after_submit) ? local_assigns[:close_after_submit] : true %>">
|
||||
<%= yield %>
|
||||
</native-modal>
|
||||
</turbo-frame>
|
||||
|
||||
@@ -11,8 +11,10 @@
|
||||
<% with_signature_id_reason = configs.find { |e| e.key == AccountConfig::WITH_SIGNATURE_ID_REASON_KEY }&.value != false %>
|
||||
<% with_signature_id_completed_at = configs.find { |e| e.key == AccountConfig::WITH_SIGNATURE_ID_COMPLETED_AT_KEY }&.value == true %>
|
||||
<main style="max-width: 1600px" class="mx-auto pl-4">
|
||||
<div class="flex justify-between items-center pr-4 sticky top-0 md:relative z-10 bg-base-100 <%= 'py-1.5' unless turbo_native_app? %>">
|
||||
<% unless turbo_native_app? %>
|
||||
<div class="flex justify-between items-center pr-4 <%= turbo_native_app? ? 'pb-3' : 'sticky top-0 md:relative z-10 bg-base-100 py-1.5' %>">
|
||||
<% if turbo_native_app? %>
|
||||
<h1 class="text-3xl font-semibold py-1" style="overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;"><% (@submission.name || @submission.template&.name).to_s.split(/(_)/).each do |item| %><%= item %><wbr><% end %></h1>
|
||||
<% else %>
|
||||
<a href="<%= signed_in? && @submission.account_id == current_account&.id && @submission.template ? template_path(@submission.template) : '/' %>" class="flex items-center space-x-3 py-1">
|
||||
<span><%= render 'submissions/logo' %></span>
|
||||
<h1 class="text-xl md:text-3xl font-semibold focus:text-clip" style="overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;"><% (@submission.name || @submission.template&.name).to_s.split(/(_)/).each do |item| %><%= item %><wbr><% end %></h1>
|
||||
|
||||
@@ -8,6 +8,6 @@
|
||||
<% if is_long %>
|
||||
<%= svg_icon(icon, class: 'w-6 h-6 inline') %>
|
||||
<% end %>
|
||||
<native-title><%= folder.name %></native-title>
|
||||
<%= folder.name %>
|
||||
</div>
|
||||
</a>
|
||||
@@ -5,11 +5,16 @@
|
||||
<h1 class="text-3xl md:text-[2em] font-semibold" style="overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;">
|
||||
<% template.name.split(/(_)/).each do |item| %><%= item %><wbr><% end %>
|
||||
<% if template.archived_at? %>
|
||||
<span class="ml-1 badge badge-outline badge-lg align-middle"><%= t('archived') %></span>
|
||||
<span class="ml-1 badge badge-outline badge-lg align-middle hidden md:inline-flex"><%= t('archived') %></span>
|
||||
<% end %>
|
||||
</h1>
|
||||
<%= render 'templates/access_icon', template: @template %>
|
||||
</div>
|
||||
<% if template.archived_at? %>
|
||||
<div class="absolute -bottom-1 right-0 md:hidden">
|
||||
<span class="badge badge-outline badge-lg"><%= t('archived') %></span>
|
||||
</div>
|
||||
<% end %>
|
||||
<% if @template.account_id == current_account.id %>
|
||||
<div class="flex items-center justify-between">
|
||||
<div class="flex items-center">
|
||||
@@ -44,17 +49,15 @@
|
||||
<% if !template.archived_at? %>
|
||||
<div class="flex items-center space-x-2">
|
||||
<% if can?(:update, template) %>
|
||||
<native-action data-label="<%= t('preferences') %>" data-icon="adjustments_horizontal" data-placement="bar">
|
||||
<div class="tooltip tooltip-no-touch hidden md:block" data-tip="<%= t('preferences') %>">
|
||||
<%= link_to template_preferences_path(template), class: 'btn border border-base-200 bg-base-200 hover:bg-base-300 hover:border-base-300 btn-sm flex-1 hidden md:flex', data: { turbo_frame: :modal } do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('adjustments_horizontal', class: 'w-6 h-6') %>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
</native-action>
|
||||
<div class="tooltip tooltip-no-touch hidden md:block" data-tip="<%= t('preferences') %>">
|
||||
<%= link_to template_preferences_path(template), class: 'btn border border-base-200 bg-base-200 hover:bg-base-300 hover:border-base-300 btn-sm flex-1 hidden md:flex', data: { turbo_frame: :modal } do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('adjustments_horizontal', class: 'w-6 h-6') %>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<open-modal-mobile class="absolute md:relative bottom-0 right-0 mt-1">
|
||||
<open-modal-mobile class="absolute md:relative -bottom-1 md:bottom-0 right-0 mt-1">
|
||||
<%= link_to template_share_link_path(template), class: 'btn btn-xs md:btn-sm whitespace-nowrap btn-neutral text-white px-2', data: { turbo_frame: :modal } do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('link', class: 'w-4 h-4 md:w-6 md:h-6') %>
|
||||
@@ -65,35 +68,92 @@
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-2 w-full md:w-fit md:justify-between md:flex-none md:pt-1">
|
||||
<% if can?(:destroy, template) %>
|
||||
<% if template.archived_at? %>
|
||||
<%= button_to button_title(title: t('restore'), disabled_with: t('restoring')[..-4], icon: svg_icon('rotate', class: 'w-6 h-6')), template_restore_index_path(template), class: 'btn btn-outline btn-sm w-full', form_class: 'flex-1' %>
|
||||
<% else %>
|
||||
<%= button_to button_title(title: t('archive'), disabled_with: t('archiving')[..-4], title_class: 'inline', icon: svg_icon('archive', class: 'w-6 h-6')), template_path(template), class: 'btn btn-outline btn-sm w-full', form_class: 'flex-1', method: :delete %>
|
||||
<% if turbo_native_app? %>
|
||||
<% unless template.archived_at? %>
|
||||
<% if can?(:create, Submission) %>
|
||||
<native-action data-section="send" data-icon="send" data-label="<%= t('send') %>">
|
||||
<a href="<%= new_template_submission_path(template) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<native-action data-section="send" data-icon="writing" data-label="<%= t('sign_yourself') %>">
|
||||
<a href="<%= new_template_submission_path(template, selfsign: true) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% if !template.archived_at? && can?(:update, template) %>
|
||||
<native-action data-placement="bar" data-icon="pencil" data-label="<%= t('edit') %>">
|
||||
<a href="<%= edit_template_path(template) %>"></a>
|
||||
</native-action>
|
||||
<native-action data-section="edit" data-icon="adjustments_horizontal" data-label="<%= t('preferences') %>">
|
||||
<a href="<%= template_preferences_path(template) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% if can?(:create, current_account.templates.new(author: current_user)) %>
|
||||
<div class="flex-1">
|
||||
<%= link_to new_template_clone_path(template), class: 'btn btn-outline btn-sm w-full', data: { turbo_frame: :modal } do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('copy', class: 'w-6 h-6') %>
|
||||
<span class="inline"><%= t('clone') %></span>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<native-action data-section="edit" data-icon="copy" data-label="<%= t('clone') %>">
|
||||
<a href="<%= new_template_clone_path(template) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% if !template.archived_at? %>
|
||||
<% if can?(:update, template) %>
|
||||
<% if template.archived_at? || (!can?(:update, template) && can?(:read, template)) %>
|
||||
<native-action data-section="edit" data-icon="file_text" data-label="<%= t('preview') %>">
|
||||
<a href="<%= template_preview_path(template) %>"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% if local_assigns[:with_export] %>
|
||||
<native-action data-section="edit" data-icon="download" data-label="<%= t('export') %>">
|
||||
<a href="<%= new_template_submissions_export_path(template, params.permit(:q, *Submissions::Filter::ALLOWED_PARAMS)) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% if can?(:destroy, template) %>
|
||||
<% if template.archived_at? %>
|
||||
<native-action data-section="archive" data-icon="rotate" data-label="<%= t('restore') %>">
|
||||
<%= button_to '', template_restore_index_path(template) %>
|
||||
</native-action>
|
||||
<% else %>
|
||||
<native-action data-section="archive" data-icon="archive" data-label="<%= t('archive') %>">
|
||||
<%= button_to '', template_path(template), method: :delete %>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<div class="flex flex-wrap gap-2 w-full md:w-fit md:justify-between md:flex-none md:pt-1">
|
||||
<% if can?(:destroy, template) %>
|
||||
<% if template.archived_at? %>
|
||||
<%= button_to button_title(title: t('restore'), disabled_with: t('restoring')[..-4], icon: svg_icon('rotate', class: 'w-6 h-6')), template_restore_index_path(template), class: 'btn btn-outline btn-sm w-full', form_class: 'flex-1' %>
|
||||
<% else %>
|
||||
<%= button_to button_title(title: t('archive'), disabled_with: t('archiving')[..-4], title_class: 'inline', icon: svg_icon('archive', class: 'w-6 h-6')), template_path(template), class: 'btn btn-outline btn-sm w-full', form_class: 'flex-1', method: :delete %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if can?(:create, current_account.templates.new(author: current_user)) %>
|
||||
<div class="flex-1">
|
||||
<%= link_to edit_template_path(template), class: 'btn btn-outline btn-sm w-full' do %>
|
||||
<%= link_to new_template_clone_path(template), class: 'btn btn-outline btn-sm w-full', data: { turbo_frame: :modal } do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('pencil', class: 'w-6 h-6') %>
|
||||
<span><%= t('edit') %></span>
|
||||
<%= svg_icon('copy', class: 'w-6 h-6') %>
|
||||
<span class="inline"><%= t('clone') %></span>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% elsif can?(:read, template) && !template.archived_at? %>
|
||||
<% end %>
|
||||
<% if !template.archived_at? %>
|
||||
<% if can?(:update, template) %>
|
||||
<div class="flex-1">
|
||||
<%= link_to edit_template_path(template), class: 'btn btn-outline btn-sm w-full' do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('pencil', class: 'w-6 h-6') %>
|
||||
<span><%= t('edit') %></span>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% elsif can?(:read, template) && !template.archived_at? %>
|
||||
<div class="flex-1">
|
||||
<%= link_to template_preview_path(template), class: 'btn btn-outline btn-sm w-full' do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('file_text', class: 'w-6 h-6') %>
|
||||
<span><%= t('preview') %></span>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if template.archived_at? %>
|
||||
<div class="flex-1">
|
||||
<%= link_to template_preview_path(template), class: 'btn btn-outline btn-sm w-full' do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
@@ -103,16 +163,6 @@
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if template.archived_at? %>
|
||||
<div class="flex-1">
|
||||
<%= link_to template_preview_path(template), class: 'btn btn-outline btn-sm w-full' do %>
|
||||
<span class="flex items-center justify-center space-x-2">
|
||||
<%= svg_icon('file_text', class: 'w-6 h-6') %>
|
||||
<span><%= t('preview') %></span>
|
||||
</span>
|
||||
<% end %>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
<% end %>
|
||||
</div>
|
||||
@@ -1,17 +1,27 @@
|
||||
<% content_for(:native_title, @template.name) if turbo_native_app? %>
|
||||
<%= render 'title', template: @template %>
|
||||
<% filter_params = params.permit(Submissions::Filter::ALLOWED_PARAMS).compact_blank %>
|
||||
<% is_show_tabs = @pagy.pages > 1 || params[:q].present? || params[:status].present? || filter_params.present? %>
|
||||
<% if @pagy.count.nil? || !@pagy.count.zero? || params[:q].present? || params[:status].present? || filter_params.present? %>
|
||||
<div class="<%= is_show_tabs ? 'mb-4' : 'mb-6' %>">
|
||||
<div class="group/header flex justify-between items-center md:items-end">
|
||||
<% submissions_count = @pagy.count %>
|
||||
<% is_show_header = submissions_count != 0 || params[:q].present? || params[:status].present? || filter_params.present? %>
|
||||
<%= render 'title', template: @template, with_export: is_show_header %>
|
||||
<% if turbo_native_app? %>
|
||||
<%= render 'shared/search_input' %>
|
||||
<% if !@template.archived_at? && can?(:create, Submission) %>
|
||||
<native-action data-placement="footer" data-icon="send" data-label="<%= t('send_to_recipients') %>">
|
||||
<a href="<%= new_template_submission_path(@template) %>" data-turbo-frame="modal"></a>
|
||||
</native-action>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<% if is_show_header %>
|
||||
<div class="<%= is_show_tabs ? 'mb-2 md:mb-4' : 'mb-4 md:mb-6' %>">
|
||||
<div class="group/header flex justify-between items-end">
|
||||
<div class="max-md:group-has-[search-input:focus-within]/header:hidden">
|
||||
<h2 class="text-3xl font-bold md:block <%= 'hidden' if params[:q].present? %>">
|
||||
<%= t('submissions') %>
|
||||
</h2>
|
||||
</div>
|
||||
<div class="flex justify-end space-x-2 max-md:has-[search-input:focus-within]:grow <%= 'max-md:grow' if params[:q].present? %>">
|
||||
<% if params[:q].present? || params[:status].present? || filter_params.present? || @pagy.pages > 1 %>
|
||||
<% if !turbo_native_app? && (params[:q].present? || params[:status].present? || filter_params.present? || @pagy.pages > 1) %>
|
||||
<%= render 'shared/search_input' %>
|
||||
<% end %>
|
||||
<%= link_to new_template_submissions_export_path(@template, params.permit(:q, *Submissions::Filter::ALLOWED_PARAMS)), class: 'hidden md:flex btn btn-ghost text-base', data: { turbo_frame: 'modal' } do %>
|
||||
|
||||
@@ -275,14 +275,16 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<button type="button" id="qr-print-button" class="print-button">
|
||||
<%= svg_icon('printer') %>
|
||||
<span><%= t('print') %></span>
|
||||
</button>
|
||||
<script nonce="<%= content_security_policy_nonce %>">
|
||||
document.getElementById('qr-print-button').addEventListener('click', function () {
|
||||
window.print();
|
||||
});
|
||||
</script>
|
||||
<% unless turbo_native_app? %>
|
||||
<button type="button" id="qr-print-button" class="print-button">
|
||||
<%= svg_icon('printer') %>
|
||||
<span><%= t('print') %></span>
|
||||
</button>
|
||||
<script nonce="<%= content_security_policy_nonce %>">
|
||||
document.getElementById('qr-print-button').addEventListener('click', function () {
|
||||
window.print();
|
||||
});
|
||||
</script>
|
||||
<% end %>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,24 @@
|
||||
<%= render 'shared/turbo_modal', title: t('revisions') do %>
|
||||
<ul class="space-y-1.5">
|
||||
<% @versions.each do |version| %>
|
||||
<li>
|
||||
<native-event class="group flex justify-between items-center gap-2 w-full rounded-lg p-3 border border-dashed border-base-200 cursor-pointer" data-name="template-builder:apply-revision" data-src="<%= template_version_path(@template, version) %>">
|
||||
<div class="flex flex-col min-w-0">
|
||||
<span><%= l(version.created_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %></span>
|
||||
<span class="-ml-0.5 flex items-center space-x-1 text-xs text-base-content/60 mt-0.5">
|
||||
<%= svg_icon('user', class: 'w-3.5 h-3.5 flex-shrink-0') %>
|
||||
<span class="truncate"><%= version.author.full_name.presence || version.author.email %></span>
|
||||
</span>
|
||||
</div>
|
||||
<span class="btn btn-sm btn-neutral text-white pointer-events-none flex-shrink-0">
|
||||
<span class="group-data-[loading]:hidden"><%= t('view') %></span>
|
||||
<%= svg_icon('loader', class: 'w-4 h-4 animate-spin hidden group-data-[loading]:block') %>
|
||||
</span>
|
||||
</native-event>
|
||||
</li>
|
||||
<% end %>
|
||||
<% if @versions.empty? %>
|
||||
<li class="py-4 text-center text-base-content/60"><%= t('no_revisions_yet') %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
<% end %>
|
||||
@@ -1,4 +1,4 @@
|
||||
<% content_for(:native_title, t('users')) if turbo_native_app? %>
|
||||
<% content_for(:native_title, params[:status] == 'archived' ? t('archived_users') : (params[:status] == 'integration' ? t('embedding_users') : t('users'))) if turbo_native_app? %>
|
||||
<div class="flex-wrap space-y-4 md:flex md:flex-nowrap md:space-y-0 md:space-x-10">
|
||||
<%= render 'shared/settings_nav' %>
|
||||
<div class="md:flex-grow">
|
||||
|
||||
@@ -261,6 +261,7 @@ en: &en
|
||||
should_be_a_valid_url: should be a valid URL
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Your account will be permanently deleted within 2 months. Please contact us if you want to keep your account.
|
||||
test_mode: Test mode
|
||||
exit_test_mode: Exit test mode
|
||||
copy: Copy
|
||||
copied: Copied
|
||||
rotate: Rotate
|
||||
@@ -521,8 +522,12 @@ en: &en
|
||||
export: Export
|
||||
there_are_no_submissions: There are no Submissions
|
||||
send_an_invitation_to_fill_and_complete_the_form: Send an invitation to fill and complete the form
|
||||
send: Send
|
||||
send_to_recipients: Send to Recipients
|
||||
sign_it_yourself: Sign it Yourself
|
||||
sign_yourself: Sign Yourself
|
||||
revisions: Revisions
|
||||
no_revisions_yet: No revisions yet
|
||||
api_and_embedding: API and Embedding
|
||||
template_id: Template ID
|
||||
embedding_url: Embedding URL
|
||||
@@ -1387,6 +1392,7 @@ es: &es
|
||||
should_be_a_valid_url: debe ser una URL válida
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Tu solicitud de eliminación de cuenta se procesará en un plazo de 2 meses. Por favor contáctanos si deseas mantener tu cuenta.
|
||||
test_mode: Modo de prueba
|
||||
exit_test_mode: Salir del modo de prueba
|
||||
copy: Copiar
|
||||
copied: Copiado
|
||||
rotate: Rotar
|
||||
@@ -1654,8 +1660,12 @@ es: &es
|
||||
export: Exportar
|
||||
there_are_no_submissions: No hay envíos
|
||||
send_an_invitation_to_fill_and_complete_the_form: Enviar una invitación para completar el formulario
|
||||
send: Enviar
|
||||
send_to_recipients: Enviar a los destinatarios
|
||||
sign_it_yourself: Fírmalo tú mismo
|
||||
sign_yourself: Firma tú mismo
|
||||
revisions: Revisiones
|
||||
no_revisions_yet: Aún no hay revisiones
|
||||
api_and_embedding: API e Integración
|
||||
template_id: ID de plantilla
|
||||
embedding_url: URL de integración
|
||||
@@ -2524,6 +2534,7 @@ it: &it
|
||||
should_be_a_valid_url: deve essere un URL valido
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: "La tua richiesta di rimozione dell'account sarà elaborata entro 2 mesi. Contattaci se desideri mantenere il tuo account."
|
||||
test_mode: Modalità di test
|
||||
exit_test_mode: Esci dalla modalità di prova
|
||||
copy: Copia
|
||||
copied: Copiato
|
||||
rotate: Ruota
|
||||
@@ -2791,8 +2802,12 @@ it: &it
|
||||
export: Esporta
|
||||
there_are_no_submissions: Non ci sono invii
|
||||
send_an_invitation_to_fill_and_complete_the_form: Invia un invito per compilare e completare il modulo
|
||||
send: Invia
|
||||
send_to_recipients: Invia ai destinatari
|
||||
sign_it_yourself: Firmalo tu stesso
|
||||
sign_yourself: Firma te stesso
|
||||
revisions: Revisioni
|
||||
no_revisions_yet: Nessuna revisione ancora
|
||||
api_and_embedding: API e Incorporazione
|
||||
template_id: ID modello
|
||||
embedding_url: URL di incorporazione
|
||||
@@ -3647,6 +3662,7 @@ fr: &fr
|
||||
should_be_a_valid_url: doit être une URL valide
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Votre demande de suppression de compte sera traitée sous 2 mois. Veuillez nous contacter si vous souhaitez conserver votre compte.
|
||||
test_mode: Mode test
|
||||
exit_test_mode: Quitter le mode test
|
||||
copy: Copier
|
||||
copied: Copié
|
||||
rotate: Pivoter
|
||||
@@ -3914,8 +3930,12 @@ fr: &fr
|
||||
export: Exporter
|
||||
there_are_no_submissions: Il n’y a aucune soumission
|
||||
send_an_invitation_to_fill_and_complete_the_form: Envoyer une invitation pour remplir et terminer le formulaire
|
||||
send: Envoyer
|
||||
send_to_recipients: Envoyer aux destinataires
|
||||
sign_it_yourself: Signer vous‑même
|
||||
sign_yourself: Signer vous-même
|
||||
revisions: Révisions
|
||||
no_revisions_yet: Aucune révision pour le moment
|
||||
api_and_embedding: API et Embedding
|
||||
template_id: ID du modèle
|
||||
embedding_url: URL d’embedding
|
||||
@@ -4780,6 +4800,7 @@ pt: &pt
|
||||
should_be_a_valid_url: deve ser um URL válido
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Seu pedido de remoção da conta será processado em até 2 meses. Entre em contato conosco se você quiser manter sua conta.
|
||||
test_mode: Modo de teste
|
||||
exit_test_mode: Sair do modo de teste
|
||||
copy: Copiar
|
||||
copied: Copiado
|
||||
rotate: Girar
|
||||
@@ -5047,8 +5068,12 @@ pt: &pt
|
||||
export: Exportar
|
||||
there_are_no_submissions: Não há submissões
|
||||
send_an_invitation_to_fill_and_complete_the_form: Enviar um convite para preencher e concluir o formulário
|
||||
send: Enviar
|
||||
send_to_recipients: Enviar para destinatários
|
||||
sign_it_yourself: Assine você mesmo
|
||||
sign_yourself: Assine você mesmo
|
||||
revisions: Revisões
|
||||
no_revisions_yet: Nenhuma revisão ainda
|
||||
api_and_embedding: API e Incorporação
|
||||
template_id: ID do modelo
|
||||
embedding_url: URL de incorporação
|
||||
@@ -5916,6 +5941,7 @@ de: &de
|
||||
should_be_a_valid_url: sollte eine gültige URL sein
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Ihre Anfrage zur Kontolöschung wird innerhalb von 2 Monaten bearbeitet. Bitte kontaktieren Sie uns, wenn Sie Ihr Konto behalten möchten.
|
||||
test_mode: Testmodus
|
||||
exit_test_mode: Testmodus verlassen
|
||||
copy: Kopieren
|
||||
copied: Kopiert
|
||||
rotate: Drehen
|
||||
@@ -6183,8 +6209,12 @@ de: &de
|
||||
export: Exportieren
|
||||
there_are_no_submissions: Es gibt keine Einreichungen
|
||||
send_an_invitation_to_fill_and_complete_the_form: Einladung zum Ausfüllen und Abschließen des Formulars senden
|
||||
send: Senden
|
||||
send_to_recipients: An Empfänger senden
|
||||
sign_it_yourself: Selbst unterschreiben
|
||||
sign_yourself: Selbst unterschreiben
|
||||
revisions: Revisionen
|
||||
no_revisions_yet: Noch keine Revisionen
|
||||
api_and_embedding: API und Einbettung
|
||||
template_id: Vorlagen-ID
|
||||
embedding_url: Einbettungs-URL
|
||||
@@ -7580,6 +7610,7 @@ nl: &nl
|
||||
should_be_a_valid_url: moet een geldige URL zijn
|
||||
your_account_will_be_permanently_deleted_within_2_months_please_contact_us_if_you_want_to_keep_your_account: Uw account wordt binnen 2 maanden permanent verwijderd. Neem contact met ons op als u uw account wilt behouden.
|
||||
test_mode: Testmodus
|
||||
exit_test_mode: Testmodus verlaten
|
||||
copy: Kopiëren
|
||||
copied: Gekopieerd
|
||||
rotate: Draaien
|
||||
@@ -7847,8 +7878,12 @@ nl: &nl
|
||||
export: Exporteren
|
||||
there_are_no_submissions: Er zijn geen inzendingen
|
||||
send_an_invitation_to_fill_and_complete_the_form: Stuur een uitnodiging om het formulier in te vullen en te voltooien
|
||||
send: Verzenden
|
||||
send_to_recipients: Verzenden naar ontvangers
|
||||
sign_it_yourself: Zelf ondertekenen
|
||||
sign_yourself: Zelf ondertekenen
|
||||
revisions: Revisies
|
||||
no_revisions_yet: Nog geen revisies
|
||||
api_and_embedding: API en insluiten
|
||||
template_id: Sjabloon-ID
|
||||
embedding_url: Insluitings-URL
|
||||
|
||||
Reference in new issue
Block a user