mirror of
https://github.com/docusealco/docuseal
synced 2026-11-04 14:42:32 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a249b0a678 | ||
|
|
99bc46b40f | ||
|
|
c1e6f0970d | ||
|
|
e8c2316bb2 | ||
|
|
9866e5468c | ||
|
|
fc60df7974 | ||
|
|
08784d28c7 | ||
|
|
0440ea652f | ||
|
|
e466562391 | ||
|
|
b2c8667c53 | ||
|
|
d6893079f7 | ||
|
|
ac1d973605 | ||
|
|
1405fefc85 | ||
|
|
2a75055fb6 | ||
|
|
f84fdd51de | ||
|
|
b38073126e | ||
|
|
c6e681195d |
No files matched your search
@@ -9,6 +9,8 @@ class ConsoleRedirectController < ApplicationController
|
|||||||
params[:redir] = Docuseal.multitenant? ? "#{Docuseal::CONSOLE_URL}/plans" : "#{Docuseal::CONSOLE_URL}/on_premise"
|
params[:redir] = Docuseal.multitenant? ? "#{Docuseal::CONSOLE_URL}/plans" : "#{Docuseal::CONSOLE_URL}/on_premise"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
params[:redir] = "#{Docuseal::CONSOLE_URL}/manage" if request.path == '/manage'
|
||||||
|
|
||||||
return redirect_to(new_user_session_path({ redir: params[:redir] }.compact)) if true_user.blank?
|
return redirect_to(new_user_session_path({ redir: params[:redir] }.compact)) if true_user.blank?
|
||||||
|
|
||||||
auth = JsonWebToken.encode(uuid: true_user.uuid,
|
auth = JsonWebToken.encode(uuid: true_user.uuid,
|
||||||
|
|||||||
@@ -16,13 +16,16 @@ class SubmissionsDebugController < ApplicationController
|
|||||||
render 'submit_form/show'
|
render 'submit_form/show'
|
||||||
end
|
end
|
||||||
f.pdf do
|
f.pdf do
|
||||||
if params[:audit]
|
result =
|
||||||
Submissions::GenerateAuditTrail.call(@submitter.submission)
|
if params[:audit]
|
||||||
else
|
Submissions::GenerateAuditTrail.call(@submitter.submission)
|
||||||
Submissions::GenerateResultAttachments.call(@submitter)
|
elsif params[:combined]
|
||||||
end
|
Submissions::GenerateCombinedAttachment.call(@submitter)
|
||||||
|
else
|
||||||
|
Submissions::GenerateResultAttachments.call(@submitter)
|
||||||
|
end
|
||||||
|
|
||||||
send_data ActiveStorage::Attachment.where(name: params[:audit] ? :audit_trail : :documents).last.download,
|
send_data Array.wrap(result).first.download,
|
||||||
filename: 'debug.pdf',
|
filename: 'debug.pdf',
|
||||||
disposition: 'inline',
|
disposition: 'inline',
|
||||||
type: 'application/pdf'
|
type: 'application/pdf'
|
||||||
|
|||||||
@@ -33,7 +33,17 @@ class SubmissionsDownloadController < ApplicationController
|
|||||||
return head :not_found
|
return head :not_found
|
||||||
end
|
end
|
||||||
|
|
||||||
render json: build_urls(last_submitter)
|
if params[:combined]
|
||||||
|
url = build_combined_url(submitter)
|
||||||
|
|
||||||
|
if url
|
||||||
|
render json: [url]
|
||||||
|
else
|
||||||
|
head :not_found
|
||||||
|
end
|
||||||
|
else
|
||||||
|
render json: build_urls(last_submitter)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
@@ -47,4 +57,14 @@ class SubmissionsDownloadController < ApplicationController
|
|||||||
ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i)
|
ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def build_combined_url(submitter)
|
||||||
|
return if submitter.submission.submitters.exists?(completed_at: nil)
|
||||||
|
return if submitter.submission.submitters.order(:completed_at).last != submitter
|
||||||
|
|
||||||
|
attachment = submitter.submission.combined_document_attachment
|
||||||
|
attachment ||= Submissions::GenerateCombinedAttachment.call(submitter)
|
||||||
|
|
||||||
|
ActiveStorage::Blob.proxy_url(attachment.blob, expires_at: FILES_TTL.from_now.to_i)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -26,6 +26,8 @@ class TemplatesUploadsController < ApplicationController
|
|||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rollbar.error(e) if defined?(Rollbar)
|
Rollbar.error(e) if defined?(Rollbar)
|
||||||
|
|
||||||
|
raise if Rails.env.local?
|
||||||
|
|
||||||
redirect_to root_path, alert: 'Unable to upload file'
|
redirect_to root_path, alert: 'Unable to upload file'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -41,26 +41,6 @@ document.addEventListener('keyup', (e) => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
window.customElements.define('toggle-visible', ToggleVisible)
|
|
||||||
window.customElements.define('disable-hidden', DisableHidden)
|
|
||||||
window.customElements.define('turbo-modal', TurboModal)
|
|
||||||
window.customElements.define('file-dropzone', FileDropzone)
|
|
||||||
window.customElements.define('menu-active', MenuActive)
|
|
||||||
window.customElements.define('clipboard-copy', ClipboardCopy)
|
|
||||||
window.customElements.define('dynamic-list', DynamicList)
|
|
||||||
window.customElements.define('download-button', DownloadButton)
|
|
||||||
window.customElements.define('set-origin-url', SetOriginUrl)
|
|
||||||
window.customElements.define('set-timezone', SetTimezone)
|
|
||||||
window.customElements.define('autoresize-textarea', AutoresizeTextarea)
|
|
||||||
window.customElements.define('submitters-autocomplete', SubmittersAutocomplete)
|
|
||||||
window.customElements.define('folder-autocomplete', FolderAutocomplete)
|
|
||||||
window.customElements.define('signature-form', SignatureForm)
|
|
||||||
window.customElements.define('submit-form', SubmitForm)
|
|
||||||
window.customElements.define('prompt-password', PromptPassword)
|
|
||||||
window.customElements.define('emails-textarea', EmailsTextarea)
|
|
||||||
window.customElements.define('toggle-cookies', ToggleCookies)
|
|
||||||
window.customElements.define('toggle-on-submit', ToggleOnSubmit)
|
|
||||||
|
|
||||||
document.addEventListener('turbo:before-fetch-request', encodeMethodIntoRequestBody)
|
document.addEventListener('turbo:before-fetch-request', encodeMethodIntoRequestBody)
|
||||||
document.addEventListener('turbo:submit-end', async (event) => {
|
document.addEventListener('turbo:submit-end', async (event) => {
|
||||||
const resp = event.detail?.formSubmission?.result?.fetchResponse?.response
|
const resp = event.detail?.formSubmission?.result?.fetchResponse?.response
|
||||||
@@ -84,7 +64,29 @@ document.addEventListener('turbo:submit-end', async (event) => {
|
|||||||
URL.revokeObjectURL(url)
|
URL.revokeObjectURL(url)
|
||||||
})
|
})
|
||||||
|
|
||||||
window.customElements.define('template-builder', class extends HTMLElement {
|
const safeRegisterElement = (name, element, options = {}) => !window.customElements.get(name) && window.customElements.define(name, element, options)
|
||||||
|
|
||||||
|
safeRegisterElement('toggle-visible', ToggleVisible)
|
||||||
|
safeRegisterElement('disable-hidden', DisableHidden)
|
||||||
|
safeRegisterElement('turbo-modal', TurboModal)
|
||||||
|
safeRegisterElement('file-dropzone', FileDropzone)
|
||||||
|
safeRegisterElement('menu-active', MenuActive)
|
||||||
|
safeRegisterElement('clipboard-copy', ClipboardCopy)
|
||||||
|
safeRegisterElement('dynamic-list', DynamicList)
|
||||||
|
safeRegisterElement('download-button', DownloadButton)
|
||||||
|
safeRegisterElement('set-origin-url', SetOriginUrl)
|
||||||
|
safeRegisterElement('set-timezone', SetTimezone)
|
||||||
|
safeRegisterElement('autoresize-textarea', AutoresizeTextarea)
|
||||||
|
safeRegisterElement('submitters-autocomplete', SubmittersAutocomplete)
|
||||||
|
safeRegisterElement('folder-autocomplete', FolderAutocomplete)
|
||||||
|
safeRegisterElement('signature-form', SignatureForm)
|
||||||
|
safeRegisterElement('submit-form', SubmitForm)
|
||||||
|
safeRegisterElement('prompt-password', PromptPassword)
|
||||||
|
safeRegisterElement('emails-textarea', EmailsTextarea)
|
||||||
|
safeRegisterElement('toggle-cookies', ToggleCookies)
|
||||||
|
safeRegisterElement('toggle-on-submit', ToggleOnSubmit)
|
||||||
|
|
||||||
|
safeRegisterElement('template-builder', class extends HTMLElement {
|
||||||
connectedCallback () {
|
connectedCallback () {
|
||||||
this.appElem = document.createElement('div')
|
this.appElem = document.createElement('div')
|
||||||
|
|
||||||
@@ -116,7 +118,7 @@ window.customElements.define('template-builder', class extends HTMLElement {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
window.customElements.define('import-list', class extends HTMLElement {
|
safeRegisterElement('import-list', class extends HTMLElement {
|
||||||
connectedCallback () {
|
connectedCallback () {
|
||||||
this.appElem = document.createElement('div')
|
this.appElem = document.createElement('div')
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,10 @@ import { createApp, reactive } from 'vue'
|
|||||||
import Form from './submission_form/form'
|
import Form from './submission_form/form'
|
||||||
import DownloadButton from './elements/download_button'
|
import DownloadButton from './elements/download_button'
|
||||||
|
|
||||||
window.customElements.define('download-button', DownloadButton)
|
const safeRegisterElement = (name, element, options = {}) => !window.customElements.get(name) && window.customElements.define(name, element, options)
|
||||||
window.customElements.define('submission-form', class extends HTMLElement {
|
|
||||||
|
safeRegisterElement('download-button', DownloadButton)
|
||||||
|
safeRegisterElement('submission-form', class extends HTMLElement {
|
||||||
connectedCallback () {
|
connectedCallback () {
|
||||||
this.appElem = document.createElement('div')
|
this.appElem = document.createElement('div')
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,34 @@
|
|||||||
|
import Rollbar from 'rollbar/dist/rollbar.umd'
|
||||||
|
|
||||||
|
const token = document.querySelector('meta[name="rollbar-token"]')?.getAttribute('content')
|
||||||
|
|
||||||
|
if (token) {
|
||||||
|
window.Rollbar ||= new Rollbar({
|
||||||
|
accessToken: token,
|
||||||
|
captureUncaught: true,
|
||||||
|
captureUnhandledRejections: true,
|
||||||
|
captureIp: false,
|
||||||
|
autoInstrument: false,
|
||||||
|
ignoredMessages: [
|
||||||
|
/Failed to fetch/i,
|
||||||
|
/NetworkError/i,
|
||||||
|
/Load failed/i,
|
||||||
|
/Clipboard write is not allowed/i
|
||||||
|
],
|
||||||
|
transform (payload) {
|
||||||
|
payload.body.telemetry = []
|
||||||
|
|
||||||
|
const string = JSON.stringify(payload)
|
||||||
|
|
||||||
|
return JSON.parse(string.replace(/(\/[des]\/)\w{6}/g, (_, m) => m))
|
||||||
|
},
|
||||||
|
payload: {
|
||||||
|
client: {
|
||||||
|
javascript: {
|
||||||
|
source_map_enabled: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
environment: 'production'
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -779,7 +779,7 @@ export default {
|
|||||||
this.isFormVisible = value
|
this.isFormVisible = value
|
||||||
},
|
},
|
||||||
currentStepFields (value) {
|
currentStepFields (value) {
|
||||||
if (isEmpty(value)) {
|
if (isEmpty(value) && this.currentStep > 0) {
|
||||||
this.currentStep -= 1
|
this.currentStep -= 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,7 @@
|
|||||||
class="flex items-center space-x-1"
|
class="flex items-center space-x-1"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
v-if="field && !field.areas.length"
|
v-if="field && !field.areas?.length"
|
||||||
:title="t('draw')"
|
:title="t('draw')"
|
||||||
class="relative cursor-pointer text-transparent group-hover:text-base-content"
|
class="relative cursor-pointer text-transparent group-hover:text-base-content"
|
||||||
@click="$emit('set-draw', { field })"
|
@click="$emit('set-draw', { field })"
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class Submission < ApplicationRecord
|
|||||||
attribute :slug, :string, default: -> { SecureRandom.base58(14) }
|
attribute :slug, :string, default: -> { SecureRandom.base58(14) }
|
||||||
|
|
||||||
has_one_attached :audit_trail
|
has_one_attached :audit_trail
|
||||||
|
has_one_attached :combined_document
|
||||||
|
|
||||||
has_many :template_schema_documents,
|
has_many :template_schema_documents,
|
||||||
->(e) { where(uuid: (e.template_schema.presence || e.template.schema).pluck('attachment_uuid')) },
|
->(e) { where(uuid: (e.template_schema.presence || e.template.schema).pluck('attachment_uuid')) },
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="<%= local_assigns[:class] %>" width="44" height="44" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M6 9l6 6l6 -6" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 312 B |
@@ -5,7 +5,12 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
<%= csp_meta_tag %>
|
<%= csp_meta_tag %>
|
||||||
<%= javascript_pack_tag 'application', defer: true %>
|
<% if ENV['ROLLBAR_CLIENT_TOKEN'] %>
|
||||||
|
<meta name="rollbar-token" content="<%= ENV.fetch('ROLLBAR_CLIENT_TOKEN', nil) %>">
|
||||||
|
<%= javascript_pack_tag 'rollbar', 'application', defer: true %>
|
||||||
|
<% else %>
|
||||||
|
<%= javascript_pack_tag 'application', defer: true %>
|
||||||
|
<% end %>
|
||||||
<%= stylesheet_pack_tag 'application', media: 'all' %>
|
<%= stylesheet_pack_tag 'application', media: 'all' %>
|
||||||
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
||||||
<%= render 'shared/plausible' if !signed_in? && ENV['PLAUSIBLE_DOMAIN'] %>
|
<%= render 'shared/plausible' if !signed_in? && ENV['PLAUSIBLE_DOMAIN'] %>
|
||||||
|
|||||||
@@ -5,7 +5,12 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
<%= csp_meta_tag %>
|
<%= csp_meta_tag %>
|
||||||
<%= javascript_pack_tag 'form', defer: true %>
|
<% if ENV['ROLLBAR_CLIENT_TOKEN'] %>
|
||||||
|
<meta name="rollbar-token" content="<%= ENV.fetch('ROLLBAR_CLIENT_TOKEN', nil) %>">
|
||||||
|
<%= javascript_pack_tag 'rollbar', 'form', defer: true %>
|
||||||
|
<% else %>
|
||||||
|
<%= javascript_pack_tag 'form', defer: true %>
|
||||||
|
<% end %>
|
||||||
<%= stylesheet_pack_tag 'form', media: 'all' %>
|
<%= stylesheet_pack_tag 'form', media: 'all' %>
|
||||||
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -5,7 +5,12 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<%= csrf_meta_tags %>
|
<%= csrf_meta_tags %>
|
||||||
<%= csp_meta_tag %>
|
<%= csp_meta_tag %>
|
||||||
<%= javascript_pack_tag 'application', defer: true %>
|
<% if ENV['ROLLBAR_CLIENT_TOKEN'] %>
|
||||||
|
<meta name="rollbar-token" content="<%= ENV.fetch('ROLLBAR_CLIENT_TOKEN', nil) %>">
|
||||||
|
<%= javascript_pack_tag 'rollbar', 'application', defer: true %>
|
||||||
|
<% else %>
|
||||||
|
<%= javascript_pack_tag 'application', defer: true %>
|
||||||
|
<% end %>
|
||||||
<%= stylesheet_pack_tag 'application', media: 'all' %>
|
<%= stylesheet_pack_tag 'application', media: 'all' %>
|
||||||
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
<%= render 'shared/posthog' if ENV['POSTHOG_TOKEN'] %>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -26,10 +26,10 @@
|
|||||||
<label tabindex="0" class="cursor-pointer bg-base-content text-purple-300 rounded-full p-2 w-9 justify-center flex">
|
<label tabindex="0" class="cursor-pointer bg-base-content text-purple-300 rounded-full p-2 w-9 justify-center flex">
|
||||||
<span class="text-sm align-text-top"><%= current_user.initials %></span>
|
<span class="text-sm align-text-top"><%= current_user.initials %></span>
|
||||||
</label>
|
</label>
|
||||||
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box whitespace-nowrap text-right">
|
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box w-40 text-right">
|
||||||
<li>
|
<li>
|
||||||
<%= link_to settings_profile_index_path, class: 'flex items-center' do %>
|
<%= link_to settings_profile_index_path, class: 'flex items-center' do %>
|
||||||
<%= svg_icon('adjustments', class: 'w-5 h-5 stroke-2') %>
|
<%= svg_icon('adjustments', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
|
||||||
<span class="mr-1">Profile</span>
|
<span class="mr-1">Profile</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -14,16 +14,42 @@
|
|||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %>
|
<% if last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %>
|
||||||
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig] }.compact) %>" class="base-button">
|
<% is_all_completed = @submission.submitters.to_a.all?(&:completed_at?) %>
|
||||||
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
<div class="join relative">
|
||||||
<%= svg_icon('download', class: 'w-6 h-6') %>
|
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig] }.compact) %>" class="base-button <%= '!rounded-r-none !pr-2' if is_all_completed %>">
|
||||||
<span class="hidden md:inline">Download</span>
|
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
||||||
</span>
|
<%= svg_icon('download', class: 'w-6 h-6') %>
|
||||||
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
<span class="hidden md:inline">Download</span>
|
||||||
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
</span>
|
||||||
<span class="hidden md:inline">Downloading</span>
|
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
||||||
</span>
|
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
||||||
</download-button>
|
<span class="hidden md:inline">Downloading</span>
|
||||||
|
</span>
|
||||||
|
</download-button>
|
||||||
|
<% if is_all_completed %>
|
||||||
|
<div class="dropdown dropdown-end">
|
||||||
|
<label tabindex="0" class="base-button !rounded-l-none !pl-1 !pr-2 !border-l-neutral-500">
|
||||||
|
<span class="text-sm align-text-top">
|
||||||
|
<%= svg_icon('chevron_down', class: 'w-6 h-6 flex-shrink-0 stroke-2') %>
|
||||||
|
</span>
|
||||||
|
</label>
|
||||||
|
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box text-right">
|
||||||
|
<li>
|
||||||
|
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig], combined: true }.compact) %>" class="flex items-center">
|
||||||
|
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
||||||
|
<%= svg_icon('download', class: 'w-6 h-6 flex-shrink-0') %>
|
||||||
|
<span class="whitespace-nowrap">Download combined PDF</span>
|
||||||
|
</span>
|
||||||
|
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
||||||
|
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
||||||
|
<span>Downloading</span>
|
||||||
|
</span>
|
||||||
|
</download-button>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
<% elsif @submission.submitters.to_a.size == 1 %>
|
<% elsif @submission.submitters.to_a.size == 1 %>
|
||||||
<%= render 'shared/clipboard_copy', text: start_form_url(slug: @submission.template.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy Share Link', copied_title: 'Copied to Clipboard' %>
|
<%= render 'shared/clipboard_copy', text: start_form_url(slug: @submission.template.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: 'Copy Share Link', copied_title: 'Copied to Clipboard' %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -77,7 +103,7 @@
|
|||||||
<% submitter_field_counters = Hash.new { 0 } %>
|
<% submitter_field_counters = Hash.new { 0 } %>
|
||||||
<% (@submission.template_submitters || @submission.template.submitters).each_with_index do |item, index| %>
|
<% (@submission.template_submitters || @submission.template.submitters).each_with_index do |item, index| %>
|
||||||
<% submitter = @submission.submitters.find { |e| e.uuid == item['uuid'] } %>
|
<% submitter = @submission.submitters.find { |e| e.uuid == item['uuid'] } %>
|
||||||
<div class="sticky -top-1 bg-base-100 pt-1 -mt-1 z-10">
|
<div class="sticky -top-1 bg-base-100 pt-1 -mt-1">
|
||||||
<div class="border border-base-300 rounded-md px-2 py-1 mb-1">
|
<div class="border border-base-300 rounded-md px-2 py-1 mb-1">
|
||||||
<div class="flex items-center space-x-1">
|
<div class="flex items-center space-x-1">
|
||||||
<span class="mx-1 w-3 h-3 rounded-full <%= colors[index] %>"></span>
|
<span class="mx-1 w-3 h-3 rounded-full <%= colors[index] %>"></span>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<input id="file_dropzone_input" name="files[]" class="hidden" data-action="change:file-dropzone#onSelectFiles" data-target="file-dropzone.input" type="file" accept="image/*, application/pdf<%= ', .docx, .doc, .xlsx, .xls' if Docuseal.multitenant? %>" multiple>
|
<input id="file_dropzone_input" name="files[]" class="hidden" data-action="change:file-dropzone#onSelectFiles" data-target="file-dropzone.input" type="file" accept="image/*, application/pdf<%= ', .docx, .doc, .xlsx, .xls, .odt, .rtf' if Docuseal.multitenant? %>" multiple>
|
||||||
</div>
|
</div>
|
||||||
</label>
|
</label>
|
||||||
</file-dropzone>
|
</file-dropzone>
|
||||||
|
|||||||
@@ -14,6 +14,6 @@
|
|||||||
</span>
|
</span>
|
||||||
</button>
|
</button>
|
||||||
<input type="hidden" name="form_id" value="<%= form_id %>">
|
<input type="hidden" name="form_id" value="<%= form_id %>">
|
||||||
<input id="upload_template" name="files[]" class="hidden" onchange="this.form.requestSubmit()" type="file" accept="image/*, application/pdf<%= ', .docx, .doc, .xlsx, .xls' if Docuseal.multitenant? %>" multiple>
|
<input id="upload_template" name="files[]" class="hidden" onchange="this.form.requestSubmit()" type="file" accept="image/*, application/pdf<%= ', .docx, .doc, .xlsx, .xls, .odt, .rtf' if Docuseal.multitenant? %>" multiple>
|
||||||
<input hidden name="folder_name" value="<%= local_assigns[:folder_name] %>">
|
<input hidden name="folder_name" value="<%= local_assigns[:folder_name] %>">
|
||||||
<% end %>
|
<% end %>
|
||||||
Whitespace-only changes.
@@ -5,9 +5,16 @@
|
|||||||
<h1 class="text-4xl font-bold"><%= params[:status].to_s.titleize %> Users</h1>
|
<h1 class="text-4xl font-bold"><%= params[:status].to_s.titleize %> Users</h1>
|
||||||
<div class="flex items-center space-x-4">
|
<div class="flex items-center space-x-4">
|
||||||
<% if can?(:create, User.new(account: current_account)) %>
|
<% if can?(:create, User.new(account: current_account)) %>
|
||||||
<%= link_to new_user_path, class: 'btn btn-primary btn-md gap-2', data: { turbo_frame: 'modal' } do %>
|
<% if Docuseal.multitenant? %>
|
||||||
<%= svg_icon('plus', class: 'w-6 h-6') %>
|
<%= render 'users/extra_buttons' %>
|
||||||
<span>New User</span>
|
<% end %>
|
||||||
|
<% if content_for(:add_user_button) %>
|
||||||
|
<%= content_for(:add_user_button) %>
|
||||||
|
<% else %>
|
||||||
|
<%= link_to new_user_path, class: 'btn btn-primary btn-md gap-2', data: { turbo_frame: 'modal' } do %>
|
||||||
|
<%= svg_icon('plus', class: 'w-6 h-6') %>
|
||||||
|
<span>New User</span>
|
||||||
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ Rails.application.configure do
|
|||||||
end
|
end
|
||||||
|
|
||||||
config.active_storage.resolve_model_to_route = :rails_storage_proxy if ENV['ACTIVE_STORAGE_PUBLIC'] != 'true'
|
config.active_storage.resolve_model_to_route = :rails_storage_proxy if ENV['ACTIVE_STORAGE_PUBLIC'] != 'true'
|
||||||
config.active_storage.service_urls_expire_in = 15.minutes
|
config.active_storage.service_urls_expire_in = 4.hours
|
||||||
|
|
||||||
# Mount Action Cable outside main process or domain.
|
# Mount Action Cable outside main process or domain.
|
||||||
# config.action_cable.mount_path = nil
|
# config.action_cable.mount_path = nil
|
||||||
@@ -136,7 +136,7 @@ Rails.application.configure do
|
|||||||
end
|
end
|
||||||
|
|
||||||
{
|
{
|
||||||
fwd: controller.request.ip,
|
fwd: controller.request.remote_ip,
|
||||||
params: {
|
params: {
|
||||||
id: params[:id],
|
id: params[:id],
|
||||||
sig: (params[:signed_uuid] || params[:signed_id]).to_s.split('--').first,
|
sig: (params[:signed_uuid] || params[:signed_id]).to_s.split('--').first,
|
||||||
@@ -154,7 +154,7 @@ Rails.application.configure do
|
|||||||
|
|
||||||
config.lograge.custom_payload do |controller|
|
config.lograge.custom_payload do |controller|
|
||||||
{
|
{
|
||||||
fwd: controller.request.ip
|
fwd: controller.request.remote_ip
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -14,6 +14,13 @@ module HexaPDF
|
|||||||
end
|
end
|
||||||
|
|
||||||
module Type
|
module Type
|
||||||
|
class Page
|
||||||
|
# fix NoMethodError (undefined method `color_space' for an instance of HexaPDF::Type::Page)
|
||||||
|
def color_space(name)
|
||||||
|
GlobalConfiguration.constantize('color_space.map', name).new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# fix NoMethodError: undefined method `field_value' for #<HexaPDF::Type::AcroForm::Field
|
# fix NoMethodError: undefined method `field_value' for #<HexaPDF::Type::AcroForm::Field
|
||||||
module AcroForm
|
module AcroForm
|
||||||
class Field
|
class Field
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ Rails.application.routes.draw do
|
|||||||
resources :submissions, only: %i[show destroy]
|
resources :submissions, only: %i[show destroy]
|
||||||
resources :console_redirect, only: %i[index]
|
resources :console_redirect, only: %i[index]
|
||||||
resources :upgrade, only: %i[index], controller: 'console_redirect'
|
resources :upgrade, only: %i[index], controller: 'console_redirect'
|
||||||
|
resources :manage, only: %i[index], controller: 'console_redirect'
|
||||||
resource :testing_account, only: %i[show destroy]
|
resource :testing_account, only: %i[show destroy]
|
||||||
resources :testing_api_settings, only: %i[index]
|
resources :testing_api_settings, only: %i[index]
|
||||||
resources :submitters_autocomplete, only: %i[index]
|
resources :submitters_autocomplete, only: %i[index]
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ const configs = generateWebpackConfig({
|
|||||||
optimization: {
|
optimization: {
|
||||||
runtimeChunk: false,
|
runtimeChunk: false,
|
||||||
splitChunks: {
|
splitChunks: {
|
||||||
|
chunks (chunk) {
|
||||||
|
return chunk.name !== 'rollbar'
|
||||||
|
},
|
||||||
cacheGroups: {
|
cacheGroups: {
|
||||||
default: false,
|
default: false,
|
||||||
applicationVendors: {
|
applicationVendors: {
|
||||||
|
|||||||
@@ -31,6 +31,17 @@ module Accounts
|
|||||||
new_account
|
new_account
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def users_count(account)
|
||||||
|
rel = User.where(account_id: account.id).or(
|
||||||
|
User.where(account_id: account.account_linked_accounts
|
||||||
|
.where.not(account_type: :testing)
|
||||||
|
.select(:linked_account_id))
|
||||||
|
)
|
||||||
|
|
||||||
|
rel.where.not(account: account.linked_accounts.where.not(archived_at: nil))
|
||||||
|
.where.not(role: :integration).active.count
|
||||||
|
end
|
||||||
|
|
||||||
def find_or_create_testing_user(account)
|
def find_or_create_testing_user(account)
|
||||||
user = User.where(role: :admin).order(:id).find_by(account: account.testing_accounts)
|
user = User.where(role: :admin).order(:id).find_by(account: account.testing_accounts)
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,6 @@ module Submissions
|
|||||||
'Helvetica'
|
'Helvetica'
|
||||||
end
|
end
|
||||||
|
|
||||||
SIGN_REASON = 'Signed with DocuSeal.co'
|
|
||||||
VERIFIED_TEXT = 'Verified'
|
VERIFIED_TEXT = 'Verified'
|
||||||
UNVERIFIED_TEXT = 'Unverified'
|
UNVERIFIED_TEXT = 'Unverified'
|
||||||
|
|
||||||
@@ -31,9 +30,35 @@ module Submissions
|
|||||||
|
|
||||||
# rubocop:disable Metrics
|
# rubocop:disable Metrics
|
||||||
def call(submission)
|
def call(submission)
|
||||||
|
document = build_audit_trail(submission)
|
||||||
|
|
||||||
account = submission.account
|
account = submission.account
|
||||||
|
|
||||||
pkcs = Accounts.load_signing_pkcs(account)
|
pkcs = Accounts.load_signing_pkcs(account)
|
||||||
tsa_url = Accounts.load_timeserver_url(account)
|
tsa_url = Accounts.load_timeserver_url(account)
|
||||||
|
|
||||||
|
io = StringIO.new
|
||||||
|
|
||||||
|
document.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
|
||||||
|
|
||||||
|
sign_params = {
|
||||||
|
reason: sign_reason,
|
||||||
|
**Submissions::GenerateResultAttachments.build_signing_params(pkcs, tsa_url)
|
||||||
|
}
|
||||||
|
|
||||||
|
document.sign(io, **sign_params)
|
||||||
|
|
||||||
|
ActiveStorage::Attachment.create!(
|
||||||
|
blob: ActiveStorage::Blob.create_and_upload!(
|
||||||
|
io: StringIO.new(io.string), filename: "Audit Log - #{submission.template.name}.pdf"
|
||||||
|
),
|
||||||
|
name: 'audit_trail',
|
||||||
|
record: submission
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_audit_trail(submission)
|
||||||
|
account = submission.account
|
||||||
verify_url = Rails.application.routes.url_helpers.settings_esign_url(**Docuseal.default_url_options)
|
verify_url = Rails.application.routes.url_helpers.settings_esign_url(**Docuseal.default_url_options)
|
||||||
page_size =
|
page_size =
|
||||||
if TimeUtils.timezone_abbr(account.timezone, Time.current.beginning_of_year).in?(US_TIMEZONES)
|
if TimeUtils.timezone_abbr(account.timezone, Time.current.beginning_of_year).in?(US_TIMEZONES)
|
||||||
@@ -299,24 +324,11 @@ module Submissions
|
|||||||
|
|
||||||
composer.table(events_data, cell_style: { padding: [0, 0, 12, 0], border: { width: 0 } }) if events_data.present?
|
composer.table(events_data, cell_style: { padding: [0, 0, 12, 0], border: { width: 0 } }) if events_data.present?
|
||||||
|
|
||||||
io = StringIO.new
|
composer.document
|
||||||
|
end
|
||||||
|
|
||||||
composer.document.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
|
def sign_reason
|
||||||
|
'Signed with DocuSeal.co'
|
||||||
sign_params = {
|
|
||||||
reason: SIGN_REASON,
|
|
||||||
**Submissions::GenerateResultAttachments.build_signing_params(pkcs, tsa_url)
|
|
||||||
}
|
|
||||||
|
|
||||||
composer.document.sign(io, **sign_params)
|
|
||||||
|
|
||||||
ActiveStorage::Attachment.create!(
|
|
||||||
blob: ActiveStorage::Blob.create_and_upload!(
|
|
||||||
io: StringIO.new(io.string), filename: "Audit Log - #{submission.template.name}.pdf"
|
|
||||||
),
|
|
||||||
name: 'audit_trail',
|
|
||||||
record: submission
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def add_logo(column, _submission = nil)
|
def add_logo(column, _submission = nil)
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Submissions
|
||||||
|
module GenerateCombinedAttachment
|
||||||
|
module_function
|
||||||
|
|
||||||
|
def call(submitter)
|
||||||
|
pdf = build_combined_pdf(submitter)
|
||||||
|
|
||||||
|
submission = submitter.submission
|
||||||
|
account = submission.account
|
||||||
|
|
||||||
|
pkcs = Accounts.load_signing_pkcs(account)
|
||||||
|
tsa_url = Accounts.load_timeserver_url(account)
|
||||||
|
|
||||||
|
io = StringIO.new
|
||||||
|
|
||||||
|
pdf.trailer.info[:Creator] = "#{Docuseal.product_name} (#{Docuseal::PRODUCT_URL})"
|
||||||
|
|
||||||
|
sign_params = {
|
||||||
|
reason: sign_reason,
|
||||||
|
**Submissions::GenerateResultAttachments.build_signing_params(pkcs, tsa_url)
|
||||||
|
}
|
||||||
|
|
||||||
|
pdf.sign(io, **sign_params)
|
||||||
|
|
||||||
|
ActiveStorage::Attachment.create!(
|
||||||
|
blob: ActiveStorage::Blob.create_and_upload!(
|
||||||
|
io: StringIO.new(io.string), filename: "#{submission.template.name}.pdf"
|
||||||
|
),
|
||||||
|
name: 'combined_document',
|
||||||
|
record: submission
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_combined_pdf(submitter)
|
||||||
|
pdfs_index = Submissions::GenerateResultAttachments.generate_pdfs(submitter)
|
||||||
|
|
||||||
|
audit_trail = Submissions::GenerateAuditTrail.build_audit_trail(submitter.submission)
|
||||||
|
|
||||||
|
audit_trail.dispatch_message(:complete_objects)
|
||||||
|
|
||||||
|
result = HexaPDF::Document.new
|
||||||
|
|
||||||
|
submitter.submission.template_schema.each do |item|
|
||||||
|
pdf = pdfs_index[item['attachment_uuid']]
|
||||||
|
|
||||||
|
pdf.dispatch_message(:complete_objects)
|
||||||
|
|
||||||
|
pdf.pages.each { |page| result.pages << result.import(page) }
|
||||||
|
end
|
||||||
|
|
||||||
|
audit_trail.pages.each { |page| result.pages << result.import(page) }
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
def sign_reason
|
||||||
|
'Signed with DocuSeal.co'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -39,17 +39,58 @@ module Submissions
|
|||||||
|
|
||||||
# rubocop:disable Metrics
|
# rubocop:disable Metrics
|
||||||
def call(submitter)
|
def call(submitter)
|
||||||
cell_layouter = HexaPDF::Layout::TextLayouter.new(text_valign: :center, text_align: :center)
|
pdfs_index = generate_pdfs(submitter)
|
||||||
|
|
||||||
template = submitter.submission.template
|
template = submitter.submission.template
|
||||||
|
account = submitter.account
|
||||||
|
|
||||||
|
pkcs = Accounts.load_signing_pkcs(account)
|
||||||
|
tsa_url = Accounts.load_timeserver_url(account)
|
||||||
|
|
||||||
|
image_pdfs = []
|
||||||
|
original_documents = template.documents.preload(:blob)
|
||||||
|
|
||||||
|
result_attachments =
|
||||||
|
submitter.submission.template_schema.map do |item|
|
||||||
|
pdf = pdfs_index[item['attachment_uuid']]
|
||||||
|
|
||||||
|
attachment = build_pdf_attachment(pdf:, submitter:, pkcs:, tsa_url:,
|
||||||
|
uuid: item['attachment_uuid'],
|
||||||
|
name: item['name'])
|
||||||
|
|
||||||
|
image_pdfs << pdf if original_documents.find { |a| a.uuid == item['attachment_uuid'] }.image?
|
||||||
|
|
||||||
|
attachment
|
||||||
|
end
|
||||||
|
|
||||||
|
return result_attachments.map { |e| e.tap(&:save!) } if image_pdfs.size < 2
|
||||||
|
|
||||||
|
images_pdf =
|
||||||
|
image_pdfs.each_with_object(HexaPDF::Document.new) do |pdf, doc|
|
||||||
|
pdf.pages.each { |page| doc.pages << doc.import(page) }
|
||||||
|
end
|
||||||
|
|
||||||
|
images_pdf_attachment =
|
||||||
|
build_pdf_attachment(
|
||||||
|
pdf: images_pdf,
|
||||||
|
submitter:,
|
||||||
|
tsa_url:,
|
||||||
|
pkcs:,
|
||||||
|
uuid: images_pdf_uuid(original_documents.select(&:image?)),
|
||||||
|
name: template.name
|
||||||
|
)
|
||||||
|
|
||||||
|
(result_attachments + [images_pdf_attachment]).map { |e| e.tap(&:save!) }
|
||||||
|
end
|
||||||
|
|
||||||
|
def generate_pdfs(submitter)
|
||||||
|
cell_layouter = HexaPDF::Layout::TextLayouter.new(text_valign: :center, text_align: :center)
|
||||||
|
|
||||||
is_flatten =
|
is_flatten =
|
||||||
submitter.account.account_configs
|
submitter.account.account_configs
|
||||||
.find_or_initialize_by(key: AccountConfig::FLATTEN_RESULT_PDF_KEY).value != false
|
.find_or_initialize_by(key: AccountConfig::FLATTEN_RESULT_PDF_KEY).value != false
|
||||||
|
|
||||||
account = submitter.account
|
account = submitter.account
|
||||||
pkcs = Accounts.load_signing_pkcs(account)
|
|
||||||
tsa_url = Accounts.load_timeserver_url(account)
|
|
||||||
attachments_data_cache = {}
|
attachments_data_cache = {}
|
||||||
|
|
||||||
pdfs_index = build_pdfs_index(submitter, flatten: is_flatten)
|
pdfs_index = build_pdfs_index(submitter, flatten: is_flatten)
|
||||||
@@ -259,40 +300,7 @@ module Submissions
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
image_pdfs = []
|
pdfs_index
|
||||||
original_documents = template.documents.preload(:blob)
|
|
||||||
|
|
||||||
result_attachments =
|
|
||||||
submitter.submission.template_schema.map do |item|
|
|
||||||
pdf = pdfs_index[item['attachment_uuid']]
|
|
||||||
|
|
||||||
attachment = build_pdf_attachment(pdf:, submitter:, pkcs:, tsa_url:,
|
|
||||||
uuid: item['attachment_uuid'],
|
|
||||||
name: item['name'])
|
|
||||||
|
|
||||||
image_pdfs << pdf if original_documents.find { |a| a.uuid == item['attachment_uuid'] }.image?
|
|
||||||
|
|
||||||
attachment
|
|
||||||
end
|
|
||||||
|
|
||||||
return result_attachments.map { |e| e.tap(&:save!) } if image_pdfs.size < 2
|
|
||||||
|
|
||||||
images_pdf =
|
|
||||||
image_pdfs.each_with_object(HexaPDF::Document.new) do |pdf, doc|
|
|
||||||
pdf.pages.each { |page| doc.pages << doc.import(page) }
|
|
||||||
end
|
|
||||||
|
|
||||||
images_pdf_attachment =
|
|
||||||
build_pdf_attachment(
|
|
||||||
pdf: images_pdf,
|
|
||||||
submitter:,
|
|
||||||
tsa_url:,
|
|
||||||
pkcs:,
|
|
||||||
uuid: images_pdf_uuid(original_documents.select(&:image?)),
|
|
||||||
name: template.name
|
|
||||||
)
|
|
||||||
|
|
||||||
(result_attachments + [images_pdf_attachment]).map { |e| e.tap(&:save!) }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def build_pdf_attachment(pdf:, submitter:, pkcs:, tsa_url:, uuid:, name:)
|
def build_pdf_attachment(pdf:, submitter:, pkcs:, tsa_url:, uuid:, name:)
|
||||||
@@ -375,6 +383,7 @@ module Submissions
|
|||||||
|
|
||||||
if flatten
|
if flatten
|
||||||
begin
|
begin
|
||||||
|
pdf.acro_form.create_appearances(force: true) if pdf.acro_form && pdf.acro_form[:NeedAppearances]
|
||||||
pdf.acro_form&.flatten
|
pdf.acro_form&.flatten
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Rollbar.error(e) if defined?(Rollbar)
|
Rollbar.error(e) if defined?(Rollbar)
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ module Templates
|
|||||||
pdf = HexaPDF::Document.new(io: StringIO.new(data))
|
pdf = HexaPDF::Document.new(io: StringIO.new(data))
|
||||||
number_of_pages = pdf.pages.size
|
number_of_pages = pdf.pages.size
|
||||||
|
|
||||||
data = maybe_flatten_form(data, pdf, attachment)
|
data = maybe_flatten_form(data, pdf)
|
||||||
|
|
||||||
attachment.metadata['pdf'] ||= {}
|
attachment.metadata['pdf'] ||= {}
|
||||||
attachment.metadata['pdf']['number_of_pages'] = number_of_pages
|
attachment.metadata['pdf']['number_of_pages'] = number_of_pages
|
||||||
@@ -74,15 +74,15 @@ module Templates
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def maybe_flatten_form(data, pdf, attachment)
|
def maybe_flatten_form(data, pdf)
|
||||||
return data if data.size > MAX_FLATTEN_FILE_SIZE
|
return data if data.size > MAX_FLATTEN_FILE_SIZE
|
||||||
return data if pdf.acro_form.blank?
|
return data if pdf.acro_form.blank?
|
||||||
return data if attachment.record.account.account_configs
|
|
||||||
.find_or_initialize_by(key: AccountConfig::FLATTEN_RESULT_PDF_KEY).value == false
|
|
||||||
|
|
||||||
io = StringIO.new
|
io = StringIO.new
|
||||||
|
|
||||||
pdf.acro_form&.flatten
|
pdf.acro_form.create_appearances(force: true) if pdf.acro_form[:NeedAppearances]
|
||||||
|
pdf.acro_form.flatten
|
||||||
|
|
||||||
pdf.write(io, incremental: false, validate: false)
|
pdf.write(io, incremental: false, validate: false)
|
||||||
|
|
||||||
io.string
|
io.string
|
||||||
|
|||||||
+2
-1
@@ -19,12 +19,13 @@
|
|||||||
"compression-webpack-plugin": "10.0.0",
|
"compression-webpack-plugin": "10.0.0",
|
||||||
"css-loader": "^6.7.3",
|
"css-loader": "^6.7.3",
|
||||||
"css-minimizer-webpack-plugin": "^5.0.0",
|
"css-minimizer-webpack-plugin": "^5.0.0",
|
||||||
"daisyui": "^3.2.1",
|
"daisyui": "^3.9.4",
|
||||||
"mathjs": "^12.4.0",
|
"mathjs": "^12.4.0",
|
||||||
"mini-css-extract-plugin": "^2.7.5",
|
"mini-css-extract-plugin": "^2.7.5",
|
||||||
"postcss": "^8.4.23",
|
"postcss": "^8.4.23",
|
||||||
"postcss-import": "^15.1.0",
|
"postcss-import": "^15.1.0",
|
||||||
"postcss-loader": "^7.3.0",
|
"postcss-loader": "^7.3.0",
|
||||||
|
"rollbar": "^2.26.4",
|
||||||
"sass": "^1.62.1",
|
"sass": "^1.62.1",
|
||||||
"sass-loader": "^13.2.2",
|
"sass-loader": "^13.2.2",
|
||||||
"shakapacker": "8.0.0",
|
"shakapacker": "8.0.0",
|
||||||
|
|||||||
@@ -1737,6 +1737,11 @@ array.prototype.flatmap@^1.3.1:
|
|||||||
es-abstract "^1.20.4"
|
es-abstract "^1.20.4"
|
||||||
es-shim-unscopables "^1.0.0"
|
es-shim-unscopables "^1.0.0"
|
||||||
|
|
||||||
|
async@~3.2.3:
|
||||||
|
version "3.2.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/async/-/async-3.2.5.tgz#ebd52a8fdaf7a2289a24df399f8d8485c8a46b66"
|
||||||
|
integrity sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==
|
||||||
|
|
||||||
autocompleter@^9.1.0:
|
autocompleter@^9.1.0:
|
||||||
version "9.1.0"
|
version "9.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/autocompleter/-/autocompleter-9.1.0.tgz#c7248a8cc0c58376d0969734c40e29626d950f04"
|
resolved "https://registry.yarnpkg.com/autocompleter/-/autocompleter-9.1.0.tgz#c7248a8cc0c58376d0969734c40e29626d950f04"
|
||||||
@@ -2105,6 +2110,11 @@ connect-history-api-fallback@^2.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
|
resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
|
||||||
integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
|
integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
|
||||||
|
|
||||||
|
console-polyfill@0.3.0:
|
||||||
|
version "0.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/console-polyfill/-/console-polyfill-0.3.0.tgz#84900902a18c47a5eba932be75fa44d23e8af861"
|
||||||
|
integrity sha512-w+JSDZS7XML43Xnwo2x5O5vxB0ID7T5BdqDtyqT6uiCAX2kZAgcWxNaGqT97tZfSHzfOcvrfsDAodKcJ3UvnXQ==
|
||||||
|
|
||||||
content-disposition@0.5.4:
|
content-disposition@0.5.4:
|
||||||
version "0.5.4"
|
version "0.5.4"
|
||||||
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
|
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
|
||||||
@@ -2310,16 +2320,16 @@ csstype@^3.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
|
resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
|
||||||
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
|
integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
|
||||||
|
|
||||||
daisyui@^3.2.1:
|
daisyui@^3.9.4:
|
||||||
version "3.2.1"
|
version "3.9.4"
|
||||||
resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-3.2.1.tgz#7fac542b03023adbde2afc869518840dbef509ee"
|
resolved "https://registry.yarnpkg.com/daisyui/-/daisyui-3.9.4.tgz#84209bfce115505d7b502f7362b8ced6bb3a6cc5"
|
||||||
integrity sha512-gIqE6wiqoJt9G8+n3R/SwLeUnpNCE2eDhT73rP0yZYVaM7o6zVcakBH3aEW5RGpx3UkonPiLuvcgxRcb2lE8TA==
|
integrity sha512-fvi2RGH4YV617/6DntOVGcOugOPym9jTGWW2XySb5ZpvdWO4L7bEG77VHirrnbRUEWvIEVXkBpxUz2KFj0rVnA==
|
||||||
dependencies:
|
dependencies:
|
||||||
colord "^2.9"
|
colord "^2.9"
|
||||||
css-selector-tokenizer "^0.8"
|
css-selector-tokenizer "^0.8"
|
||||||
postcss "^8"
|
postcss "^8"
|
||||||
postcss-js "^4"
|
postcss-js "^4"
|
||||||
tailwindcss "^3"
|
tailwindcss "^3.1"
|
||||||
|
|
||||||
debug@2.6.9:
|
debug@2.6.9:
|
||||||
version "2.6.9"
|
version "2.6.9"
|
||||||
@@ -2342,6 +2352,13 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
ms "2.1.2"
|
ms "2.1.2"
|
||||||
|
|
||||||
|
decache@^3.0.5:
|
||||||
|
version "3.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/decache/-/decache-3.1.0.tgz#4f5036fbd6581fcc97237ac3954a244b9536c2da"
|
||||||
|
integrity sha512-p7D6wJ5EJFFq1CcF2lu1XeqKFLBob8jRQGNAvFLTsV3CbSKBl3VtliAVlUIGz2i9H6kEFnI2Amaft5ZopIG2Fw==
|
||||||
|
dependencies:
|
||||||
|
find "^0.2.4"
|
||||||
|
|
||||||
decimal.js@^10.4.3:
|
decimal.js@^10.4.3:
|
||||||
version "10.4.3"
|
version "10.4.3"
|
||||||
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
|
resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
|
||||||
@@ -2508,6 +2525,13 @@ error-ex@^1.3.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
is-arrayish "^0.2.1"
|
is-arrayish "^0.2.1"
|
||||||
|
|
||||||
|
error-stack-parser@^2.0.4:
|
||||||
|
version "2.1.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286"
|
||||||
|
integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==
|
||||||
|
dependencies:
|
||||||
|
stackframe "^1.3.4"
|
||||||
|
|
||||||
es-abstract@^1.19.0, es-abstract@^1.20.4:
|
es-abstract@^1.19.0, es-abstract@^1.20.4:
|
||||||
version "1.21.2"
|
version "1.21.2"
|
||||||
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
|
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.21.2.tgz#a56b9695322c8a185dc25975aa3b8ec31d0e7eff"
|
||||||
@@ -2901,6 +2925,17 @@ fast-glob@^3.2.12:
|
|||||||
merge2 "^1.3.0"
|
merge2 "^1.3.0"
|
||||||
micromatch "^4.0.4"
|
micromatch "^4.0.4"
|
||||||
|
|
||||||
|
fast-glob@^3.3.0:
|
||||||
|
version "3.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129"
|
||||||
|
integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==
|
||||||
|
dependencies:
|
||||||
|
"@nodelib/fs.stat" "^2.0.2"
|
||||||
|
"@nodelib/fs.walk" "^1.2.3"
|
||||||
|
glob-parent "^5.1.2"
|
||||||
|
merge2 "^1.3.0"
|
||||||
|
micromatch "^4.0.4"
|
||||||
|
|
||||||
fast-json-stable-stringify@^2.0.0:
|
fast-json-stable-stringify@^2.0.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
|
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
|
||||||
@@ -2987,6 +3022,13 @@ find-up@^5.0.0:
|
|||||||
locate-path "^6.0.0"
|
locate-path "^6.0.0"
|
||||||
path-exists "^4.0.0"
|
path-exists "^4.0.0"
|
||||||
|
|
||||||
|
find@^0.2.4:
|
||||||
|
version "0.2.9"
|
||||||
|
resolved "https://registry.yarnpkg.com/find/-/find-0.2.9.tgz#4b73f1ff9e56ad91b76e716407fe5ffe6554bb8c"
|
||||||
|
integrity sha512-7a4/LCiInB9xYMnAUEjLilL9FKclwbwK7VlXw+h5jMvT2TDFeYFCHM24O1XdnC/on/hx8mxVO3FTQkyHZnOghQ==
|
||||||
|
dependencies:
|
||||||
|
traverse-chain "~0.1.0"
|
||||||
|
|
||||||
flat-cache@^3.0.4:
|
flat-cache@^3.0.4:
|
||||||
version "3.0.4"
|
version "3.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
|
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11"
|
||||||
@@ -3614,6 +3656,11 @@ jiti@^1.18.2:
|
|||||||
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
|
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd"
|
||||||
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
|
integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==
|
||||||
|
|
||||||
|
jiti@^1.21.0:
|
||||||
|
version "1.21.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
|
||||||
|
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
|
||||||
|
|
||||||
js-tokens@^4.0.0:
|
js-tokens@^4.0.0:
|
||||||
version "4.0.0"
|
version "4.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||||
@@ -3656,6 +3703,11 @@ json-stable-stringify-without-jsonify@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
|
||||||
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
|
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
|
||||||
|
|
||||||
|
json-stringify-safe@~5.0.0:
|
||||||
|
version "5.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
|
||||||
|
integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
|
||||||
|
|
||||||
json5@^1.0.2:
|
json5@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
|
resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593"
|
||||||
@@ -3779,6 +3831,11 @@ lru-cache@^6.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
yallist "^4.0.0"
|
yallist "^4.0.0"
|
||||||
|
|
||||||
|
lru-cache@~2.2.1:
|
||||||
|
version "2.2.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d"
|
||||||
|
integrity sha512-Q5pAgXs+WEAfoEdw2qKQhNFFhMoFMTYqRVKKUMnzuiR7oKFHS7fWo848cPcTKw+4j/IdN17NyzdhVKgabFV0EA==
|
||||||
|
|
||||||
magic-string@^0.30.0:
|
magic-string@^0.30.0:
|
||||||
version "0.30.0"
|
version "0.30.0"
|
||||||
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529"
|
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.0.tgz#fd58a4748c5c4547338a424e90fa5dd17f4de529"
|
||||||
@@ -4674,6 +4731,11 @@ regjsparser@^0.9.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
jsesc "~0.5.0"
|
jsesc "~0.5.0"
|
||||||
|
|
||||||
|
request-ip@~3.3.0:
|
||||||
|
version "3.3.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/request-ip/-/request-ip-3.3.0.tgz#863451e8fec03847d44f223e30a5d63e369fa611"
|
||||||
|
integrity sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA==
|
||||||
|
|
||||||
require-from-string@^2.0.2:
|
require-from-string@^2.0.2:
|
||||||
version "2.0.2"
|
version "2.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
|
||||||
@@ -4727,6 +4789,21 @@ rimraf@^3.0.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
glob "^7.1.3"
|
glob "^7.1.3"
|
||||||
|
|
||||||
|
rollbar@^2.26.4:
|
||||||
|
version "2.26.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/rollbar/-/rollbar-2.26.4.tgz#05e47d3b1f52ab6da9f88710ec66371a76cdc3c9"
|
||||||
|
integrity sha512-JKmrj6riYm9ZPJisgxljgH4uCsvjMHDHXrinDF7aAFaP+eoF51HomVPtLcDTYLsrJ568aKVNLUhedFajONBwSg==
|
||||||
|
dependencies:
|
||||||
|
async "~3.2.3"
|
||||||
|
console-polyfill "0.3.0"
|
||||||
|
error-stack-parser "^2.0.4"
|
||||||
|
json-stringify-safe "~5.0.0"
|
||||||
|
lru-cache "~2.2.1"
|
||||||
|
request-ip "~3.3.0"
|
||||||
|
source-map "^0.5.7"
|
||||||
|
optionalDependencies:
|
||||||
|
decache "^3.0.5"
|
||||||
|
|
||||||
run-parallel@^1.1.9:
|
run-parallel@^1.1.9:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
|
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
|
||||||
@@ -4969,6 +5046,11 @@ source-map-support@~0.5.20:
|
|||||||
buffer-from "^1.0.0"
|
buffer-from "^1.0.0"
|
||||||
source-map "^0.6.0"
|
source-map "^0.6.0"
|
||||||
|
|
||||||
|
source-map@^0.5.7:
|
||||||
|
version "0.5.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||||
|
integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
|
||||||
|
|
||||||
source-map@^0.6.0, source-map@^0.6.1:
|
source-map@^0.6.0, source-map@^0.6.1:
|
||||||
version "0.6.1"
|
version "0.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
@@ -4997,6 +5079,11 @@ spdy@^4.0.2:
|
|||||||
select-hose "^2.0.0"
|
select-hose "^2.0.0"
|
||||||
spdy-transport "^3.0.0"
|
spdy-transport "^3.0.0"
|
||||||
|
|
||||||
|
stackframe@^1.3.4:
|
||||||
|
version "1.3.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310"
|
||||||
|
integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==
|
||||||
|
|
||||||
statuses@2.0.1:
|
statuses@2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
|
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63"
|
||||||
@@ -5129,7 +5216,35 @@ svgo@^3.0.2:
|
|||||||
csso "^5.0.5"
|
csso "^5.0.5"
|
||||||
picocolors "^1.0.0"
|
picocolors "^1.0.0"
|
||||||
|
|
||||||
tailwindcss@^3, tailwindcss@^3.3.2:
|
tailwindcss@^3.1:
|
||||||
|
version "3.4.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.4.3.tgz#be48f5283df77dfced705451319a5dffb8621519"
|
||||||
|
integrity sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==
|
||||||
|
dependencies:
|
||||||
|
"@alloc/quick-lru" "^5.2.0"
|
||||||
|
arg "^5.0.2"
|
||||||
|
chokidar "^3.5.3"
|
||||||
|
didyoumean "^1.2.2"
|
||||||
|
dlv "^1.1.3"
|
||||||
|
fast-glob "^3.3.0"
|
||||||
|
glob-parent "^6.0.2"
|
||||||
|
is-glob "^4.0.3"
|
||||||
|
jiti "^1.21.0"
|
||||||
|
lilconfig "^2.1.0"
|
||||||
|
micromatch "^4.0.5"
|
||||||
|
normalize-path "^3.0.0"
|
||||||
|
object-hash "^3.0.0"
|
||||||
|
picocolors "^1.0.0"
|
||||||
|
postcss "^8.4.23"
|
||||||
|
postcss-import "^15.1.0"
|
||||||
|
postcss-js "^4.0.1"
|
||||||
|
postcss-load-config "^4.0.1"
|
||||||
|
postcss-nested "^6.0.1"
|
||||||
|
postcss-selector-parser "^6.0.11"
|
||||||
|
resolve "^1.22.2"
|
||||||
|
sucrase "^3.32.0"
|
||||||
|
|
||||||
|
tailwindcss@^3.3.2:
|
||||||
version "3.3.2"
|
version "3.3.2"
|
||||||
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3"
|
resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.2.tgz#2f9e35d715fdf0bbf674d90147a0684d7054a2d3"
|
||||||
integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==
|
integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==
|
||||||
@@ -5246,6 +5361,11 @@ totalist@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df"
|
resolved "https://registry.yarnpkg.com/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df"
|
||||||
integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
|
integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==
|
||||||
|
|
||||||
|
traverse-chain@~0.1.0:
|
||||||
|
version "0.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1"
|
||||||
|
integrity sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==
|
||||||
|
|
||||||
ts-interface-checker@^0.1.9:
|
ts-interface-checker@^0.1.9:
|
||||||
version "0.1.13"
|
version "0.1.13"
|
||||||
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
|
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
|
||||||
|
|||||||
Reference in new issue
Block a user