mirror of
https://github.com/docusealco/docuseal
synced 2026-11-13 07:52:32 -05:00
Compare commits
100
Commits
1.7.4
...
88776e7316
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
88776e7316 | ||
|
|
f669045362 | ||
|
|
68d3efbdba | ||
|
|
22d4833496 | ||
|
|
ff14caa9f7 | ||
|
|
05647135bc | ||
|
|
ae76c2a4a8 | ||
|
|
fb2b3d44fe | ||
|
|
3868557efd | ||
|
|
9bef28c8ba | ||
|
|
f25fd3b03d | ||
|
|
d1d7571ee4 | ||
|
|
6a298a068c | ||
|
|
d4aef79b68 | ||
|
|
05d578d88f | ||
|
|
8773b30b10 | ||
|
|
1b636c5878 | ||
|
|
46e948ab99 | ||
|
|
889103aa5e | ||
|
|
558a14a5f2 | ||
|
|
72bbdb38bf | ||
|
|
3975a03cb4 | ||
|
|
e398327fb7 | ||
|
|
9266694d65 | ||
|
|
350c4b1c2a | ||
|
|
c3a933d87d | ||
|
|
970e53a5a3 | ||
|
|
520bac2ec7 | ||
|
|
e1eddd31c4 | ||
|
|
3c616a824c | ||
|
|
90d86b58c2 | ||
|
|
4332b4ebb8 | ||
|
|
e2f930f6f7 | ||
|
|
c303159c63 | ||
|
|
c1ce2bec00 | ||
|
|
3d2046f227 | ||
|
|
babaf1aa48 | ||
|
|
3f03d343ca | ||
|
|
110cdb5123 | ||
|
|
440d1114be | ||
|
|
9032517d4e | ||
|
|
7c71fefc47 | ||
|
|
e8bd8ff76f | ||
|
|
fed420cae1 | ||
|
|
910490528d | ||
|
|
ab810be250 | ||
|
|
178ee47093 | ||
|
|
6f90147a11 | ||
|
|
3ebaacbb7a | ||
|
|
64b39b53a2 | ||
|
|
2948910c25 | ||
|
|
1d20c79cf4 | ||
|
|
48f3b13f3e | ||
|
|
1fc1e9af16 | ||
|
|
ce70016603 | ||
|
|
e0e79e343d | ||
|
|
6568f81ee9 | ||
|
|
386f130d7a | ||
|
|
3ee41975fd | ||
|
|
d9f314898b | ||
|
|
4fc7412cac | ||
|
|
9adbfc52c2 | ||
|
|
1ad8d9196a | ||
|
|
e9172392b5 | ||
|
|
d6d94de328 | ||
|
|
77261f457c | ||
|
|
c258915031 | ||
|
|
c1db8bdd3b | ||
|
|
c700484ce8 | ||
|
|
b62bd200ed | ||
|
|
a164fe8dd8 | ||
|
|
bb40e872b3 | ||
|
|
bab80e9488 | ||
|
|
d090d79ebf | ||
|
|
2299ba4e29 | ||
|
|
d6474f0e6e | ||
|
|
e0a297cf81 | ||
|
|
40f5fa4217 | ||
|
|
94e552d170 | ||
|
|
cf1b0a4c16 | ||
|
|
9aa0a8ecbf | ||
|
|
fd4bef1706 | ||
|
|
d32b0e6d20 | ||
|
|
4a846be214 | ||
|
|
3dd3877ea9 | ||
|
|
b4dba0d809 | ||
|
|
dea80a82d8 | ||
|
|
eefa994724 | ||
|
|
35cce24539 | ||
|
|
e6c8203959 | ||
|
|
9479771fc8 | ||
|
|
711427521c | ||
|
|
5dae742361 | ||
|
|
d8ccd4beee | ||
|
|
c532a0115d | ||
|
|
c9c3364764 | ||
|
|
1ff23d7c40 | ||
|
|
95e9b34033 | ||
|
|
6b42dcf91b | ||
|
|
28962c949b |
No files matched your search
+1
-1
@@ -66,7 +66,7 @@ RSpec/ExampleLength:
|
|||||||
Max: 40
|
Max: 40
|
||||||
|
|
||||||
RSpec/MultipleMemoizedHelpers:
|
RSpec/MultipleMemoizedHelpers:
|
||||||
Max: 6
|
Max: 9
|
||||||
|
|
||||||
Metrics/BlockNesting:
|
Metrics/BlockNesting:
|
||||||
Max: 4
|
Max: 4
|
||||||
|
|||||||
+2
-2
@@ -41,7 +41,7 @@ ENV OPENSSL_CONF=/app/openssl_legacy.cnf
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
RUN apk add --no-cache sqlite-dev libpq-dev mariadb-dev vips-dev vips-poppler poppler-utils redis vips-heif gcompat ttf-freefont && mkdir /fonts && rm /usr/share/fonts/freefont/FreeSans.otf
|
RUN echo '@edge https://dl-cdn.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && apk add --no-cache sqlite-dev libpq-dev mariadb-dev vips-dev vips-poppler poppler-utils redis libheif@edge vips-heif gcompat ttf-freefont && mkdir /fonts && rm /usr/share/fonts/freefont/FreeSans.otf
|
||||||
|
|
||||||
RUN echo $'.include = /etc/ssl/openssl.cnf\n\
|
RUN echo $'.include = /etc/ssl/openssl.cnf\n\
|
||||||
\n\
|
\n\
|
||||||
@@ -57,7 +57,7 @@ activate = 1' >> /app/openssl_legacy.cnf
|
|||||||
|
|
||||||
COPY ./Gemfile ./Gemfile.lock ./
|
COPY ./Gemfile ./Gemfile.lock ./
|
||||||
|
|
||||||
RUN apk add --no-cache build-base && bundle install && apk del build-base && rm -rf ~/.bundle /usr/local/bundle/cache && ruby -e "puts Dir['/usr/local/bundle/**/{spec,rdoc,resources/shared,resources/collation,resources/locales}']" | xargs rm -rf
|
RUN apk add --no-cache build-base && bundle install && apk del --no-cache build-base && rm -rf ~/.bundle /usr/local/bundle/cache && ruby -e "puts Dir['/usr/local/bundle/**/{spec,rdoc,resources/shared,resources/collation,resources/locales}']" | xargs rm -rf
|
||||||
|
|
||||||
COPY ./bin ./bin
|
COPY ./bin ./bin
|
||||||
COPY ./app ./app
|
COPY ./app ./app
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ gem 'image_processing'
|
|||||||
gem 'jwt'
|
gem 'jwt'
|
||||||
gem 'lograge'
|
gem 'lograge'
|
||||||
gem 'mysql2', require: false
|
gem 'mysql2', require: false
|
||||||
gem 'net-smtp', '0.4.0'
|
|
||||||
gem 'oj'
|
gem 'oj'
|
||||||
gem 'pagy'
|
gem 'pagy'
|
||||||
gem 'pg', require: false
|
gem 'pg', require: false
|
||||||
@@ -40,7 +39,7 @@ gem 'ruby-vips'
|
|||||||
gem 'rubyXL'
|
gem 'rubyXL'
|
||||||
gem 'shakapacker'
|
gem 'shakapacker'
|
||||||
gem 'sidekiq'
|
gem 'sidekiq'
|
||||||
gem 'sqlite3', require: false, force_ruby_platform: true
|
gem 'sqlite3', require: false
|
||||||
gem 'strip_attributes'
|
gem 'strip_attributes'
|
||||||
gem 'turbo-rails'
|
gem 'turbo-rails'
|
||||||
gem 'twitter_cldr', require: false
|
gem 'twitter_cldr', require: false
|
||||||
|
|||||||
+170
-164
@@ -1,105 +1,101 @@
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (7.1.3.4)
|
actioncable (7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
zeitwerk (~> 2.6)
|
zeitwerk (~> 2.6)
|
||||||
actionmailbox (7.1.3.4)
|
actionmailbox (7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
activejob (= 7.1.3.4)
|
activejob (= 7.2.1.1)
|
||||||
activerecord (= 7.1.3.4)
|
activerecord (= 7.2.1.1)
|
||||||
activestorage (= 7.1.3.4)
|
activestorage (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.8.0)
|
||||||
net-imap
|
actionmailer (7.2.1.1)
|
||||||
net-pop
|
actionpack (= 7.2.1.1)
|
||||||
net-smtp
|
actionview (= 7.2.1.1)
|
||||||
actionmailer (7.1.3.4)
|
activejob (= 7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
actionview (= 7.1.3.4)
|
mail (>= 2.8.0)
|
||||||
activejob (= 7.1.3.4)
|
|
||||||
activesupport (= 7.1.3.4)
|
|
||||||
mail (~> 2.5, >= 2.5.4)
|
|
||||||
net-imap
|
|
||||||
net-pop
|
|
||||||
net-smtp
|
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
actionpack (7.1.3.4)
|
actionpack (7.2.1.1)
|
||||||
actionview (= 7.1.3.4)
|
actionview (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
racc
|
racc
|
||||||
rack (>= 2.2.4)
|
rack (>= 2.2.4, < 3.2)
|
||||||
rack-session (>= 1.0.1)
|
rack-session (>= 1.0.1)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
actiontext (7.1.3.4)
|
useragent (~> 0.16)
|
||||||
actionpack (= 7.1.3.4)
|
actiontext (7.2.1.1)
|
||||||
activerecord (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
activestorage (= 7.1.3.4)
|
activerecord (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activestorage (= 7.2.1.1)
|
||||||
|
activesupport (= 7.2.1.1)
|
||||||
globalid (>= 0.6.0)
|
globalid (>= 0.6.0)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (7.1.3.4)
|
actionview (7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.11)
|
erubi (~> 1.11)
|
||||||
rails-dom-testing (~> 2.2)
|
rails-dom-testing (~> 2.2)
|
||||||
rails-html-sanitizer (~> 1.6)
|
rails-html-sanitizer (~> 1.6)
|
||||||
activejob (7.1.3.4)
|
activejob (7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (7.1.3.4)
|
activemodel (7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
activerecord (7.1.3.4)
|
activerecord (7.2.1.1)
|
||||||
activemodel (= 7.1.3.4)
|
activemodel (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
timeout (>= 0.4.0)
|
timeout (>= 0.4.0)
|
||||||
activestorage (7.1.3.4)
|
activestorage (7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
activejob (= 7.1.3.4)
|
activejob (= 7.2.1.1)
|
||||||
activerecord (= 7.1.3.4)
|
activerecord (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
activesupport (7.1.3.4)
|
activesupport (7.2.1.1)
|
||||||
base64
|
base64
|
||||||
bigdecimal
|
bigdecimal
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.3.1)
|
||||||
connection_pool (>= 2.2.5)
|
connection_pool (>= 2.2.5)
|
||||||
drb
|
drb
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
|
logger (>= 1.4.2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
mutex_m
|
securerandom (>= 0.3)
|
||||||
tzinfo (~> 2.0)
|
tzinfo (~> 2.0, >= 2.0.5)
|
||||||
addressable (2.8.6)
|
addressable (2.8.7)
|
||||||
public_suffix (>= 2.0.2, < 6.0)
|
public_suffix (>= 2.0.2, < 7.0)
|
||||||
annotate (3.2.0)
|
annotate (3.2.0)
|
||||||
activerecord (>= 3.2, < 8.0)
|
activerecord (>= 3.2, < 8.0)
|
||||||
rake (>= 10.4, < 14.0)
|
rake (>= 10.4, < 14.0)
|
||||||
arabic-letter-connector (0.1.1)
|
arabic-letter-connector (0.1.1)
|
||||||
ast (2.4.2)
|
ast (2.4.2)
|
||||||
aws-eventstream (1.3.0)
|
aws-eventstream (1.3.0)
|
||||||
aws-partitions (1.913.0)
|
aws-partitions (1.985.0)
|
||||||
aws-sdk-core (3.191.6)
|
aws-sdk-core (3.209.1)
|
||||||
aws-eventstream (~> 1, >= 1.3.0)
|
aws-eventstream (~> 1, >= 1.3.0)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.651.0)
|
||||||
aws-sigv4 (~> 1.8)
|
aws-sigv4 (~> 1.9)
|
||||||
jmespath (~> 1, >= 1.6.1)
|
jmespath (~> 1, >= 1.6.1)
|
||||||
aws-sdk-kms (1.79.0)
|
aws-sdk-kms (1.94.0)
|
||||||
aws-sdk-core (~> 3, >= 3.191.0)
|
aws-sdk-core (~> 3, >= 3.207.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-s3 (1.146.1)
|
aws-sdk-s3 (1.167.0)
|
||||||
aws-sdk-core (~> 3, >= 3.191.0)
|
aws-sdk-core (~> 3, >= 3.207.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.8)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sdk-secretsmanager (1.91.0)
|
aws-sdk-secretsmanager (1.108.0)
|
||||||
aws-sdk-core (~> 3, >= 3.191.0)
|
aws-sdk-core (~> 3, >= 3.207.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.5)
|
||||||
aws-sigv4 (1.8.0)
|
aws-sigv4 (1.10.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
azure-storage-blob (2.0.3)
|
azure-storage-blob (2.0.3)
|
||||||
azure-storage-common (~> 2.0)
|
azure-storage-common (~> 2.0)
|
||||||
@@ -120,14 +116,14 @@ GEM
|
|||||||
smart_properties
|
smart_properties
|
||||||
bigdecimal (3.1.8)
|
bigdecimal (3.1.8)
|
||||||
bindex (0.8.1)
|
bindex (0.8.1)
|
||||||
bootsnap (1.18.3)
|
bootsnap (1.18.4)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
builder (3.3.0)
|
builder (3.3.0)
|
||||||
bullet (7.1.6)
|
bullet (7.2.0)
|
||||||
activesupport (>= 3.0.0)
|
activesupport (>= 3.0.0)
|
||||||
uniform_notifier (~> 1.11)
|
uniform_notifier (~> 1.11)
|
||||||
camertron-eprun (1.1.1)
|
camertron-eprun (1.1.1)
|
||||||
cancancan (3.5.0)
|
cancancan (3.6.1)
|
||||||
capybara (3.40.0)
|
capybara (3.40.0)
|
||||||
addressable
|
addressable
|
||||||
matrix
|
matrix
|
||||||
@@ -137,7 +133,8 @@ GEM
|
|||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
regexp_parser (>= 1.5, < 3.0)
|
regexp_parser (>= 1.5, < 3.0)
|
||||||
xpath (~> 3.2)
|
xpath (~> 3.2)
|
||||||
childprocess (5.0.0)
|
childprocess (5.1.0)
|
||||||
|
logger (~> 1.5)
|
||||||
chunky_png (1.4.0)
|
chunky_png (1.4.0)
|
||||||
cldr-plurals-runtime-rb (1.1.0)
|
cldr-plurals-runtime-rb (1.1.0)
|
||||||
cmdparse (3.0.7)
|
cmdparse (3.0.7)
|
||||||
@@ -148,12 +145,12 @@ GEM
|
|||||||
bigdecimal
|
bigdecimal
|
||||||
rexml
|
rexml
|
||||||
crass (1.0.6)
|
crass (1.0.6)
|
||||||
css_parser (1.17.1)
|
css_parser (1.19.0)
|
||||||
addressable
|
addressable
|
||||||
csv (3.3.0)
|
csv (3.3.0)
|
||||||
cuprite (0.15)
|
cuprite (0.15.1)
|
||||||
capybara (~> 3.0)
|
capybara (~> 3.0)
|
||||||
ferrum (~> 0.14.0)
|
ferrum (~> 0.15.0)
|
||||||
date (3.3.4)
|
date (3.3.4)
|
||||||
debug (1.9.2)
|
debug (1.9.2)
|
||||||
irb (~> 1.10)
|
irb (~> 1.10)
|
||||||
@@ -173,26 +170,26 @@ GEM
|
|||||||
diff-lcs (1.5.1)
|
diff-lcs (1.5.1)
|
||||||
digest-crc (0.6.5)
|
digest-crc (0.6.5)
|
||||||
rake (>= 12.0.0, < 14.0.0)
|
rake (>= 12.0.0, < 14.0.0)
|
||||||
docile (1.4.0)
|
docile (1.4.1)
|
||||||
dotenv (3.1.0)
|
dotenv (3.1.4)
|
||||||
drb (2.2.1)
|
drb (2.2.1)
|
||||||
email_typo (0.2.3)
|
email_typo (0.2.3)
|
||||||
erb_lint (0.5.0)
|
erb_lint (0.6.0)
|
||||||
activesupport
|
activesupport
|
||||||
better_html (>= 2.0.1)
|
better_html (>= 2.0.1)
|
||||||
parser (>= 2.7.1.4)
|
parser (>= 2.7.1.4)
|
||||||
rainbow
|
rainbow
|
||||||
rubocop
|
rubocop (>= 1)
|
||||||
smart_properties
|
smart_properties
|
||||||
erubi (1.13.0)
|
erubi (1.13.0)
|
||||||
factory_bot (6.4.6)
|
factory_bot (6.5.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
factory_bot_rails (6.4.3)
|
factory_bot_rails (6.4.3)
|
||||||
factory_bot (~> 6.4)
|
factory_bot (~> 6.4)
|
||||||
railties (>= 5.0.0)
|
railties (>= 5.0.0)
|
||||||
faker (3.3.1)
|
faker (3.4.2)
|
||||||
i18n (>= 1.8.11, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.10.3)
|
faraday (1.10.4)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
faraday-em_synchrony (~> 1.0)
|
faraday-em_synchrony (~> 1.0)
|
||||||
faraday-excon (~> 1.1)
|
faraday-excon (~> 1.1)
|
||||||
@@ -212,58 +209,60 @@ GEM
|
|||||||
faraday-httpclient (1.0.1)
|
faraday-httpclient (1.0.1)
|
||||||
faraday-multipart (1.0.4)
|
faraday-multipart (1.0.4)
|
||||||
multipart-post (~> 2)
|
multipart-post (~> 2)
|
||||||
faraday-net_http (1.0.1)
|
faraday-net_http (1.0.2)
|
||||||
faraday-net_http_persistent (1.2.0)
|
faraday-net_http_persistent (1.2.0)
|
||||||
faraday-patron (1.0.0)
|
faraday-patron (1.0.0)
|
||||||
faraday-rack (1.0.0)
|
faraday-rack (1.0.0)
|
||||||
faraday-retry (1.0.3)
|
faraday-retry (1.0.3)
|
||||||
faraday_middleware (1.2.0)
|
faraday_middleware (1.2.1)
|
||||||
faraday (~> 1.0)
|
faraday (~> 1.0)
|
||||||
ferrum (0.14)
|
ferrum (0.15)
|
||||||
addressable (~> 2.5)
|
addressable (~> 2.5)
|
||||||
concurrent-ruby (~> 1.1)
|
concurrent-ruby (~> 1.1)
|
||||||
webrick (~> 1.7)
|
webrick (~> 1.7)
|
||||||
websocket-driver (>= 0.6, < 0.8)
|
websocket-driver (~> 0.7)
|
||||||
ffi (1.16.3)
|
ffi (1.17.0)
|
||||||
|
ffi (1.17.0-aarch64-linux-gnu)
|
||||||
|
ffi (1.17.0-x86_64-linux-gnu)
|
||||||
geom2d (0.4.1)
|
geom2d (0.4.1)
|
||||||
globalid (1.2.1)
|
globalid (1.2.1)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 6.1)
|
||||||
google-apis-core (0.14.1)
|
google-apis-core (0.15.1)
|
||||||
addressable (~> 2.5, >= 2.5.1)
|
addressable (~> 2.5, >= 2.5.1)
|
||||||
googleauth (~> 1.9)
|
googleauth (~> 1.9)
|
||||||
httpclient (>= 2.8.1, < 3.a)
|
httpclient (>= 2.8.3, < 3.a)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
|
mutex_m
|
||||||
representable (~> 3.0)
|
representable (~> 3.0)
|
||||||
retriable (>= 2.0, < 4.a)
|
retriable (>= 2.0, < 4.a)
|
||||||
rexml
|
google-apis-iamcredentials_v1 (0.21.0)
|
||||||
google-apis-iamcredentials_v1 (0.20.0)
|
google-apis-core (>= 0.15.0, < 2.a)
|
||||||
google-apis-core (>= 0.14.0, < 2.a)
|
google-apis-storage_v1 (0.46.0)
|
||||||
google-apis-storage_v1 (0.37.0)
|
google-apis-core (>= 0.15.0, < 2.a)
|
||||||
google-apis-core (>= 0.14.0, < 2.a)
|
google-cloud-core (1.7.1)
|
||||||
google-cloud-core (1.7.0)
|
|
||||||
google-cloud-env (>= 1.0, < 3.a)
|
google-cloud-env (>= 1.0, < 3.a)
|
||||||
google-cloud-errors (~> 1.0)
|
google-cloud-errors (~> 1.0)
|
||||||
google-cloud-env (2.1.1)
|
google-cloud-env (2.2.1)
|
||||||
faraday (>= 1.0, < 3.a)
|
faraday (>= 1.0, < 3.a)
|
||||||
google-cloud-errors (1.4.0)
|
google-cloud-errors (1.4.0)
|
||||||
google-cloud-storage (1.49.0)
|
google-cloud-storage (1.52.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
digest-crc (~> 0.4)
|
digest-crc (~> 0.4)
|
||||||
google-apis-core (~> 0.13)
|
google-apis-core (~> 0.13)
|
||||||
google-apis-iamcredentials_v1 (~> 0.18)
|
google-apis-iamcredentials_v1 (~> 0.18)
|
||||||
google-apis-storage_v1 (~> 0.33)
|
google-apis-storage_v1 (~> 0.38)
|
||||||
google-cloud-core (~> 1.6)
|
google-cloud-core (~> 1.6)
|
||||||
googleauth (~> 1.9)
|
googleauth (~> 1.9)
|
||||||
mini_mime (~> 1.0)
|
mini_mime (~> 1.0)
|
||||||
googleauth (1.11.0)
|
googleauth (1.11.1)
|
||||||
faraday (>= 1.0, < 3.a)
|
faraday (>= 1.0, < 3.a)
|
||||||
google-cloud-env (~> 2.1)
|
google-cloud-env (~> 2.1)
|
||||||
jwt (>= 1.4, < 3.0)
|
jwt (>= 1.4, < 3.0)
|
||||||
multi_json (~> 1.11)
|
multi_json (~> 1.11)
|
||||||
os (>= 0.9, < 2.0)
|
os (>= 0.9, < 2.0)
|
||||||
signet (>= 0.16, < 2.a)
|
signet (>= 0.16, < 2.a)
|
||||||
hashdiff (1.1.0)
|
hashdiff (1.1.1)
|
||||||
hexapdf (0.42.0)
|
hexapdf (0.47.0)
|
||||||
cmdparse (~> 3.0, >= 3.0.3)
|
cmdparse (~> 3.0, >= 3.0.3)
|
||||||
geom2d (~> 0.4, >= 0.4.1)
|
geom2d (~> 0.4, >= 0.4.1)
|
||||||
openssl (>= 2.2.1)
|
openssl (>= 2.2.1)
|
||||||
@@ -271,28 +270,29 @@ GEM
|
|||||||
httpclient (2.8.3)
|
httpclient (2.8.3)
|
||||||
i18n (1.14.6)
|
i18n (1.14.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
image_processing (1.12.2)
|
image_processing (1.13.0)
|
||||||
mini_magick (>= 4.9.5, < 5)
|
mini_magick (>= 4.9.5, < 5)
|
||||||
ruby-vips (>= 2.0.17, < 3)
|
ruby-vips (>= 2.0.17, < 3)
|
||||||
io-console (0.7.2)
|
io-console (0.7.2)
|
||||||
irb (1.14.0)
|
irb (1.14.1)
|
||||||
rdoc (>= 4.0.0)
|
rdoc (>= 4.0.0)
|
||||||
reline (>= 0.4.2)
|
reline (>= 0.4.2)
|
||||||
jmespath (1.6.2)
|
jmespath (1.6.2)
|
||||||
json (2.7.2)
|
json (2.7.2)
|
||||||
jwt (2.8.1)
|
jwt (2.9.3)
|
||||||
base64
|
base64
|
||||||
language_server-protocol (3.17.0.3)
|
language_server-protocol (3.17.0.3)
|
||||||
launchy (3.0.0)
|
launchy (3.0.1)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
childprocess (~> 5.0)
|
childprocess (~> 5.0)
|
||||||
letter_opener (1.10.0)
|
letter_opener (1.10.0)
|
||||||
launchy (>= 2.2, < 4)
|
launchy (>= 2.2, < 4)
|
||||||
letter_opener_web (2.0.0)
|
letter_opener_web (3.0.0)
|
||||||
actionmailer (>= 5.2)
|
actionmailer (>= 6.1)
|
||||||
letter_opener (~> 1.7)
|
letter_opener (~> 1.9)
|
||||||
railties (>= 5.2)
|
railties (>= 6.1)
|
||||||
rexml
|
rexml
|
||||||
|
logger (1.6.1)
|
||||||
lograge (0.14.0)
|
lograge (0.14.0)
|
||||||
actionpack (>= 4)
|
actionpack (>= 4)
|
||||||
activesupport (>= 4)
|
activesupport (>= 4)
|
||||||
@@ -309,25 +309,25 @@ GEM
|
|||||||
marcel (1.0.4)
|
marcel (1.0.4)
|
||||||
matrix (0.4.2)
|
matrix (0.4.2)
|
||||||
method_source (1.1.0)
|
method_source (1.1.0)
|
||||||
mini_magick (4.12.0)
|
mini_magick (4.13.2)
|
||||||
mini_mime (1.1.5)
|
mini_mime (1.1.5)
|
||||||
mini_portile2 (2.8.7)
|
mini_portile2 (2.8.7)
|
||||||
minitest (5.25.1)
|
minitest (5.25.1)
|
||||||
msgpack (1.7.2)
|
msgpack (1.7.3)
|
||||||
multi_json (1.15.0)
|
multi_json (1.15.0)
|
||||||
multipart-post (2.4.0)
|
multipart-post (2.4.1)
|
||||||
mutex_m (0.2.0)
|
mutex_m (0.2.0)
|
||||||
mysql2 (0.5.6)
|
mysql2 (0.5.6)
|
||||||
net-http-persistent (4.0.2)
|
net-http-persistent (4.0.4)
|
||||||
connection_pool (~> 2.2)
|
connection_pool (~> 2.2)
|
||||||
net-imap (0.4.14)
|
net-imap (0.4.17)
|
||||||
date
|
date
|
||||||
net-protocol
|
net-protocol
|
||||||
net-pop (0.1.2)
|
net-pop (0.1.2)
|
||||||
net-protocol
|
net-protocol
|
||||||
net-protocol (0.2.2)
|
net-protocol (0.2.2)
|
||||||
timeout
|
timeout
|
||||||
net-smtp (0.4.0)
|
net-smtp (0.5.0)
|
||||||
net-protocol
|
net-protocol
|
||||||
nio4r (2.7.3)
|
nio4r (2.7.3)
|
||||||
nokogiri (1.16.7)
|
nokogiri (1.16.7)
|
||||||
@@ -337,21 +337,23 @@ GEM
|
|||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nokogiri (1.16.7-x86_64-linux)
|
nokogiri (1.16.7-x86_64-linux)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
oj (3.16.3)
|
oj (3.16.6)
|
||||||
bigdecimal (>= 3.0)
|
bigdecimal (>= 3.0)
|
||||||
|
ostruct (>= 0.2)
|
||||||
openssl (3.2.0)
|
openssl (3.2.0)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
os (1.1.4)
|
os (1.1.4)
|
||||||
|
ostruct (0.6.0)
|
||||||
package_json (0.1.0)
|
package_json (0.1.0)
|
||||||
pagy (8.1.2)
|
pagy (9.1.0)
|
||||||
parallel (1.26.3)
|
parallel (1.26.3)
|
||||||
parser (3.3.5.0)
|
parser (3.3.5.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
racc
|
racc
|
||||||
pg (1.5.6)
|
pg (1.5.8)
|
||||||
premailer (1.23.0)
|
premailer (1.27.0)
|
||||||
addressable
|
addressable
|
||||||
css_parser (>= 1.12.0)
|
css_parser (>= 1.19.0)
|
||||||
htmlentities (>= 4.0.0)
|
htmlentities (>= 4.0.0)
|
||||||
premailer-rails (1.12.0)
|
premailer-rails (1.12.0)
|
||||||
actionmailer (>= 3)
|
actionmailer (>= 3)
|
||||||
@@ -362,15 +364,15 @@ GEM
|
|||||||
pry (0.14.2)
|
pry (0.14.2)
|
||||||
coderay (~> 1.1)
|
coderay (~> 1.1)
|
||||||
method_source (~> 1.0)
|
method_source (~> 1.0)
|
||||||
pry-rails (0.3.9)
|
pry-rails (0.3.11)
|
||||||
pry (>= 0.10.4)
|
pry (>= 0.13.0)
|
||||||
psych (5.1.2)
|
psych (5.1.2)
|
||||||
stringio
|
stringio
|
||||||
public_suffix (5.0.5)
|
public_suffix (6.0.1)
|
||||||
puma (6.4.3)
|
puma (6.4.3)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
racc (1.8.1)
|
racc (1.8.1)
|
||||||
rack (3.1.7)
|
rack (3.1.8)
|
||||||
rack-proxy (0.7.7)
|
rack-proxy (0.7.7)
|
||||||
rack
|
rack
|
||||||
rack-session (2.0.0)
|
rack-session (2.0.0)
|
||||||
@@ -380,20 +382,20 @@ GEM
|
|||||||
rackup (2.1.0)
|
rackup (2.1.0)
|
||||||
rack (>= 3)
|
rack (>= 3)
|
||||||
webrick (~> 1.8)
|
webrick (~> 1.8)
|
||||||
rails (7.1.3.4)
|
rails (7.2.1.1)
|
||||||
actioncable (= 7.1.3.4)
|
actioncable (= 7.2.1.1)
|
||||||
actionmailbox (= 7.1.3.4)
|
actionmailbox (= 7.2.1.1)
|
||||||
actionmailer (= 7.1.3.4)
|
actionmailer (= 7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
actiontext (= 7.1.3.4)
|
actiontext (= 7.2.1.1)
|
||||||
actionview (= 7.1.3.4)
|
actionview (= 7.2.1.1)
|
||||||
activejob (= 7.1.3.4)
|
activejob (= 7.2.1.1)
|
||||||
activemodel (= 7.1.3.4)
|
activemodel (= 7.2.1.1)
|
||||||
activerecord (= 7.1.3.4)
|
activerecord (= 7.2.1.1)
|
||||||
activestorage (= 7.1.3.4)
|
activestorage (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 7.1.3.4)
|
railties (= 7.2.1.1)
|
||||||
rails-dom-testing (2.2.0)
|
rails-dom-testing (2.2.0)
|
||||||
activesupport (>= 5.0.0)
|
activesupport (>= 5.0.0)
|
||||||
minitest
|
minitest
|
||||||
@@ -408,10 +410,10 @@ GEM
|
|||||||
actionview (> 3.1)
|
actionview (> 3.1)
|
||||||
activesupport (> 3.1)
|
activesupport (> 3.1)
|
||||||
railties (> 3.1)
|
railties (> 3.1)
|
||||||
railties (7.1.3.4)
|
railties (7.2.1.1)
|
||||||
actionpack (= 7.1.3.4)
|
actionpack (= 7.2.1.1)
|
||||||
activesupport (= 7.1.3.4)
|
activesupport (= 7.2.1.1)
|
||||||
irb
|
irb (~> 1.13)
|
||||||
rackup (>= 1.0.0)
|
rackup (>= 1.0.0)
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0, >= 1.2.2)
|
thor (~> 1.0, >= 1.2.2)
|
||||||
@@ -429,30 +431,30 @@ GEM
|
|||||||
declarative (< 0.1.0)
|
declarative (< 0.1.0)
|
||||||
trailblazer-option (>= 0.1.1, < 0.2.0)
|
trailblazer-option (>= 0.1.1, < 0.2.0)
|
||||||
uber (< 0.2.0)
|
uber (< 0.2.0)
|
||||||
request_store (1.6.0)
|
request_store (1.7.0)
|
||||||
rack (>= 1.4)
|
rack (>= 1.4)
|
||||||
responders (3.1.1)
|
responders (3.1.1)
|
||||||
actionpack (>= 5.2)
|
actionpack (>= 5.2)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
retriable (3.1.2)
|
retriable (3.1.2)
|
||||||
rexml (3.3.8)
|
rexml (3.3.9)
|
||||||
rotp (6.3.0)
|
rotp (6.3.0)
|
||||||
rqrcode (2.2.0)
|
rqrcode (2.2.0)
|
||||||
chunky_png (~> 1.0)
|
chunky_png (~> 1.0)
|
||||||
rqrcode_core (~> 1.0)
|
rqrcode_core (~> 1.0)
|
||||||
rqrcode_core (1.2.0)
|
rqrcode_core (1.2.0)
|
||||||
rspec-core (3.13.0)
|
rspec-core (3.13.1)
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-expectations (3.13.0)
|
rspec-expectations (3.13.3)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-mocks (3.13.0)
|
rspec-mocks (3.13.2)
|
||||||
diff-lcs (>= 1.2.0, < 2.0)
|
diff-lcs (>= 1.2.0, < 2.0)
|
||||||
rspec-support (~> 3.13.0)
|
rspec-support (~> 3.13.0)
|
||||||
rspec-rails (6.1.2)
|
rspec-rails (7.0.1)
|
||||||
actionpack (>= 6.1)
|
actionpack (>= 7.0)
|
||||||
activesupport (>= 6.1)
|
activesupport (>= 7.0)
|
||||||
railties (>= 6.1)
|
railties (>= 7.0)
|
||||||
rspec-core (~> 3.13)
|
rspec-core (~> 3.13)
|
||||||
rspec-expectations (~> 3.13)
|
rspec-expectations (~> 3.13)
|
||||||
rspec-mocks (~> 3.13)
|
rspec-mocks (~> 3.13)
|
||||||
@@ -470,36 +472,39 @@ GEM
|
|||||||
unicode-display_width (>= 2.4.0, < 3.0)
|
unicode-display_width (>= 2.4.0, < 3.0)
|
||||||
rubocop-ast (1.32.3)
|
rubocop-ast (1.32.3)
|
||||||
parser (>= 3.3.1.0)
|
parser (>= 3.3.1.0)
|
||||||
rubocop-performance (1.21.0)
|
rubocop-performance (1.22.1)
|
||||||
rubocop (>= 1.48.1, < 2.0)
|
rubocop (>= 1.48.1, < 2.0)
|
||||||
rubocop-ast (>= 1.31.1, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
rubocop-rails (2.24.1)
|
rubocop-rails (2.26.2)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
rack (>= 1.1)
|
rack (>= 1.1)
|
||||||
rubocop (>= 1.33.0, < 2.0)
|
rubocop (>= 1.52.0, < 2.0)
|
||||||
rubocop-ast (>= 1.31.1, < 2.0)
|
rubocop-ast (>= 1.31.1, < 2.0)
|
||||||
rubocop-rspec (3.0.3)
|
rubocop-rspec (3.1.0)
|
||||||
rubocop (~> 1.61)
|
rubocop (~> 1.61)
|
||||||
ruby-progressbar (1.13.0)
|
ruby-progressbar (1.13.0)
|
||||||
ruby-vips (2.2.1)
|
ruby-vips (2.2.2)
|
||||||
ffi (~> 1.12)
|
ffi (~> 1.12)
|
||||||
|
logger
|
||||||
ruby2_keywords (0.0.5)
|
ruby2_keywords (0.0.5)
|
||||||
rubyXL (3.4.27)
|
rubyXL (3.4.27)
|
||||||
nokogiri (>= 1.10.8)
|
nokogiri (>= 1.10.8)
|
||||||
rubyzip (>= 1.3.0)
|
rubyzip (>= 1.3.0)
|
||||||
rubyzip (2.3.2)
|
rubyzip (2.3.2)
|
||||||
|
securerandom (0.3.1)
|
||||||
semantic_range (3.0.0)
|
semantic_range (3.0.0)
|
||||||
shakapacker (8.0.0)
|
shakapacker (8.0.2)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
package_json
|
package_json
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
semantic_range (>= 2.3.0)
|
semantic_range (>= 2.3.0)
|
||||||
sidekiq (7.2.4)
|
sidekiq (7.3.2)
|
||||||
concurrent-ruby (< 2)
|
concurrent-ruby (< 2)
|
||||||
connection_pool (>= 2.3.0)
|
connection_pool (>= 2.3.0)
|
||||||
|
logger
|
||||||
rack (>= 2.2.4)
|
rack (>= 2.2.4)
|
||||||
redis-client (>= 0.19.0)
|
redis-client (>= 0.22.2)
|
||||||
signet (0.19.0)
|
signet (0.19.0)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
faraday (>= 0.17.5, < 3.a)
|
faraday (>= 0.17.5, < 3.a)
|
||||||
@@ -509,32 +514,34 @@ GEM
|
|||||||
docile (~> 1.1)
|
docile (~> 1.1)
|
||||||
simplecov-html (~> 0.11)
|
simplecov-html (~> 0.11)
|
||||||
simplecov_json_formatter (~> 0.1)
|
simplecov_json_formatter (~> 0.1)
|
||||||
simplecov-html (0.12.3)
|
simplecov-html (0.13.1)
|
||||||
simplecov_json_formatter (0.1.4)
|
simplecov_json_formatter (0.1.4)
|
||||||
smart_properties (1.17.0)
|
smart_properties (1.17.0)
|
||||||
sqlite3 (1.7.3)
|
sqlite3 (2.1.0)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
|
sqlite3 (2.1.0-aarch64-linux-gnu)
|
||||||
|
sqlite3 (2.1.0-x86_64-linux-gnu)
|
||||||
stringio (3.1.1)
|
stringio (3.1.1)
|
||||||
strip_attributes (1.13.0)
|
strip_attributes (1.13.0)
|
||||||
activemodel (>= 3.0, < 8.0)
|
activemodel (>= 3.0, < 8.0)
|
||||||
thor (1.3.2)
|
thor (1.3.2)
|
||||||
timeout (0.4.1)
|
timeout (0.4.1)
|
||||||
trailblazer-option (0.1.2)
|
trailblazer-option (0.1.2)
|
||||||
turbo-rails (2.0.5)
|
turbo-rails (2.0.10)
|
||||||
actionpack (>= 6.0.0)
|
actionpack (>= 6.0.0)
|
||||||
activejob (>= 6.0.0)
|
|
||||||
railties (>= 6.0.0)
|
railties (>= 6.0.0)
|
||||||
twitter_cldr (6.12.0)
|
twitter_cldr (6.12.1)
|
||||||
camertron-eprun
|
camertron-eprun
|
||||||
cldr-plurals-runtime-rb (~> 1.1)
|
cldr-plurals-runtime-rb (~> 1.1)
|
||||||
tzinfo
|
tzinfo
|
||||||
tzinfo (2.0.6)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
tzinfo-data (1.2024.1)
|
tzinfo-data (1.2024.2)
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
uber (0.1.0)
|
uber (0.1.0)
|
||||||
unicode-display_width (2.6.0)
|
unicode-display_width (2.6.0)
|
||||||
uniform_notifier (1.16.0)
|
uniform_notifier (1.16.0)
|
||||||
|
useragent (0.16.10)
|
||||||
warden (1.2.9)
|
warden (1.2.9)
|
||||||
rack (>= 2.0.9)
|
rack (>= 2.0.9)
|
||||||
web-console (4.2.1)
|
web-console (4.2.1)
|
||||||
@@ -542,17 +549,17 @@ GEM
|
|||||||
activemodel (>= 6.0.0)
|
activemodel (>= 6.0.0)
|
||||||
bindex (>= 0.4.0)
|
bindex (>= 0.4.0)
|
||||||
railties (>= 6.0.0)
|
railties (>= 6.0.0)
|
||||||
webmock (3.23.0)
|
webmock (3.24.0)
|
||||||
addressable (>= 2.8.0)
|
addressable (>= 2.8.0)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
webrick (1.8.1)
|
webrick (1.8.2)
|
||||||
websocket-driver (0.7.6)
|
websocket-driver (0.7.6)
|
||||||
websocket-extensions (>= 0.1.0)
|
websocket-extensions (>= 0.1.0)
|
||||||
websocket-extensions (0.1.5)
|
websocket-extensions (0.1.5)
|
||||||
xpath (3.2.0)
|
xpath (3.2.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
zeitwerk (2.6.18)
|
zeitwerk (2.7.0)
|
||||||
|
|
||||||
PLATFORMS
|
PLATFORMS
|
||||||
aarch64-linux
|
aarch64-linux
|
||||||
@@ -589,7 +596,6 @@ DEPENDENCIES
|
|||||||
letter_opener_web
|
letter_opener_web
|
||||||
lograge
|
lograge
|
||||||
mysql2
|
mysql2
|
||||||
net-smtp (= 0.4.0)
|
|
||||||
oj
|
oj
|
||||||
pagy
|
pagy
|
||||||
pg
|
pg
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<h1 align="center" style="border-bottom: none">
|
<h1 align="center" style="border-bottom: none">
|
||||||
<div>
|
<div>
|
||||||
<a href="https://www.docuseal.co">
|
<a href="https://www.docuseal.com">
|
||||||
<img alt="DocuSeal" src="https://github.com/docusealco/docuseal/assets/5418788/c12cd051-81cd-4402-bc3a-92f2cfdc1b06" width="80" />
|
<img alt="DocuSeal" src="https://github.com/docusealco/docuseal/assets/5418788/c12cd051-81cd-4402-bc3a-92f2cfdc1b06" width="80" />
|
||||||
<br>
|
<br>
|
||||||
</a>
|
</a>
|
||||||
@@ -25,12 +25,12 @@
|
|||||||
DocuSeal is an open source platform that provides secure and efficient digital document signing and processing. Create PDF forms to have them filled and signed online on any device with an easy-to-use, mobile-optimized web tool.
|
DocuSeal is an open source platform that provides secure and efficient digital document signing and processing. Create PDF forms to have them filled and signed online on any device with an easy-to-use, mobile-optimized web tool.
|
||||||
</p>
|
</p>
|
||||||
<h2 align="center">
|
<h2 align="center">
|
||||||
<a href="https://demo.docuseal.co">✨ Live Demo</a>
|
<a href="https://demo.docuseal.tech">✨ Live Demo</a>
|
||||||
<span>|</span>
|
<span>|</span>
|
||||||
<a href="https://docuseal.co/sign_up">☁️ Try in Cloud</a>
|
<a href="https://docuseal.com/sign_up">☁️ Try in Cloud</a>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
[](https://demo.docuseal.co)
|
[](https://demo.docuseal.tech)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- PDF form fields builder (WYSIWYG)
|
- PDF form fields builder (WYSIWYG)
|
||||||
@@ -54,11 +54,11 @@ DocuSeal is an open source platform that provides secure and efficient digital d
|
|||||||
- Conditional fields and formulas
|
- Conditional fields and formulas
|
||||||
- Bulk send with CSV, XLSX spreadsheet import
|
- Bulk send with CSV, XLSX spreadsheet import
|
||||||
- SSO / SAML
|
- SSO / SAML
|
||||||
- Template creation with HTML API ([Guide](https://www.docuseal.co/guides/create-pdf-document-fillable-form-with-html-api))
|
- Template creation with HTML API ([Guide](https://www.docuseal.com/guides/create-pdf-document-fillable-form-with-html-api))
|
||||||
- Template creation with PDF or DOCX and field tags API ([Guide](https://www.docuseal.co/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form))
|
- Template creation with PDF or DOCX and field tags API ([Guide](https://www.docuseal.com/guides/use-embedded-text-field-tags-in-the-pdf-to-create-a-fillable-form))
|
||||||
- Embedded signing form ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.co/docs/embedded))
|
- Embedded signing form ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.com/docs/embedded))
|
||||||
- Embedded document form builder ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.co/docs/embedded))
|
- Embedded document form builder ([React](https://github.com/docusealco/docuseal-react), [Vue](https://github.com/docusealco/docuseal-vue), [Angular](https://github.com/docusealco/docuseal-angular) or [JavaScript](https://www.docuseal.com/docs/embedded))
|
||||||
- [Learn more](https://www.docuseal.co/pricing)
|
- [Learn more](https://www.docuseal.com/pricing)
|
||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ sudo HOST=your-domain-name.com docker compose up
|
|||||||
|
|
||||||
At DocuSeal we have expertise and technologies to make documents creation, filling, signing and processing seamlessly integrated with your product. We specialize in working with various industries, including **Banking, Healthcare, Transport, Real Estate, eCommerce, KYC, CRM, and other software products** that require bulk document signing. By leveraging DocuSeal, we can assist in reducing the overall cost of developing and processing electronic documents while ensuring security and compliance with local electronic document laws.
|
At DocuSeal we have expertise and technologies to make documents creation, filling, signing and processing seamlessly integrated with your product. We specialize in working with various industries, including **Banking, Healthcare, Transport, Real Estate, eCommerce, KYC, CRM, and other software products** that require bulk document signing. By leveraging DocuSeal, we can assist in reducing the overall cost of developing and processing electronic documents while ensuring security and compliance with local electronic document laws.
|
||||||
|
|
||||||
[Book a Meeting](https://www.docuseal.co/contact)
|
[Book a Meeting](https://www.docuseal.com/contact)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
@@ -102,6 +102,6 @@ Unless otherwise noted, all files © 2023 DocuSeal LLC.
|
|||||||
|
|
||||||
## Tools
|
## Tools
|
||||||
|
|
||||||
- [Signature Maker](https://www.docuseal.co/online-signature)
|
- [Signature Maker](https://www.docuseal.com/online-signature)
|
||||||
- [Sign Document Online](https://www.docuseal.co/sign-documents-online)
|
- [Sign Document Online](https://www.docuseal.com/sign-documents-online)
|
||||||
- [Fill PDF Online](https://www.docuseal.co/fill-pdf)
|
- [Fill PDF Online](https://www.docuseal.com/fill-pdf)
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
# Reporting a Vulnerability
|
# Reporting a Vulnerability
|
||||||
|
|
||||||
If you come across any security concern or vulnarability, please report the information via email to security@docuseal.co instead of opening a GitHub issue. We will promptly respond and will collaborate with you to validate the issue, and resolve it ASAP.
|
If you come across any security concern or vulnarability, please report the information via email to security@docuseal.com instead of opening a GitHub issue. We will promptly respond and will collaborate with you to validate the issue, and resolve it ASAP.
|
||||||
|
|
||||||
**We have a bug bounty program to reward security researchers.**
|
**We have a bug bounty program to reward security researchers.**
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ class AccountConfigsController < ApplicationController
|
|||||||
AccountConfig::ALLOW_TYPED_SIGNATURE,
|
AccountConfig::ALLOW_TYPED_SIGNATURE,
|
||||||
AccountConfig::FORCE_MFA,
|
AccountConfig::FORCE_MFA,
|
||||||
AccountConfig::ALLOW_TO_RESUBMIT,
|
AccountConfig::ALLOW_TO_RESUBMIT,
|
||||||
|
AccountConfig::ALLOW_TO_DECLINE_KEY,
|
||||||
AccountConfig::FORM_PREFILL_SIGNATURE_KEY,
|
AccountConfig::FORM_PREFILL_SIGNATURE_KEY,
|
||||||
AccountConfig::ESIGNING_PREFERENCE_KEY,
|
AccountConfig::ESIGNING_PREFERENCE_KEY,
|
||||||
AccountConfig::FORM_WITH_CONFETTI_KEY,
|
AccountConfig::FORM_WITH_CONFETTI_KEY,
|
||||||
|
|||||||
@@ -38,12 +38,12 @@ module Api
|
|||||||
private
|
private
|
||||||
|
|
||||||
def authorization_check!(blob)
|
def authorization_check!(blob)
|
||||||
is_authorized =
|
attachment = blob.attachments.take
|
||||||
blob.attachments.all? do |a|
|
|
||||||
a.name.in?(%w[logo preview_images]) ||
|
is_authorized = attachment.name.in?(%w[logo preview_images]) ||
|
||||||
(current_user && a.record.account.id == current_user.account_id) ||
|
(current_user && attachment.record.account.id == current_user.account_id) ||
|
||||||
!a.record.account.account_configs.find_or_initialize_by(key: AccountConfig::DOWNLOAD_LINKS_AUTH_KEY).value
|
!attachment.record.account.account_configs
|
||||||
end
|
.find_or_initialize_by(key: AccountConfig::DOWNLOAD_LINKS_AUTH_KEY).value
|
||||||
|
|
||||||
return if is_authorized
|
return if is_authorized
|
||||||
|
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ module Api
|
|||||||
render json: { error: 'Too many requests' }, status: :too_many_requests
|
render json: { error: 'Too many requests' }, status: :too_many_requests
|
||||||
end
|
end
|
||||||
|
|
||||||
if Rails.env.production?
|
unless Rails.env.development?
|
||||||
rescue_from CanCan::AccessDenied do |e|
|
rescue_from CanCan::AccessDenied do |e|
|
||||||
render json: { error: e.message }, status: :forbidden
|
render json: { error: access_denied_error_message(e) }, status: :forbidden
|
||||||
end
|
end
|
||||||
|
|
||||||
rescue_from JSON::ParserError do |e|
|
rescue_from JSON::ParserError do |e|
|
||||||
@@ -39,6 +39,33 @@ module Api
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def access_denied_error_message(error)
|
||||||
|
return 'Not authorized' if request.headers['X-Auth-Token'].blank?
|
||||||
|
return 'Not authorized' unless error.subject.is_a?(ActiveRecord::Base)
|
||||||
|
return 'Not authorized' unless error.subject.respond_to?(:account_id)
|
||||||
|
|
||||||
|
linked_account_record_exists =
|
||||||
|
if current_user.account.testing?
|
||||||
|
current_user.account.linked_account_accounts.where(account_type: 'testing')
|
||||||
|
.exists?(account_id: error.subject.account_id)
|
||||||
|
else
|
||||||
|
current_user.account.testing_accounts.exists?(id: error.subject.account_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
return 'Not authorized' unless linked_account_record_exists
|
||||||
|
|
||||||
|
object_name = error.subject.model_name.human
|
||||||
|
id = error.subject.id
|
||||||
|
|
||||||
|
if current_user.account.testing?
|
||||||
|
"#{object_name} #{id} not found using testing API key; Use production API key to " \
|
||||||
|
"access production #{object_name.downcase.pluralize}."
|
||||||
|
else
|
||||||
|
"#{object_name} #{id} not found using production API key; Use testing API key to " \
|
||||||
|
"access testing #{object_name.downcase.pluralize}."
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def paginate(relation, field: :id)
|
def paginate(relation, field: :id)
|
||||||
result = relation.order(field => :desc)
|
result = relation.order(field => :desc)
|
||||||
.limit([params.fetch(:limit, DEFAULT_LIMIT).to_i, MAX_LIMIT].min)
|
.limit([params.fetch(:limit, DEFAULT_LIMIT).to_i, MAX_LIMIT].min)
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Api
|
||||||
|
class SubmissionDocumentsController < ApiBaseController
|
||||||
|
load_and_authorize_resource :submission
|
||||||
|
|
||||||
|
def index
|
||||||
|
documents =
|
||||||
|
if @submission.submitters.all?(&:completed_at?)
|
||||||
|
last_submitter = @submission.submitters.max_by(&:completed_at)
|
||||||
|
|
||||||
|
if last_submitter.documents_attachments.blank?
|
||||||
|
last_submitter.documents_attachments = Submissions::EnsureResultGenerated.call(submitter)
|
||||||
|
end
|
||||||
|
|
||||||
|
last_submitter.documents_attachments
|
||||||
|
else
|
||||||
|
values_hash = Submissions::GeneratePreviewAttachments.build_values_hash(@submission)
|
||||||
|
|
||||||
|
if @submission.preview_documents.present? &&
|
||||||
|
@submission.preview_documents.all? { |s| s.metadata['values_hash'] == values_hash }
|
||||||
|
@submission.preview_documents
|
||||||
|
else
|
||||||
|
ApplicationRecord.no_touching do
|
||||||
|
@submission.preview_documents.each(&:destroy)
|
||||||
|
end
|
||||||
|
|
||||||
|
Submissions::GeneratePreviewAttachments.call(@submission, values_hash:)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
ActiveRecord::Associations::Preloader.new(
|
||||||
|
records: documents,
|
||||||
|
associations: [:blob]
|
||||||
|
).call
|
||||||
|
|
||||||
|
render json: {
|
||||||
|
id: @submission.id,
|
||||||
|
documents: documents.map do |attachment|
|
||||||
|
{ name: attachment.filename.base, url: ActiveStorage::Blob.proxy_url(attachment.blob) }
|
||||||
|
end
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -74,13 +74,14 @@ module Api
|
|||||||
Submissions.send_signature_requests(submissions)
|
Submissions.send_signature_requests(submissions)
|
||||||
|
|
||||||
submissions.each do |submission|
|
submissions.each do |submission|
|
||||||
if submission.submitters.all?(&:completed_at?) && submission.submitters.last
|
submission.submitters.each do |submitter|
|
||||||
ProcessSubmitterCompletionJob.perform_async({ 'submitter_id' => submission.submitters.last.id })
|
ProcessSubmitterCompletionJob.perform_async({ 'submitter_id' => submitter.id }) if submitter.completed_at?
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
render json: build_create_json(submissions)
|
render json: build_create_json(submissions)
|
||||||
rescue Submitters::NormalizeValues::BaseError, DownloadUtils::UnableToDownload => e
|
rescue Submitters::NormalizeValues::BaseError, Submissions::CreateFromSubmitters::BaseError,
|
||||||
|
DownloadUtils::UnableToDownload => e
|
||||||
Rollbar.warning(e) if defined?(Rollbar)
|
Rollbar.warning(e) if defined?(Rollbar)
|
||||||
|
|
||||||
render json: { error: e.message }, status: :unprocessable_entity
|
render json: { error: e.message }, status: :unprocessable_entity
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ module Api
|
|||||||
end&.dig('uuid')
|
end&.dig('uuid')
|
||||||
|
|
||||||
submitter.email = Submissions.normalize_email(attrs[:email]) if attrs.key?(:email)
|
submitter.email = Submissions.normalize_email(attrs[:email]) if attrs.key?(:email)
|
||||||
|
submitter.name = attrs[:name] if attrs.key?(:name)
|
||||||
|
|
||||||
if attrs.key?(:phone)
|
if attrs.key?(:phone)
|
||||||
submitter.phone = attrs[:phone].to_s.gsub(/[^0-9+]/, '')
|
submitter.phone = attrs[:phone].to_s.gsub(/[^0-9+]/, '')
|
||||||
|
|||||||
@@ -20,10 +20,7 @@ module Api
|
|||||||
pdf = HexaPDF::Document.new(io: StringIO.new(file))
|
pdf = HexaPDF::Document.new(io: StringIO.new(file))
|
||||||
|
|
||||||
trusted_certs = Accounts.load_trusted_certs(current_account)
|
trusted_certs = Accounts.load_trusted_certs(current_account)
|
||||||
|
is_checksum_found = CompletedDocument.exists?(sha256: Base64.urlsafe_encode64(Digest::SHA256.digest(file)))
|
||||||
is_checksum_found = ActiveStorage::Attachment.joins(:blob)
|
|
||||||
.where(name: 'documents', record_type: 'Submitter')
|
|
||||||
.exists?(blob: { checksum: Digest::MD5.base64digest(file) })
|
|
||||||
|
|
||||||
render json: {
|
render json: {
|
||||||
checksum_status: is_checksum_found ? 'verified' : 'not_found',
|
checksum_status: is_checksum_found ? 'verified' : 'not_found',
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def default_url_options
|
def default_url_options
|
||||||
|
if request.domain == 'docuseal.com'
|
||||||
|
return { host: 'docuseal.com', protocol: ENV['FORCE_SSL'].present? ? 'https' : 'http' }
|
||||||
|
end
|
||||||
|
|
||||||
Docuseal.default_url_options
|
Docuseal.default_url_options
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -62,7 +66,7 @@ class ApplicationController < ActionController::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def with_browser_locale(&)
|
def with_browser_locale(&)
|
||||||
return yield if I18n.locale != :'en-US'
|
return yield if I18n.locale != :'en-US' && I18n.locale != :en
|
||||||
|
|
||||||
locale = params[:lang].presence
|
locale = params[:lang].presence
|
||||||
locale ||= request.env['HTTP_ACCEPT_LANGUAGE'].to_s[BROWSER_LOCALE_REGEXP].to_s
|
locale ||= request.env['HTTP_ACCEPT_LANGUAGE'].to_s[BROWSER_LOCALE_REGEXP].to_s
|
||||||
@@ -100,4 +104,10 @@ class ApplicationController < ActionController::Base
|
|||||||
def svg_icon(icon_name, class: '')
|
def svg_icon(icon_name, class: '')
|
||||||
render_to_string(partial: "icons/#{icon_name}", locals: { class: })
|
render_to_string(partial: "icons/#{icon_name}", locals: { class: })
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def maybe_redirect_com
|
||||||
|
return if request.domain != 'docuseal.co'
|
||||||
|
|
||||||
|
redirect_to request.url.gsub('.co/', '.com/'), allow_other_host: true, status: :moved_permanently
|
||||||
|
end
|
||||||
end
|
end
|
||||||
@@ -9,7 +9,7 @@ class EmailSmtpSettingsController < ApplicationController
|
|||||||
|
|
||||||
def create
|
def create
|
||||||
if @encrypted_config.update(email_configs)
|
if @encrypted_config.update(email_configs)
|
||||||
SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email']).deliver_now!
|
SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email'] || current_user.email).deliver_now!
|
||||||
|
|
||||||
redirect_to settings_email_index_path, notice: I18n.t('changes_have_been_saved')
|
redirect_to settings_email_index_path, notice: I18n.t('changes_have_been_saved')
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
class ErrorsController < ActionController::Base
|
class ErrorsController < ActionController::Base
|
||||||
ENTERPRISE_FEATURE_MESSAGE =
|
ENTERPRISE_FEATURE_MESSAGE =
|
||||||
'This feature is available in Pro Edition: https://www.docuseal.co/pricing'
|
'This feature is available in Pro Edition: https://www.docuseal.com/pricing'
|
||||||
|
|
||||||
ENTERPRISE_PATHS = [
|
ENTERPRISE_PATHS = [
|
||||||
'/templates/html',
|
'/templates/html',
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ class EsignSettingsController < ApplicationController
|
|||||||
|
|
||||||
@encrypted_config.save!
|
@encrypted_config.save!
|
||||||
|
|
||||||
redirect_to settings_esign_path, notice: I18m.t('certificate_has_been_removed')
|
redirect_to settings_esign_path, notice: I18n.t('certificate_has_been_removed')
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ class PreviewDocumentPageController < ActionController::API
|
|||||||
|
|
||||||
return head :not_found unless attachment
|
return head :not_found unless attachment
|
||||||
|
|
||||||
preview_image = attachment.preview_images.joins(:blob).find_by(blob: { filename: "#{params[:id]}#{FORMAT}" })
|
preview_image = attachment.preview_images.joins(:blob)
|
||||||
|
.find_by(blob: { filename: ["#{params[:id]}.png", "#{params[:id]}.jpg"] })
|
||||||
|
|
||||||
return redirect_to preview_image.url, allow_other_host: true if preview_image
|
return redirect_to preview_image.url, allow_other_host: true if preview_image
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ class StartFormController < ApplicationController
|
|||||||
skip_authorization_check
|
skip_authorization_check
|
||||||
|
|
||||||
around_action :with_browser_locale, only: %i[show completed]
|
around_action :with_browser_locale, only: %i[show completed]
|
||||||
|
before_action :maybe_redirect_com, only: %i[show completed]
|
||||||
before_action :load_template
|
before_action :load_template
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|||||||
@@ -9,6 +9,13 @@ class SubmissionsController < ApplicationController
|
|||||||
def show
|
def show
|
||||||
@submission = Submissions.preload_with_pages(@submission)
|
@submission = Submissions.preload_with_pages(@submission)
|
||||||
|
|
||||||
|
unless @submission.submitters.all?(&:completed_at?)
|
||||||
|
ActiveRecord::Associations::Preloader.new(
|
||||||
|
records: [@submission],
|
||||||
|
associations: [submitters: :start_form_submission_events]
|
||||||
|
).call
|
||||||
|
end
|
||||||
|
|
||||||
render :show, layout: 'plain'
|
render :show, layout: 'plain'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,6 @@ class SubmissionsDashboardController < ApplicationController
|
|||||||
@submissions = @submissions.pending if params[:status] == 'pending'
|
@submissions = @submissions.pending if params[:status] == 'pending'
|
||||||
@submissions = @submissions.completed if params[:status] == 'completed'
|
@submissions = @submissions.completed if params[:status] == 'completed'
|
||||||
|
|
||||||
@pagy, @submissions = pagy(@submissions.preload(:submitters).order(id: :desc))
|
@pagy, @submissions = pagy(@submissions.preload(submitters: :start_form_submission_events).order(id: :desc))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -4,6 +4,8 @@ class SubmissionsPreviewController < ApplicationController
|
|||||||
skip_before_action :authenticate_user!
|
skip_before_action :authenticate_user!
|
||||||
skip_authorization_check
|
skip_authorization_check
|
||||||
|
|
||||||
|
before_action :maybe_redirect_com, only: %i[show completed]
|
||||||
|
|
||||||
TTL = 40.minutes
|
TTL = 40.minutes
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SubmissionsUnarchiveController < ApplicationController
|
||||||
|
load_and_authorize_resource :submission
|
||||||
|
|
||||||
|
def create
|
||||||
|
@submission.update!(archived_at: nil)
|
||||||
|
|
||||||
|
redirect_to submission_path(@submission), notice: I18n.t('submission_has_been_unarchived')
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -7,6 +7,8 @@ class SubmitFormController < ApplicationController
|
|||||||
skip_before_action :authenticate_user!
|
skip_before_action :authenticate_user!
|
||||||
skip_authorization_check
|
skip_authorization_check
|
||||||
|
|
||||||
|
before_action :maybe_redirect_com, only: %i[show completed]
|
||||||
|
|
||||||
CONFIG_KEYS = [].freeze
|
CONFIG_KEYS = [].freeze
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|||||||
@@ -21,7 +21,10 @@ class SubmitFormDeclineController < ApplicationController
|
|||||||
|
|
||||||
user = submitter.submission.created_by_user || submitter.template.author
|
user = submitter.submission.created_by_user || submitter.template.author
|
||||||
|
|
||||||
SubmitterMailer.declined_email(submitter, user).deliver_later!
|
if user.user_configs.find_by(key: UserConfig::RECEIVE_DECLINED_EMAIL)&.value != false
|
||||||
|
SubmitterMailer.declined_email(submitter, user).deliver_later!
|
||||||
|
end
|
||||||
|
|
||||||
SendFormDeclinedWebhookRequestJob.perform_async('submitter_id' => submitter.id)
|
SendFormDeclinedWebhookRequestJob.perform_async('submitter_id' => submitter.id)
|
||||||
|
|
||||||
redirect_to submit_form_path(submitter.slug)
|
redirect_to submit_form_path(submitter.slug)
|
||||||
|
|||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class SubmittersController < ApplicationController
|
||||||
|
load_and_authorize_resource :submitter, only: %i[edit update]
|
||||||
|
|
||||||
|
def edit
|
||||||
|
@submitter_email_message =
|
||||||
|
if @submitter.preferences['email_message_uuid'].present?
|
||||||
|
@submitter.account.email_messages.find_by(uuid: @submitter.preferences['email_message_uuid'])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
submission = @submitter.submission
|
||||||
|
|
||||||
|
if @submitter.submission_events.exists?(event_type: 'start_form') || submission.archived_at? || submission.expired?
|
||||||
|
return redirect_back fallback_location: submission_path(submission), alert: I18n.t('submitter_cannot_be_updated')
|
||||||
|
end
|
||||||
|
|
||||||
|
if submitter_params.values.all?(&:blank?)
|
||||||
|
return redirect_back fallback_location: submission_path(submission),
|
||||||
|
alert: I18n.t('at_least_one_field_must_be_filled')
|
||||||
|
end
|
||||||
|
|
||||||
|
if params[:is_custom_message] != '1'
|
||||||
|
params.delete(:subject)
|
||||||
|
params.delete(:body)
|
||||||
|
end
|
||||||
|
|
||||||
|
submitter_preferences = Submitters.normalize_preferences(@submitter.account, current_user, params)
|
||||||
|
|
||||||
|
if submitter_preferences.key?('email_message_uuid')
|
||||||
|
@submitter.preferences['email_message_uuid'] = submitter_preferences['email_message_uuid']
|
||||||
|
end
|
||||||
|
|
||||||
|
assign_submitter_attrs(@submitter, submitter_params)
|
||||||
|
|
||||||
|
if @submitter.save
|
||||||
|
maybe_resend_email_sms(@submitter, params)
|
||||||
|
|
||||||
|
redirect_back fallback_location: submission_path(submission), notice: I18n.t('changes_have_been_saved')
|
||||||
|
else
|
||||||
|
redirect_back fallback_location: submission_path(submission), alert: I18n.t('unable_to_save')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def maybe_resend_email_sms(submitter, params)
|
||||||
|
if params[:send_email] == '1' && submitter.email.present?
|
||||||
|
is_sent_recently = Docuseal.multitenant? &&
|
||||||
|
EmailEvent.exists?(email: submitter.email,
|
||||||
|
tag: 'submitter_invitation',
|
||||||
|
emailable: submitter,
|
||||||
|
event_type: 'send',
|
||||||
|
created_at: 4.hours.ago..Time.current)
|
||||||
|
|
||||||
|
SendSubmitterInvitationEmailJob.perform_async('submitter_id' => submitter.id) unless is_sent_recently
|
||||||
|
end
|
||||||
|
|
||||||
|
return if submitter.phone.blank?
|
||||||
|
return unless params[:send_sms] == '1'
|
||||||
|
|
||||||
|
SendSubmitterInvitationSmsJob.perform_async('submitter_id' => submitter.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def assign_submitter_attrs(submitter, attrs)
|
||||||
|
submitter.phone = attrs[:phone].to_s.gsub(/[^0-9+]/, '') if attrs.key?(:phone)
|
||||||
|
|
||||||
|
submitter.email = Submissions.normalize_email(attrs[:email]) if attrs.key?(:email)
|
||||||
|
|
||||||
|
submitter.name = attrs[:name] if attrs.key?(:name)
|
||||||
|
|
||||||
|
submitter
|
||||||
|
end
|
||||||
|
|
||||||
|
def submitter_params
|
||||||
|
params.require(:submitter).permit(:email, :name, :phone).transform_values(&:strip)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -7,7 +7,7 @@ class TemplateFoldersController < ApplicationController
|
|||||||
@templates = @template_folder.templates.active.preload(:author).order(id: :desc)
|
@templates = @template_folder.templates.active.preload(:author).order(id: :desc)
|
||||||
@templates = Templates.search(@templates, params[:q])
|
@templates = Templates.search(@templates, params[:q])
|
||||||
|
|
||||||
@pagy, @templates = pagy(@templates, items: 12)
|
@pagy, @templates = pagy(@templates, limit: 12)
|
||||||
end
|
end
|
||||||
|
|
||||||
def edit; end
|
def edit; end
|
||||||
|
|||||||
@@ -7,6 +7,6 @@ class TemplatesArchivedController < ApplicationController
|
|||||||
@templates = @templates.where.not(archived_at: nil).preload(:author, :folder).order(id: :desc)
|
@templates = @templates.where.not(archived_at: nil).preload(:author, :folder).order(id: :desc)
|
||||||
@templates = Templates.search(@templates, params[:q])
|
@templates = Templates.search(@templates, params[:q])
|
||||||
|
|
||||||
@pagy, @templates = pagy(@templates, items: 12)
|
@pagy, @templates = pagy(@templates, limit: 12)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -15,7 +15,7 @@ class TemplatesController < ApplicationController
|
|||||||
submissions = submissions.pending if params[:status] == 'pending'
|
submissions = submissions.pending if params[:status] == 'pending'
|
||||||
submissions = submissions.completed if params[:status] == 'completed'
|
submissions = submissions.completed if params[:status] == 'completed'
|
||||||
|
|
||||||
@pagy, @submissions = pagy(submissions.preload(:submitters).order(id: :desc))
|
@pagy, @submissions = pagy(submissions.preload(submitters: :start_form_submission_events).order(id: :desc))
|
||||||
rescue ActiveRecord::RecordNotFound
|
rescue ActiveRecord::RecordNotFound
|
||||||
redirect_to root_path
|
redirect_to root_path
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ class TemplatesDashboardController < ApplicationController
|
|||||||
@template_folders = @template_folders.reject { |e| e.name == TemplateFolder::DEFAULT_NAME }
|
@template_folders = @template_folders.reject { |e| e.name == TemplateFolder::DEFAULT_NAME }
|
||||||
@templates = filter_templates(@templates)
|
@templates = filter_templates(@templates)
|
||||||
|
|
||||||
items =
|
limit =
|
||||||
if @template_folders.size < 4
|
if @template_folders.size < 4
|
||||||
TEMPLATES_PER_PAGE
|
TEMPLATES_PER_PAGE
|
||||||
else
|
else
|
||||||
(@template_folders.size < 7 ? 9 : 6)
|
(@template_folders.size < 7 ? 9 : 6)
|
||||||
end
|
end
|
||||||
|
|
||||||
@pagy, @templates = pagy(@templates, items:)
|
@pagy, @templates = pagy(@templates, limit:)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -9,9 +9,11 @@ class UsersController < ApplicationController
|
|||||||
def index
|
def index
|
||||||
@users =
|
@users =
|
||||||
if params[:status] == 'archived'
|
if params[:status] == 'archived'
|
||||||
@users.archived
|
@users.archived.where.not(role: 'integration')
|
||||||
|
elsif params[:status] == 'integration'
|
||||||
|
@users.active.where(role: 'integration')
|
||||||
else
|
else
|
||||||
@users.active
|
@users.active.where.not(role: 'integration')
|
||||||
end
|
end
|
||||||
|
|
||||||
@pagy, @users = pagy(@users.where(account: current_account).order(id: :desc))
|
@pagy, @users = pagy(@users.where(account: current_account).order(id: :desc))
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import SearchInput from './elements/search_input'
|
|||||||
import ToggleAttribute from './elements/toggle_attribute'
|
import ToggleAttribute from './elements/toggle_attribute'
|
||||||
import LinkedInput from './elements/linked_input'
|
import LinkedInput from './elements/linked_input'
|
||||||
import CheckboxGroup from './elements/checkbox_group'
|
import CheckboxGroup from './elements/checkbox_group'
|
||||||
|
import MaskedInput from './elements/masked_input'
|
||||||
|
|
||||||
import * as TurboInstantClick from './lib/turbo_instant_click'
|
import * as TurboInstantClick from './lib/turbo_instant_click'
|
||||||
|
|
||||||
@@ -95,6 +96,7 @@ safeRegisterElement('search-input', SearchInput)
|
|||||||
safeRegisterElement('toggle-attribute', ToggleAttribute)
|
safeRegisterElement('toggle-attribute', ToggleAttribute)
|
||||||
safeRegisterElement('linked-input', LinkedInput)
|
safeRegisterElement('linked-input', LinkedInput)
|
||||||
safeRegisterElement('checkbox-group', CheckboxGroup)
|
safeRegisterElement('checkbox-group', CheckboxGroup)
|
||||||
|
safeRegisterElement('masked-input', MaskedInput)
|
||||||
|
|
||||||
safeRegisterElement('template-builder', class extends HTMLElement {
|
safeRegisterElement('template-builder', class extends HTMLElement {
|
||||||
connectedCallback () {
|
connectedCallback () {
|
||||||
|
|||||||
@@ -130,7 +130,3 @@ button[disabled] .enabled {
|
|||||||
outline-offset: 3px;
|
outline-offset: 3px;
|
||||||
outline-color: hsl(var(--bc) / 0.2);
|
outline-color: hsl(var(--bc) / 0.2);
|
||||||
}
|
}
|
||||||
|
|
||||||
select:required:invalid {
|
|
||||||
color: gray !important;
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
export default class extends HTMLElement {
|
||||||
|
connectedCallback () {
|
||||||
|
const maskedToken = this.input.value
|
||||||
|
|
||||||
|
this.input.addEventListener('focus', () => {
|
||||||
|
this.input.value = this.dataset.token
|
||||||
|
this.input.select()
|
||||||
|
})
|
||||||
|
|
||||||
|
this.input.addEventListener('focusout', () => {
|
||||||
|
this.input.value = maskedToken
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
get input () {
|
||||||
|
return this.querySelector('input')
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -28,6 +28,7 @@ safeRegisterElement('submission-form', class extends HTMLElement {
|
|||||||
requireSigningReason: this.dataset.requireSigningReason === 'true',
|
requireSigningReason: this.dataset.requireSigningReason === 'true',
|
||||||
withConfetti: this.dataset.withConfetti !== 'false',
|
withConfetti: this.dataset.withConfetti !== 'false',
|
||||||
withDisclosure: this.dataset.withDisclosure === 'true',
|
withDisclosure: this.dataset.withDisclosure === 'true',
|
||||||
|
reuseSignature: this.dataset.reuseSignature !== 'false',
|
||||||
withTypedSignature: this.dataset.withTypedSignature !== 'false',
|
withTypedSignature: this.dataset.withTypedSignature !== 'false',
|
||||||
authenticityToken: document.querySelector('meta[name="csrf-token"]')?.content,
|
authenticityToken: document.querySelector('meta[name="csrf-token"]')?.content,
|
||||||
rememberSignature: this.dataset.rememberSignature === 'true',
|
rememberSignature: this.dataset.rememberSignature === 'true',
|
||||||
|
|||||||
@@ -31,10 +31,6 @@ button[disabled] .enabled {
|
|||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
select:required:invalid {
|
|
||||||
@apply text-gray-300;
|
|
||||||
}
|
|
||||||
|
|
||||||
.input-bordered {
|
.input-bordered {
|
||||||
@apply border-base-content/20;
|
@apply border-base-content/20;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -405,7 +405,8 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this.field.preferences?.font_size) {
|
if (this.field.preferences?.font_size) {
|
||||||
style.fontSize = this.field.preferences.font_size + 'pt'
|
style.fontSize = `clamp(4pt, 1.6vw, ${this.field.preferences.font_size}pt)`
|
||||||
|
style.lineHeight = `clamp(6pt, 2.0vw, ${parseInt(this.field.preferences.font_size) + 3}pt)`
|
||||||
}
|
}
|
||||||
|
|
||||||
return style
|
return style
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
|
id="form_completed"
|
||||||
class="mx-auto max-w-md flex flex-col"
|
class="mx-auto max-w-md flex flex-col"
|
||||||
dir="auto"
|
dir="auto"
|
||||||
>
|
>
|
||||||
@@ -75,7 +76,7 @@
|
|||||||
</a>
|
</a>
|
||||||
<a
|
<a
|
||||||
v-if="isDemo"
|
v-if="isDemo"
|
||||||
href="https://docuseal.co/sign_up"
|
href="https://docuseal.com/sign_up"
|
||||||
class="white-button flex items-center space-x-1 w-full"
|
class="white-button flex items-center space-x-1 w-full"
|
||||||
>
|
>
|
||||||
<IconLogin />
|
<IconLogin />
|
||||||
@@ -90,7 +91,7 @@
|
|||||||
>
|
>
|
||||||
{{ t('powered_by') }}
|
{{ t('powered_by') }}
|
||||||
<a
|
<a
|
||||||
href="https://www.docuseal.co/start"
|
href="https://www.docuseal.com/start"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="underline"
|
class="underline"
|
||||||
>DocuSeal</a> - {{ t('open_source_documents_software') }}
|
>DocuSeal</a> - {{ t('open_source_documents_software') }}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
:name="`values[${field.uuid}]`"
|
:name="`values[${field.uuid}]`"
|
||||||
@keydown.enter="onEnter"
|
@keydown.enter="onEnter"
|
||||||
@focus="$emit('focus')"
|
@focus="$emit('focus')"
|
||||||
|
@paste="onPaste"
|
||||||
>
|
>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -98,6 +99,25 @@ export default {
|
|||||||
this.$emit('submit')
|
this.$emit('submit')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
onPaste (e) {
|
||||||
|
e.preventDefault()
|
||||||
|
|
||||||
|
let pasteData = e.clipboardData.getData('text').trim()
|
||||||
|
|
||||||
|
if (pasteData.match(/^\d{2}\.\d{2}\.\d{4}$/)) {
|
||||||
|
pasteData = pasteData.split('.').reverse().join('-')
|
||||||
|
}
|
||||||
|
|
||||||
|
const parsedDate = new Date(pasteData)
|
||||||
|
|
||||||
|
if (!isNaN(parsedDate)) {
|
||||||
|
const inputEl = this.$refs.input
|
||||||
|
|
||||||
|
inputEl.valueAsDate = new Date(parsedDate.getTime() - parsedDate.getTimezoneOffset() * 60000)
|
||||||
|
|
||||||
|
inputEl.dispatchEvent(new Event('input', { bubbles: true }))
|
||||||
|
}
|
||||||
|
},
|
||||||
setCurrentDate () {
|
setCurrentDate () {
|
||||||
const inputEl = this.$refs.input
|
const inputEl = this.$refs.input
|
||||||
|
|
||||||
|
|||||||
@@ -115,7 +115,7 @@
|
|||||||
v-model="values[currentField.uuid]"
|
v-model="values[currentField.uuid]"
|
||||||
:show-field-names="showFieldNames"
|
:show-field-names="showFieldNames"
|
||||||
:field="currentField"
|
:field="currentField"
|
||||||
@submit="submitStep"
|
@submit="!isSubmitting && submitStep()"
|
||||||
@focus="scrollIntoField(currentField)"
|
@focus="scrollIntoField(currentField)"
|
||||||
/>
|
/>
|
||||||
<div v-else-if="currentField.type === 'select'">
|
<div v-else-if="currentField.type === 'select'">
|
||||||
@@ -152,6 +152,7 @@
|
|||||||
dir="auto"
|
dir="auto"
|
||||||
:required="currentField.required"
|
:required="currentField.required"
|
||||||
class="select base-input !text-2xl w-full text-center font-normal"
|
class="select base-input !text-2xl w-full text-center font-normal"
|
||||||
|
:class="{ 'text-gray-300': !values[currentField.uuid] }"
|
||||||
:name="`values[${currentField.uuid}]`"
|
:name="`values[${currentField.uuid}]`"
|
||||||
@change="values[currentField.uuid] = $event.target.value"
|
@change="values[currentField.uuid] = $event.target.value"
|
||||||
@focus="scrollIntoField(currentField)"
|
@focus="scrollIntoField(currentField)"
|
||||||
@@ -159,6 +160,7 @@
|
|||||||
<option
|
<option
|
||||||
value=""
|
value=""
|
||||||
:selected="!values[currentField.uuid]"
|
:selected="!values[currentField.uuid]"
|
||||||
|
class="text-gray-300"
|
||||||
>
|
>
|
||||||
{{ t('select_your_option') }}
|
{{ t('select_your_option') }}
|
||||||
</option>
|
</option>
|
||||||
@@ -167,6 +169,7 @@
|
|||||||
:key="option.uuid"
|
:key="option.uuid"
|
||||||
:selected="values[currentField.uuid] == option.value"
|
:selected="values[currentField.uuid] == option.value"
|
||||||
:value="option.value"
|
:value="option.value"
|
||||||
|
class="text-base-content"
|
||||||
>
|
>
|
||||||
{{ option.value }}
|
{{ option.value }}
|
||||||
</option>
|
</option>
|
||||||
@@ -392,7 +395,7 @@
|
|||||||
:default-value="submitter.phone"
|
:default-value="submitter.phone"
|
||||||
:submitter-slug="submitterSlug"
|
:submitter-slug="submitterSlug"
|
||||||
@focus="scrollIntoField(currentField)"
|
@focus="scrollIntoField(currentField)"
|
||||||
@submit="submitStep"
|
@submit="!isSubmitting && submitStep()"
|
||||||
/>
|
/>
|
||||||
<PaymentStep
|
<PaymentStep
|
||||||
v-else-if="currentField.type === 'payment'"
|
v-else-if="currentField.type === 'payment'"
|
||||||
@@ -404,7 +407,7 @@
|
|||||||
:values="values"
|
:values="values"
|
||||||
@attached="attachments.push($event)"
|
@attached="attachments.push($event)"
|
||||||
@focus="scrollIntoField(currentField)"
|
@focus="scrollIntoField(currentField)"
|
||||||
@submit="submitStep"
|
@submit="!isSubmitting && submitStep()"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
@@ -897,7 +900,7 @@ export default {
|
|||||||
mounted () {
|
mounted () {
|
||||||
this.submittedValues = JSON.parse(JSON.stringify(this.values))
|
this.submittedValues = JSON.parse(JSON.stringify(this.values))
|
||||||
|
|
||||||
screen?.orientation.addEventListener('change', this.onOrientationChange)
|
screen?.orientation?.addEventListener('change', this.onOrientationChange)
|
||||||
|
|
||||||
this.fields.forEach((field) => {
|
this.fields.forEach((field) => {
|
||||||
if (field.default_value && !field.readonly) {
|
if (field.default_value && !field.readonly) {
|
||||||
@@ -1104,6 +1107,10 @@ export default {
|
|||||||
const currentFieldUuids = this.currentStepFields.map((f) => f.uuid)
|
const currentFieldUuids = this.currentStepFields.map((f) => f.uuid)
|
||||||
const currentFieldType = this.currentField.type
|
const currentFieldType = this.currentField.type
|
||||||
|
|
||||||
|
if (!formData && !this.$refs.form.checkValidity()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if (this.dryRun) {
|
if (this.dryRun) {
|
||||||
currentFieldUuids.forEach((fieldUuid) => {
|
currentFieldUuids.forEach((fieldUuid) => {
|
||||||
this.submittedValues[fieldUuid] = this.values[fieldUuid]
|
this.submittedValues[fieldUuid] = this.values[fieldUuid]
|
||||||
@@ -1142,13 +1149,15 @@ export default {
|
|||||||
async submitStep () {
|
async submitStep () {
|
||||||
this.isSubmitting = true
|
this.isSubmitting = true
|
||||||
|
|
||||||
|
const submitStep = this.currentStep
|
||||||
|
|
||||||
const stepPromise = ['signature', 'phone', 'initials', 'payment'].includes(this.currentField.type)
|
const stepPromise = ['signature', 'phone', 'initials', 'payment'].includes(this.currentField.type)
|
||||||
? this.$refs.currentStep.submit
|
? this.$refs.currentStep.submit
|
||||||
: () => Promise.resolve({})
|
: () => Promise.resolve({})
|
||||||
|
|
||||||
stepPromise().then(async () => {
|
stepPromise().then(async () => {
|
||||||
const emptyRequiredField = this.stepFields.find((fields, index) => {
|
const emptyRequiredField = this.stepFields.find((fields, index) => {
|
||||||
if (index >= this.currentStep) {
|
if (index >= submitStep) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1158,7 +1167,7 @@ export default {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const formData = new FormData(this.$refs.form)
|
const formData = new FormData(this.$refs.form)
|
||||||
const isLastStep = this.currentStep === this.stepFields.length - 1
|
const isLastStep = submitStep === this.stepFields.length - 1
|
||||||
|
|
||||||
if (isLastStep && !emptyRequiredField && !this.inviteSubmitters.length) {
|
if (isLastStep && !emptyRequiredField && !this.inviteSubmitters.length) {
|
||||||
formData.append('completed', 'true')
|
formData.append('completed', 'true')
|
||||||
@@ -1183,7 +1192,7 @@ export default {
|
|||||||
return Promise.reject(new Error(data.error))
|
return Promise.reject(new Error(data.error))
|
||||||
}
|
}
|
||||||
|
|
||||||
const nextStep = (isLastStep && emptyRequiredField) || this.stepFields[this.currentStep + 1]
|
const nextStep = (isLastStep && emptyRequiredField) || this.stepFields[submitStep + 1]
|
||||||
|
|
||||||
if (nextStep) {
|
if (nextStep) {
|
||||||
if (this.alwaysMinimize) {
|
if (this.alwaysMinimize) {
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ const it = {
|
|||||||
pay: 'Pagamento',
|
pay: 'Pagamento',
|
||||||
file: 'File',
|
file: 'File',
|
||||||
select: 'Seleziona',
|
select: 'Seleziona',
|
||||||
checkbox: 'Casella di controllo',
|
checkbox: 'Checkbox',
|
||||||
multiple: 'Multiplo',
|
multiple: 'Multiplo',
|
||||||
radio: 'Radio',
|
radio: 'Radio',
|
||||||
cells: 'Celle',
|
cells: 'Celle',
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -61,30 +61,55 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input
|
<div
|
||||||
v-show="!isCodeSent"
|
v-show="!isCodeSent"
|
||||||
:id="field.uuid"
|
class="flex w-full rounded-full outline-neutral-content outline-2 outline-offset-2 focus-within:outline"
|
||||||
ref="phone"
|
|
||||||
:value="modelValue || defaultValue"
|
|
||||||
:readonly="!!defaultValue"
|
|
||||||
class="base-input !text-2xl w-full"
|
|
||||||
autocomplete="tel"
|
|
||||||
pattern="^\+[0-9\s\-]+$"
|
|
||||||
type="tel"
|
|
||||||
inputmode="tel"
|
|
||||||
:required="field.required"
|
|
||||||
placeholder="+1 234 567-8900"
|
|
||||||
:name="`values[${field.uuid}]`"
|
|
||||||
@invalid="$event.target.value ? $event.target.setCustomValidity(`${t('use_international_format')}...`) : ''"
|
|
||||||
@input="[$event.target.setCustomValidity(''), $emit('update:model-value', $event.target.value)]"
|
|
||||||
@focus="$emit('focus')"
|
|
||||||
>
|
>
|
||||||
|
<div class="relative inline-block">
|
||||||
|
<div class="btn bg-base-200 border border-neutral-300 text-2xl whitespace-nowrap font-normal rounded-l-full">
|
||||||
|
{{ selectedCountry.flag }} +{{ selectedCountry.dial }}
|
||||||
|
</div>
|
||||||
|
<select
|
||||||
|
class="absolute top-0 bottom-0 right-0 left-0 opacity-0 w-full h-full cursor-pointer"
|
||||||
|
:disabled="!!defaultValue"
|
||||||
|
@change="onCountrySelect(countries.find((country) => country.flag === $event.target.value))"
|
||||||
|
>
|
||||||
|
<option
|
||||||
|
v-for="(country, index) in countries"
|
||||||
|
:key="index"
|
||||||
|
:value="country.flag"
|
||||||
|
>
|
||||||
|
{{ country.flag }} {{ country.name }}
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<input
|
||||||
|
:name="`values[${field.uuid}]`"
|
||||||
|
:value="fullInternationalPhoneValue"
|
||||||
|
hidden
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
:id="field.uuid"
|
||||||
|
ref="phone"
|
||||||
|
:value="phoneValue"
|
||||||
|
:readonly="!!defaultValue"
|
||||||
|
class="base-input !text-2xl !rounded-l-none !border-l-0 !outline-none w-full"
|
||||||
|
autocomplete="tel"
|
||||||
|
type="tel"
|
||||||
|
inputmode="tel"
|
||||||
|
:required="field.required"
|
||||||
|
placeholder="234 567-8900"
|
||||||
|
@input="onPhoneInput"
|
||||||
|
@focus="$emit('focus')"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import MarkdownContent from './markdown_content'
|
import MarkdownContent from './markdown_content'
|
||||||
|
import phoneData from './phone_data'
|
||||||
|
|
||||||
function throttle (func, delay) {
|
function throttle (func, delay) {
|
||||||
let lastCallTime = 0
|
let lastCallTime = 0
|
||||||
@@ -144,13 +169,73 @@ export default {
|
|||||||
data () {
|
data () {
|
||||||
return {
|
return {
|
||||||
isCodeSent: false,
|
isCodeSent: false,
|
||||||
isResendLoading: false
|
isResendLoading: false,
|
||||||
|
phoneValue: this.modelValue || this.defaultValue || '',
|
||||||
|
selectedCountry: {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
countries () {
|
||||||
|
return phoneData.map(([name, dial, flag, tz]) => {
|
||||||
|
return { name, dial, flag, tz }
|
||||||
|
})
|
||||||
|
},
|
||||||
|
countriesDialIndex () {
|
||||||
|
return this.countries.reduce((acc, item) => {
|
||||||
|
acc[item.dial] ||= item
|
||||||
|
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
},
|
||||||
|
dialCodesRegexp () {
|
||||||
|
const dialCodes = this.countries.map((country) => country.dial).sort((a, b) => b.length - a.length)
|
||||||
|
|
||||||
|
return new RegExp(`^\\+(${dialCodes.join('|')})`)
|
||||||
|
},
|
||||||
|
detectedPhoneValueDialCode () {
|
||||||
|
return (this.phoneValue || '').replace(/[^\d+]/g, '').match(this.dialCodesRegexp)?.[1]
|
||||||
|
},
|
||||||
|
fullInternationalPhoneValue () {
|
||||||
|
if (this.detectedPhoneValueDialCode) {
|
||||||
|
return this.phoneValue
|
||||||
|
} else if (this.phoneValue) {
|
||||||
|
return ['+', this.selectedCountry.dial, this.phoneValue].filter(Boolean).join('')
|
||||||
|
} else {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
mounted () {
|
||||||
|
const browserTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone
|
||||||
|
|
||||||
|
if (this.detectedPhoneValueDialCode) {
|
||||||
|
this.selectedCountry = this.countriesDialIndex[this.detectedPhoneValueDialCode]
|
||||||
|
} else if (browserTimeZone) {
|
||||||
|
const tz = browserTimeZone.split('/')[1]
|
||||||
|
|
||||||
|
this.selectedCountry = this.countries.find((country) => country.tz.includes(tz)) || this.countries[0]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
emitSubmit: throttle(function (e) {
|
emitSubmit: throttle(function (e) {
|
||||||
this.$emit('submit')
|
this.$emit('submit')
|
||||||
}, 1000),
|
}, 1000),
|
||||||
|
onCountrySelect (country) {
|
||||||
|
if (this.selectedCountry.flag !== country.flag) {
|
||||||
|
this.phoneValue = this.phoneValue.replace(`+${this.selectedCountry.dial}`, `+${country.dial}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selectedCountry = country
|
||||||
|
|
||||||
|
this.$refs.phone.focus()
|
||||||
|
},
|
||||||
|
onPhoneInput (e) {
|
||||||
|
this.phoneValue = e.target.value
|
||||||
|
|
||||||
|
if (this.detectedPhoneValueDialCode) {
|
||||||
|
this.selectedCountry = this.countriesDialIndex[this.detectedPhoneValueDialCode]
|
||||||
|
}
|
||||||
|
},
|
||||||
onInputCode (e) {
|
onInputCode (e) {
|
||||||
if (e.target.value.length === 6) {
|
if (e.target.value.length === 6) {
|
||||||
this.emitSubmit()
|
this.emitSubmit()
|
||||||
@@ -171,14 +256,14 @@ export default {
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
submitter_slug: this.submitterSlug,
|
submitter_slug: this.submitterSlug,
|
||||||
locale: this.locale,
|
locale: this.locale,
|
||||||
phone: this.$refs.phone.value
|
phone: this.fullInternationalPhoneValue
|
||||||
}),
|
}),
|
||||||
headers: { 'Content-Type': 'application/json' }
|
headers: { 'Content-Type': 'application/json' }
|
||||||
}).then(async (resp) => {
|
}).then(async (resp) => {
|
||||||
if (resp.status === 422) {
|
if (resp.status === 422) {
|
||||||
const data = await resp.json()
|
const data = await resp.json()
|
||||||
|
|
||||||
alert(this.t('number_phone_is_invalid').replace('{number}', this.$refs.phone.value))
|
alert(this.t('number_phone_is_invalid').replace('{number}', this.fullInternationalPhoneValue))
|
||||||
|
|
||||||
return Promise.reject(new Error(data.error))
|
return Promise.reject(new Error(data.error))
|
||||||
}
|
}
|
||||||
@@ -189,13 +274,13 @@ export default {
|
|||||||
return Promise.resolve({})
|
return Promise.resolve({})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.$refs.phone.value.toString().startsWith('+')) {
|
if (!this.fullInternationalPhoneValue.toString().startsWith('+')) {
|
||||||
alert(this.t('use_international_format'))
|
alert(this.t('use_international_format'))
|
||||||
|
|
||||||
return Promise.reject(new Error('phone invalid'))
|
return Promise.reject(new Error('phone invalid'))
|
||||||
} else if (!this.isCodeSent) {
|
} else if (!this.isCodeSent) {
|
||||||
return this.sendVerificationCode().then(() => {
|
return this.sendVerificationCode().then(() => {
|
||||||
this.$emit('update:model-value', this.$refs.phone.value)
|
this.$emit('update:model-value', this.fullInternationalPhoneValue)
|
||||||
|
|
||||||
this.isCodeSent = true
|
this.isCodeSent = true
|
||||||
|
|
||||||
|
|||||||
@@ -145,6 +145,10 @@
|
|||||||
{{ t('clear') }}
|
{{ t('clear') }}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="isTextSignature"
|
||||||
|
class="absolute top-0 right-0 left-0 bottom-0"
|
||||||
|
/>
|
||||||
<canvas
|
<canvas
|
||||||
v-show="!modelValue && !computedPreviousValue"
|
v-show="!modelValue && !computedPreviousValue"
|
||||||
ref="canvas"
|
ref="canvas"
|
||||||
@@ -197,6 +201,7 @@
|
|||||||
<select
|
<select
|
||||||
v-if="requireSigningReason && !isOtherReason"
|
v-if="requireSigningReason && !isOtherReason"
|
||||||
class="select base-input !text-2xl w-full mt-6 text-center"
|
class="select base-input !text-2xl w-full mt-6 text-center"
|
||||||
|
:class="{ 'text-gray-300': !reason }"
|
||||||
required
|
required
|
||||||
:name="`values[${field.preferences.reason_field_uuid}]`"
|
:name="`values[${field.preferences.reason_field_uuid}]`"
|
||||||
@change="$event.target.value === 'other' ? [reason = '', isOtherReason = true] : $emit('update:reason', $event.target.value)"
|
@change="$event.target.value === 'other' ? [reason = '', isOtherReason = true] : $emit('update:reason', $event.target.value)"
|
||||||
@@ -205,6 +210,7 @@
|
|||||||
value=""
|
value=""
|
||||||
disabled
|
disabled
|
||||||
:selected="!reason"
|
:selected="!reason"
|
||||||
|
class="text-gray-300"
|
||||||
>
|
>
|
||||||
{{ t('select_a_reason') }}
|
{{ t('select_a_reason') }}
|
||||||
</option>
|
</option>
|
||||||
@@ -213,10 +219,14 @@
|
|||||||
:key="option"
|
:key="option"
|
||||||
:value="option"
|
:value="option"
|
||||||
:selected="reason === option"
|
:selected="reason === option"
|
||||||
|
class="text-base-content"
|
||||||
>
|
>
|
||||||
{{ label }}
|
{{ label }}
|
||||||
</option>
|
</option>
|
||||||
<option value="other">
|
<option
|
||||||
|
value="other"
|
||||||
|
class="text-base-content"
|
||||||
|
>
|
||||||
{{ t('other') }}
|
{{ t('other') }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
@@ -249,7 +259,7 @@
|
|||||||
class="text-base-content/60 text-xs text-center w-full mt-1"
|
class="text-base-content/60 text-xs text-center w-full mt-1"
|
||||||
>
|
>
|
||||||
{{ t('by_clicking_you_agree_to_the').replace('{button}', buttonText.charAt(0).toUpperCase() + buttonText.slice(1)) }} <a
|
{{ t('by_clicking_you_agree_to_the').replace('{button}', buttonText.charAt(0).toUpperCase() + buttonText.slice(1)) }} <a
|
||||||
href="https://www.docuseal.co/esign-disclosure"
|
href="https://www.docuseal.com/esign-disclosure"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
<span class="inline md:hidden">
|
<span class="inline md:hidden">
|
||||||
|
|||||||
@@ -360,6 +360,7 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
fieldNames: FieldType.computed.fieldNames,
|
fieldNames: FieldType.computed.fieldNames,
|
||||||
|
fieldLabels: FieldType.computed.fieldLabels,
|
||||||
fieldIcons: FieldType.computed.fieldIcons,
|
fieldIcons: FieldType.computed.fieldIcons,
|
||||||
isDefaultValuePresent () {
|
isDefaultValuePresent () {
|
||||||
if (this.field?.type === 'radio' && this.field?.areas?.length > 1) {
|
if (this.field?.type === 'radio' && this.field?.areas?.length > 1) {
|
||||||
|
|||||||
@@ -332,7 +332,7 @@
|
|||||||
>
|
>
|
||||||
<div class="bg-base-200 rounded-lg p-5 text-center space-y-4">
|
<div class="bg-base-200 rounded-lg p-5 text-center space-y-4">
|
||||||
<p>
|
<p>
|
||||||
{{ t('draw_field_on_the_document').replace('{field}', drawField?.name || '') }}
|
{{ t('draw_field_on_the_document') }}
|
||||||
</p>
|
</p>
|
||||||
<div>
|
<div>
|
||||||
<button
|
<button
|
||||||
@@ -415,6 +415,7 @@ import Contenteditable from './contenteditable'
|
|||||||
import DocumentPreview from './preview'
|
import DocumentPreview from './preview'
|
||||||
import DocumentControls from './controls'
|
import DocumentControls from './controls'
|
||||||
import MobileFields from './mobile_fields'
|
import MobileFields from './mobile_fields'
|
||||||
|
import FieldSubmitter from './field_submitter'
|
||||||
import { IconPlus, IconUsersPlus, IconDeviceFloppy, IconChevronDown, IconEye, IconWritingSign, IconInnerShadowTop, IconInfoCircle, IconAdjustments } from '@tabler/icons-vue'
|
import { IconPlus, IconUsersPlus, IconDeviceFloppy, IconChevronDown, IconEye, IconWritingSign, IconInnerShadowTop, IconInfoCircle, IconAdjustments } from '@tabler/icons-vue'
|
||||||
import { v4 } from 'uuid'
|
import { v4 } from 'uuid'
|
||||||
import { ref, computed } from 'vue'
|
import { ref, computed } from 'vue'
|
||||||
@@ -558,6 +559,11 @@ export default {
|
|||||||
required: false,
|
required: false,
|
||||||
default: () => []
|
default: () => []
|
||||||
},
|
},
|
||||||
|
defineSubmitters: {
|
||||||
|
type: Array,
|
||||||
|
required: false,
|
||||||
|
default: () => []
|
||||||
|
},
|
||||||
acceptFileTypes: {
|
acceptFileTypes: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
@@ -677,6 +683,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
submitterDefaultNames: FieldSubmitter.computed.names,
|
||||||
selectedAreaRef: () => ref(),
|
selectedAreaRef: () => ref(),
|
||||||
fieldsDragFieldRef: () => ref(),
|
fieldsDragFieldRef: () => ref(),
|
||||||
language () {
|
language () {
|
||||||
@@ -693,6 +700,7 @@ export default {
|
|||||||
'de-DE': 'DD.MM.YYYY',
|
'de-DE': 'DD.MM.YYYY',
|
||||||
'fr-FR': 'DD/MM/YYYY',
|
'fr-FR': 'DD/MM/YYYY',
|
||||||
'it-IT': 'DD/MM/YYYY',
|
'it-IT': 'DD/MM/YYYY',
|
||||||
|
'en-GB': 'DD/MM/YYYY',
|
||||||
'es-ES': 'DD/MM/YYYY'
|
'es-ES': 'DD/MM/YYYY'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -748,6 +756,18 @@ export default {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
this.defineSubmitters.forEach((name, index) => {
|
||||||
|
const submitter = (this.template.submitters[index] ||= {})
|
||||||
|
|
||||||
|
submitter.name = name || this.submitterDefaultNames[index]
|
||||||
|
|
||||||
|
if (existingSubmittersUuids.filter(Boolean).length) {
|
||||||
|
submitter.uuid = existingSubmittersUuids[index] || submitter.uuid || v4()
|
||||||
|
} else {
|
||||||
|
submitter.uuid ||= v4()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
this.selectedSubmitter = this.template.submitters[0]
|
this.selectedSubmitter = this.template.submitters[0]
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
@@ -1355,7 +1375,7 @@ export default {
|
|||||||
this.save()
|
this.save()
|
||||||
},
|
},
|
||||||
onDocumentRemove (item) {
|
onDocumentRemove (item) {
|
||||||
if (window.confirm(this.t('are_you_sure'))) {
|
if (window.confirm(this.t('are_you_sure_'))) {
|
||||||
this.template.schema.splice(this.template.schema.indexOf(item), 1)
|
this.template.schema.splice(this.template.schema.indexOf(item), 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
class="bg-base-300 rounded-xl py-2 px-3 text-center"
|
class="bg-base-300 rounded-xl py-2 px-3 text-center"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://www.docuseal.co/pricing"
|
href="https://www.docuseal.com/pricing"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="link"
|
class="link"
|
||||||
>{{ t('available_in_pro') }}</a>
|
>{{ t('available_in_pro') }}</a>
|
||||||
@@ -50,6 +50,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<select
|
<select
|
||||||
class="select select-bordered select-sm w-full bg-white h-11 pl-4 text-base font-normal"
|
class="select select-bordered select-sm w-full bg-white h-11 pl-4 text-base font-normal"
|
||||||
|
:class="{ 'text-gray-300': !condition.field_uuid }"
|
||||||
required
|
required
|
||||||
@change="[
|
@change="[
|
||||||
condition.field_uuid = $event.target.value,
|
condition.field_uuid = $event.target.value,
|
||||||
@@ -68,6 +69,7 @@
|
|||||||
v-for="f in fields"
|
v-for="f in fields"
|
||||||
:key="f.uuid"
|
:key="f.uuid"
|
||||||
:value="f.uuid"
|
:value="f.uuid"
|
||||||
|
class="text-base-content"
|
||||||
:selected="condition.field_uuid === f.uuid"
|
:selected="condition.field_uuid === f.uuid"
|
||||||
>
|
>
|
||||||
{{ f.name || buildDefaultName(f, template.fields) }}
|
{{ f.name || buildDefaultName(f, template.fields) }}
|
||||||
@@ -88,8 +90,9 @@
|
|||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<select
|
<select
|
||||||
v-if="conditionField(condition)?.options?.length"
|
v-if="['radio', 'select', 'multiple'].includes(conditionField(condition)?.type) && conditionField(condition)?.options"
|
||||||
class="select select-bordered select-sm w-full bg-white h-11 pl-4 text-base font-normal"
|
class="select select-bordered select-sm w-full bg-white h-11 pl-4 text-base font-normal"
|
||||||
|
:class="{ 'text-gray-300': !condition.value }"
|
||||||
required
|
required
|
||||||
@change="condition.value = $event.target.value"
|
@change="condition.value = $event.target.value"
|
||||||
>
|
>
|
||||||
@@ -105,6 +108,7 @@
|
|||||||
:key="option.uuid"
|
:key="option.uuid"
|
||||||
:value="option.uuid"
|
:value="option.uuid"
|
||||||
:selected="condition.value === option.uuid"
|
:selected="condition.value === option.uuid"
|
||||||
|
class="text-base-content"
|
||||||
>
|
>
|
||||||
{{ option.value || `${t('option')} ${index + 1}` }}
|
{{ option.value || `${t('option')} ${index + 1}` }}
|
||||||
</option>
|
</option>
|
||||||
|
|||||||
@@ -312,6 +312,7 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
fieldNames: FieldType.computed.fieldNames,
|
fieldNames: FieldType.computed.fieldNames,
|
||||||
|
fieldLabels: FieldType.computed.fieldLabels,
|
||||||
dropdownBgColor () {
|
dropdownBgColor () {
|
||||||
return ['', null, 'transparent'].includes(this.backgroundColor) ? 'white' : this.backgroundColor
|
return ['', null, 'transparent'].includes(this.backgroundColor) ? 'white' : this.backgroundColor
|
||||||
},
|
},
|
||||||
@@ -367,8 +368,7 @@ export default {
|
|||||||
if (this.field.type === 'heading') {
|
if (this.field.type === 'heading') {
|
||||||
return `${this.fieldNames[field.type]} ${typeIndex + 1}`
|
return `${this.fieldNames[field.type]} ${typeIndex + 1}`
|
||||||
} else {
|
} else {
|
||||||
const suffix = { multiple: this.t('select'), radio: this.t('group') }[field.type] || this.t('field')
|
return `${this.fieldLabels[field.type]} ${typeIndex + 1}`
|
||||||
return `${this.fieldNames[field.type]} ${suffix} ${typeIndex + 1}`
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -330,7 +330,7 @@ export default {
|
|||||||
this.$emit('update:model-value', submitter.uuid)
|
this.$emit('update:model-value', submitter.uuid)
|
||||||
},
|
},
|
||||||
remove (submitter) {
|
remove (submitter) {
|
||||||
if (window.confirm(this.t('are_you_sure'))) {
|
if (window.confirm(this.t('are_you_sure_'))) {
|
||||||
this.$emit('remove', submitter)
|
this.$emit('remove', submitter)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -114,6 +114,25 @@ export default {
|
|||||||
phone: this.t('phone')
|
phone: this.t('phone')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
fieldLabels () {
|
||||||
|
return {
|
||||||
|
text: this.t('text_field'),
|
||||||
|
signature: this.t('signature_field'),
|
||||||
|
initials: this.t('initials_field'),
|
||||||
|
date: this.t('date_field'),
|
||||||
|
number: this.t('number_field'),
|
||||||
|
image: this.t('image_field'),
|
||||||
|
file: this.t('file_field'),
|
||||||
|
select: this.t('select_field'),
|
||||||
|
checkbox: this.t('checkbox_field'),
|
||||||
|
multiple: this.t('multiple_field'),
|
||||||
|
radio: this.t('radio_field'),
|
||||||
|
cells: this.t('cells_field'),
|
||||||
|
stamp: this.t('stamp_field'),
|
||||||
|
payment: this.t('payment_field'),
|
||||||
|
phone: this.t('phone_field')
|
||||||
|
}
|
||||||
|
},
|
||||||
fieldIcons () {
|
fieldIcons () {
|
||||||
return {
|
return {
|
||||||
heading: IconHeading,
|
heading: IconHeading,
|
||||||
|
|||||||
@@ -140,7 +140,7 @@
|
|||||||
:data-tip="t('unlock_sms_verified_phone_number_field_with_paid_plan_use_text_field_for_phone_numbers_without_verification')"
|
:data-tip="t('unlock_sms_verified_phone_number_field_with_paid_plan_use_text_field_for_phone_numbers_without_verification')"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://www.docuseal.co/pricing"
|
href="https://www.docuseal.com/pricing"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="opacity-50 flex items-center justify-center border border-dashed border-base-300 w-full rounded relative"
|
class="opacity-50 flex items-center justify-center border border-dashed border-base-300 w-full rounded relative"
|
||||||
:style="{ backgroundColor }"
|
:style="{ backgroundColor }"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
class="bg-base-300 rounded-xl py-2 px-3 text-center"
|
class="bg-base-300 rounded-xl py-2 px-3 text-center"
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
href="https://www.docuseal.co/pricing"
|
href="https://www.docuseal.com/pricing"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
class="link"
|
class="link"
|
||||||
>{{ t('available_in_pro') }}</a>
|
>{{ t('available_in_pro') }}</a>
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
const en = {
|
const en = {
|
||||||
editable: 'Editable',
|
editable: 'Editable',
|
||||||
|
recurrent: 'Recurrent',
|
||||||
|
one_off: 'One-off',
|
||||||
search_field: 'Search field',
|
search_field: 'Search field',
|
||||||
field_not_found: 'Field not found',
|
field_not_found: 'Field not found',
|
||||||
clear: 'Clear',
|
clear: 'Clear',
|
||||||
@@ -29,7 +31,7 @@ const en = {
|
|||||||
select_value_: 'Select value...',
|
select_value_: 'Select value...',
|
||||||
remove_condition: 'Remove condition',
|
remove_condition: 'Remove condition',
|
||||||
add_condition: 'Add condition',
|
add_condition: 'Add condition',
|
||||||
are_you_sure: 'Are you sure?',
|
are_you_sure_: 'Are you sure?',
|
||||||
sign_yourself: 'Sign Yourself',
|
sign_yourself: 'Sign Yourself',
|
||||||
set_signing_date: 'Set signing date',
|
set_signing_date: 'Set signing date',
|
||||||
signing_date: 'Signing Date',
|
signing_date: 'Signing Date',
|
||||||
@@ -46,7 +48,7 @@ const en = {
|
|||||||
drawn: 'Drawn',
|
drawn: 'Drawn',
|
||||||
formula: 'Formula',
|
formula: 'Formula',
|
||||||
typed: 'Typed',
|
typed: 'Typed',
|
||||||
draw_field_on_the_document: 'Draw {field} field on the document',
|
draw_field_on_the_document: 'Draw a field on the document',
|
||||||
click_to_upload: 'Click to upload',
|
click_to_upload: 'Click to upload',
|
||||||
or_drag_and_drop_files: 'or drag and drop files',
|
or_drag_and_drop_files: 'or drag and drop files',
|
||||||
uploading: 'Uploading',
|
uploading: 'Uploading',
|
||||||
@@ -101,8 +103,21 @@ const en = {
|
|||||||
stamp: 'Stamp',
|
stamp: 'Stamp',
|
||||||
payment: 'Payment',
|
payment: 'Payment',
|
||||||
phone: 'Phone',
|
phone: 'Phone',
|
||||||
field: 'Field',
|
text_field: 'Text Field',
|
||||||
group: 'Group',
|
signature_field: 'Signature Field',
|
||||||
|
initials_field: 'Initials Field',
|
||||||
|
date_field: 'Date Field',
|
||||||
|
number_field: 'Number Field',
|
||||||
|
image_field: 'Image Field',
|
||||||
|
file_field: 'File Field',
|
||||||
|
select_field: 'Select Field',
|
||||||
|
checkbox_field: 'Checkbox Field',
|
||||||
|
multiple_field: 'Multiple Select Field',
|
||||||
|
radio_field: 'Radio Group Field',
|
||||||
|
cells_field: 'Cells Field',
|
||||||
|
stamp_field: 'Stamp Field',
|
||||||
|
payment_field: 'Payment Field',
|
||||||
|
phone_field: 'Phone Field',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Draw a text field on the page with a mouse',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Draw a text field on the page with a mouse',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Drag & drop any other field type on the page',
|
drag_and_drop_any_other_field_type_on_the_page: 'Drag & drop any other field type on the page',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Click on the field type above to start drawing it',
|
click_on_the_field_type_above_to_start_drawing_it: 'Click on the field type above to start drawing it',
|
||||||
@@ -138,6 +153,8 @@ const en = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const es = {
|
const es = {
|
||||||
|
recurrent: 'Recurrente',
|
||||||
|
one_off: 'Único',
|
||||||
editable: 'Editable',
|
editable: 'Editable',
|
||||||
search_field: 'Campo de búsqueda',
|
search_field: 'Campo de búsqueda',
|
||||||
field_not_found: 'Campo no encontrado',
|
field_not_found: 'Campo no encontrado',
|
||||||
@@ -176,7 +193,7 @@ const es = {
|
|||||||
up: 'Arriba',
|
up: 'Arriba',
|
||||||
down: 'Abajo',
|
down: 'Abajo',
|
||||||
set_signing_date: 'Establecer fecha de firma',
|
set_signing_date: 'Establecer fecha de firma',
|
||||||
are_you_sure: '¿Estás seguro?',
|
are_you_sure_: '¿Estás seguro?',
|
||||||
sign_yourself: 'Firma tú mismo',
|
sign_yourself: 'Firma tú mismo',
|
||||||
checked: 'Seleccionado',
|
checked: 'Seleccionado',
|
||||||
send: 'Enviar',
|
send: 'Enviar',
|
||||||
@@ -184,7 +201,7 @@ const es = {
|
|||||||
save: 'Guardar',
|
save: 'Guardar',
|
||||||
cancel: 'Cancelar',
|
cancel: 'Cancelar',
|
||||||
or_add_field_without_drawing: 'O añadir campo sin dibujar',
|
or_add_field_without_drawing: 'O añadir campo sin dibujar',
|
||||||
draw_field_on_the_document: 'Dibujar campo {field} en el documento',
|
draw_field_on_the_document: 'Dibujar un campo en el documento',
|
||||||
click_to_upload: 'Haz clic para cargar',
|
click_to_upload: 'Haz clic para cargar',
|
||||||
or_drag_and_drop_files: 'o arrastra y suelta archivos',
|
or_drag_and_drop_files: 'o arrastra y suelta archivos',
|
||||||
uploading: 'Subiendo',
|
uploading: 'Subiendo',
|
||||||
@@ -232,13 +249,26 @@ const es = {
|
|||||||
select: 'Seleccionar',
|
select: 'Seleccionar',
|
||||||
checkbox: 'Casilla',
|
checkbox: 'Casilla',
|
||||||
multiple: 'Múltiple',
|
multiple: 'Múltiple',
|
||||||
field: 'Campo',
|
|
||||||
group: 'Grupo',
|
|
||||||
radio: 'Radio',
|
radio: 'Radio',
|
||||||
cells: 'Celdas',
|
cells: 'Celdas',
|
||||||
stamp: 'Sello',
|
stamp: 'Sello',
|
||||||
payment: 'Pago',
|
payment: 'Pago',
|
||||||
phone: 'Teléfono',
|
phone: 'Teléfono',
|
||||||
|
text_field: 'Campo de Texto',
|
||||||
|
signature_field: 'Campo de Firma',
|
||||||
|
initials_field: 'Campo de Iniciales',
|
||||||
|
date_field: 'Campo de Fecha',
|
||||||
|
number_field: 'Campo de Número',
|
||||||
|
image_field: 'Campo de Imagen',
|
||||||
|
file_field: 'Campo de Archivo',
|
||||||
|
select_field: 'Campo de Selección',
|
||||||
|
checkbox_field: 'Campo de Casilla',
|
||||||
|
multiple_field: 'Campo Múltiple',
|
||||||
|
radio_field: 'Campo de Grupo Radio',
|
||||||
|
cells_field: 'Campo de Celdas',
|
||||||
|
stamp_field: 'Campo de Sello',
|
||||||
|
payment_field: 'Campo de Pago',
|
||||||
|
phone_field: 'Campo de Teléfono',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Dibujar un campo de texto en la página con el mouse',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Dibujar un campo de texto en la página con el mouse',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Arrastra y suelta cualquier otro tipo de campo en la página',
|
drag_and_drop_any_other_field_type_on_the_page: 'Arrastra y suelta cualquier otro tipo de campo en la página',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Haz clic en el tipo de campo de arriba para comenzar a dibujarlo',
|
click_on_the_field_type_above_to_start_drawing_it: 'Haz clic en el tipo de campo de arriba para comenzar a dibujarlo',
|
||||||
@@ -277,6 +307,8 @@ const es = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const it = {
|
const it = {
|
||||||
|
ricorrente: 'Ricorrente',
|
||||||
|
una_volta: 'Una volta',
|
||||||
editable: 'Modificabile',
|
editable: 'Modificabile',
|
||||||
search_field: 'Campo di ricerca',
|
search_field: 'Campo di ricerca',
|
||||||
field_not_found: 'Campo non trovato',
|
field_not_found: 'Campo non trovato',
|
||||||
@@ -307,7 +339,7 @@ const it = {
|
|||||||
select_value_: 'Seleziona valore...',
|
select_value_: 'Seleziona valore...',
|
||||||
remove_condition: 'Rimuovi condizione',
|
remove_condition: 'Rimuovi condizione',
|
||||||
add_condition: 'Aggiungi condizione',
|
add_condition: 'Aggiungi condizione',
|
||||||
are_you_sure: 'Sei sicuro?',
|
are_you_sure_: 'Sei sicuro?',
|
||||||
sign_yourself: 'Firma te stesso',
|
sign_yourself: 'Firma te stesso',
|
||||||
set_signing_date: 'Imposta data di firma',
|
set_signing_date: 'Imposta data di firma',
|
||||||
signing_date: 'Data di firma',
|
signing_date: 'Data di firma',
|
||||||
@@ -324,7 +356,7 @@ const it = {
|
|||||||
drawn: 'Disegnato',
|
drawn: 'Disegnato',
|
||||||
formula: 'Formula',
|
formula: 'Formula',
|
||||||
typed: 'Digitato',
|
typed: 'Digitato',
|
||||||
draw_field_on_the_document: 'Disegna il campo {field} sul documento',
|
draw_field_on_the_document: 'Disegnare un campo sul documento',
|
||||||
click_to_upload: 'Clicca per caricare',
|
click_to_upload: 'Clicca per caricare',
|
||||||
or_drag_and_drop_files: 'o trascina e rilascia i file',
|
or_drag_and_drop_files: 'o trascina e rilascia i file',
|
||||||
uploading: 'Caricamento in corso',
|
uploading: 'Caricamento in corso',
|
||||||
@@ -372,15 +404,28 @@ const it = {
|
|||||||
image: 'Immagine',
|
image: 'Immagine',
|
||||||
file: 'File',
|
file: 'File',
|
||||||
select: 'Seleziona',
|
select: 'Seleziona',
|
||||||
checkbox: 'Casella di controllo',
|
checkbox: 'Checkbox',
|
||||||
multiple: 'Multiplo',
|
multiple: 'Multiplo',
|
||||||
radio: 'Radio',
|
radio: 'Radio',
|
||||||
cells: 'Celle',
|
cells: 'Celle',
|
||||||
stamp: 'Timbro',
|
stamp: 'Timbro',
|
||||||
payment: 'Pagamento',
|
payment: 'Pagamento',
|
||||||
phone: 'Telefono',
|
phone: 'Telefono',
|
||||||
field: 'Campo',
|
text_field: 'Campo di Testo',
|
||||||
group: 'Gruppo',
|
signature_field: 'Campo di Firma',
|
||||||
|
initials_field: 'Campo di Iniziali',
|
||||||
|
date_field: 'Campo Data',
|
||||||
|
number_field: 'Campo Numero',
|
||||||
|
image_field: 'Campo Immagine',
|
||||||
|
file_field: 'Campo File',
|
||||||
|
select_field: 'Campo di Selezione',
|
||||||
|
checkbox_field: 'Campo di Checkbox',
|
||||||
|
multiple_field: 'Campo Selezione Multipla',
|
||||||
|
radio_field: 'Campo di Gruppo Radio',
|
||||||
|
cells_field: 'Campo Celle',
|
||||||
|
stamp_field: 'Campo Timbro',
|
||||||
|
payment_field: 'Campo Pagamento',
|
||||||
|
phone_field: 'Campo Telefono',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Disegna un campo di testo sulla pagina con il mouse',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Disegna un campo di testo sulla pagina con il mouse',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Trascina e rilascia qualsiasi altro tipo di campo sulla pagina',
|
drag_and_drop_any_other_field_type_on_the_page: 'Trascina e rilascia qualsiasi altro tipo di campo sulla pagina',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Clicca sul tipo di campo sopra per iniziare a disegnarlo',
|
click_on_the_field_type_above_to_start_drawing_it: 'Clicca sul tipo di campo sopra per iniziare a disegnarlo',
|
||||||
@@ -416,6 +461,8 @@ const it = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const pt = {
|
const pt = {
|
||||||
|
recurrent: 'Recurrente',
|
||||||
|
one_off: 'Único',
|
||||||
editable: 'Editável',
|
editable: 'Editável',
|
||||||
search_field: 'Campo de busca',
|
search_field: 'Campo de busca',
|
||||||
field_not_found: 'Campo não encontrado',
|
field_not_found: 'Campo não encontrado',
|
||||||
@@ -454,7 +501,7 @@ const pt = {
|
|||||||
up: 'Para cima',
|
up: 'Para cima',
|
||||||
down: 'Para baixo',
|
down: 'Para baixo',
|
||||||
set_signing_date: 'Definir data de assinatura',
|
set_signing_date: 'Definir data de assinatura',
|
||||||
are_you_sure: 'Tem certeza?',
|
are_you_sure_: 'Tem certeza?',
|
||||||
sign_yourself: 'Assine você mesmo',
|
sign_yourself: 'Assine você mesmo',
|
||||||
checked: 'Marcado',
|
checked: 'Marcado',
|
||||||
send: 'Enviar',
|
send: 'Enviar',
|
||||||
@@ -462,7 +509,7 @@ const pt = {
|
|||||||
save: 'Salvar',
|
save: 'Salvar',
|
||||||
cancel: 'Cancelar',
|
cancel: 'Cancelar',
|
||||||
or_add_field_without_drawing: 'Ou adicione campo sem desenhar',
|
or_add_field_without_drawing: 'Ou adicione campo sem desenhar',
|
||||||
draw_field_on_the_document: 'Desenhar campo {field} no documento',
|
draw_field_on_the_document: 'Desenhar um campo no documento',
|
||||||
click_to_upload: 'Clique para enviar',
|
click_to_upload: 'Clique para enviar',
|
||||||
or_drag_and_drop_files: 'ou arraste e solte arquivos',
|
or_drag_and_drop_files: 'ou arraste e solte arquivos',
|
||||||
uploading: 'Carregando',
|
uploading: 'Carregando',
|
||||||
@@ -509,14 +556,27 @@ const pt = {
|
|||||||
file: 'Arquivo',
|
file: 'Arquivo',
|
||||||
select: 'Selecionar',
|
select: 'Selecionar',
|
||||||
checkbox: 'Caixa',
|
checkbox: 'Caixa',
|
||||||
field: 'Campo',
|
|
||||||
group: 'Grupo',
|
|
||||||
multiple: 'Múltiplo',
|
multiple: 'Múltiplo',
|
||||||
radio: 'Rádio',
|
radio: 'Rádio',
|
||||||
cells: 'Células',
|
cells: 'Células',
|
||||||
stamp: 'Carimbo',
|
stamp: 'Carimbo',
|
||||||
payment: 'Pagamento',
|
payment: 'Pagamento',
|
||||||
phone: 'Telefone',
|
phone: 'Telefone',
|
||||||
|
text_field: 'Campo de Texto',
|
||||||
|
signature_field: 'Campo de Assinatura',
|
||||||
|
initials_field: 'Campo de Rúbrica',
|
||||||
|
date_field: 'Campo de Data',
|
||||||
|
number_field: 'Campo de Número',
|
||||||
|
image_field: 'Campo de Imagem',
|
||||||
|
file_field: 'Campo de Arquivo',
|
||||||
|
select_field: 'Campo de Seleção',
|
||||||
|
checkbox_field: 'Campo de Caixa',
|
||||||
|
multiple_field: 'Campo de Opção Múltipla',
|
||||||
|
radio_field: 'Campo de Grupo Rádio',
|
||||||
|
cells_field: 'Campo de Células',
|
||||||
|
stamp_field: 'Campo de Carimbo',
|
||||||
|
payment_field: 'Campo de Pagamento',
|
||||||
|
phone_field: 'Campo de Telefone',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Desenhar um campo de texto na página com o mouse',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Desenhar um campo de texto na página com o mouse',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Arraste e solte qualquer outro tipo de campo na página',
|
drag_and_drop_any_other_field_type_on_the_page: 'Arraste e solte qualquer outro tipo de campo na página',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Clique no tipo de campo acima para começar a desenhá-lo',
|
click_on_the_field_type_above_to_start_drawing_it: 'Clique no tipo de campo acima para começar a desenhá-lo',
|
||||||
@@ -555,6 +615,8 @@ const pt = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const fr = {
|
const fr = {
|
||||||
|
recurrent: 'Récurrent',
|
||||||
|
one_off: 'Ponctuel',
|
||||||
editable: 'Éditable',
|
editable: 'Éditable',
|
||||||
search_field: 'Champ de recherche',
|
search_field: 'Champ de recherche',
|
||||||
field_not_found: 'Champ non trouvé',
|
field_not_found: 'Champ non trouvé',
|
||||||
@@ -593,14 +655,14 @@ const fr = {
|
|||||||
up: 'Haut',
|
up: 'Haut',
|
||||||
down: 'Bas',
|
down: 'Bas',
|
||||||
set_signing_date: 'Définir la date de signature',
|
set_signing_date: 'Définir la date de signature',
|
||||||
are_you_sure: 'Êtes-vous sûr ?',
|
are_you_sure_: 'Êtes-vous sûr?',
|
||||||
sign_yourself: 'Signez-vous',
|
sign_yourself: 'Signez-vous',
|
||||||
checked: 'Coché',
|
checked: 'Coché',
|
||||||
send: 'Envoyer',
|
send: 'Envoyer',
|
||||||
remove: 'Supprimer',
|
remove: 'Supprimer',
|
||||||
save: 'Enregistrer',
|
save: 'Enregistrer',
|
||||||
cancel: 'Annuler',
|
cancel: 'Annuler',
|
||||||
draw_field_on_the_document: 'Dessinez le champ {field} sur le document',
|
draw_field_on_the_document: 'Dessiner un champ sur le document',
|
||||||
click_to_upload: 'Cliquez pour télécharger',
|
click_to_upload: 'Cliquez pour télécharger',
|
||||||
or_drag_and_drop_files: 'ou faites glisser-déposer des fichiers',
|
or_drag_and_drop_files: 'ou faites glisser-déposer des fichiers',
|
||||||
uploading: 'Téléchargement en cours',
|
uploading: 'Téléchargement en cours',
|
||||||
@@ -654,8 +716,21 @@ const fr = {
|
|||||||
stamp: 'Tampon',
|
stamp: 'Tampon',
|
||||||
payment: 'Paiement',
|
payment: 'Paiement',
|
||||||
phone: 'Téléphone',
|
phone: 'Téléphone',
|
||||||
field: 'Champ',
|
text_field: 'Champ de Texte',
|
||||||
group: 'Groupe',
|
signature_field: 'Champ de Signature',
|
||||||
|
initials_field: "Champ d'Initiales",
|
||||||
|
date_field: 'Champ de Date',
|
||||||
|
number_field: 'Champ de Numéro',
|
||||||
|
image_field: "Champ d'Image",
|
||||||
|
file_field: 'Champ de Fichier',
|
||||||
|
select_field: 'Champ de Choix',
|
||||||
|
checkbox_field: 'Champ de Coche',
|
||||||
|
multiple_field: 'Champ de Choix Multiple',
|
||||||
|
radio_field: 'Champ de Groupe Radio',
|
||||||
|
cells_field: 'Champ de Cellules',
|
||||||
|
stamp_field: 'Champ de Tampon',
|
||||||
|
payment_field: 'Champ de Paiement',
|
||||||
|
phone_field: 'Champ de Téléphone',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Dessinez un champ texte sur la page avec une souris',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Dessinez un champ texte sur la page avec une souris',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Glissez et déposez tout autre type de champ sur la page',
|
drag_and_drop_any_other_field_type_on_the_page: 'Glissez et déposez tout autre type de champ sur la page',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Cliquez sur le type de champ ci-dessus pour commencer à le dessiner',
|
click_on_the_field_type_above_to_start_drawing_it: 'Cliquez sur le type de champ ci-dessus pour commencer à le dessiner',
|
||||||
@@ -694,6 +769,8 @@ const fr = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const de = {
|
const de = {
|
||||||
|
wiederkehrend: 'Wiederkehrend',
|
||||||
|
einmalig: 'Einmalig',
|
||||||
editable: 'Bearbeitbar',
|
editable: 'Bearbeitbar',
|
||||||
search_field: 'Suchfeld',
|
search_field: 'Suchfeld',
|
||||||
field_not_found: 'Feld nicht gefunden',
|
field_not_found: 'Feld nicht gefunden',
|
||||||
@@ -732,14 +809,14 @@ const de = {
|
|||||||
up: 'Nach oben',
|
up: 'Nach oben',
|
||||||
down: 'Nach unten',
|
down: 'Nach unten',
|
||||||
set_signing_date: 'Unterschriftdatum festlegen',
|
set_signing_date: 'Unterschriftdatum festlegen',
|
||||||
are_you_sure: 'Bist du sicher?',
|
are_you_sure_: 'Bist du sicher?',
|
||||||
sign_yourself: 'Unterschreiben Sie selbst',
|
sign_yourself: 'Unterschreiben Sie selbst',
|
||||||
checked: 'Ausgewählt',
|
checked: 'Ausgewählt',
|
||||||
send: 'Senden',
|
send: 'Senden',
|
||||||
remove: 'Entfernen',
|
remove: 'Entfernen',
|
||||||
save: 'Speichern',
|
save: 'Speichern',
|
||||||
cancel: 'Abbrechen',
|
cancel: 'Abbrechen',
|
||||||
draw_field_on_the_document: 'Feld {field} auf dem Dokument zeichnen',
|
draw_field_on_the_document: 'Ein Feld auf dem Dokument zeichnen',
|
||||||
click_to_upload: 'Klicken Sie zum Hochladen',
|
click_to_upload: 'Klicken Sie zum Hochladen',
|
||||||
or_drag_and_drop_files: 'oder Dateien hierher ziehen',
|
or_drag_and_drop_files: 'oder Dateien hierher ziehen',
|
||||||
uploading: 'Hochladen',
|
uploading: 'Hochladen',
|
||||||
@@ -793,8 +870,21 @@ const de = {
|
|||||||
stamp: 'Stempel',
|
stamp: 'Stempel',
|
||||||
payment: 'Zahlung',
|
payment: 'Zahlung',
|
||||||
phone: 'Telefon',
|
phone: 'Telefon',
|
||||||
field: 'Feld',
|
text_field: 'Textfeld',
|
||||||
group: 'Gruppe',
|
signature_field: 'Unterschriftsfeld',
|
||||||
|
initials_field: 'Initialenfeld',
|
||||||
|
date_field: 'Datumsfeld',
|
||||||
|
number_field: 'Zahlenfeld',
|
||||||
|
image_field: 'Bildfeld',
|
||||||
|
file_field: 'Dateifeld',
|
||||||
|
select_field: 'Auswahlfeld',
|
||||||
|
checkbox_field: 'Checkbox-Feld',
|
||||||
|
multiple_field: 'Mehrfach-Auswahlfeld',
|
||||||
|
radio_field: 'Radio-Gruppenfeld',
|
||||||
|
cells_field: 'Zellenfeld',
|
||||||
|
stamp_field: 'Stempelfeld',
|
||||||
|
payment_field: 'Zahlungsfeld',
|
||||||
|
phone_field: 'Telefonfeld',
|
||||||
draw_a_text_field_on_the_page_with_a_mouse: 'Textfeld auf der Seite mit der Maus zeichnen',
|
draw_a_text_field_on_the_page_with_a_mouse: 'Textfeld auf der Seite mit der Maus zeichnen',
|
||||||
drag_and_drop_any_other_field_type_on_the_page: 'Ziehe und lasse einen anderen Feldtyp auf die Seite fallen',
|
drag_and_drop_any_other_field_type_on_the_page: 'Ziehe und lasse einen anderen Feldtyp auf die Seite fallen',
|
||||||
click_on_the_field_type_above_to_start_drawing_it: 'Klicke auf den Feldtyp oben, um mit dem Zeichnen zu beginnen',
|
click_on_the_field_type_above_to_start_drawing_it: 'Klicke auf den Feldtyp oben, um mit dem Zeichnen zu beginnen',
|
||||||
|
|||||||
@@ -50,6 +50,7 @@
|
|||||||
<div class="flex">
|
<div class="flex">
|
||||||
<select
|
<select
|
||||||
class="base-select !select-sm !h-10"
|
class="base-select !select-sm !h-10"
|
||||||
|
:class="{ '!text-gray-300': !mapping.field_name }"
|
||||||
required
|
required
|
||||||
@change="mapping.field_name = $event.target.value"
|
@change="mapping.field_name = $event.target.value"
|
||||||
>
|
>
|
||||||
@@ -65,6 +66,7 @@
|
|||||||
:key="index"
|
:key="index"
|
||||||
:value="field.name"
|
:value="field.name"
|
||||||
:selected="mapping.field_name === field.name"
|
:selected="mapping.field_name === field.name"
|
||||||
|
class="text-base-content"
|
||||||
>
|
>
|
||||||
{{ field.name }}
|
{{ field.name }}
|
||||||
</option>
|
</option>
|
||||||
@@ -75,6 +77,7 @@
|
|||||||
<div class="w-full relative">
|
<div class="w-full relative">
|
||||||
<select
|
<select
|
||||||
class="base-select !select-sm !h-10"
|
class="base-select !select-sm !h-10"
|
||||||
|
:class="{ '!text-gray-300': !mapping.column_index && mapping.column_index != 0 }"
|
||||||
required
|
required
|
||||||
@change="mapping.column_index = parseInt($event.target.value)"
|
@change="mapping.column_index = parseInt($event.target.value)"
|
||||||
>
|
>
|
||||||
@@ -93,6 +96,7 @@
|
|||||||
v-if="column"
|
v-if="column"
|
||||||
:value="index"
|
:value="index"
|
||||||
:selected="index === mapping.column_index"
|
:selected="index === mapping.column_index"
|
||||||
|
class="text-base-content"
|
||||||
>
|
>
|
||||||
{{ column }}
|
{{ column }}
|
||||||
</option>
|
</option>
|
||||||
@@ -281,7 +285,7 @@ export default {
|
|||||||
submittersIndex[mapping.submitter_uuid][mapping.field_name.toLowerCase()] = row[mapping.column_index]
|
submittersIndex[mapping.submitter_uuid][mapping.field_name.toLowerCase()] = row[mapping.column_index]
|
||||||
}
|
}
|
||||||
|
|
||||||
const fieldType = this.fieldTypesIndex[mapping.submitter_uuid][mapping.field_name]
|
const fieldType = this.fieldTypesIndex[mapping.submitter_uuid]?.[mapping.field_name]
|
||||||
|
|
||||||
if (fieldType && fieldType !== 'phone') {
|
if (fieldType && fieldType !== 'phone') {
|
||||||
submittersIndex[mapping.submitter_uuid].fields.push({
|
submittersIndex[mapping.submitter_uuid].fields.push({
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
@click="closeDropdown"
|
@click="closeDropdown"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
|
v-if="!('price_id' in field.preferences)"
|
||||||
class="py-1.5 px-1 relative"
|
class="py-1.5 px-1 relative"
|
||||||
@click.stop
|
@click.stop
|
||||||
>
|
>
|
||||||
@@ -58,6 +59,13 @@
|
|||||||
class="input input-bordered input-xs w-full max-w-xs h-7 !outline-0"
|
class="input input-bordered input-xs w-full max-w-xs h-7 !outline-0"
|
||||||
@blur="save"
|
@blur="save"
|
||||||
>
|
>
|
||||||
|
<input
|
||||||
|
v-else-if="'price_id' in field.preferences"
|
||||||
|
v-model="field.preferences.price_id"
|
||||||
|
placeholder="Price ID: price_XXXXX"
|
||||||
|
class="input input-bordered input-xs w-full max-w-xs h-7 !outline-0"
|
||||||
|
@blur="save"
|
||||||
|
>
|
||||||
<input
|
<input
|
||||||
v-else
|
v-else
|
||||||
v-model="field.preferences.price"
|
v-model="field.preferences.price"
|
||||||
@@ -74,6 +82,23 @@
|
|||||||
>
|
>
|
||||||
{{ t('price') }}
|
{{ t('price') }}
|
||||||
</label>
|
</label>
|
||||||
|
<div class="flex items-center justify-center">
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
class="hover:underline"
|
||||||
|
style="font-size: 11px"
|
||||||
|
:class="{'underline': !('price_id' in field.preferences)}"
|
||||||
|
@click="delete field.preferences.price_id"
|
||||||
|
>{{ t('one_off') }}</a>
|
||||||
|
<span class="h-2.5 border-l border-base-content mx-1" />
|
||||||
|
<a
|
||||||
|
href="#"
|
||||||
|
class="hover:underline"
|
||||||
|
style="font-size: 11px"
|
||||||
|
:class="{'underline': ('price_id' in field.preferences)}"
|
||||||
|
@click="field.preferences.price_id ??= ''"
|
||||||
|
>{{ t('recurrent') }}</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="!isConnected || isOauthSuccess"
|
v-if="!isConnected || isOauthSuccess"
|
||||||
@@ -153,12 +178,15 @@
|
|||||||
<a
|
<a
|
||||||
v-if="!isConnected"
|
v-if="!isConnected"
|
||||||
class="block link text-center mt-1"
|
class="block link text-center mt-1"
|
||||||
href="https://www.docuseal.co/blog/accept-payments-and-request-signatures-with-ease"
|
href="https://www.docuseal.com/blog/accept-payments-and-request-signatures-with-ease"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
data-turbo="false"
|
data-turbo="false"
|
||||||
>{{ t('learn_more') }}</a>
|
>{{ t('learn_more') }}</a>
|
||||||
</div>
|
</div>
|
||||||
<li class="mb-1">
|
<li
|
||||||
|
v-if="!('price_id' in field.preferences)"
|
||||||
|
class="mb-1"
|
||||||
|
>
|
||||||
<label
|
<label
|
||||||
class="label-text cursor-pointer text-center w-full flex items-center"
|
class="label-text cursor-pointer text-center w-full flex items-center"
|
||||||
@click="$emit('click-formula')"
|
@click="$emit('click-formula')"
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class GeneratePreviewImagesJob
|
||||||
|
include Sidekiq::Job
|
||||||
|
|
||||||
|
sidekiq_options queue: :images
|
||||||
|
|
||||||
|
def perform(params = {})
|
||||||
|
attachment = ActiveStorage::Attachment.find(params['attachment_id'])
|
||||||
|
|
||||||
|
max_page = [attachment.metadata['pdf']['number_of_pages'].to_i - 1,
|
||||||
|
Templates::ProcessDocument::MAX_NUMBER_OF_PAGES_PROCESSED].min
|
||||||
|
|
||||||
|
Templates::ProcessDocument.generate_document_preview_images(attachment, attachment.download, (1..max_page),
|
||||||
|
concurrency: 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -6,6 +6,8 @@ class ProcessSubmitterCompletionJob
|
|||||||
def perform(params = {})
|
def perform(params = {})
|
||||||
submitter = Submitter.find(params['submitter_id'])
|
submitter = Submitter.find(params['submitter_id'])
|
||||||
|
|
||||||
|
create_completed_submitter!(submitter)
|
||||||
|
|
||||||
is_all_completed = !submitter.submission.submitters.exists?(completed_at: nil)
|
is_all_completed = !submitter.submission.submitters.exists?(completed_at: nil)
|
||||||
|
|
||||||
if !is_all_completed && submitter.submission.submitters_order_preserved?
|
if !is_all_completed && submitter.submission.submitters_order_preserved?
|
||||||
@@ -24,9 +26,42 @@ class ProcessSubmitterCompletionJob
|
|||||||
enqueue_completed_emails(submitter)
|
enqueue_completed_emails(submitter)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create_completed_documents!(submitter)
|
||||||
|
|
||||||
enqueue_completed_webhooks(submitter, is_all_completed:)
|
enqueue_completed_webhooks(submitter, is_all_completed:)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_completed_submitter!(submitter)
|
||||||
|
completed_submitter = CompletedSubmitter.find_or_initialize_by(submitter_id: submitter.id)
|
||||||
|
|
||||||
|
return completed_submitter if completed_submitter.persisted?
|
||||||
|
|
||||||
|
submission = submitter.submission
|
||||||
|
|
||||||
|
completed_submitter.assign_attributes(
|
||||||
|
submission_id: submitter.submission_id,
|
||||||
|
account_id: submission.account_id,
|
||||||
|
template_id: submission.template_id,
|
||||||
|
source: submission.source,
|
||||||
|
sms_count: submitter.submission_events.where(event_type: %w[send_sms send_2fa_sms]).count,
|
||||||
|
completed_at: submitter.completed_at
|
||||||
|
)
|
||||||
|
|
||||||
|
completed_submitter.save!
|
||||||
|
|
||||||
|
completed_submitter
|
||||||
|
rescue ActiveRecord::RecordNotUnique
|
||||||
|
retry
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_completed_documents!(submitter)
|
||||||
|
submitter.documents.filter_map do |attachment|
|
||||||
|
next if attachment.metadata['sha256'].blank?
|
||||||
|
|
||||||
|
CompletedDocument.find_or_create_by!(sha256: attachment.metadata['sha256'], submitter_id: submitter.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def enqueue_completed_webhooks(submitter, is_all_completed: false)
|
def enqueue_completed_webhooks(submitter, is_all_completed: false)
|
||||||
webhook_config = Accounts.load_webhook_config(submitter.account)
|
webhook_config = Accounts.load_webhook_config(submitter.account)
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
class ApplicationMailer < ActionMailer::Base
|
class ApplicationMailer < ActionMailer::Base
|
||||||
default from: 'DocuSeal <info@docuseal.co>'
|
default from: 'DocuSeal <info@docuseal.com>'
|
||||||
layout 'mailer'
|
layout 'mailer'
|
||||||
|
|
||||||
register_interceptor ActionMailerConfigsInterceptor
|
register_interceptor ActionMailerConfigsInterceptor
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
|
|
||||||
class SettingsMailer < ApplicationMailer
|
class SettingsMailer < ApplicationMailer
|
||||||
def smtp_successful_setup(email)
|
def smtp_successful_setup(email)
|
||||||
mail(to: email, subject: 'SMTP has been configured')
|
mail(to: email, from: email, subject: 'SMTP has been configured')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -8,7 +8,9 @@ class UserMailer < ApplicationMailer
|
|||||||
|
|
||||||
assign_message_metadata('user_invitation', @user)
|
assign_message_metadata('user_invitation', @user)
|
||||||
|
|
||||||
mail(to: @user.friendly_name,
|
I18n.with_locale(@current_account.locale) do
|
||||||
subject: "You are invited to #{Docuseal.product_name}")
|
mail(to: @user.friendly_name,
|
||||||
|
subject: I18n.t('you_are_invited_to_product_name', product_name: Docuseal.product_name))
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -28,6 +28,7 @@ class AccountConfig < ApplicationRecord
|
|||||||
FORCE_MFA = 'force_mfa'
|
FORCE_MFA = 'force_mfa'
|
||||||
ALLOW_TYPED_SIGNATURE = 'allow_typed_signature'
|
ALLOW_TYPED_SIGNATURE = 'allow_typed_signature'
|
||||||
ALLOW_TO_RESUBMIT = 'allow_to_resubmit'
|
ALLOW_TO_RESUBMIT = 'allow_to_resubmit'
|
||||||
|
ALLOW_TO_DECLINE_KEY = 'allow_to_decline'
|
||||||
SUBMITTER_REMINDERS = 'submitter_reminders'
|
SUBMITTER_REMINDERS = 'submitter_reminders'
|
||||||
FORM_COMPLETED_BUTTON_KEY = 'form_completed_button'
|
FORM_COMPLETED_BUTTON_KEY = 'form_completed_button'
|
||||||
FORM_COMPLETED_MESSAGE_KEY = 'form_completed_message'
|
FORM_COMPLETED_MESSAGE_KEY = 'form_completed_message'
|
||||||
@@ -39,7 +40,9 @@ class AccountConfig < ApplicationRecord
|
|||||||
FORCE_SSO_AUTH_KEY = 'force_sso_auth'
|
FORCE_SSO_AUTH_KEY = 'force_sso_auth'
|
||||||
FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf'
|
FLATTEN_RESULT_PDF_KEY = 'flatten_result_pdf'
|
||||||
WITH_SIGNATURE_ID = 'with_signature_id'
|
WITH_SIGNATURE_ID = 'with_signature_id'
|
||||||
|
WITH_AUDIT_VALUES_KEY = 'with_audit_values'
|
||||||
REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason'
|
REQUIRE_SIGNING_REASON_KEY = 'require_signing_reason'
|
||||||
|
REUSE_SIGNATURE_KEY = 'reuse_signature'
|
||||||
COMBINE_PDF_RESULT_KEY = 'combine_pdf_result_key'
|
COMBINE_PDF_RESULT_KEY = 'combine_pdf_result_key'
|
||||||
|
|
||||||
DEFAULT_VALUES = {
|
DEFAULT_VALUES = {
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: completed_documents
|
||||||
|
#
|
||||||
|
# id :bigint not null, primary key
|
||||||
|
# sha256 :string not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# submitter_id :bigint not null
|
||||||
|
#
|
||||||
|
# Indexes
|
||||||
|
#
|
||||||
|
# index_completed_documents_on_sha256 (sha256)
|
||||||
|
# index_completed_documents_on_submitter_id (submitter_id)
|
||||||
|
#
|
||||||
|
class CompletedDocument < ApplicationRecord
|
||||||
|
belongs_to :submitter, optional: true
|
||||||
|
|
||||||
|
has_one :completed_submitter, primary_key: :submitter_id, inverse_of: :completed_documents, dependent: :destroy
|
||||||
|
end
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
# == Schema Information
|
||||||
|
#
|
||||||
|
# Table name: completed_submitters
|
||||||
|
#
|
||||||
|
# id :bigint not null, primary key
|
||||||
|
# completed_at :datetime not null
|
||||||
|
# sms_count :integer not null
|
||||||
|
# source :string not null
|
||||||
|
# created_at :datetime not null
|
||||||
|
# updated_at :datetime not null
|
||||||
|
# account_id :bigint not null
|
||||||
|
# submission_id :bigint not null
|
||||||
|
# submitter_id :bigint not null
|
||||||
|
# template_id :bigint not null
|
||||||
|
#
|
||||||
|
# Indexes
|
||||||
|
#
|
||||||
|
# index_completed_submitters_on_account_id (account_id)
|
||||||
|
# index_completed_submitters_on_submitter_id (submitter_id) UNIQUE
|
||||||
|
#
|
||||||
|
class CompletedSubmitter < ApplicationRecord
|
||||||
|
belongs_to :submitter
|
||||||
|
belongs_to :submission
|
||||||
|
belongs_to :account
|
||||||
|
belongs_to :template
|
||||||
|
|
||||||
|
has_many :completed_documents, dependent: :destroy,
|
||||||
|
primary_key: :submitter_id,
|
||||||
|
foreign_key: :submitter_id,
|
||||||
|
inverse_of: :submitter
|
||||||
|
end
|
||||||
@@ -55,6 +55,8 @@ class Submission < ApplicationRecord
|
|||||||
has_one_attached :audit_trail
|
has_one_attached :audit_trail
|
||||||
has_one_attached :combined_document
|
has_one_attached :combined_document
|
||||||
|
|
||||||
|
has_many_attached :preview_documents
|
||||||
|
|
||||||
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')) },
|
||||||
through: :template, source: :documents_attachments
|
through: :template, source: :documents_attachments
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ class Submitter < ApplicationRecord
|
|||||||
|
|
||||||
has_many :document_generation_events, dependent: :destroy
|
has_many :document_generation_events, dependent: :destroy
|
||||||
has_many :submission_events, dependent: :destroy
|
has_many :submission_events, dependent: :destroy
|
||||||
|
has_many :start_form_submission_events, -> { where(event_type: :start_form) },
|
||||||
|
class_name: 'SubmissionEvent', dependent: :destroy, inverse_of: :submitter
|
||||||
|
|
||||||
scope :completed, -> { where.not(completed_at: nil) }
|
scope :completed, -> { where.not(completed_at: nil) }
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,9 @@ class User < ApplicationRecord
|
|||||||
|
|
||||||
EMAIL_REGEXP = /[^@;,<>\s]+@[^@;,<>\s]+/
|
EMAIL_REGEXP = /[^@;,<>\s]+@[^@;,<>\s]+/
|
||||||
|
|
||||||
|
FULL_EMAIL_REGEXP =
|
||||||
|
/\A[a-z0-9][\.']?(?:(?:[a-z0-9_-]+[\.\+'])*[a-z0-9_-]+)*@(?:[a-z0-9]+[\.-])*[a-z0-9]+\.[a-z]{2,}\z/i
|
||||||
|
|
||||||
has_one_attached :signature
|
has_one_attached :signature
|
||||||
has_one_attached :initials
|
has_one_attached :initials
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ class UserConfig < ApplicationRecord
|
|||||||
SIGNATURE_KEY = 'signature'
|
SIGNATURE_KEY = 'signature'
|
||||||
INITIALS_KEY = 'initials'
|
INITIALS_KEY = 'initials'
|
||||||
RECEIVE_COMPLETED_EMAIL = 'receive_completed_email'
|
RECEIVE_COMPLETED_EMAIL = 'receive_completed_email'
|
||||||
|
RECEIVE_DECLINED_EMAIL = 'receive_declined_email'
|
||||||
|
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
|
|
||||||
|
|||||||
@@ -103,6 +103,18 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ALLOW_TO_DECLINE_KEY) %>
|
||||||
|
<% if can?(:manage, account_config) %>
|
||||||
|
<%= form_for account_config, url: account_configs_path, method: :post do |f| %>
|
||||||
|
<%= f.hidden_field :key %>
|
||||||
|
<div class="flex items-center justify-between py-2.5">
|
||||||
|
<span>
|
||||||
|
<%= t('allow_to_decline_documents') %>
|
||||||
|
</span>
|
||||||
|
<%= f.check_box :value, class: 'toggle', checked: account_config.value != false, onchange: 'this.form.requestSubmit()' %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::FORM_PREFILL_SIGNATURE_KEY) %>
|
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::FORM_PREFILL_SIGNATURE_KEY) %>
|
||||||
<% if can?(:manage, account_config) %>
|
<% if can?(:manage, account_config) %>
|
||||||
<%= form_for account_config, url: account_configs_path, method: :post do |f| %>
|
<%= form_for account_config, url: account_configs_path, method: :post do |f| %>
|
||||||
|
|||||||
@@ -10,8 +10,11 @@
|
|||||||
<label for="api_key" class="text-sm font-semibold">X-Auth-Token</label>
|
<label for="api_key" class="text-sm font-semibold">X-Auth-Token</label>
|
||||||
<div class="flex flex-col md:flex-row gap-4">
|
<div class="flex flex-col md:flex-row gap-4">
|
||||||
<div class="flex w-full space-x-4">
|
<div class="flex w-full space-x-4">
|
||||||
<input id="api_key" type="text" value="<%= current_user.access_token.token %>" class="input font-mono input-bordered w-full" autocomplete="off" readonly>
|
<% token = current_user.access_token.token %>
|
||||||
<%= render 'shared/clipboard_copy', icon: 'copy', text: current_user.access_token.token, class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
|
<masked-input class="block w-full" data-token="<%= token %>">
|
||||||
|
<input id="api_key" type="text" value="<%= token.sub(token[5..], '*' * token[5..].size) %>" class="input font-mono input-bordered w-full" autocomplete="off" readonly>
|
||||||
|
</masked-input>
|
||||||
|
<%= render 'shared/clipboard_copy', icon: 'copy', text: token, class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
|
||||||
</div>
|
</div>
|
||||||
<%= button_to button_title(title: t('rotate'), disabled_with: t('rotate'), icon: svg_icon('reload', class: 'w-6 h-6')), settings_api_index_path, class: 'white-button w-full', data: { turbo_confirm: t('remove_existing_api_token_and_generated_a_new_one_are_you_sure_') } %>
|
<%= button_to button_title(title: t('rotate'), disabled_with: t('rotate'), icon: svg_icon('reload', class: 'w-6 h-6')), settings_api_index_path, class: 'white-button w-full', data: { turbo_confirm: t('remove_existing_api_token_and_generated_a_new_one_are_you_sure_') } %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<div class="join">
|
<div class="join">
|
||||||
<a href="https://docuseal.co<%= request.fullpath.gsub('docuseal.eu', 'docuseal.co') %>" class="btn bg-base-200 join-item w-32 <%= 'bg-base-300' if request.host == 'docuseal.co' %>">
|
<a href="https://docuseal.com<%= request.fullpath.gsub('docuseal.eu', 'docuseal.com') %>" class="btn bg-base-200 join-item w-32 <%= 'bg-base-300' if request.host == 'docuseal.com' %>">
|
||||||
<%= svg_icon 'world', class: 'w-5 h-5' %>
|
<%= svg_icon 'world', class: 'w-5 h-5' %>
|
||||||
Global
|
Global
|
||||||
</a>
|
</a>
|
||||||
<a href="https://docuseal.eu<%= request.fullpath.gsub('docuseal.co', 'docuseal.eu') %>" class="btn bg-base-200 join-item w-32 <%= 'bg-base-300' if request.host == 'docuseal.eu' %>">
|
<a href="https://docuseal.eu<%= request.fullpath.gsub('docuseal.com', 'docuseal.eu') %>" class="btn bg-base-200 join-item w-32 <%= 'bg-base-300' if request.host == 'docuseal.eu' %>">
|
||||||
<%= svg_icon 'eu_flag', class: 'w-5 h-5' %>
|
<%= svg_icon 'eu_flag', class: 'w-5 h-5' %>
|
||||||
Europe
|
Europe
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -38,7 +38,7 @@
|
|||||||
<div class="form-control">
|
<div class="form-control">
|
||||||
<%= ff.label :security_label, 'SMTP Security', class: 'label' %>
|
<%= ff.label :security_label, 'SMTP Security', class: 'label' %>
|
||||||
<div class="flex items-center space-x-6">
|
<div class="flex items-center space-x-6">
|
||||||
<% [%w[Auto none], %w[SSL ssl], %w[TLS tls]].each do |(label, val)| %>
|
<% [%w[Auto none], %w[SSL ssl], %w[TLS tls], %w[Noverify noverify]].each do |(label, val)| %>
|
||||||
<%= ff.label :security, value: val, for: "#{val}_radio", class: 'label' do %>
|
<%= ff.label :security, value: val, for: "#{val}_radio", class: 'label' do %>
|
||||||
<%= ff.radio_button :security, val, checked: (value['security'].blank? && val == 'none') || value['security'] == val, id: "#{val}_radio", class: 'base-radio mr-2' %>
|
<%= ff.radio_button :security, val, checked: (value['security'].blank? && val == 'none') || value['security'] == val, id: "#{val}_radio", class: 'base-radio mr-2' %>
|
||||||
<%= label %>
|
<%= label %>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="form-control">
|
<div class="form-control">
|
||||||
<%= ff.label :from_email, t('send_from_email'), class: 'label' %>
|
<%= ff.label :from_email, t('send_from_email'), class: 'label' %>
|
||||||
<%= ff.email_field :from_email, value: value['from_email'], required: true, class: 'base-input' %>
|
<%= ff.email_field :from_email, value: value['from_email'], required: !Docuseal.multitenant?, class: 'base-input' %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="form-control pt-2">
|
<div class="form-control pt-2">
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<h3 class="mb-4 text-2xl font-semibold">Easy to Start</h3>
|
<h3 class="mb-4 text-2xl font-semibold">Easy to Start</h3>
|
||||||
<p class="text-base text-gray-500">
|
<p class="text-base text-gray-500">
|
||||||
Run on your own host using Docker container, or deploy on your favorite managed PaaS with a single <a href="https://www.docuseal.co/install" class="link link-neutral font-bold">click</a>.
|
Run on your own host using Docker container, or deploy on your favorite managed PaaS with a single <a href="https://www.docuseal.com/install" class="link link-neutral font-bold">click</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,5 +2,5 @@
|
|||||||
---
|
---
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Sent using <a href="<%= Docuseal::PRODUCT_URL %>/start"><%= Docuseal.product_name %></a> free document signing.
|
<%= t('sent_using_product_name_free_document_signing_html', product_url: "#{Docuseal::PRODUCT_URL}/start", product_name: Docuseal.product_name) %>
|
||||||
</p>
|
</p>
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
<a href="<%= Docuseal::GITHUB_URL %>" target="_blank" class="inline">
|
<a href="<%= Docuseal::GITHUB_URL %>" target="_blank" class="inline">
|
||||||
<img alt="GitHub Repo stars" src="https://www.docuseal.co/github-badge.svg" style="height: 22px">
|
<img alt="GitHub Repo stars" src="https://www.docuseal.com/github-badge.svg" style="height: 22px">
|
||||||
</a>
|
</a>
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
<% if signed_in? %>
|
<% if signed_in? %>
|
||||||
<div class="space-x-4 flex items-center">
|
<div class="space-x-4 flex items-center">
|
||||||
<% if Docuseal.demo? %>
|
<% if Docuseal.demo? %>
|
||||||
<a href="https://docuseal.co/sign_up" class="btn btn-neutral btn-sm btn-outline inline-flex items-center justify-center" style="height: 37px">
|
<a href="https://docuseal.com/sign_up" class="btn btn-neutral btn-sm btn-outline inline-flex items-center justify-center" style="height: 37px">
|
||||||
<%= t('sign_up') %>
|
<%= t('sign_up') %>
|
||||||
</a>
|
</a>
|
||||||
<span class="hidden sm:inline">
|
<span class="hidden sm:inline">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<div class="text-center px-2">
|
<div class="text-center px-2">
|
||||||
<% if local_assigns[:with_counter] %>
|
<% if local_assigns[:with_counter] %>
|
||||||
<% count = Submitter.where.not(completed_at: nil).distinct.count(:submission_id) %>
|
<% count = CompletedSubmitter.distinct.count(:submission_id) %>
|
||||||
<% if count > 1 %>
|
<% if count > 1 %>
|
||||||
<%= t('count_documents_signed_with_html', count:) %>
|
<%= t('count_documents_signed_with_html', count:) %>
|
||||||
<% else %>
|
<% else %>
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
</submitters-autocomplete>
|
</submitters-autocomplete>
|
||||||
<submitters-autocomplete data-field="phone">
|
<submitters-autocomplete data-field="phone">
|
||||||
<linked-input data-target-id="<%= "detailed_phone_#{item['linked_to_uuid']}" if item['linked_to_uuid'].present? %>">
|
<linked-input data-target-id="<%= "detailed_phone_#{item['linked_to_uuid']}" if item['linked_to_uuid'].present? %>">
|
||||||
<input type="tel" pattern="^\+[0-9\s\-]+$" oninvalid="this.value ? this.setCustomValidity('Use internatioanl format: +1xxx...') : ''" oninput="this.setCustomValidity('')" name="submission[1][submitters][][phone]" autocomplete="off" class="base-input !h-10 mt-1.5 w-full" placeholder="<%= "#{t('phone')} (#{t('optional')})" %>" id="detailed_phone_<%= item['uuid'] %>">
|
<input type="tel" pattern="^\+[0-9\s\-]+$" oninvalid="this.value ? this.setCustomValidity('<%= t('use_international_format_1xxx_') %>') : ''" oninput="this.setCustomValidity('')" name="submission[1][submitters][][phone]" autocomplete="off" class="base-input !h-10 mt-1.5 w-full" placeholder="<%= "#{t('phone')} (#{t('optional')})" %>" id="detailed_phone_<%= item['uuid'] %>">
|
||||||
</linked-input>
|
</linked-input>
|
||||||
</submitters-autocomplete>
|
</submitters-autocomplete>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
<input type="hidden" name="submission[1][submitters][][uuid]" value="<%= item['uuid'] %>">
|
<input type="hidden" name="submission[1][submitters][][uuid]" value="<%= item['uuid'] %>">
|
||||||
<submitters-autocomplete data-field="phone">
|
<submitters-autocomplete data-field="phone">
|
||||||
<linked-input data-target-id="<%= "phone_phone_#{item['linked_to_uuid']}" if item['linked_to_uuid'].present? %>">
|
<linked-input data-target-id="<%= "phone_phone_#{item['linked_to_uuid']}" if item['linked_to_uuid'].present? %>">
|
||||||
<%= tag.input type: 'tel', pattern: '^\+[0-9\s\-]+$', oninvalid: "this.value ? this.setCustomValidity('Use internatioanl format: +1xxx...') : ''", oninput: "this.setCustomValidity('')", name: 'submission[1][submitters][][phone]', autocomplete: 'off', class: 'base-input !h-10 w-full', placeholder: t('phone'), required: index.zero?, id: "phone_phone_#{item['uuid']}" %>
|
<%= tag.input type: 'tel', pattern: '^\+[0-9\s\-]+$', oninvalid: "this.value ? this.setCustomValidity('#{t('use_international_format_1xxx_')}') : ''", oninput: "this.setCustomValidity('')", name: 'submission[1][submitters][][phone]', autocomplete: 'off', class: 'base-input !h-10 w-full', placeholder: t('phone'), required: index.zero?, id: "phone_phone_#{item['uuid']}" %>
|
||||||
</linked-input>
|
</linked-input>
|
||||||
</submitters-autocomplete>
|
</submitters-autocomplete>
|
||||||
<% if submitters.size > 1 %>
|
<% if submitters.size > 1 %>
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
<% can_send_emails = Accounts.can_send_emails?(current_account) %>
|
<% can_send_emails = Accounts.can_send_emails?(current_account) %>
|
||||||
<div class="flex justify-between items-center">
|
<div class="flex justify-between items-center">
|
||||||
<%= f.label :send_email, for: uuid = SecureRandom.uuid, class: 'flex items-center cursor-pointer' do %>
|
<%= f.label :send_email, for: uuid = SecureRandom.uuid, class: 'flex items-center cursor-pointer' do %>
|
||||||
<%= f.check_box :send_email, id: uuid, class: 'base-checkbox', disabled: !can_send_emails, checked: can_send_emails %>
|
<%= f.check_box :send_email, id: uuid, class: 'base-checkbox', disabled: !can_send_emails, checked: can_send_emails && !local_assigns.key?(:resend_email) %>
|
||||||
<span class="label"><%= t('send_emails') %></span>
|
<span class="label"><%= local_assigns[:resend_email] ? t('re_send_email') : t('send_email') %></span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div>
|
<div>
|
||||||
<% if can_send_emails %>
|
<% if can_send_emails %>
|
||||||
<%= render 'email_stats' %>
|
<%= render 'submissions/email_stats' %>
|
||||||
<%= content_for(:edit_button) || capture do %>
|
<%= content_for(:edit_button) || capture do %>
|
||||||
<label>
|
<label>
|
||||||
<%= f.check_box :is_custom_message, onchange: "[this.form.querySelector('#message_field').classList.toggle('hidden', !event.currentTarget.checked)]", checked: false, class: 'hidden peer' %>
|
<%= f.check_box :is_custom_message, onchange: "[this.form.querySelector('#message_field').classList.toggle('hidden', !event.currentTarget.checked)]", checked: false, class: 'hidden peer' %>
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
<div class="form-control space-y-2">
|
<div class="form-control space-y-2">
|
||||||
<div class="form-control">
|
<div class="form-control">
|
||||||
<%= f.label :subject, t('subject'), class: 'label' %>
|
<%= f.label :subject, t('subject'), class: 'label' %>
|
||||||
<%= f.text_field :subject, value: @template.preferences['request_email_subject'].presence || config.value['subject'], required: true, class: '!text-sm base-input w-full', dir: 'auto' %>
|
<%= f.text_field :subject, value: local_assigns[:submitter_email_message]&.subject.presence || template.preferences['request_email_subject'].presence || config.value['subject'], required: true, class: '!text-sm base-input w-full', dir: 'auto' %>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-control">
|
<div class="form-control">
|
||||||
<div class="flex items-center">
|
<div class="flex items-center">
|
||||||
@@ -49,14 +49,16 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<autoresize-textarea>
|
<autoresize-textarea>
|
||||||
<%= f.text_area :body, value: @template.preferences['request_email_body'].presence || config.value['body'], required: true, class: 'base-textarea w-full', rows: 10, dir: 'auto' %>
|
<%= f.text_area :body, value: local_assigns[:submitter_email_message]&.body.presence || template.preferences['request_email_body'].presence || config.value['body'], required: true, class: 'base-textarea w-full', rows: 10, dir: 'auto' %>
|
||||||
</autoresize-textarea>
|
</autoresize-textarea>
|
||||||
<label for="<%= uuid = SecureRandom.uuid %>" class="flex items-center cursor-pointer">
|
<% unless local_assigns.fetch(:disable_save_as_default_template_option, false) %>
|
||||||
<%= check_box_tag :save_message, id: uuid, class: 'base-checkbox', checked: false %>
|
<label for="<%= uuid = SecureRandom.uuid %>" class="flex items-center cursor-pointer">
|
||||||
<span class="label"><%= t('save_as_default_template_message') %></span>
|
<%= check_box_tag :save_message, id: uuid, class: 'base-checkbox', checked: false %>
|
||||||
</label>
|
<span class="label"><%= t('save_as_default_template_message') %></span>
|
||||||
|
</label>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<%= render 'message_fields' %>
|
<%= render 'submissions/message_fields' %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
<% align = field.dig('preferences', 'align') %>
|
<% align = field.dig('preferences', 'align') %>
|
||||||
<field-value dir="auto" class="flex absolute text-[1.6vw] lg:text-base <%= 'font-serif' if field.dig('preferences', 'font') == 'Times' %> <%= align == 'right' ? 'justify-end' : (align == 'center' ? 'justify-center' : '') %>" style="width: <%= area['w'] * 100 %>%; height: <%= area['h'] * 100 %>%; left: <%= area['x'] * 100 %>%; top: <%= area['y'] * 100 %>%; <%= "font-size: #{field['preferences']['font_size']}pt" if field.dig('preferences', 'font_size') %>">
|
<field-value dir="auto" class="flex absolute text-[1.6vw] lg:text-base <%= 'font-serif' if field.dig('preferences', 'font') == 'Times' %> <%= align == 'right' ? 'justify-end' : (align == 'center' ? 'justify-center' : '') %>" style="width: <%= area['w'] * 100 %>%; height: <%= area['h'] * 100 %>%; left: <%= area['x'] * 100 %>%; top: <%= area['y'] * 100 %>%; <%= "font-size: clamp(4pt, 1.6vw, #{field['preferences']['font_size']}pt); line-height: `clamp(6pt, 2.0vw, #{field['preferences']['font_size'].to_i + 3}pt)`" if field.dig('preferences', 'font_size') %>">
|
||||||
<% if field['type'] == 'signature' %>
|
<% if field['type'] == 'signature' %>
|
||||||
<div class="flex flex-col justify-between h-full overflow-hidden">
|
<div class="flex flex-col justify-between h-full overflow-hidden">
|
||||||
<div class="flex-grow flex overflow-hidden" style="min-height: 50%">
|
<div class="flex-grow flex overflow-hidden" style="min-height: 50%">
|
||||||
|
|||||||
@@ -9,50 +9,56 @@
|
|||||||
<span 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.template.name.split(/(_)/).each do |item| %><%= item %><wbr><% end %></span>
|
<span 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.template.name.split(/(_)/).each do |item| %><%= item %><wbr><% end %></span>
|
||||||
</a>
|
</a>
|
||||||
<div class="space-x-3 flex items-center">
|
<div class="space-x-3 flex items-center">
|
||||||
|
<% last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %>
|
||||||
|
<% is_all_completed = @submission.submitters.to_a.all?(&:completed_at?) %>
|
||||||
|
<% if signed_in? && can?(:create, @submission) && @submission.archived_at? && !is_all_completed %>
|
||||||
|
<%= button_to button_title(title: t('unarchive'), disabled_with: t('unarchive')[0..-2], icon: svg_icon('rotate', class: 'w-6 h-6')), submission_unarchive_index_path(@submission), class: 'btn btn-primary btn-ghost text-base hidden md:flex' %>
|
||||||
|
<% end %>
|
||||||
<% if @submission.audit_trail.present? %>
|
<% if @submission.audit_trail.present? %>
|
||||||
<a href="<%= ActiveStorage::Blob.proxy_url(@submission.audit_trail.blob, expires_at: 4.hours.from_now) %>" class="white-button" target="_blank">
|
<a href="<%= ActiveStorage::Blob.proxy_url(@submission.audit_trail.blob, expires_at: 4.hours.from_now) %>" class="white-button" target="_blank">
|
||||||
<%= svg_icon('external_link', class: 'w-6 h-6') %>
|
<%= svg_icon('external_link', class: 'w-6 h-6') %>
|
||||||
<span class="hidden md:inline"><%= t('audit_log') %></span>
|
<span class="hidden md:inline"><%= t('audit_log') %></span>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if last_submitter = @submission.submitters.to_a.select(&:completed_at?).max_by(&:completed_at) %>
|
<% if last_submitter %>
|
||||||
<% is_all_completed = @submission.submitters.to_a.all?(&:completed_at?) %>
|
<% if is_all_completed || !is_combined_enabled %>
|
||||||
<div class="join relative">
|
<div class="join relative">
|
||||||
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig], combined: is_combined_enabled }.compact) %>" class="base-button <%= '!rounded-r-none !pr-2' if is_all_completed && !is_combined_enabled %>">
|
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig], combined: is_combined_enabled }.compact) %>" class="base-button <%= '!rounded-r-none !pr-2' if is_all_completed && !is_combined_enabled %>">
|
||||||
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
||||||
<%= svg_icon('download', class: 'w-6 h-6') %>
|
<%= svg_icon('download', class: 'w-6 h-6') %>
|
||||||
<span class="hidden md:inline"><%= t('download') %></span>
|
<span class="hidden md:inline"><%= t('download') %></span>
|
||||||
</span>
|
</span>
|
||||||
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
<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') %>
|
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
||||||
<span class="hidden md:inline"><%= t('downloading') %></span>
|
<span class="hidden md:inline"><%= t('downloading') %></span>
|
||||||
</span>
|
</span>
|
||||||
</download-button>
|
</download-button>
|
||||||
<% if is_all_completed && !is_combined_enabled %>
|
<% if is_all_completed && !is_combined_enabled %>
|
||||||
<div class="dropdown dropdown-end">
|
<div class="dropdown dropdown-end">
|
||||||
<label tabindex="0" class="base-button !rounded-l-none !pl-1 !pr-2 !border-l-neutral-500">
|
<label tabindex="0" class="base-button !rounded-l-none !pl-1 !pr-2 !border-l-neutral-500">
|
||||||
<span class="text-sm align-text-top">
|
<span class="text-sm align-text-top">
|
||||||
<%= svg_icon('chevron_down', class: 'w-6 h-6 flex-shrink-0 stroke-2') %>
|
<%= svg_icon('chevron_down', class: 'w-6 h-6 flex-shrink-0 stroke-2') %>
|
||||||
</span>
|
</span>
|
||||||
</label>
|
</label>
|
||||||
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box text-right">
|
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box text-right">
|
||||||
<li>
|
<li>
|
||||||
<download-button data-src="<%= submitter_download_index_path(last_submitter.slug, { sig: params[:sig], combined: true }.compact) %>" class="flex items-center">
|
<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">
|
<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') %>
|
<%= svg_icon('download', class: 'w-6 h-6 flex-shrink-0') %>
|
||||||
<span class="whitespace-nowrap"><%= t('download_combined_pdf') %></span>
|
<span class="whitespace-nowrap"><%= t('download_combined_pdf') %></span>
|
||||||
</span>
|
</span>
|
||||||
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
<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') %>
|
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
||||||
<span><%= t('downloading') %></span>
|
<span><%= t('downloading') %></span>
|
||||||
</span>
|
</span>
|
||||||
</download-button>
|
</download-button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% elsif @submission.submitters.to_a.size == 1 && !@submission.expired? && !@submission.submitters.to_a.first.declined_at? %>
|
<% end %>
|
||||||
|
<% elsif @submission.submitters.to_a.size == 1 && !@submission.expired? && !@submission.submitters.to_a.first.declined_at? && !@submission.archived_at? %>
|
||||||
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: @submission.submitters.to_a.first.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy_share_link'), copied_title: t('copied_to_clipboard') %>
|
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: @submission.submitters.to_a.first.slug), class: 'base-button', icon_class: 'w-6 h-6 text-white', copy_title: t('copy_share_link'), copied_title: t('copied_to_clipboard') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
@@ -107,12 +113,21 @@
|
|||||||
<% (@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">
|
<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="group 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 justify-between">
|
||||||
<span class="mx-1 w-3 h-3 rounded-full <%= colors[index] %>"></span>
|
<div class="flex items-center space-x-1">
|
||||||
<span class="text-lg" dir="auto">
|
<span class="mx-1 w-3 h-3 shrink-0 rounded-full <%= colors[index] %>"></span>
|
||||||
<%= (@submission.template_submitters || @submission.template.submitters).find { |e| e['uuid'] == submitter&.uuid }&.dig('name') || "#{(index + 1).ordinalize} Submitter" %>
|
<span class="text-lg" dir="auto">
|
||||||
</span>
|
<%= (@submission.template_submitters || @submission.template.submitters).find { |e| e['uuid'] == submitter&.uuid }&.dig('name') || "#{(index + 1).ordinalize} Submitter" %>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<% if signed_in? && can?(:update, submitter) && !submitter.completed_at? && !submitter.declined_at? && !@submission.archived_at? && !@submission.expired? && !submitter.start_form_submission_events.any? %>
|
||||||
|
<span class="tooltip tooltip-left" data-tip="<%= t('edit') %>">
|
||||||
|
<%= link_to edit_submitter_path(submitter), class: 'shrink-0 inline md:hidden md:group-hover:inline', data: { turbo_frame: 'modal' } do %>
|
||||||
|
<%= svg_icon('pencil', class: 'w-5 h-5') %>
|
||||||
|
<% end %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% if submitter&.name.present? %>
|
<% if submitter&.name.present? %>
|
||||||
<div class="flex items-center space-x-1 mt-1">
|
<div class="flex items-center space-x-1 mt-1">
|
||||||
@@ -182,7 +197,7 @@
|
|||||||
<% next if value.blank? %>
|
<% next if value.blank? %>
|
||||||
<div class="pt-2.5 border-b border-base-300">
|
<div class="pt-2.5 border-b border-base-300">
|
||||||
<div class="text-xs font-medium uppercase mb-0.5" dir="auto">
|
<div class="text-xs font-medium uppercase mb-0.5" dir="auto">
|
||||||
<%= field['name'].presence || "#{field['type'].titleize} Field #{submitter_field_counters[field['type']]}" %>
|
<%= field['name'].presence || "#{t("#{field['type']}_field")} #{submitter_field_counters[field['type']]}" %>
|
||||||
</div>
|
</div>
|
||||||
<div dir="auto">
|
<div dir="auto">
|
||||||
<% if field['type'].in?(%w[signature initials]) %>
|
<% if field['type'].in?(%w[signature initials]) %>
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
<% data_attachments = attachments_index.values.select { |e| e.record_id == submitter.id }.to_json(only: %i[uuid created_at], methods: %i[url filename content_type]) %>
|
<% data_attachments = attachments_index.values.select { |e| e.record_id == submitter.id }.to_json(only: %i[uuid created_at], methods: %i[url filename content_type]) %>
|
||||||
<% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %>
|
<% data_fields = (submitter.submission.template_fields || submitter.submission.template.fields).select { |f| f['submitter_uuid'] == submitter.uuid }.to_json %>
|
||||||
<% invite_submitters = (submitter.submission.template_submitters || submitter.submission.template.submitters).select { |s| s['invite_by_uuid'] == submitter.uuid && submitter.submission.submitters.none? { |e| e.uuid == s['uuid'] } }.to_json %>
|
<% invite_submitters = (submitter.submission.template_submitters || submitter.submission.template.submitters).select { |s| s['invite_by_uuid'] == submitter.uuid && submitter.submission.submitters.none? { |e| e.uuid == s['uuid'] } }.to_json %>
|
||||||
<submission-form data-is-demo="<%= Docuseal.demo? %>" data-require-signing-reason="<%= configs[:require_signing_reason] %>" data-with-signature-id="<%= configs[:with_signature_id] %>" data-with-confetti="<%= configs[:with_confetti] %>" data-completed-redirect-url="<%= submitter.preferences['completed_redirect_url'].presence || submitter.submission.template.preferences['completed_redirect_url'] %>" data-completed-message="<%= (configs[:completed_message]&.compact_blank.presence || submitter.submission.template.preferences['completed_message'] || {}).to_json %>" data-completed-button="<%= configs[:completed_button].to_json %>" data-go-to-last="<%= submitter.preferences.key?('go_to_last') ? submitter.preferences['go_to_last'] : submitter.opened_at? %>" data-submitter="<%= submitter.to_json(only: %i[uuid slug name phone email]) %>" data-can-send-email="<%= Accounts.can_send_emails?(submitter.submission.account) %>" data-invite-submitters="<%= invite_submitters %>" data-attachments="<%= data_attachments %>" data-fields="<%= data_fields %>" data-values="<%= submitter.values.to_json %>" data-with-typed-signature="<%= configs[:with_typed_signature] %>" data-previous-signature-value="<%= local_assigns[:signature_attachment]&.uuid %>" data-remember-signature="<%= configs[:prefill_signature] %>" data-dry-run="<%= local_assigns[:dry_run] %>" data-expand="<%= local_assigns[:expand] %>" data-scroll-padding="<%= local_assigns[:scroll_padding] %>" data-language="<%= I18n.locale.to_s.split('-').first %>"></submission-form>
|
<submission-form data-is-demo="<%= Docuseal.demo? %>" data-reuse-signature="<%= configs[:reuse_signature] %>" data-require-signing-reason="<%= configs[:require_signing_reason] %>" data-with-signature-id="<%= configs[:with_signature_id] %>" data-with-confetti="<%= configs[:with_confetti] %>" data-completed-redirect-url="<%= submitter.preferences['completed_redirect_url'].presence || submitter.submission.template.preferences['completed_redirect_url'] %>" data-completed-message="<%= (configs[:completed_message]&.compact_blank.presence || submitter.submission.template.preferences['completed_message'] || {}).to_json %>" data-completed-button="<%= configs[:completed_button].to_json %>" data-go-to-last="<%= submitter.preferences.key?('go_to_last') ? submitter.preferences['go_to_last'] : submitter.opened_at? %>" data-submitter="<%= submitter.to_json(only: %i[uuid slug name phone email]) %>" data-can-send-email="<%= Accounts.can_send_emails?(submitter.submission.account) %>" data-invite-submitters="<%= invite_submitters %>" data-attachments="<%= data_attachments %>" data-fields="<%= data_fields %>" data-values="<%= submitter.values.to_json %>" data-with-typed-signature="<%= configs[:with_typed_signature] %>" data-previous-signature-value="<%= local_assigns[:signature_attachment]&.uuid %>" data-remember-signature="<%= configs[:prefill_signature] %>" data-dry-run="<%= local_assigns[:dry_run] %>" data-expand="<%= local_assigns[:expand] %>" data-scroll-padding="<%= local_assigns[:scroll_padding] %>" data-language="<%= I18n.locale.to_s.split('-').first %>"></submission-form>
|
||||||
@@ -15,18 +15,21 @@
|
|||||||
<%= @submitter.submission.template.name %>
|
<%= @submitter.submission.template.name %>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex items-center space-x-2" style="margin-left: 20px; flex-shrink: 0">
|
<div class="flex items-center space-x-2" style="margin-left: 20px; flex-shrink: 0">
|
||||||
<div>
|
<% if @form_configs[:with_decline] %>
|
||||||
<%= render 'shared/html_modal', title: t(:decline), btn_text: t(:decline), btn_class: 'btn btn-sm !px-5', button_id: 'decline_button' do %>
|
<div>
|
||||||
<%= render 'submit_form/decline_form', submitter: @submitter %>
|
<%= render 'shared/html_modal', title: t(:decline), btn_text: t(:decline), btn_class: 'btn btn-sm !px-5', button_id: 'decline_button' do %>
|
||||||
<% end %>
|
<%= render 'submit_form/decline_form', submitter: @submitter %>
|
||||||
</div>
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
<download-button data-src="<%= submit_form_download_index_path(@submitter.slug) %>" class="btn btn-neutral text-white btn-sm !px-4">
|
<download-button data-src="<%= submit_form_download_index_path(@submitter.slug) %>" class="btn btn-neutral text-white btn-sm !px-4">
|
||||||
<span class="flex items-center justify-center space-x-2" data-target="download-button.defaultButton">
|
<span class="flex items-center justify-center" data-target="download-button.defaultButton">
|
||||||
<span><%= t('download') %></span>
|
<%= svg_icon('download', class: 'w-6 h-6 inline md:hidden') %>
|
||||||
|
<span class="hidden md:inline"><%= t('download') %></span>
|
||||||
</span>
|
</span>
|
||||||
<span class="flex items-center justify-center space-x-2 hidden" data-target="download-button.loadingButton">
|
<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') %>
|
<%= svg_icon('loader', class: 'w-6 h-6 animate-spin') %>
|
||||||
<span><%= t('downloading') %></span>
|
<span class="hidden md:inline"><%= t('downloading') %></span>
|
||||||
</span>
|
</span>
|
||||||
</download-button>
|
</download-button>
|
||||||
</div>
|
</div>
|
||||||
@@ -59,7 +62,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= render 'shared/attribution', link_path: '/start', account: @submitter.account %>
|
<%= render 'shared/attribution', link_path: '/start', account: @submitter.account, with_style: false %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="w-full bg-white rounded-2xl border relative" style="height: 300px">
|
<div class="w-full bg-white rounded-2xl border relative" style="height: 300px">
|
||||||
<canvas class="w-full"></canvas>
|
<canvas class="w-full"></canvas>
|
||||||
<button aria-label="<%= t('clear') %>" class="btn btn-ghost btn-sm font-medium top-0 right-0 absolute mt-1 mr-1">
|
<button aria-label="Clear" class="btn btn-ghost btn-sm font-medium top-0 right-0 absolute mt-1 mr-1">
|
||||||
<%= svg_icon('reload', class: 'w-5 h-5') %>
|
<%= svg_icon('reload', class: 'w-5 h-5') %>
|
||||||
<span class="inline"><%= t('clear') %></span>
|
<span class="inline"><%= t('clear') %></span>
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<%= render 'shared/turbo_modal_large', title: t('edit_recipient') do %>
|
||||||
|
<div class="px-5 mb-5 mt-4">
|
||||||
|
<%= form_for '', url: submitter_path(@submitter), method: :patch, html: { autocomplete: 'off' }, data: { turbo_frame: :_top } do |f| %>
|
||||||
|
<div class="mb-2">
|
||||||
|
<submitter-item class="form-control">
|
||||||
|
<submitters-autocomplete data-field="name">
|
||||||
|
<%= text_field_tag 'submitter[name]', @submitter.name, autocomplete: 'off', class: 'base-input !h-10 w-full', placeholder: "#{t('name')} (#{t('optional')})", dir: 'auto' %>
|
||||||
|
</submitters-autocomplete>
|
||||||
|
<div class="grid md:grid-cols-2 gap-1.5 mt-1.5">
|
||||||
|
<submitters-autocomplete data-field="email">
|
||||||
|
<%= email_field_tag 'submitter[email]', @submitter.email, autocomplete: 'off', class: 'base-input !h-10 mt-1.5 w-full', placeholder: "#{t('email')} (#{t('optional')})" %>
|
||||||
|
</submitters-autocomplete>
|
||||||
|
<submitters-autocomplete data-field="phone">
|
||||||
|
<%= telephone_field_tag 'submitter[phone]', @submitter.phone, autocomplete: 'off', pattern: '^\+[0-9\s\-]+$', class: 'base-input !h-10 mt-1.5 w-full', placeholder: "#{t('phone')} (#{t('optional')})", oninvalid: "this.value ? this.setCustomValidity('#{t('use_international_format_1xxx_')}') : ''", oninput: "this.setCustomValidity('')" %>
|
||||||
|
</submitters-autocomplete>
|
||||||
|
</div>
|
||||||
|
</submitter-item>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<%= render 'submissions/send_email', f:, template: @submitter.template, submitter: @submitter, resend_email: @submitter.sent_at?, submitter_email_message: @submitter_email_message, disable_save_as_default_template_option: true %>
|
||||||
|
<%= render 'submissions/send_sms', f:, resend_sms: @submitter.sent_at? %>
|
||||||
|
</div>
|
||||||
|
<div class="form-control mt-4">
|
||||||
|
<%= f.button button_title(title: t('update_recipient'), disabled_with: t('updating')), class: 'base-button' %>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
<%= content_for(:modal_extra) %>
|
||||||
|
<% end %>
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
<a href="<%= submission_path(submission) %>" class="w-full flex flex-col md:flex-row space-y-4 md:space-y-0 md:justify-between px-5 md:px-6 pb-5 md:items-center pt-5">
|
<div class="w-full flex flex-col md:flex-row space-y-4 md:space-y-0 md:justify-between px-5 md:px-6 pb-5 md:items-center pt-5 relative cursor-pointer">
|
||||||
<% submitters = (submission.template_submitters || submission.template.submitters).filter_map { |item| submission.submitters.find { |e| e.uuid == item['uuid'] } } %>
|
<% submitters = (submission.template_submitters || submission.template.submitters).filter_map { |item| submission.submitters.find { |e| e.uuid == item['uuid'] } } %>
|
||||||
<% is_submission_completed = submitters.all?(&:completed_at?) && submitters.size.positive? %>
|
<% is_submission_completed = submitters.all?(&:completed_at?) && submitters.size.positive? %>
|
||||||
<% if submitters.size == 1 %>
|
<% if submitters.size == 1 %>
|
||||||
@@ -41,22 +41,31 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
<div class="tooltip flex" data-tip="<%= l(submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
<a href="<%= submission_path(submission) %>" class="flex z-[1]">
|
||||||
<span class="badge <%= status_badges[submitter.status] %> md:w-32 badge-lg bg-opacity-50 uppercase text-sm font-semibold">
|
<span class="badge <%= status_badges[submitter.status] %> md:w-32 badge-lg bg-opacity-50 uppercase text-sm font-semibold tooltip" data-tip="<%= l(submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
||||||
<%= t(submitter.status) %>
|
<%= t(submitter.status) %>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="text-lg break-all flex items-center">
|
<span class="flex items-center z-[1]">
|
||||||
<%= submitter.name || submitter.email || submitter.phone %>
|
<a href="<%= submission_path(submission) %>" class="text-lg break-all peer">
|
||||||
|
<%= submitter.name || submitter.email || submitter.phone %>
|
||||||
|
</a>
|
||||||
|
<% if can?(:update, submitter) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %>
|
||||||
|
<span class="pl-0.5 tooltip tooltip-top md:opacity-0 md:hover:opacity-100 md:peer-hover:opacity-100" data-tip="<%= t('edit') %>">
|
||||||
|
<%= link_to edit_submitter_path(submitter), class: 'shrink-0', data: { turbo_frame: 'modal' } do %>
|
||||||
|
<%= svg_icon('pencil', class: 'w-5 h-5') %>
|
||||||
|
<% end %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-2 items-center">
|
<div class="flex space-x-2 items-center z-[1]">
|
||||||
<% if submitter.completed_at? %>
|
<% if submitter.completed_at? %>
|
||||||
<form onsubmit="event.preventDefault()" class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none">
|
||||||
<button onclick="event.stopPropagation()" class="w-full md:w-fit">
|
<div class="w-full md:w-fit">
|
||||||
<download-button data-src="<%= submitter_download_index_path(submitter.slug) %>" class="btn btn-sm btn-neutral text-white w-full md:w-36">
|
<download-button data-src="<%= submitter_download_index_path(submitter.slug) %>" class="btn btn-sm btn-neutral text-white w-full md:w-36">
|
||||||
<span class="flex items-center justify-center space-x-1 <%= 'md:space-x-2' if t('download').length < 11 %>" data-target="download-button.defaultButton">
|
<span class="flex items-center justify-center space-x-1 <%= 'md:space-x-2' if t('download').length < 11 %>" data-target="download-button.defaultButton">
|
||||||
<%= svg_icon('download', class: 'w-5 h-5 stroke-2') %>
|
<%= svg_icon('download', class: 'w-5 h-5 stroke-2') %>
|
||||||
@@ -67,37 +76,39 @@
|
|||||||
<span class="inline"><%= t('download')[..-2] %>...</span>
|
<span class="inline"><%= t('download')[..-2] %>...</span>
|
||||||
</span>
|
</span>
|
||||||
</download-button>
|
</download-button>
|
||||||
</button>
|
</div>
|
||||||
</form>
|
</div>
|
||||||
<% elsif !submission.archived_at? && !template.archived_at? && !submission.expired? && !submitter.declined_at? %>
|
<% elsif !submission.archived_at? && !template.archived_at? && !submission.expired? && !submitter.declined_at? %>
|
||||||
<% if current_user.email == submitter.email %>
|
<% if current_user.email == submitter.email %>
|
||||||
<form data-turbo="false" method="get" action="<%= submit_form_url(slug: submitter.slug) %>" class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none md:w-36 flex">
|
||||||
<button onclick="event.stopPropagation()" class="btn btn-sm btn-neutral btn-outline bg-white w-full md:w-36 flex">
|
<a href="<%= submit_form_url(slug: submitter.slug) %>" data-turbo="false" target="_blank" class="btn btn-sm btn-neutral btn-outline bg-white w-full md:w-36 flex z-[1]">
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2">
|
<span class="flex items-center justify-center space-x-1 md:space-x-2">
|
||||||
<% if t('sign_now').length < 12 %>
|
<% if t('sign_now').length < 12 %>
|
||||||
<%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %>
|
<%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="inline shrink-0"><%= t('sign_now') %></span>
|
<span class="inline shrink-0"><%= t('sign_now') %></span>
|
||||||
</span>
|
</span>
|
||||||
</button>
|
</a>
|
||||||
</form>
|
</div>
|
||||||
<% else %>
|
<% else %>
|
||||||
<div class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none">
|
||||||
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: submitter.slug), class: 'btn btn-sm btn-neutral text-white md:w-36 flex', icon_class: 'w-6 h-6 text-white', copy_title: t('copy_link').length < 10 ? t('copy_link') : t('copy'), copy_title_md: t('copy'), copied_title_md: t('copied') %>
|
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: submitter.slug), class: 'btn btn-sm btn-neutral text-white md:w-36 flex z-[1]', icon_class: 'w-6 h-6 text-white', copy_title: t('copy_link').length < 10 ? t('copy_link') : t('copy'), copy_title_md: t('copy'), copied_title_md: t('copied') %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none z-[1]">
|
||||||
<span class="btn btn-outline btn-sm w-full md:w-24"><%= t('view') %></span>
|
<a href="<%= submission_path(submission) %>" class="btn btn-outline btn-sm w-full md:w-24">
|
||||||
|
<%= t('view') %>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<% if !submission.archived_at? && !template.archived_at? && can?(:destroy, submission) %>
|
<% if !submission.archived_at? && !template.archived_at? && can?(:destroy, submission) %>
|
||||||
<span data-tip="<%= t('archive') %>" class="sm:tooltip tooltip-top">
|
<span data-tip="<%= t('archive') %>" class="sm:tooltip tooltip-top">
|
||||||
<%= button_to button_title(title: nil, disabled_with: t(:archive).first(4), icon: svg_icon('archive', class: 'w-6 h-6')), submission_path(submission), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('archive'), method: :delete, onclick: 'event.stopPropagation()' %>
|
<%= button_to button_title(title: nil, disabled_with: t(:archive).first(4), icon: svg_icon('archive', class: 'w-6 h-6')), submission_path(submission), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('archive'), method: :delete %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if local_assigns[:archived] && can?(:destroy, submission) %>
|
<% if local_assigns[:archived] && can?(:destroy, submission) %>
|
||||||
<span data-tip="<%= t('remove') %>" class="sm:tooltip tooltip-top">
|
<span data-tip="<%= t('remove') %>" class="sm:tooltip tooltip-top">
|
||||||
<%= button_to button_title(title: nil, disabled_with: t(:remove).first(3), icon: svg_icon('trash', class: 'w-6 h-6')), submission_path(submission, permanently: true), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('remove'), method: :delete, data: { turbo_confirm: t('submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_') }, onclick: 'event.stopPropagation()' %>
|
<%= button_to button_title(title: nil, disabled_with: t(:remove).first(3), icon: svg_icon('trash', class: 'w-6 h-6')), submission_path(submission, permanently: true), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('remove'), method: :delete, data: { turbo_confirm: t('submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_') } %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
@@ -106,11 +117,11 @@
|
|||||||
<div class="flex flex-col md:flex-row md:items-center gap-3">
|
<div class="flex flex-col md:flex-row md:items-center gap-3">
|
||||||
<% if is_submission_completed %>
|
<% if is_submission_completed %>
|
||||||
<% latest_submitter = submitters.select(&:completed_at?).max_by(&:completed_at) %>
|
<% latest_submitter = submitters.select(&:completed_at?).max_by(&:completed_at) %>
|
||||||
<div class="tooltip flex" data-tip="<%= l(latest_submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
<a href="<%= submission_path(submission) %>" class="z-[1] tooltip flex" data-tip="<%= l(latest_submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
||||||
<span class="badge <%= status_badges[latest_submitter.status] %> md:w-32 bg-opacity-50 badge-lg uppercase text-sm font-semibold">
|
<span class="badge <%= status_badges[latest_submitter.status] %> md:w-32 bg-opacity-50 badge-lg uppercase text-sm font-semibold">
|
||||||
<%= t(latest_submitter.status) %>
|
<%= t(latest_submitter.status) %>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</a>
|
||||||
<% elsif submission.expired? %>
|
<% elsif submission.expired? %>
|
||||||
<div class="tooltip flex" data-tip="<%= l(submission.expire_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
<div class="tooltip flex" data-tip="<%= l(submission.expire_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
||||||
<span class="badge badge-error md:w-32 bg-opacity-50 badge-lg uppercase text-sm font-semibold">
|
<span class="badge badge-error md:w-32 bg-opacity-50 badge-lg uppercase text-sm font-semibold">
|
||||||
@@ -123,46 +134,49 @@
|
|||||||
<div class="relative flex justify-between items-start md:items-center space-x-3">
|
<div class="relative flex justify-between items-start md:items-center space-x-3">
|
||||||
<span class="flex flex-col md:flex-row md:items-center gap-2">
|
<span class="flex flex-col md:flex-row md:items-center gap-2">
|
||||||
<% if !is_submission_completed && !submission.expired? %>
|
<% if !is_submission_completed && !submission.expired? %>
|
||||||
<div class="tooltip flex" data-tip="<%= l(submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
<a href="<%= submission_path(submission) %>" class="z-[1] tooltip flex" data-tip="<%= l(submitter.status_event_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) %>">
|
||||||
<span class="badge md:w-24 <%= status_badges[submitter.status] %> bg-opacity-50 uppercase text-xs font-semibold">
|
<span class="badge md:w-24 <%= status_badges[submitter.status] %> bg-opacity-50 uppercase text-xs font-semibold">
|
||||||
<%= t(submitter.status) %>
|
<%= t(submitter.status) %>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</a>
|
||||||
<% end %>
|
<% end %>
|
||||||
<span class="text-lg break-all">
|
<span class="flex items-center z-[1]">
|
||||||
<%= submitter.name || submitter.email || submitter.phone %>
|
<a href="<%= submission_path(submission) %>" class="text-lg break-all peer">
|
||||||
|
<%= submitter.name || submitter.email || submitter.phone %>
|
||||||
|
</a>
|
||||||
|
<% if can?(:update, submitter) && !submitter.start_form_submission_events.any? && !submission.archived_at? && !submission.expired? && !submitter.declined_at? %>
|
||||||
|
<span class="pl-0.5 tooltip tooltip-top md:opacity-0 md:hover:opacity-100 md:peer-hover:opacity-100" data-tip="<%= t('edit') %>">
|
||||||
|
<%= link_to edit_submitter_path(submitter), class: 'shrink-0', data: { turbo_frame: 'modal' } do %>
|
||||||
|
<%= svg_icon('pencil', class: 'w-5 h-5') %>
|
||||||
|
<% end %>
|
||||||
|
</span>
|
||||||
|
<% end %>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<% if submitter.completed_at? && !is_submission_completed %>
|
<% if submitter.completed_at? && !is_submission_completed %>
|
||||||
<form onsubmit="event.preventDefault()">
|
<download-button data-src="<%= submitter_download_index_path(submitter.slug) %>" class="absolute md:relative top-0 right-0 btn btn-xs btn-neutral text-white md:w-36 z-[1]">
|
||||||
<button onclick="event.stopPropagation()">
|
<span class="flex items-center justify-center space-x-1 md:space-x-2" data-target="download-button.defaultButton">
|
||||||
<download-button data-src="<%= submitter_download_index_path(submitter.slug) %>" class="absolute md:relative top-0 right-0 btn btn-xs btn-neutral text-white md:w-36">
|
<%= svg_icon('download', class: 'w-4 h-4 stroke-2') %>
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2" data-target="download-button.defaultButton">
|
<span class="inline"><%= t('download') %></span>
|
||||||
<%= svg_icon('download', class: 'w-4 h-4 stroke-2') %>
|
</span>
|
||||||
<span class="inline"><%= t('download') %></span>
|
<span class="flex items-center justify-center space-x-1 md:space-x-2 hidden" data-target="download-button.loadingButton">
|
||||||
</span>
|
<%= svg_icon('loader', class: 'w-4 h-4 animate-spin') %>
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2 hidden" data-target="download-button.loadingButton">
|
<span class="inline"><%= t('download')[..-2] %>...</span>
|
||||||
<%= svg_icon('loader', class: 'w-4 h-4 animate-spin') %>
|
</span>
|
||||||
<span class="inline"><%= t('download')[..-2] %>...</span>
|
</download-button>
|
||||||
</span>
|
|
||||||
</download-button>
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
<% elsif !template.archived_at? && !submission.archived_at? && !is_submission_completed && !submission.expired? && !submitter.declined_at? %>
|
<% elsif !template.archived_at? && !submission.archived_at? && !is_submission_completed && !submission.expired? && !submitter.declined_at? %>
|
||||||
<div class="relative flex items-center space-x-3">
|
<div class="relative flex items-center space-x-3">
|
||||||
<% if current_user.email == submitter.email %>
|
<% if current_user.email == submitter.email %>
|
||||||
<form data-turbo="false" method="get" action="<%= submit_form_url(slug: submitter.slug) %>">
|
<a href="<%= submit_form_url(slug: submitter.slug) %>" data-turbo="false" target="_blank" class="absolute md:relative top-0 right-0 btn btn-xs btn-outline btn-neutral bg-white w-28 md:w-36 z-[1]">
|
||||||
<button onclick="event.stopPropagation()" class="absolute md:relative top-0 right-0 btn btn-xs btn-outline btn-neutral bg-white w-28 md:w-36">
|
<span class="flex items-center justify-center space-x-1 md:space-x-2">
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2">
|
<% if t('sign_now').length < 12 %>
|
||||||
<% if t('sign_now').length < 12 %>
|
<%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %>
|
||||||
<%= svg_icon('writing_sign', class: 'w-4 h-4 stroke-2') %>
|
<% end %>
|
||||||
<% end %>
|
<span class="inline shrink-0"><%= t('sign_now') %></span>
|
||||||
<span class="inline shrink-0"><%= t('sign_now') %></span>
|
</span>
|
||||||
</span>
|
</a>
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
<% else %>
|
<% else %>
|
||||||
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: submitter.slug), class: 'absolute md:relative top-0 right-0 btn btn-xs text-xs btn-neutral text-white w-28 md:w-36 flex', icon_class: 'w-4 h-4 text-white', copy_title: t('copy_link'), copy_title_md: t('copy_link').length < 10 ? t('copy_link') : t('copy'), copied_title_md: t('copied') %>
|
<%= render 'shared/clipboard_copy', text: submit_form_url(slug: submitter.slug), class: 'absolute md:relative top-0 right-0 btn btn-xs text-xs btn-neutral text-white w-28 md:w-36 flex z-[1]', icon_class: 'w-4 h-4 text-white', copy_title: t('copy_link'), copy_title_md: t('copy_link').length < 10 ? t('copy_link') : t('copy'), copied_title_md: t('copied') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -171,40 +185,41 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex space-x-1 md:space-x-2 items-center">
|
<div class="flex space-x-1 md:space-x-2 items-center z-[1]">
|
||||||
<% if is_submission_completed %>
|
<% if is_submission_completed %>
|
||||||
<% latest_submitter = submitters.select(&:completed_at?).max_by(&:completed_at) %>
|
<% latest_submitter = submitters.select(&:completed_at?).max_by(&:completed_at) %>
|
||||||
<div class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none">
|
||||||
<form onsubmit="event.preventDefault()" class="w-full md:w-fit">
|
<div class="w-full md:w-fit">
|
||||||
<button onclick="event.stopPropagation()" class="w-full">
|
<download-button data-src="<%= submitter_download_index_path(latest_submitter.slug) %>" class="btn btn-sm btn-neutral text-white w-full md:w-36 z-[1]">
|
||||||
<download-button data-src="<%= submitter_download_index_path(latest_submitter.slug) %>" class="btn btn-sm btn-neutral text-white w-full md:w-36">
|
<span class="flex items-center justify-center space-x-1 md:space-x-2" data-target="download-button.defaultButton">
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2" data-target="download-button.defaultButton">
|
<%= svg_icon('download', class: 'w-5 h-5 stroke-2') %>
|
||||||
<%= svg_icon('download', class: 'w-5 h-5 stroke-2') %>
|
<span class="inline"><%= t('download') %></span>
|
||||||
<span class="inline"><%= t('download') %></span>
|
</span>
|
||||||
</span>
|
<span class="flex items-center justify-center space-x-1 md:space-x-2 hidden" data-target="download-button.loadingButton">
|
||||||
<span class="flex items-center justify-center space-x-1 md:space-x-2 hidden" data-target="download-button.loadingButton">
|
<%= svg_icon('loader', class: 'w-5 h-5 animate-spin') %>
|
||||||
<%= svg_icon('loader', class: 'w-5 h-5 animate-spin') %>
|
<span class="inline"><%= t('download')[..-2] %>...</span>
|
||||||
<span class="inline"><%= t('download')[..-2] %>...</span>
|
</span>
|
||||||
</span>
|
</download-button>
|
||||||
</download-button>
|
</div>
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
<div class="flex-1 md:flex-none">
|
<div class="flex-1 md:flex-none z-[1]">
|
||||||
<span class="btn btn-outline btn-sm w-full md:w-24"><%= t('view') %></span>
|
<a href="<%= submission_path(submission) %>" class="btn btn-outline btn-sm w-full md:w-24">
|
||||||
|
<%= t('view') %>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<% if !submission.archived_at? && !template.archived_at? %>
|
<% if !submission.archived_at? && !template.archived_at? %>
|
||||||
<span data-tip="<%= t('archive') %>" class="sm:tooltip tooltip-top">
|
<span data-tip="<%= t('archive') %>" class="sm:tooltip tooltip-top">
|
||||||
<%= button_to button_title(title: nil, disabled_with: t(:archive).first(4), icon: svg_icon('archive', class: 'w-6 h-6')), submission_path(submission), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('archive'), method: :delete, onclick: 'event.stopPropagation()' %>
|
<%= button_to button_title(title: nil, disabled_with: t(:archive).first(4), icon: svg_icon('archive', class: 'w-6 h-6')), submission_path(submission), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('archive'), method: :delete %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if local_assigns[:archived] && can?(:destroy, submission) %>
|
<% if local_assigns[:archived] && can?(:destroy, submission) %>
|
||||||
<span data-tip="<%= t('remove') %>" class="sm:tooltip tooltip-top">
|
<span data-tip="<%= t('remove') %>" class="sm:tooltip tooltip-top">
|
||||||
<%= button_to button_title(title: nil, disabled_with: t(:remove).first(3), icon: svg_icon('trash', class: 'w-6 h-6')), submission_path(submission, permanently: true), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('remove'), method: :delete, data: { turbo_confirm: t('submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_') }, onclick: 'event.stopPropagation()' %>
|
<%= button_to button_title(title: nil, disabled_with: t(:remove).first(3), icon: svg_icon('trash', class: 'w-6 h-6')), submission_path(submission, permanently: true), class: 'btn btn-outline btn-sm w-full md:w-fit', form: { class: 'flex' }, title: t('remove'), method: :delete, data: { turbo_confirm: t('submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_') } %>
|
||||||
</span>
|
</span>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</a>
|
<a href="<%= submission_path(submission) %>" class="top-0 bottom-0 left-0 right-0 absolute"></a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<p>Hello <%= @user.first_name %>,</p>
|
<p><%= @user.first_name.present? ? t('hello_name', name: @user.first_name) : t('hi_there') %>,</p>
|
||||||
<p>You have been invited to <%= @user.account.name %> <%= Docuseal.product_name %>. Please sign up using the link below:</p>
|
<p><%= t('you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_', account_name: @user.account.name, product_name: Docuseal.product_name) %></p>
|
||||||
<p><%= link_to 'Sign up', invitation_url(reset_password_token: @token) %></p>
|
<p><%= link_to t('sign_up'), invitation_url(reset_password_token: @token) %></p>
|
||||||
<p>Please contact us by replying to this email if you didn't request this.</p>
|
<p><%= t('please_contact_us_by_replying_to_this_email_if_you_didn_t_request_this') %></p>
|
||||||
<p>
|
<p>
|
||||||
Thanks,<br><%= @current_account.name %>
|
<%= t('thanks') %>,<br><%= @current_account.name %>
|
||||||
</p>
|
</p>
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
<div class="flex items-center space-x-1">
|
||||||
|
<% if %w[archived integration].include?(params[:status]) %>
|
||||||
|
<%= link_to t('view_active'), settings_users_path, class: 'link text-sm' %>
|
||||||
|
<% else %>
|
||||||
|
<% archived_exists = current_account.users.archived.where.not(role: 'integration').exists? %>
|
||||||
|
<% if current_account.users.active.exists?(role: 'integration') %>
|
||||||
|
<%= link_to t('view_embedding_users'), settings_integration_users_path, class: 'link text-sm' %>
|
||||||
|
<% if archived_exists %>
|
||||||
|
<span class="text-neutral-700">|</span>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<% if archived_exists %>
|
||||||
|
<%= link_to t('view_archived'), settings_archived_users_path, class: 'link text-sm' %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
@@ -1,12 +1,18 @@
|
|||||||
<div class="flex-wrap space-y-4 md:flex md:flex-nowrap md:space-y-0 md:space-x-10">
|
<div class="flex-wrap space-y-4 md:flex md:flex-nowrap md:space-y-0 md:space-x-10">
|
||||||
<%= render 'shared/settings_nav' %>
|
<%= render 'shared/settings_nav' %>
|
||||||
<div class="md:flex-grow">
|
<div class="md:flex-grow">
|
||||||
<div class="flex flex-col md:flex-row gap-2 md:justify-between md:items-end mb-4">
|
<div class="flex flex-col md:flex-row gap-2 md:justify-between md:items-end mb-4 min-h-12">
|
||||||
<h1 class="text-4xl font-bold">
|
<h1 class="text-4xl font-bold">
|
||||||
<%= t('status_users', status: params[:status].to_s.titleize) %>
|
<% if params[:status] == 'archived' %>
|
||||||
|
<%= t('archived_users') %>
|
||||||
|
<% elsif params[:status] == 'integration' %>
|
||||||
|
<%= t('embedding_users') %>
|
||||||
|
<% else %>
|
||||||
|
<%= t('users') %>
|
||||||
|
<% end %>
|
||||||
</h1>
|
</h1>
|
||||||
<div class="flex flex-col md:flex-row gap-y-2 gap-x-4 md:items-center">
|
<div class="flex flex-col md:flex-row gap-y-2 gap-x-4 md:items-center">
|
||||||
<% if can?(:create, User.new(account: current_account)) %>
|
<% if params[:status].blank? && can?(:create, User.new(account: current_account)) %>
|
||||||
<%= render 'users/extra_buttons' %>
|
<%= render 'users/extra_buttons' %>
|
||||||
<% if content_for(:add_user_button) %>
|
<% if content_for(:add_user_button) %>
|
||||||
<%= content_for(:add_user_button) %>
|
<%= content_for(:add_user_button) %>
|
||||||
@@ -57,17 +63,17 @@
|
|||||||
<%= user.last_sign_in_at ? l(user.last_sign_in_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) : '-' %>
|
<%= user.last_sign_in_at ? l(user.last_sign_in_at.in_time_zone(current_account.timezone), format: :short, locale: current_account.locale) : '-' %>
|
||||||
</td>
|
</td>
|
||||||
<td class="flex items-center space-x-2 justify-end">
|
<td class="flex items-center space-x-2 justify-end">
|
||||||
<% if can?(:update, user) && user.archived_at.blank? %>
|
<% if params[:status].blank? && can?(:update, user) && user.archived_at.blank? %>
|
||||||
<%= link_to edit_user_path(user), class: 'btn btn-outline btn-xs', title: t('edit'), data: { turbo_frame: 'modal' } do %>
|
<%= link_to edit_user_path(user), class: 'btn btn-outline btn-xs', title: t('edit'), data: { turbo_frame: 'modal' } do %>
|
||||||
<%= t('edit') %>
|
<%= t('edit') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if params[:status].blank? && can?(:destroy, user) && user != current_user %>
|
<% if params[:status] != 'archived' && can?(:destroy, user) && user != current_user %>
|
||||||
<%= button_to user_path(user), method: :delete, class: 'btn btn-outline btn-error btn-xs', title: t('remove'), data: { turbo_confirm: t('are_you_sure_') } do %>
|
<%= button_to user_path(user), method: :delete, class: 'btn btn-outline btn-error btn-xs', title: t('remove'), data: { turbo_confirm: t('are_you_sure_') } do %>
|
||||||
<%= t('remove') %>
|
<%= t('remove') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<% if params[:status].present? && can?(:manage, user) && user != current_user %>
|
<% if params[:status] == 'archived' && can?(:manage, user) && user != current_user && user.archived_at? %>
|
||||||
<%= button_to user_path(user), method: :put, params: { user: { archived_at: nil } }, class: 'btn btn-outline btn-xs', title: t('unarchive'), data: { turbo_confirm: t('are_you_sure_') } do %>
|
<%= button_to user_path(user), method: :put, params: { user: { archived_at: nil } }, class: 'btn btn-outline btn-xs', title: t('unarchive'), data: { turbo_confirm: t('are_you_sure_') } do %>
|
||||||
<%= t('unarchive') %>
|
<%= t('unarchive') %>
|
||||||
<% end %>
|
<% end %>
|
||||||
@@ -78,22 +84,11 @@
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<% view_archived_html = capture do %>
|
|
||||||
<% if current_account.users.archived.exists? %>
|
|
||||||
<div>
|
|
||||||
<% if params[:status] == 'archived' %>
|
|
||||||
<a href="<%= settings_users_path %>" class="link text-sm"><%= t('view_active') %></a>
|
|
||||||
<% else %>
|
|
||||||
<a href="<%= settings_archived_users_path %>" class="link text-sm"><%= t('view_archived') %></a>
|
|
||||||
<% end %>
|
|
||||||
</div>
|
|
||||||
<% end %>
|
|
||||||
<% end %>
|
|
||||||
<% if @pagy.pages > 1 %>
|
<% if @pagy.pages > 1 %>
|
||||||
<%= render 'shared/pagination', pagy: @pagy, items_name: 'users', left_additional_html: view_archived_html %>
|
<%= render 'shared/pagination', pagy: @pagy, items_name: 'users', left_additional_html: render('bottom_links') %>
|
||||||
<% else %>
|
<% else %>
|
||||||
<div class="mt-2">
|
<div class="mt-2">
|
||||||
<%= view_archived_html %>
|
<%= render 'bottom_links' %>
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Bundler.require(*Rails.groups)
|
|||||||
|
|
||||||
module DocuSeal
|
module DocuSeal
|
||||||
class Application < Rails::Application
|
class Application < Rails::Application
|
||||||
config.load_defaults 7.1
|
config.load_defaults 7.2
|
||||||
|
|
||||||
config.autoload_lib(ignore: %w[assets tasks puma])
|
config.autoload_lib(ignore: %w[assets tasks puma])
|
||||||
|
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ Rails.application.configure do
|
|||||||
domain: ENV.fetch('SMTP_DOMAIN', nil),
|
domain: ENV.fetch('SMTP_DOMAIN', nil),
|
||||||
user_name: ENV.fetch('SMTP_USERNAME', nil),
|
user_name: ENV.fetch('SMTP_USERNAME', nil),
|
||||||
password: ENV.fetch('SMTP_PASSWORD', nil),
|
password: ENV.fetch('SMTP_PASSWORD', nil),
|
||||||
authentication: ENV.fetch('SMTP_AUTHENTICATION', 'plain'),
|
authentication: ENV.fetch('SMTP_PASSWORD', nil).present? ? ENV.fetch('SMTP_AUTHENTICATION', 'plain') : nil,
|
||||||
enable_starttls_auto: ENV['SMTP_ENABLE_STARTTLS_AUTO'] != 'false'
|
enable_starttls_auto: ENV['SMTP_ENABLE_STARTTLS_AUTO'] != 'false'
|
||||||
}.compact
|
}.compact
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,19 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
module HexaPDF
|
module HexaPDF
|
||||||
|
module DigitalSignature
|
||||||
|
class Signatures
|
||||||
|
private
|
||||||
|
|
||||||
|
def generate_field_name
|
||||||
|
index = (@document.acro_form.each_field
|
||||||
|
.map { |field| field.full_field_name.to_s.scan(/\ASignature(\d+)/).first&.first.to_i }
|
||||||
|
.max || 0) + 1
|
||||||
|
"Signature#{index}"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
module Encryption
|
module Encryption
|
||||||
class SecurityHandler
|
class SecurityHandler
|
||||||
def encrypt_string(str, obj)
|
def encrypt_string(str, obj)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
Rails.configuration.to_prepare do
|
Rails.configuration.to_prepare do
|
||||||
ActiveRecord::Tasks::DatabaseTasks.migrate if ENV['RAILS_ENV'] == 'production'
|
ActiveRecord::Tasks::DatabaseTasks.migrate if ENV['RAILS_ENV'] == 'production' && ENV['RUN_MIGRATIONS'] != 'false'
|
||||||
end
|
end
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
Pagy::DEFAULT[:items] = 10
|
Pagy::DEFAULT[:limit] = 10
|
||||||
Pagy::DEFAULT.freeze
|
Pagy::DEFAULT.freeze
|
||||||
|
|
||||||
ActiveSupport.on_load(:action_view) do
|
ActiveSupport.on_load(:action_view) do
|
||||||
|
|||||||
+383
-22
@@ -20,8 +20,13 @@ en: &en
|
|||||||
language_ko: 한국어
|
language_ko: 한국어
|
||||||
hi_there: Hi there
|
hi_there: Hi there
|
||||||
thanks: Thanks
|
thanks: Thanks
|
||||||
|
unarchive: Unarchive
|
||||||
first_party: 'First Party'
|
first_party: 'First Party'
|
||||||
docuseal_trusted_signature: DocuSeal Trusted Signature
|
docuseal_trusted_signature: DocuSeal Trusted Signature
|
||||||
|
hello_name: Hello %{name}
|
||||||
|
you_are_invited_to_product_name: You are invited to %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'You have been invited to %{account_name} %{product_name}. Please sign up using the link below:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Sent using <a href="%{product_url}">%{product_name}</a> free document signing.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Sign documents with trusted certificate provided by DocuSeal. Your documents and data are never shared with DocuSeal. PDF checksum is provided to generate a trusted signature.
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Sign documents with trusted certificate provided by DocuSeal. Your documents and data are never shared with DocuSeal. PDF checksum is provided to generate a trusted signature.
|
||||||
you_have_been_invited_to_submit_the_name_form: 'You have been invited to submit the "%{name}" form.'
|
you_have_been_invited_to_submit_the_name_form: 'You have been invited to submit the "%{name}" form.'
|
||||||
you_have_been_invited_to_sign_the_name: 'You have been invited to sign the "%{name}".'
|
you_have_been_invited_to_sign_the_name: 'You have been invited to sign the "%{name}".'
|
||||||
@@ -115,7 +120,7 @@ en: &en
|
|||||||
profile_details: Profile Details
|
profile_details: Profile Details
|
||||||
sign_up_with_google: Sign up with Google
|
sign_up_with_google: Sign up with Google
|
||||||
sign_up_with_microsoft: Sign up with Microsoft
|
sign_up_with_microsoft: Sign up with Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'By creating an account, you agree to our <a target="_blank" href="https://www.docuseal.co/privacy">Privacy Policy</a> and <a target="_blank" href="https://www.docuseal.co/terms">Terms of Service</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'By creating an account, you agree to our <a target="_blank" href="https://www.docuseal.com/privacy">Privacy Policy</a> and <a target="_blank" href="https://www.docuseal.com/terms">Terms of Service</a>.'
|
||||||
enter_email_to_continue: Enter email to continue
|
enter_email_to_continue: Enter email to continue
|
||||||
account: Account
|
account: Account
|
||||||
preferences: Preferences
|
preferences: Preferences
|
||||||
@@ -130,6 +135,7 @@ en: &en
|
|||||||
require_signing_reason: Require signing reason
|
require_signing_reason: Require signing reason
|
||||||
allow_typed_text_signatures: Allow typed text signatures
|
allow_typed_text_signatures: Allow typed text signatures
|
||||||
allow_to_resubmit_completed_forms: Allow to resubmit completed forms
|
allow_to_resubmit_completed_forms: Allow to resubmit completed forms
|
||||||
|
allow_to_decline_documents: Allow to decline documents
|
||||||
remember_and_pre_fill_signatures: Remember and pre-fill signatures
|
remember_and_pre_fill_signatures: Remember and pre-fill signatures
|
||||||
require_authentication_for_file_download_links: Require authentication for file download links
|
require_authentication_for_file_download_links: Require authentication for file download links
|
||||||
combine_completed_documents_and_audit_log: Combine completed documents and Audit Log
|
combine_completed_documents_and_audit_log: Combine completed documents and Audit Log
|
||||||
@@ -469,7 +475,6 @@ en: &en
|
|||||||
back: Back
|
back: Back
|
||||||
add_secret: Add Secret
|
add_secret: Add Secret
|
||||||
submission_example_payload: Submission example payload
|
submission_example_payload: Submission example payload
|
||||||
status_users: '%{status} Users'
|
|
||||||
there_are_no_signatures: There are no signatures
|
there_are_no_signatures: There are no signatures
|
||||||
signed_with_trusted_certificate: Signed with trusted certificate
|
signed_with_trusted_certificate: Signed with trusted certificate
|
||||||
signed_with_external_certificate: Signed with external certificate
|
signed_with_external_certificate: Signed with external certificate
|
||||||
@@ -494,6 +499,7 @@ en: &en
|
|||||||
document_template_has_been_moved: Document template has been moved.
|
document_template_has_been_moved: Document template has been moved.
|
||||||
unable_to_move_template_into_folder: Unable to move template into folder.
|
unable_to_move_template_into_folder: Unable to move template into folder.
|
||||||
template_has_been_unarchived: Template has been unarchived.
|
template_has_been_unarchived: Template has been unarchived.
|
||||||
|
submission_has_been_unarchived: Submission has been unarchived.
|
||||||
unable_to_update_file: Unable to upload file.
|
unable_to_update_file: Unable to upload file.
|
||||||
user_has_been_invited: User has been invited.
|
user_has_been_invited: User has been invited.
|
||||||
unable_to_update_user: Unable to update user.
|
unable_to_update_user: Unable to update user.
|
||||||
@@ -577,6 +583,61 @@ en: &en
|
|||||||
opened: Opened
|
opened: Opened
|
||||||
sent: Sent
|
sent: Sent
|
||||||
awaiting: Awaiting
|
awaiting: Awaiting
|
||||||
|
document_id: Document ID
|
||||||
|
envelope_id: Envelope ID
|
||||||
|
event_log: Event Log
|
||||||
|
verify: Verify
|
||||||
|
testing_log_not_for_production_use: Testing Log - Not for Production Use
|
||||||
|
original_sha256: Original SHA256
|
||||||
|
result_sha256: Result SHA256
|
||||||
|
generated_at: Generated at
|
||||||
|
email_verification: Email verification
|
||||||
|
phone_verification: Phone verification
|
||||||
|
session_id: Session ID
|
||||||
|
option: Option
|
||||||
|
text_field: Text Field
|
||||||
|
signature_field: Signature Field
|
||||||
|
initials_field: Initials Field
|
||||||
|
date_field: Date Field
|
||||||
|
number_field: Number Field
|
||||||
|
image_field: Image Field
|
||||||
|
file_field: File Field
|
||||||
|
select_field: Select Field
|
||||||
|
checkbox_field: Checkbox Field
|
||||||
|
multiple_field: Multiple Select Field
|
||||||
|
radio_field: Radio Group Field
|
||||||
|
cells_field: Cells Field
|
||||||
|
stamp_field: Stamp Field
|
||||||
|
payment_field: Payment Field
|
||||||
|
phone_field: Phone Field
|
||||||
|
paid_price: 'Paid %{price}'
|
||||||
|
verified: Verified
|
||||||
|
unverified: Unverified
|
||||||
|
document: Document
|
||||||
|
completed_at: Completed At
|
||||||
|
edit_recipient: Edit Recipient
|
||||||
|
update_recipient: Update Recipient
|
||||||
|
use_international_format_1xxx_: 'Use internatioanl format: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: Submitter cannot be updated.
|
||||||
|
at_least_one_field_must_be_filled: At least one field must be filled.
|
||||||
|
archived_users: Archived Users
|
||||||
|
embedding_users: Embedding Users
|
||||||
|
view_embedding_users: View Embedding Users
|
||||||
|
view_users: View Users
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>Email sent</b> to %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>Reminder email sent</b> to %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS sent</b> to %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>Verification SMS sent</b> to %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>Email opened</b> by %{submitter_name}'
|
||||||
|
click_email_by_html: '<b>Email link clicked</b> by %{submitter_name}'
|
||||||
|
click_sms_by_html: '<b>SMS link clicked</b> by %{submitter_name}'
|
||||||
|
phone_verified_by_html: '<b>Phone verified</b> by %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Submission started</b> by %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Form viewed</b> by %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Invited</b> %{invited_submitter_name} by %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Submission completed</b> by %{submitter_name}'
|
||||||
|
api_complete_form_by_html: '<b>Submission completed via API</b> by %{submitter_name}'
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Select Worksheet
|
select_worksheet: Select Worksheet
|
||||||
open: Open
|
open: Open
|
||||||
@@ -599,10 +660,15 @@ en: &en
|
|||||||
read: Read your data
|
read: Read your data
|
||||||
|
|
||||||
es: &es
|
es: &es
|
||||||
|
unarchive: Desarchivar
|
||||||
awaiting_completion_by_the_other_party: "Esperando la finalización por la otra parte"
|
awaiting_completion_by_the_other_party: "Esperando la finalización por la otra parte"
|
||||||
enforce_recipients_order: 'Hacer cumplir el orden de los destinatarios'
|
enforce_recipients_order: 'Hacer cumplir el orden de los destinatarios'
|
||||||
first_party: 'Primera Parte'
|
first_party: 'Primera Parte'
|
||||||
docuseal_trusted_signature: Firma de confianza DocuSeal
|
docuseal_trusted_signature: Firma de confianza DocuSeal
|
||||||
|
hello_name: Hola %{name}
|
||||||
|
you_are_invited_to_product_name: Estás invitado a %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Has sido invitado a %{account_name} %{product_name}. Por favor, regístrate usando el enlace a continuación:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Enviado usando la firma de documentos gratuita de <a href="%{product_url}">%{product_name}</a>.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Firme documentos con un certificado de confianza proporcionado por DocuSeal. Sus documentos y datos nunca se comparten con DocuSeal. Se proporciona un checksum de PDF para generar una firma de confianza.
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Firme documentos con un certificado de confianza proporcionado por DocuSeal. Sus documentos y datos nunca se comparten con DocuSeal. Se proporciona un checksum de PDF para generar una firma de confianza.
|
||||||
hi_there: Hola
|
hi_there: Hola
|
||||||
thanks: Gracias
|
thanks: Gracias
|
||||||
@@ -696,7 +762,7 @@ es: &es
|
|||||||
profile_details: Detalles del perfil
|
profile_details: Detalles del perfil
|
||||||
sign_up_with_google: Registrarse con Google
|
sign_up_with_google: Registrarse con Google
|
||||||
sign_up_with_microsoft: Registrarse con Microsoft
|
sign_up_with_microsoft: Registrarse con Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Al crear una cuenta, aceptas nuestra <a target="_blank" href="https://www.docuseal.co/privacy">Política de Privacidad</a> y <a target="_blank" href="https://www.docuseal.co/terms">Términos de Servicio</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Al crear una cuenta, aceptas nuestra <a target="_blank" href="https://www.docuseal.com/privacy">Política de Privacidad</a> y <a target="_blank" href="https://www.docuseal.com/terms">Términos de Servicio</a>.'
|
||||||
enter_email_to_continue: Ingresa tu correo electrónico para continuar
|
enter_email_to_continue: Ingresa tu correo electrónico para continuar
|
||||||
account: Cuenta
|
account: Cuenta
|
||||||
preferences: Preferencias
|
preferences: Preferencias
|
||||||
@@ -711,6 +777,7 @@ es: &es
|
|||||||
require_signing_reason: Requerir motivo de firma
|
require_signing_reason: Requerir motivo de firma
|
||||||
allow_typed_text_signatures: Permitir firmas de texto mecanografiadas
|
allow_typed_text_signatures: Permitir firmas de texto mecanografiadas
|
||||||
allow_to_resubmit_completed_forms: Permitir reenviar formularios completados
|
allow_to_resubmit_completed_forms: Permitir reenviar formularios completados
|
||||||
|
allow_to_decline_documents: Permitir rechazar documentos
|
||||||
remember_and_pre_fill_signatures: Recordar y prellenar firmas
|
remember_and_pre_fill_signatures: Recordar y prellenar firmas
|
||||||
require_authentication_for_file_download_links: Requerir autenticación para enlaces de descarga de archivos
|
require_authentication_for_file_download_links: Requerir autenticación para enlaces de descarga de archivos
|
||||||
combine_completed_documents_and_audit_log: Combinar documentos completados y Registro de Auditoría
|
combine_completed_documents_and_audit_log: Combinar documentos completados y Registro de Auditoría
|
||||||
@@ -1050,7 +1117,6 @@ es: &es
|
|||||||
back: Atrás
|
back: Atrás
|
||||||
add_secret: Agregar secreto
|
add_secret: Agregar secreto
|
||||||
submission_example_payload: Ejemplo de payload de envío
|
submission_example_payload: Ejemplo de payload de envío
|
||||||
status_users: '%{status} Usuarios'
|
|
||||||
there_are_no_signatures: No hay firmas
|
there_are_no_signatures: No hay firmas
|
||||||
signed_with_trusted_certificate: Firmado con certificado de confianza
|
signed_with_trusted_certificate: Firmado con certificado de confianza
|
||||||
signed_with_external_certificate: Firmado con certificado externo
|
signed_with_external_certificate: Firmado con certificado externo
|
||||||
@@ -1075,6 +1141,7 @@ es: &es
|
|||||||
document_template_has_been_moved: La plantilla de documento ha sido movida.
|
document_template_has_been_moved: La plantilla de documento ha sido movida.
|
||||||
unable_to_move_template_into_folder: No se pudo mover la plantilla a la carpeta.
|
unable_to_move_template_into_folder: No se pudo mover la plantilla a la carpeta.
|
||||||
template_has_been_unarchived: La plantilla ha sido desarchivada.
|
template_has_been_unarchived: La plantilla ha sido desarchivada.
|
||||||
|
submission_has_been_unarchived: La presentación ha sido desarchivada.
|
||||||
unable_to_update_file: No se pudo subir el archivo.
|
unable_to_update_file: No se pudo subir el archivo.
|
||||||
user_has_been_invited: El usuario ha sido invitado.
|
user_has_been_invited: El usuario ha sido invitado.
|
||||||
unable_to_update_user: No se pudo actualizar el usuario.
|
unable_to_update_user: No se pudo actualizar el usuario.
|
||||||
@@ -1158,6 +1225,60 @@ es: &es
|
|||||||
opened: Abierto
|
opened: Abierto
|
||||||
sent: Enviado
|
sent: Enviado
|
||||||
awaiting: Pendiente
|
awaiting: Pendiente
|
||||||
|
document_id: ID del Documento
|
||||||
|
envelope_id: ID del Sobre
|
||||||
|
event_log: Registro de Eventos
|
||||||
|
verify: Verificar
|
||||||
|
testing_log_not_for_production_use: Registro de Pruebas - No para Uso en Producción
|
||||||
|
original_sha256: SHA256 Original
|
||||||
|
result_sha256: SHA256 del Resultado
|
||||||
|
generated_at: Generado el
|
||||||
|
email_verification: Verificación de correo electrónico
|
||||||
|
phone_verification: Verificación telefónica
|
||||||
|
session_id: ID de la Sesión
|
||||||
|
option: Opción
|
||||||
|
text_field: Campo de Texto
|
||||||
|
signature_field: Campo de Firma
|
||||||
|
initials_field: Campo de Iniciales
|
||||||
|
date_field: Campo de Fecha
|
||||||
|
number_field: Campo de Número
|
||||||
|
image_field: Campo de Imagen
|
||||||
|
file_field: Campo de Archivo
|
||||||
|
select_field: Campo de Selección
|
||||||
|
multiple_field: Campo Múltiple
|
||||||
|
radio_field: Campo de Grupo Radio
|
||||||
|
radio_field: Campo de Radio
|
||||||
|
cells_field: Campo de Celdas
|
||||||
|
stamp_field: Campo de Sello
|
||||||
|
payment_field: Campo de Pago
|
||||||
|
phone_field: Campo de Teléfono
|
||||||
|
paid_price: 'Pagado %{price}'
|
||||||
|
verified: Verificado
|
||||||
|
unverified: No verificado
|
||||||
|
document: Documento
|
||||||
|
completed_at: Completado el
|
||||||
|
edit_recipient: Editar Destinatario
|
||||||
|
update_recipient: Actualizar Destinatario
|
||||||
|
use_international_format_1xxx_: 'Usa el formato internacional: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: El remitente no puede ser actualizado.
|
||||||
|
at_least_one_field_must_be_filled: Al menos un campo debe estar completo.
|
||||||
|
archived_users: Usuarios Archivados
|
||||||
|
embedding_users: Usuarios Integrados
|
||||||
|
view_embedding_users: Ver Usuarios Integrado
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>Correo electrónico enviado</b> a %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>Correo de recordatorio enviado</b> a %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS enviado</b> a %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>SMS de verificación enviado</b> a %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>Correo electrónico abierto</b> por %{submitter_name}'
|
||||||
|
click_email_by_html: '<b>Enlace del correo electrónico clicado</b> por %{submitter_name}'
|
||||||
|
click_sms_by_html: '<b>Enlace del SMS clicado</b> por %{submitter_name}'
|
||||||
|
phone_verified_by_html: '<b>Teléfono verificado</b> por %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Envío iniciado</b> por %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Formulario visto</b> por %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Invitado</b> %{invited_submitter_name} por %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Envío completado</b> por %{submitter_name}'
|
||||||
|
api_complete_form_by_html: '<b>Envío completado vía API</b> por %{submitter_name}'
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Seleccionar hoja de cálculo
|
select_worksheet: Seleccionar hoja de cálculo
|
||||||
open: Abrir
|
open: Abrir
|
||||||
@@ -1180,10 +1301,15 @@ es: &es
|
|||||||
read: Leer tus datos
|
read: Leer tus datos
|
||||||
|
|
||||||
it: &it
|
it: &it
|
||||||
|
unarchive: Ripristina
|
||||||
awaiting_completion_by_the_other_party: "In attesa di completamento da parte dell'altra parte"
|
awaiting_completion_by_the_other_party: "In attesa di completamento da parte dell'altra parte"
|
||||||
enforce_recipients_order: Aplicar el orden de los destinatarios
|
enforce_recipients_order: Aplicar el orden de los destinatarios
|
||||||
first_party: 'Prima parte'
|
first_party: 'Prima parte'
|
||||||
docuseal_trusted_signature: "Firma Fiduciaria DocuSeal"
|
docuseal_trusted_signature: "Firma Fiduciaria DocuSeal"
|
||||||
|
hello_name: Ciao %{name}
|
||||||
|
you_are_invited_to_product_name: Sei stato invitato a %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Sei stato invitato a %{account_name} %{product_name}. Registrati utilizzando il link qui sotto:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Inviato utilizzando la firma di documenti gratuita di <a href="%{product_url}">%{product_name}</a>.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: "Firma documenti con un certificato di fiducia fornito da DocuSeal. I tuoi documenti e i tuoi dati non vengono mai condivisi con DocuSeal. Il checksum PDF è fornito per generare una firma di fiducia."
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: "Firma documenti con un certificato di fiducia fornito da DocuSeal. I tuoi documenti e i tuoi dati non vengono mai condivisi con DocuSeal. Il checksum PDF è fornito per generare una firma di fiducia."
|
||||||
hi_there: Ciao
|
hi_there: Ciao
|
||||||
thanks: Grazie
|
thanks: Grazie
|
||||||
@@ -1277,7 +1403,7 @@ it: &it
|
|||||||
profile_details: Dettagli del profilo
|
profile_details: Dettagli del profilo
|
||||||
sign_up_with_google: Registrati con Google
|
sign_up_with_google: Registrati con Google
|
||||||
sign_up_with_microsoft: Registrati con Microsoft
|
sign_up_with_microsoft: Registrati con Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Creando un account, accetti la nostra <a target="_blank" href="https://www.docuseal.co/privacy">Privacy Policy</a> e i nostri <a target="_blank" href="https://www.docuseal.co/terms">Termini di servizio</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Creando un account, accetti la nostra <a target="_blank" href="https://www.docuseal.com/privacy">Privacy Policy</a> e i nostri <a target="_blank" href="https://www.docuseal.com/terms">Termini di servizio</a>.'
|
||||||
enter_email_to_continue: "Inserisci l'email per continuare"
|
enter_email_to_continue: "Inserisci l'email per continuare"
|
||||||
account: Account
|
account: Account
|
||||||
preferences: Preferenze
|
preferences: Preferenze
|
||||||
@@ -1292,6 +1418,7 @@ it: &it
|
|||||||
require_signing_reason: Richiedere il motivo della firma
|
require_signing_reason: Richiedere il motivo della firma
|
||||||
allow_typed_text_signatures: Permettere firme con testo digitato
|
allow_typed_text_signatures: Permettere firme con testo digitato
|
||||||
allow_to_resubmit_completed_forms: Permettere di reinviare i moduli completati
|
allow_to_resubmit_completed_forms: Permettere di reinviare i moduli completati
|
||||||
|
allow_to_decline_documents: Permettere di rifiutare i documenti
|
||||||
remember_and_pre_fill_signatures: Ricordare e precompilare le firme
|
remember_and_pre_fill_signatures: Ricordare e precompilare le firme
|
||||||
require_authentication_for_file_download_links: "Richiedere l'autenticazione per i link di download dei file"
|
require_authentication_for_file_download_links: "Richiedere l'autenticazione per i link di download dei file"
|
||||||
combine_completed_documents_and_audit_log: Combinare i documenti completati e il Registro di Audit
|
combine_completed_documents_and_audit_log: Combinare i documenti completati e il Registro di Audit
|
||||||
@@ -1631,7 +1758,6 @@ it: &it
|
|||||||
back: Indietro
|
back: Indietro
|
||||||
add_secret: Aggiungi segreto
|
add_secret: Aggiungi segreto
|
||||||
submission_example_payload: Esempio di payload di invio
|
submission_example_payload: Esempio di payload di invio
|
||||||
status_users: '%{status} Utenti'
|
|
||||||
there_are_no_signatures: Non ci sono firme
|
there_are_no_signatures: Non ci sono firme
|
||||||
signed_with_trusted_certificate: Firmato con certificato affidabile
|
signed_with_trusted_certificate: Firmato con certificato affidabile
|
||||||
signed_with_external_certificate: Firmato con certificato esterno
|
signed_with_external_certificate: Firmato con certificato esterno
|
||||||
@@ -1656,6 +1782,7 @@ it: &it
|
|||||||
document_template_has_been_moved: Il modello di documento è stato spostato.
|
document_template_has_been_moved: Il modello di documento è stato spostato.
|
||||||
unable_to_move_template_into_folder: Impossibile spostare il modello nella cartella.
|
unable_to_move_template_into_folder: Impossibile spostare il modello nella cartella.
|
||||||
template_has_been_unarchived: Il modello è stato disarchiviato.
|
template_has_been_unarchived: Il modello è stato disarchiviato.
|
||||||
|
submission_has_been_unarchived: La sottomissione è stata dearchiviata.
|
||||||
unable_to_update_file: Impossibile caricare il file.
|
unable_to_update_file: Impossibile caricare il file.
|
||||||
user_has_been_invited: "L'utente è stato invitato."
|
user_has_been_invited: "L'utente è stato invitato."
|
||||||
unable_to_update_user: Impossibile aggiornare l'utente.
|
unable_to_update_user: Impossibile aggiornare l'utente.
|
||||||
@@ -1739,6 +1866,60 @@ it: &it
|
|||||||
opened: Aperto
|
opened: Aperto
|
||||||
sent: Inviato
|
sent: Inviato
|
||||||
awaiting: In attesa
|
awaiting: In attesa
|
||||||
|
document_id: ID del Documento
|
||||||
|
envelope_id: ID della Busta
|
||||||
|
event_log: Registro degli Eventi
|
||||||
|
verify: Verifica
|
||||||
|
testing_log_not_for_production_use: Registro di Test - Non per Uso in Produzione
|
||||||
|
original_sha256: SHA256 Originale
|
||||||
|
result_sha256: SHA256 del Risultato
|
||||||
|
generated_at: Generato il
|
||||||
|
email_verification: Verifica e-mail
|
||||||
|
phone_verification: Verifica telefono
|
||||||
|
session_id: ID della Sessione
|
||||||
|
option: Opzione
|
||||||
|
text_field: Campo di Testo
|
||||||
|
signature_field: Campo di Firma
|
||||||
|
initials_field: Campo di Iniziali
|
||||||
|
date_field: Campo Data
|
||||||
|
number_field: Campo Numero
|
||||||
|
image_field: Campo Immagine
|
||||||
|
file_field: Campo File
|
||||||
|
select_field: Campo di Selezione
|
||||||
|
checkbox_field: Campo di Checkbox
|
||||||
|
multiple_field: Campo Selezione Multipla
|
||||||
|
radio_field: Campo di Gruppo Radio
|
||||||
|
cells_field: Campo Celle
|
||||||
|
stamp_field: Campo Timbro
|
||||||
|
payment_field: Campo Pagamento
|
||||||
|
phone_field: Campo Telefono
|
||||||
|
paid_price: 'Pagato %{price}'
|
||||||
|
verified: Verificato
|
||||||
|
unverified: Non verificato
|
||||||
|
document: Documento
|
||||||
|
completed_at: Completato il
|
||||||
|
edit_recipient: Modifica Destinatario
|
||||||
|
update_recipient: Aggiorna Destinatario
|
||||||
|
use_international_format_1xxx_: 'Utilizza il formato internazionale: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: Il mittente non può essere aggiornato.
|
||||||
|
at_least_one_field_must_be_filled: Almeno un campo deve essere compilato.
|
||||||
|
archived_users: Utenti Archiviati
|
||||||
|
embedding_users: Utenti Incorporati
|
||||||
|
view_embedding_users: Visualizza Utenti Incorporati
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>E-mail inviato</b> a %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>E-mail di promemoria inviato</b> a %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS inviato</b> a %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>SMS di verifica inviato</b> a %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>E-mail aperta</b> da %{submitter_name}'
|
||||||
|
click_email_by_html: "<b>Link dell'e-mail cliccato</b> da %{submitter_name}"
|
||||||
|
click_sms_by_html: "<b>Link dell'SMS cliccato</b> da %{submitter_name}"
|
||||||
|
phone_verified_by_html: '<b>Telefono verificato</b> da %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Invio iniziato</b> da %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Modulo visualizzato</b> da %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Invitato</b> %{invited_submitter_name} da %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Invio completato</b> da %{submitter_name}'
|
||||||
|
api_complete_form_by_html: '<b>Invio completato tramite API</b> da %{submitter_name}'
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Seleziona il foglio di lavoro
|
select_worksheet: Seleziona il foglio di lavoro
|
||||||
open: Apri
|
open: Apri
|
||||||
@@ -1761,10 +1942,15 @@ it: &it
|
|||||||
read: Leggi i tuoi dati
|
read: Leggi i tuoi dati
|
||||||
|
|
||||||
fr: &fr
|
fr: &fr
|
||||||
|
unarchive: Désarchiver
|
||||||
awaiting_completion_by_the_other_party: "En attente de la complétion par l'autre partie"
|
awaiting_completion_by_the_other_party: "En attente de la complétion par l'autre partie"
|
||||||
enforce_recipients_order: "Respecter l'ordre des destinataires"
|
enforce_recipients_order: "Respecter l'ordre des destinataires"
|
||||||
first_party: 'Première partie'
|
first_party: 'Première partie'
|
||||||
docuseal_trusted_signature: Signature de confiance DocuSeal
|
docuseal_trusted_signature: Signature de confiance DocuSeal
|
||||||
|
hello_name: Bonjour %{name}
|
||||||
|
you_are_invited_to_product_name: Vous êtes invité à %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Vous avez été invité à %{account_name} %{product_name}. Veuillez vous inscrire en utilisant le lien ci-dessous:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Envoyé en utilisant la signature de documents gratuite de <a href="%{product_url}">%{product_name}</a>.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Signez des documents avec un certificat de confiance fourni par DocuSeal. Vos documents et données ne sont jamais partagés avec DocuSeal. Un checksum PDF est fourni pour générer une signature de confiance.
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Signez des documents avec un certificat de confiance fourni par DocuSeal. Vos documents et données ne sont jamais partagés avec DocuSeal. Un checksum PDF est fourni pour générer une signature de confiance.
|
||||||
hi_there: Bonjour
|
hi_there: Bonjour
|
||||||
thanks: Merci
|
thanks: Merci
|
||||||
@@ -1859,7 +2045,7 @@ fr: &fr
|
|||||||
sign_up_with_google: S'inscrire avec Google
|
sign_up_with_google: S'inscrire avec Google
|
||||||
sign_up_with_microsoft: S'inscrire avec Microsoft
|
sign_up_with_microsoft: S'inscrire avec Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: |
|
by_creating_an_account_you_agree_to_our_html: |
|
||||||
En créant un compte, vous acceptez notre <a target="_blank" href="https://www.docuseal.co/privacy">Politique de Confidentialité</a> et nos <a target="_blank" href="https://www.docuseal.co/terms">Conditions d'Utilisation</a>.
|
En créant un compte, vous acceptez notre <a target="_blank" href="https://www.docuseal.com/privacy">Politique de Confidentialité</a> et nos <a target="_blank" href="https://www.docuseal.com/terms">Conditions d'Utilisation</a>.
|
||||||
enter_email_to_continue: Entrez votre e-mail pour continuer
|
enter_email_to_continue: Entrez votre e-mail pour continuer
|
||||||
account: Compte
|
account: Compte
|
||||||
preferences: Préférences
|
preferences: Préférences
|
||||||
@@ -1874,6 +2060,7 @@ fr: &fr
|
|||||||
require_signing_reason: Demander une raison pour la signature
|
require_signing_reason: Demander une raison pour la signature
|
||||||
allow_typed_text_signatures: Autoriser les signatures en texte tapé
|
allow_typed_text_signatures: Autoriser les signatures en texte tapé
|
||||||
allow_to_resubmit_completed_forms: Autoriser la resoumission des formulaires complétés
|
allow_to_resubmit_completed_forms: Autoriser la resoumission des formulaires complétés
|
||||||
|
allow_to_decline_documents: Autoriser le refus des documents
|
||||||
remember_and_pre_fill_signatures: Se souvenir et préremplir les signatures
|
remember_and_pre_fill_signatures: Se souvenir et préremplir les signatures
|
||||||
require_authentication_for_file_download_links: Exiger une authentification pour les liens de téléchargement des fichiers
|
require_authentication_for_file_download_links: Exiger une authentification pour les liens de téléchargement des fichiers
|
||||||
combine_completed_documents_and_audit_log: "Combiner les documents complétés et le journal d'audit"
|
combine_completed_documents_and_audit_log: "Combiner les documents complétés et le journal d'audit"
|
||||||
@@ -2213,7 +2400,6 @@ fr: &fr
|
|||||||
back: Retour
|
back: Retour
|
||||||
add_secret: Ajouter un secret
|
add_secret: Ajouter un secret
|
||||||
submission_example_payload: Exemple de payload de soumission
|
submission_example_payload: Exemple de payload de soumission
|
||||||
status_users: '%{status} Utilisateurs'
|
|
||||||
there_are_no_signatures: "Il n'y a pas de signatures"
|
there_are_no_signatures: "Il n'y a pas de signatures"
|
||||||
signed_with_trusted_certificate: Signé avec un certificat de confiance
|
signed_with_trusted_certificate: Signé avec un certificat de confiance
|
||||||
signed_with_external_certificate: Signé avec un certificat externe
|
signed_with_external_certificate: Signé avec un certificat externe
|
||||||
@@ -2238,6 +2424,7 @@ fr: &fr
|
|||||||
document_template_has_been_moved: Le modèle de document a été déplacé.
|
document_template_has_been_moved: Le modèle de document a été déplacé.
|
||||||
unable_to_move_template_into_folder: Impossible de déplacer le modèle dans le dossier.
|
unable_to_move_template_into_folder: Impossible de déplacer le modèle dans le dossier.
|
||||||
template_has_been_unarchived: Le modèle a été désarchivé.
|
template_has_been_unarchived: Le modèle a été désarchivé.
|
||||||
|
submission_has_been_unarchived: La soumission a été désarchivée.
|
||||||
unable_to_update_file: Impossible de télécharger le fichier.
|
unable_to_update_file: Impossible de télécharger le fichier.
|
||||||
user_has_been_updated: "L'utilisateur a été mis à jour."
|
user_has_been_updated: "L'utilisateur a été mis à jour."
|
||||||
unable_to_remove_user: Impossible de supprimer l'utilisateur.
|
unable_to_remove_user: Impossible de supprimer l'utilisateur.
|
||||||
@@ -2321,6 +2508,60 @@ fr: &fr
|
|||||||
opened: Ouvert
|
opened: Ouvert
|
||||||
sent: Envoyé
|
sent: Envoyé
|
||||||
awaiting: En attente
|
awaiting: En attente
|
||||||
|
document_id: ID du document
|
||||||
|
envelope_id: ID de l'enveloppe
|
||||||
|
event_log: Journal d'événements
|
||||||
|
verify: Vérifier
|
||||||
|
testing_log_not_for_production_use: Journal de test - Ne pas utiliser en production
|
||||||
|
original_sha256: SHA256 original
|
||||||
|
result_sha256: SHA256 du résultat
|
||||||
|
generated_at: Généré le
|
||||||
|
email_verification: Vérification de l'e-mail
|
||||||
|
phone_verification: Vérification du téléphone
|
||||||
|
session_id: ID de session
|
||||||
|
option: Option
|
||||||
|
text_field: Champ de Texte
|
||||||
|
signature_field: Champ de Signature
|
||||||
|
initials_field: "Champ d'Initiales"
|
||||||
|
date_field: Champ de Date
|
||||||
|
number_field: Champ de Numéro
|
||||||
|
image_field: "Champ d'Image"
|
||||||
|
file_field: Champ de Fichier
|
||||||
|
select_field: Champ de Choix
|
||||||
|
checkbox_field: Champ de Coche
|
||||||
|
multiple_field: Champ de Choix Multiple
|
||||||
|
radio_field: Champ de Groupe Radio
|
||||||
|
cells_field: Champ de Cellules
|
||||||
|
stamp_field: Champ de Tampon
|
||||||
|
payment_field: Champ de Paiement
|
||||||
|
phone_field: Champ de Téléphone
|
||||||
|
paid_price: 'Payé %{price}'
|
||||||
|
verified: Vérifié
|
||||||
|
unverified: Non vérifié
|
||||||
|
document: Document
|
||||||
|
completed_at: Terminé le
|
||||||
|
edit_recipient: Modifica Destinatario
|
||||||
|
update_recipient: Aggiorna Destinatario
|
||||||
|
use_international_format_1xxx_: 'Utilizza il formato internazionale: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: Il mittente non può essere aggiornato.
|
||||||
|
at_least_one_field_must_be_filled: Almeno un campo deve essere compilato.
|
||||||
|
archived_users: Utilisateurs Archivés
|
||||||
|
embedding_users: Utilisateurs Intégrés
|
||||||
|
view_embedding_users: Voir les Utilisateurs Intégrés
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>E-mail envoyé</b> à %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>E-mail de rappel envoyé</b> à %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS envoyé</b> à %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>SMS de vérification envoyé</b> à %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>E-mail ouvert</b> par %{submitter_name}'
|
||||||
|
click_email_by_html: "<b>Lien de l'e-mail cliqué</b> par %{submitter_name}"
|
||||||
|
click_sms_by_html: '<b>Lien du SMS cliqué</b> par %{submitter_name}'
|
||||||
|
phone_verified_by_html: '<b>Téléphone vérifié</b> par %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Soumission commencée</b> par %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Formulaire consulté</b> par %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Invité</b> %{invited_submitter_name} par %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Soumission terminée</b> par %{submitter_name}'
|
||||||
|
api_complete_form_by_html: "<b>Soumission terminée via l'API</b> par %{submitter_name}"
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Sélectionner la feuille de calcul
|
select_worksheet: Sélectionner la feuille de calcul
|
||||||
open: Ouvrir
|
open: Ouvrir
|
||||||
@@ -2343,10 +2584,15 @@ fr: &fr
|
|||||||
read: Lire vos données
|
read: Lire vos données
|
||||||
|
|
||||||
pt: &pt
|
pt: &pt
|
||||||
|
unarchive: Desarquivar
|
||||||
awaiting_completion_by_the_other_party: "Aguardando a conclusão pela outra parte"
|
awaiting_completion_by_the_other_party: "Aguardando a conclusão pela outra parte"
|
||||||
enforce_recipients_order: 'Forçar a ordem dos recipientes'
|
enforce_recipients_order: 'Forçar a ordem dos recipientes'
|
||||||
first_party: 'Primeira Parte'
|
first_party: 'Primeira Parte'
|
||||||
docuseal_trusted_signature: Assinatura Confiável DocuSeal
|
docuseal_trusted_signature: Assinatura Confiável DocuSeal
|
||||||
|
hello_name: Olá %{name}
|
||||||
|
you_are_invited_to_product_name: Você está convidado para %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Você foi convidado para %{account_name} %{product_name}. Inscreva-se usando o link abaixo:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Enviado usando a assinatura gratuita de documentos de <a href="%{product_url}">%{product_name}</a>.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Assine documentos com certificado confiável fornecido pela DocuSeal. Seus documentos e dados nunca são compartilhados com a DocuSeal. O checksum do PDF é fornecido para gerar uma assinatura confiável.
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Assine documentos com certificado confiável fornecido pela DocuSeal. Seus documentos e dados nunca são compartilhados com a DocuSeal. O checksum do PDF é fornecido para gerar uma assinatura confiável.
|
||||||
hi_there: Olá
|
hi_there: Olá
|
||||||
thanks: Obrigado
|
thanks: Obrigado
|
||||||
@@ -2440,7 +2686,7 @@ pt: &pt
|
|||||||
profile_details: Detalhes do perfil
|
profile_details: Detalhes do perfil
|
||||||
sign_up_with_google: Inscrever-se com Google
|
sign_up_with_google: Inscrever-se com Google
|
||||||
sign_up_with_microsoft: Inscrever-se com Microsoft
|
sign_up_with_microsoft: Inscrever-se com Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Ao criar uma conta, você concorda com nossa <a target="_blank" href="https://www.docuseal.co/privacy">Política de Privacidade</a> e <a target="_blank" href="https://www.docuseal.co/terms">Termos de Serviço</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Ao criar uma conta, você concorda com nossa <a target="_blank" href="https://www.docuseal.com/privacy">Política de Privacidade</a> e <a target="_blank" href="https://www.docuseal.com/terms">Termos de Serviço</a>.'
|
||||||
enter_email_to_continue: Insira o e-mail para continuar
|
enter_email_to_continue: Insira o e-mail para continuar
|
||||||
account: Conta
|
account: Conta
|
||||||
preferences: Preferências
|
preferences: Preferências
|
||||||
@@ -2455,6 +2701,7 @@ pt: &pt
|
|||||||
require_signing_reason: Requerer motivo para assinatura
|
require_signing_reason: Requerer motivo para assinatura
|
||||||
allow_typed_text_signatures: Permitir assinaturas digitadas
|
allow_typed_text_signatures: Permitir assinaturas digitadas
|
||||||
allow_to_resubmit_completed_forms: Permitir reenviar formulários concluídos
|
allow_to_resubmit_completed_forms: Permitir reenviar formulários concluídos
|
||||||
|
allow_to_decline_documents: Permitir recusar documentos
|
||||||
remember_and_pre_fill_signatures: Lembrar e preencher assinaturas automaticamente
|
remember_and_pre_fill_signatures: Lembrar e preencher assinaturas automaticamente
|
||||||
require_authentication_for_file_download_links: Requerer autenticação para links de download de arquivos
|
require_authentication_for_file_download_links: Requerer autenticação para links de download de arquivos
|
||||||
combine_completed_documents_and_audit_log: Combinar documentos concluídos e log de auditoria
|
combine_completed_documents_and_audit_log: Combinar documentos concluídos e log de auditoria
|
||||||
@@ -2518,7 +2765,7 @@ pt: &pt
|
|||||||
removing: Removendo
|
removing: Removendo
|
||||||
delete: Excluir
|
delete: Excluir
|
||||||
default: Padrão
|
default: Padrão
|
||||||
are_you_sure_: Você tem certeza?
|
are_you_sure_: Tem certeza?
|
||||||
timestamp_server: Servidor de carimbo de tempo
|
timestamp_server: Servidor de carimbo de tempo
|
||||||
timeserver_url: URL do servidor de carimbo de tempo
|
timeserver_url: URL do servidor de carimbo de tempo
|
||||||
url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL do servidor de carimbo de tempo RFC 3161 confiável a ser usado para gerar assinaturas de carimbo de tempo.
|
url_of_the_trusted_rfc_3161_timeserver_to_be_used_to_generate_timestamp_signatures: URL do servidor de carimbo de tempo RFC 3161 confiável a ser usado para gerar assinaturas de carimbo de tempo.
|
||||||
@@ -2696,9 +2943,9 @@ pt: &pt
|
|||||||
draw_signature: Desenhar assinatura
|
draw_signature: Desenhar assinatura
|
||||||
clear: Limpar
|
clear: Limpar
|
||||||
signature_uploaded: Assinatura enviada
|
signature_uploaded: Assinatura enviada
|
||||||
submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'A exclusão da submissão é irreversível e removerá permanentemente todos os documentos assinados associados a ela. Você tem certeza?'
|
submission_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: 'A exclusão da submissão é irreversível e removerá permanentemente todos os documentos assinados associados a ela. Tem certeza?'
|
||||||
return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Volte para seu dispositivo desktop para concluir o formulário ou <a class="link" href="%{link}">continue no celular</a>'
|
return_back_to_your_desktop_device_to_complete_the_form_or_continue_on_mobile_html: 'Volte para seu dispositivo desktop para concluir o formulário ou <a class="link" href="%{link}">continue no celular</a>'
|
||||||
template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: A exclusão do modelo é irreversível e removerá permanentemente todos os documentos assinados associados a ele. Você tem certeza?
|
template_deletion_is_irreversible_and_will_permanently_remove_all_associated_signed_documents_with_it_are_you_sure_: A exclusão do modelo é irreversível e removerá permanentemente todos os documentos assinados associados a ele. Tem certeza?
|
||||||
rename_folder: Renomear pasta
|
rename_folder: Renomear pasta
|
||||||
folder_name: Nome da pasta
|
folder_name: Nome da pasta
|
||||||
rename: Renomear
|
rename: Renomear
|
||||||
@@ -2794,7 +3041,6 @@ pt: &pt
|
|||||||
back: Voltar
|
back: Voltar
|
||||||
add_secret: Adicionar segredo
|
add_secret: Adicionar segredo
|
||||||
submission_example_payload: Exemplo de payload de submissão
|
submission_example_payload: Exemplo de payload de submissão
|
||||||
status_users: '%{status} Usuários'
|
|
||||||
there_are_no_signatures: Não há assinaturas
|
there_are_no_signatures: Não há assinaturas
|
||||||
signed_with_trusted_certificate: Assinado com certificado confiável
|
signed_with_trusted_certificate: Assinado com certificado confiável
|
||||||
signed_with_external_certificate: Assinado com certificado externo
|
signed_with_external_certificate: Assinado com certificado externo
|
||||||
@@ -2819,6 +3065,7 @@ pt: &pt
|
|||||||
document_template_has_been_moved: O modelo de documento foi movido.
|
document_template_has_been_moved: O modelo de documento foi movido.
|
||||||
unable_to_move_template_into_folder: Não foi possível mover o modelo para a pasta.
|
unable_to_move_template_into_folder: Não foi possível mover o modelo para a pasta.
|
||||||
template_has_been_unarchived: O modelo foi desarquivado.
|
template_has_been_unarchived: O modelo foi desarquivado.
|
||||||
|
submission_has_been_unarchived: A submissao foi desarquivada.
|
||||||
unable_to_update_file: Não foi possível atualizar o arquivo.
|
unable_to_update_file: Não foi possível atualizar o arquivo.
|
||||||
user_has_been_updated: O usuário foi atualizado.
|
user_has_been_updated: O usuário foi atualizado.
|
||||||
unable_to_remove_user: Não foi possível remover o usuário.
|
unable_to_remove_user: Não foi possível remover o usuário.
|
||||||
@@ -2902,6 +3149,60 @@ pt: &pt
|
|||||||
opened: Aberto
|
opened: Aberto
|
||||||
sent: Enviado
|
sent: Enviado
|
||||||
awaiting: Aguardando
|
awaiting: Aguardando
|
||||||
|
document_id: ID do Documento
|
||||||
|
envelope_id: ID do Envelope
|
||||||
|
event_log: Log de Eventos
|
||||||
|
verify: Verificar
|
||||||
|
testing_log_not_for_production_use: Log de Teste - Não para Uso em Produção
|
||||||
|
original_sha256: SHA256 Original
|
||||||
|
result_sha256: SHA256 do Resultado
|
||||||
|
generated_at: Gerado em
|
||||||
|
email_verification: Verificação de E-mail
|
||||||
|
phone_verification: Verificação de Telefone
|
||||||
|
session_id: ID da Sessão
|
||||||
|
option: Opção
|
||||||
|
text_field: Campo de Texto
|
||||||
|
signature_field: Campo de Assinatura
|
||||||
|
initials_field: Campo de Rúbrica
|
||||||
|
date_field: Campo de Data
|
||||||
|
number_field: Campo de Número
|
||||||
|
image_field: Campo de Imagem
|
||||||
|
file_field: Campo de Arquivo
|
||||||
|
select_field: Campo de Seleção
|
||||||
|
checkbox_field: Campo de Caixa
|
||||||
|
multiple_field: Campo de Opção Múltipla
|
||||||
|
radio_field: Campo de Grupo Rádio
|
||||||
|
cells_field: Campo de Células
|
||||||
|
stamp_field: Campo de Carimbo
|
||||||
|
payment_field: Campo de Pagamento
|
||||||
|
phone_field: Campo de Telefone
|
||||||
|
paid_price: 'Pago %{price}'
|
||||||
|
verified: Verificado
|
||||||
|
unverified: Não verificado
|
||||||
|
document: Documento
|
||||||
|
completed_at: Concluído em
|
||||||
|
edit_recipient: Editar Destinatário
|
||||||
|
update_recipient: Atualizar Destinatário
|
||||||
|
use_international_format_1xxx_: 'Use o formato internacional: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: O remetente não pode ser atualizado.
|
||||||
|
at_least_one_field_must_be_filled: Pelo menos um campo deve ser preenchido.
|
||||||
|
archived_users: Usuários Arquivados
|
||||||
|
embedding_users: Usuários Incorporados
|
||||||
|
view_embedding_users: Ver Usuários Incorporados
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>E-mail enviado</b> para %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>E-mail de lembrete enviado</b> para %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS enviado</b> para %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>SMS de verificação enviado</b> para %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>E-mail aberto</b> por %{submitter_name}'
|
||||||
|
click_email_by_html: '<b>Link do e-mail clicado</b> por %{submitter_name}'
|
||||||
|
click_sms_by_html: '<b>Link do SMS clicado</b> por %{submitter_name}'
|
||||||
|
phone_verified_by_html: '<b>Telefone verificado</b> por %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Submissão iniciada</b> por %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Formulário visualizado</b> por %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Convidado</b> %{invited_submitter_name} por %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Submissão concluída</b> por %{submitter_name}'
|
||||||
|
api_complete_form_by_html: '<b>Submissão concluída via API</b> por %{submitter_name}'
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Selecionar planilha
|
select_worksheet: Selecionar planilha
|
||||||
open: Abrir
|
open: Abrir
|
||||||
@@ -2924,10 +3225,15 @@ pt: &pt
|
|||||||
read: Ler seus dados
|
read: Ler seus dados
|
||||||
|
|
||||||
de: &de
|
de: &de
|
||||||
|
unarchive: Wiederherstellen
|
||||||
awaiting_completion_by_the_other_party: "Warten auf die Fertigstellung durch die andere Partei"
|
awaiting_completion_by_the_other_party: "Warten auf die Fertigstellung durch die andere Partei"
|
||||||
enforce_recipients_order: 'Empfängerreihenfolge durchsetzen'
|
enforce_recipients_order: 'Empfängerreihenfolge durchsetzen'
|
||||||
first_party: 'Erste Partei'
|
first_party: 'Erste Partei'
|
||||||
docuseal_trusted_signature: DocuSeal-Vertrauenssignatur
|
docuseal_trusted_signature: DocuSeal-Vertrauenssignatur
|
||||||
|
hello_name: Hallo %{name}
|
||||||
|
you_are_invited_to_product_name: Sie sind eingeladen zu %{product_name}
|
||||||
|
you_have_been_invited_to_account_name_product_name_please_sign_up_using_the_link_below_: 'Sie wurden zu %{account_name} %{product_name} eingeladen. Bitte registrieren Sie sich über den folgenden Link:'
|
||||||
|
sent_using_product_name_free_document_signing_html: 'Gesendet mit der kostenlosen Dokumentensignierung von <a href="%{product_url}">%{product_name}</a>.'
|
||||||
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Unterzeichnen Sie Dokumente mit einem vertrauenswürdigen Zertifikat von DocuSeal. Ihre Dokumente und Daten werden niemals mit DocuSeal geteilt. Eine PDF-Prüfziffer wird bereitgestellt, um eine vertrauenswürdige Signatur zu generieren.
|
sign_documents_with_trusted_certificate_provided_by_docu_seal_your_documents_and_data_are_never_shared_with_docu_seal_p_d_f_checksum_is_provided_to_generate_a_trusted_signature: Unterzeichnen Sie Dokumente mit einem vertrauenswürdigen Zertifikat von DocuSeal. Ihre Dokumente und Daten werden niemals mit DocuSeal geteilt. Eine PDF-Prüfziffer wird bereitgestellt, um eine vertrauenswürdige Signatur zu generieren.
|
||||||
hi_there: Hallo
|
hi_there: Hallo
|
||||||
thanks: Danke
|
thanks: Danke
|
||||||
@@ -3021,7 +3327,7 @@ de: &de
|
|||||||
profile_details: Profildetails
|
profile_details: Profildetails
|
||||||
sign_up_with_google: Mit Google registrieren
|
sign_up_with_google: Mit Google registrieren
|
||||||
sign_up_with_microsoft: Mit Microsoft registrieren
|
sign_up_with_microsoft: Mit Microsoft registrieren
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Durch die Erstellung eines Kontos stimmst du unseren <a target="_blank" href="https://www.docuseal.co/privacy">Datenschutzrichtlinien</a> und <a target="_blank" href="https://www.docuseal.co/terms">Nutzungsbedingungen</a> zu.'
|
by_creating_an_account_you_agree_to_our_html: 'Durch die Erstellung eines Kontos stimmst du unseren <a target="_blank" href="https://www.docuseal.com/privacy">Datenschutzrichtlinien</a> und <a target="_blank" href="https://www.docuseal.com/terms">Nutzungsbedingungen</a> zu.'
|
||||||
enter_email_to_continue: E-Mail eingeben, um fortzufahren
|
enter_email_to_continue: E-Mail eingeben, um fortzufahren
|
||||||
account: Konto
|
account: Konto
|
||||||
preferences: Einstellungen
|
preferences: Einstellungen
|
||||||
@@ -3036,6 +3342,7 @@ de: &de
|
|||||||
require_signing_reason: Grund für die Signatur erforderlich
|
require_signing_reason: Grund für die Signatur erforderlich
|
||||||
allow_typed_text_signatures: Unterschriften mit getipptem Text zulassen
|
allow_typed_text_signatures: Unterschriften mit getipptem Text zulassen
|
||||||
allow_to_resubmit_completed_forms: Erneutes Einreichen abgeschlossener Formulare zulassen
|
allow_to_resubmit_completed_forms: Erneutes Einreichen abgeschlossener Formulare zulassen
|
||||||
|
allow_to_decline_documents: Erlauben, Dokumente abzulehnen
|
||||||
remember_and_pre_fill_signatures: Signaturen merken und vorab ausfüllen
|
remember_and_pre_fill_signatures: Signaturen merken und vorab ausfüllen
|
||||||
require_authentication_for_file_download_links: Authentifizierung für Dateidownload-Links erforderlich
|
require_authentication_for_file_download_links: Authentifizierung für Dateidownload-Links erforderlich
|
||||||
combine_completed_documents_and_audit_log: Abgeschlossene Dokumente und Prüfprotokoll kombinieren
|
combine_completed_documents_and_audit_log: Abgeschlossene Dokumente und Prüfprotokoll kombinieren
|
||||||
@@ -3375,7 +3682,6 @@ de: &de
|
|||||||
back: Zurück
|
back: Zurück
|
||||||
add_secret: Geheimnis hinzufügen
|
add_secret: Geheimnis hinzufügen
|
||||||
submission_example_payload: Beispiel-Payload für Einreichung
|
submission_example_payload: Beispiel-Payload für Einreichung
|
||||||
status_users: '%{status} Benutzer'
|
|
||||||
there_are_no_signatures: Es gibt keine Unterschriften
|
there_are_no_signatures: Es gibt keine Unterschriften
|
||||||
signed_with_trusted_certificate: Signiert mit vertrauenswürdigem Zertifikat
|
signed_with_trusted_certificate: Signiert mit vertrauenswürdigem Zertifikat
|
||||||
signed_with_external_certificate: Signiert mit externem Zertifikat
|
signed_with_external_certificate: Signiert mit externem Zertifikat
|
||||||
@@ -3400,6 +3706,7 @@ de: &de
|
|||||||
document_template_has_been_moved: Die Dokumentvorlage wurde verschoben.
|
document_template_has_been_moved: Die Dokumentvorlage wurde verschoben.
|
||||||
unable_to_move_template_into_folder: Vorlage konnte nicht in den Ordner verschoben werden.
|
unable_to_move_template_into_folder: Vorlage konnte nicht in den Ordner verschoben werden.
|
||||||
template_has_been_unarchived: Die Vorlage wurde entarchiviert.
|
template_has_been_unarchived: Die Vorlage wurde entarchiviert.
|
||||||
|
submission_has_been_unarchived: Die Einreichung wurde wiederhergestellt.
|
||||||
unable_to_update_file: Datei konnte nicht hochgeladen werden.
|
unable_to_update_file: Datei konnte nicht hochgeladen werden.
|
||||||
user_has_been_updated: Der Benutzer wurde aktualisiert.
|
user_has_been_updated: Der Benutzer wurde aktualisiert.
|
||||||
unable_to_remove_user: Benutzer konnte nicht entfernt werden.
|
unable_to_remove_user: Benutzer konnte nicht entfernt werden.
|
||||||
@@ -3483,6 +3790,60 @@ de: &de
|
|||||||
opened: Geöffnet
|
opened: Geöffnet
|
||||||
sent: Gesendet
|
sent: Gesendet
|
||||||
awaiting: Ausstehend
|
awaiting: Ausstehend
|
||||||
|
document_id: Dokumenten-ID
|
||||||
|
envelope_id: Umschlag-ID
|
||||||
|
event_log: Ereignisprotokoll
|
||||||
|
verify: Überprüfen
|
||||||
|
testing_log_not_for_production_use: Testprotokoll - Nicht für den Produktionseinsatz
|
||||||
|
original_sha256: Original SHA256
|
||||||
|
result_sha256: Ergebnis SHA256
|
||||||
|
generated_at: Generiert am
|
||||||
|
email_verification: E-Mail-Verifizierung
|
||||||
|
phone_verification: Telefonverifizierung
|
||||||
|
session_id: Sitzungs-ID
|
||||||
|
option: Option
|
||||||
|
text_field: Textfeld
|
||||||
|
signature_field: Unterschriftsfeld
|
||||||
|
initials_field: Initialenfeld
|
||||||
|
date_field: Datumsfeld
|
||||||
|
number_field: Zahlenfeld
|
||||||
|
image_field: Bildfeld
|
||||||
|
file_field: Dateifeld
|
||||||
|
select_field: Auswahlfeld
|
||||||
|
checkbox_field: Checkbox-Feld
|
||||||
|
multiple_field: Mehrfach-Auswahlfeld
|
||||||
|
radio_field: Radio-Gruppenfeld
|
||||||
|
cells_field: Zellenfeld
|
||||||
|
stamp_field: Stempelfeld
|
||||||
|
payment_field: Zahlungsfeld
|
||||||
|
phone_field: Telefonfeld
|
||||||
|
paid_price: 'Bezahlt %{price}'
|
||||||
|
verified: Verifiziert
|
||||||
|
unverified: Nicht verifiziert
|
||||||
|
document: Dokument
|
||||||
|
completed_at: Abgeschlossen am
|
||||||
|
edit_recipient: Empfänger bearbeiten
|
||||||
|
update_recipient: Empfänger aktualisieren
|
||||||
|
use_international_format_1xxx_: 'Verwenden Sie das internationale Format: +1xxx...'
|
||||||
|
submitter_cannot_be_updated: Der Absender kann nicht aktualisiert werden.
|
||||||
|
at_least_one_field_must_be_filled: Mindestens ein Feld muss ausgefüllt werden.
|
||||||
|
archived_users: Archivierte Benutzer
|
||||||
|
embedding_users: Einbettende Benutzer
|
||||||
|
view_embedding_users: Einbettende Benutzer anzeigen
|
||||||
|
submission_event_names:
|
||||||
|
send_email_to_html: '<b>E-Mail gesendet</b> an %{submitter_name}'
|
||||||
|
send_reminder_email_to_html: '<b>Erinnerungs-E-Mail gesendet</b> an %{submitter_name}'
|
||||||
|
send_sms_to_html: '<b>SMS gesendet</b> an %{submitter_name}'
|
||||||
|
send_2fa_sms_to_html: '<b>Verifizierungs-SMS gesendet</b> an %{submitter_name}'
|
||||||
|
open_email_by_html: '<b>E-Mail geöffnet</b> von %{submitter_name}'
|
||||||
|
click_email_by_html: '<b>E-Mail-Link angeklickt</b> von %{submitter_name}'
|
||||||
|
click_sms_by_html: '<b>SMS-Link angeklickt</b> von %{submitter_name}'
|
||||||
|
phone_verified_by_html: '<b>Telefon verifiziert</b> von %{submitter_name}'
|
||||||
|
start_form_by_html: '<b>Einreichung gestartet</b> von %{submitter_name}'
|
||||||
|
view_form_by_html: '<b>Formular angesehen</b> von %{submitter_name}'
|
||||||
|
invite_party_by_html: '<b>Eingeladen</b> %{invited_submitter_name} von %{submitter_name}'
|
||||||
|
complete_form_by_html: '<b>Einreichung abgeschlossen</b> von %{submitter_name}'
|
||||||
|
api_complete_form_by_html: '<b>Einreichung über API abgeschlossen</b> von %{submitter_name}'
|
||||||
import_list:
|
import_list:
|
||||||
select_worksheet: Arbeitsblatt auswählen
|
select_worksheet: Arbeitsblatt auswählen
|
||||||
open: Öffnen
|
open: Öffnen
|
||||||
@@ -3555,7 +3916,7 @@ pl:
|
|||||||
profile_details: Szczegóły profilu
|
profile_details: Szczegóły profilu
|
||||||
sign_up_with_google: Zarejestruj się przez Google
|
sign_up_with_google: Zarejestruj się przez Google
|
||||||
sign_up_with_microsoft: Zarejestruj się przez Microsoft
|
sign_up_with_microsoft: Zarejestruj się przez Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Tworząc konto, akceptujesz naszą <a target="_blank" href="https://www.docuseal.co/privacy">Politykę Prywatności</a> i <a target="_blank" href="https://www.docuseal.co/terms">Regulamin</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Tworząc konto, akceptujesz naszą <a target="_blank" href="https://www.docuseal.com/privacy">Politykę Prywatności</a> i <a target="_blank" href="https://www.docuseal.com/terms">Regulamin</a>.'
|
||||||
enter_email_to_continue: Wprowadź e-mail, aby kontynuować
|
enter_email_to_continue: Wprowadź e-mail, aby kontynuować
|
||||||
|
|
||||||
uk:
|
uk:
|
||||||
@@ -3609,7 +3970,7 @@ uk:
|
|||||||
profile_details: Дані профілю
|
profile_details: Дані профілю
|
||||||
sign_up_with_google: Зареєструватися через Google
|
sign_up_with_google: Зареєструватися через Google
|
||||||
sign_up_with_microsoft: Зареєструватися через Microsoft
|
sign_up_with_microsoft: Зареєструватися через Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Створюючи акаунт, ви погоджуєтесь з нашою <a target="_blank" href="https://www.docuseal.co/privacy">Політикою конфіденційності</a> і <a target="_blank" href="https://www.docuseal.co/terms">Умовами надання послуг</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Створюючи акаунт, ви погоджуєтесь з нашою <a target="_blank" href="https://www.docuseal.com/privacy">Політикою конфіденційності</a> і <a target="_blank" href="https://www.docuseal.com/terms">Умовами надання послуг</a>.'
|
||||||
enter_email_to_continue: Введіть електронну пошту, щоб продовжити
|
enter_email_to_continue: Введіть електронну пошту, щоб продовжити
|
||||||
|
|
||||||
cs:
|
cs:
|
||||||
@@ -3663,7 +4024,7 @@ cs:
|
|||||||
profile_details: Detaily profilu
|
profile_details: Detaily profilu
|
||||||
sign_up_with_google: Zaregistrovat se pomocí Googlu
|
sign_up_with_google: Zaregistrovat se pomocí Googlu
|
||||||
sign_up_with_microsoft: Zaregistrovat se pomocí Microsoftu
|
sign_up_with_microsoft: Zaregistrovat se pomocí Microsoftu
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Vytvořením účtu souhlasíte s našimi <a target="_blank" href="https://www.docuseal.co/privacy">Zásadami ochrany osobních údajů</a> a <a target="_blank" href="https://www.docuseal.co/terms">Podmínkami služby</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Vytvořením účtu souhlasíte s našimi <a target="_blank" href="https://www.docuseal.com/privacy">Zásadami ochrany osobních údajů</a> a <a target="_blank" href="https://www.docuseal.com/terms">Podmínkami služby</a>.'
|
||||||
enter_email_to_continue: Zadejte e-mail pro pokračování
|
enter_email_to_continue: Zadejte e-mail pro pokračování
|
||||||
|
|
||||||
he:
|
he:
|
||||||
@@ -3717,7 +4078,7 @@ he:
|
|||||||
profile_details: פרטי הפרופיל
|
profile_details: פרטי הפרופיל
|
||||||
sign_up_with_google: הירשם עם גוגל
|
sign_up_with_google: הירשם עם גוגל
|
||||||
sign_up_with_microsoft: הירשם עם מיקרוסופט
|
sign_up_with_microsoft: הירשם עם מיקרוסופט
|
||||||
by_creating_an_account_you_agree_to_our_html: 'על ידי יצירת חשבון, אתה מסכים ל<a target="_blank" href="https://www.docuseal.co/privacy">מדיניות הפרטיות</a> ול<a target="_blank" href="https://www.docuseal.co/terms">תנאי השירות</a> שלנו.'
|
by_creating_an_account_you_agree_to_our_html: 'על ידי יצירת חשבון, אתה מסכים ל<a target="_blank" href="https://www.docuseal.com/privacy">מדיניות הפרטיות</a> ול<a target="_blank" href="https://www.docuseal.com/terms">תנאי השירות</a> שלנו.'
|
||||||
enter_email_to_continue: הכנס דוא"ל כדי להמשיך
|
enter_email_to_continue: הכנס דוא"ל כדי להמשיך
|
||||||
|
|
||||||
nl:
|
nl:
|
||||||
@@ -3771,7 +4132,7 @@ nl:
|
|||||||
profile_details: Profielgegevens
|
profile_details: Profielgegevens
|
||||||
sign_up_with_google: Aanmelden met Google
|
sign_up_with_google: Aanmelden met Google
|
||||||
sign_up_with_microsoft: Aanmelden met Microsoft
|
sign_up_with_microsoft: Aanmelden met Microsoft
|
||||||
by_creating_an_account_you_agree_to_our_html: 'Door een account aan te maken, ga je akkoord met ons <a target="_blank" href="https://www.docuseal.co/privacy">Privacybeleid</a> en onze <a target="_blank" href="https://www.docuseal.co/terms">Gebruiksvoorwaarden</a>.'
|
by_creating_an_account_you_agree_to_our_html: 'Door een account aan te maken, ga je akkoord met ons <a target="_blank" href="https://www.docuseal.com/privacy">Privacybeleid</a> en onze <a target="_blank" href="https://www.docuseal.com/terms">Gebruiksvoorwaarden</a>.'
|
||||||
enter_email_to_continue: Voer e-mail in om door te gaan
|
enter_email_to_continue: Voer e-mail in om door te gaan
|
||||||
|
|
||||||
ar:
|
ar:
|
||||||
@@ -3825,7 +4186,7 @@ ar:
|
|||||||
profile_details: تفاصيل الملف الشخصي
|
profile_details: تفاصيل الملف الشخصي
|
||||||
sign_up_with_google: الاشتراك باستخدام جوجل
|
sign_up_with_google: الاشتراك باستخدام جوجل
|
||||||
sign_up_with_microsoft: الاشتراك باستخدام مايكروسوفت
|
sign_up_with_microsoft: الاشتراك باستخدام مايكروسوفت
|
||||||
by_creating_an_account_you_agree_to_our_html: 'من خلال إنشاء حساب، فإنك توافق على <a target="_blank" href="https://www.docuseal.co/privacy">سياسة الخصوصية</a> و<a target="_blank" href="https://www.docuseal.co/terms">شروط الخدمة</a> الخاصة بنا.'
|
by_creating_an_account_you_agree_to_our_html: 'من خلال إنشاء حساب، فإنك توافق على <a target="_blank" href="https://www.docuseal.com/privacy">سياسة الخصوصية</a> و<a target="_blank" href="https://www.docuseal.com/terms">شروط الخدمة</a> الخاصة بنا.'
|
||||||
enter_email_to_continue: أدخل البريد الإلكتروني للمتابعة
|
enter_email_to_continue: أدخل البريد الإلكتروني للمتابعة
|
||||||
|
|
||||||
ko:
|
ko:
|
||||||
@@ -3879,7 +4240,7 @@ ko:
|
|||||||
profile_details: 프로필 세부 정보
|
profile_details: 프로필 세부 정보
|
||||||
sign_up_with_google: Google로 가입
|
sign_up_with_google: Google로 가입
|
||||||
sign_up_with_microsoft: Microsoft로 가입
|
sign_up_with_microsoft: Microsoft로 가입
|
||||||
by_creating_an_account_you_agree_to_our_html: '계정을 생성함으로써, 귀하는 우리의 <a target="_blank" href="https://www.docuseal.co/privacy">개인정보 보호정책</a> 및 <a target="_blank" href="https://www.docuseal.co/terms">서비스 약관</a>에 동의하는 것입니다.'
|
by_creating_an_account_you_agree_to_our_html: '계정을 생성함으로써, 귀하는 우리의 <a target="_blank" href="https://www.docuseal.com/privacy">개인정보 보호정책</a> 및 <a target="_blank" href="https://www.docuseal.com/terms">서비스 약관</a>에 동의하는 것입니다.'
|
||||||
enter_email_to_continue: 계속하려면 이메일을 입력하세요
|
enter_email_to_continue: 계속하려면 이메일을 입력하세요
|
||||||
|
|
||||||
en-US:
|
en-US:
|
||||||
|
|||||||
+8
-2
@@ -34,6 +34,7 @@ Rails.application.routes.draw do
|
|||||||
resources :submitter_form_views, only: %i[create]
|
resources :submitter_form_views, only: %i[create]
|
||||||
resources :submitters, only: %i[index show update]
|
resources :submitters, only: %i[index show update]
|
||||||
resources :submissions, only: %i[index show create destroy] do
|
resources :submissions, only: %i[index show create destroy] do
|
||||||
|
resources :documents, only: %i[index], controller: 'submission_documents'
|
||||||
collection do
|
collection do
|
||||||
resources :init, only: %i[create], controller: 'submissions'
|
resources :init, only: %i[create], controller: 'submissions'
|
||||||
resources :emails, only: %i[create], controller: 'submissions', as: :submissions_emails
|
resources :emails, only: %i[create], controller: 'submissions', as: :submissions_emails
|
||||||
@@ -68,7 +69,10 @@ Rails.application.routes.draw do
|
|||||||
resource :user_initials, only: %i[edit update destroy]
|
resource :user_initials, only: %i[edit update destroy]
|
||||||
resources :submissions_archived, only: %i[index], path: 'submissions/archived'
|
resources :submissions_archived, only: %i[index], path: 'submissions/archived'
|
||||||
resources :submissions, only: %i[index], controller: 'submissions_dashboard'
|
resources :submissions, only: %i[index], controller: 'submissions_dashboard'
|
||||||
resources :submissions, only: %i[show destroy]
|
resources :submissions, only: %i[show destroy] do
|
||||||
|
resources :unarchive, only: %i[create], controller: 'submissions_unarchive'
|
||||||
|
end
|
||||||
|
resources :submitters, only: %i[edit update]
|
||||||
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'
|
resources :manage, only: %i[index], controller: 'console_redirect'
|
||||||
@@ -151,15 +155,17 @@ Rails.application.routes.draw do
|
|||||||
scope '/settings', as: :settings do
|
scope '/settings', as: :settings do
|
||||||
unless Docuseal.multitenant?
|
unless Docuseal.multitenant?
|
||||||
resources :storage, only: %i[index create], controller: 'storage_settings'
|
resources :storage, only: %i[index create], controller: 'storage_settings'
|
||||||
resources :email, only: %i[index create], controller: 'email_smtp_settings'
|
|
||||||
resources :sms, only: %i[index], controller: 'sms_settings'
|
resources :sms, only: %i[index], controller: 'sms_settings'
|
||||||
end
|
end
|
||||||
|
resources :email, only: %i[index create], controller: 'email_smtp_settings'
|
||||||
resources :sso, only: %i[index], controller: 'sso_settings'
|
resources :sso, only: %i[index], controller: 'sso_settings'
|
||||||
resources :notifications, only: %i[index create], controller: 'notifications_settings'
|
resources :notifications, only: %i[index create], controller: 'notifications_settings'
|
||||||
resource :esign, only: %i[show create new update destroy], controller: 'esign_settings'
|
resource :esign, only: %i[show create new update destroy], controller: 'esign_settings'
|
||||||
resources :users, only: %i[index]
|
resources :users, only: %i[index]
|
||||||
resources :archived_users, only: %i[index], path: 'users/:status', controller: 'users',
|
resources :archived_users, only: %i[index], path: 'users/:status', controller: 'users',
|
||||||
defaults: { status: :archived }
|
defaults: { status: :archived }
|
||||||
|
resources :integration_users, only: %i[index], path: 'users/:status', controller: 'users',
|
||||||
|
defaults: { status: :integration }
|
||||||
resource :personalization, only: %i[show create], controller: 'personalization_settings'
|
resource :personalization, only: %i[show create], controller: 'personalization_settings'
|
||||||
resources :api, only: %i[index create], controller: 'api_settings'
|
resources :api, only: %i[index create], controller: 'api_settings'
|
||||||
resource :webhooks, only: %i[show create update], controller: 'webhook_settings'
|
resource :webhooks, only: %i[show create update], controller: 'webhook_settings'
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
queues:
|
queues:
|
||||||
- [default, 1]
|
- [default, 1]
|
||||||
- [webhooks, 1]
|
- [webhooks, 1]
|
||||||
|
- [images, 1]
|
||||||
- [mailers, 1]
|
- [mailers, 1]
|
||||||
- [recurrent, 1]
|
- [recurrent, 1]
|
||||||
- [rollbar, 1]
|
- [rollbar, 1]
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const configs = generateWebpackConfig({
|
|||||||
},
|
},
|
||||||
optimization: {
|
optimization: {
|
||||||
runtimeChunk: false,
|
runtimeChunk: false,
|
||||||
|
concatenateModules: !process.env.BUNDLE_ANALYZE,
|
||||||
splitChunks: {
|
splitChunks: {
|
||||||
chunks (chunk) {
|
chunks (chunk) {
|
||||||
return chunk.name !== 'rollbar'
|
return chunk.name !== 'rollbar'
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class CreateCompletedSubmittersAndDocuments < ActiveRecord::Migration[7.2]
|
||||||
|
def change
|
||||||
|
create_table :completed_submitters do |t|
|
||||||
|
t.bigint :submitter_id, null: false, index: true
|
||||||
|
t.bigint :submission_id, null: false
|
||||||
|
t.bigint :account_id, null: false, index: true
|
||||||
|
t.bigint :template_id, null: false
|
||||||
|
t.string :source, null: false
|
||||||
|
t.integer :sms_count, null: false
|
||||||
|
t.datetime :completed_at, null: false
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
|
||||||
|
create_table :completed_documents do |t|
|
||||||
|
t.bigint :submitter_id, null: false, index: true
|
||||||
|
t.string :sha256, null: false, index: true
|
||||||
|
|
||||||
|
t.timestamps
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class PopulateCompletedSubmittersAndDocuments < ActiveRecord::Migration[7.2]
|
||||||
|
disable_ddl_transaction
|
||||||
|
|
||||||
|
class MigrationSubmitter < ApplicationRecord
|
||||||
|
self.table_name = 'submitters'
|
||||||
|
|
||||||
|
belongs_to :submission, class_name: 'MigrationSubmission'
|
||||||
|
has_many :submission_sms_events, -> { where(event_type: %w[send_sms send_2fa_sms]) },
|
||||||
|
class_name: 'MigrationSubmissionEvent', foreign_key: :submitter_id
|
||||||
|
end
|
||||||
|
|
||||||
|
class MigrationSubmission < ApplicationRecord
|
||||||
|
self.table_name = 'submissions'
|
||||||
|
end
|
||||||
|
|
||||||
|
class MigrationSubmissionEvent < ApplicationRecord
|
||||||
|
self.table_name = 'submission_events'
|
||||||
|
end
|
||||||
|
|
||||||
|
class MigrationCompletedSubmitter < ApplicationRecord
|
||||||
|
self.table_name = 'completed_submitters'
|
||||||
|
end
|
||||||
|
|
||||||
|
class MigrationCompletedDocument < ApplicationRecord
|
||||||
|
self.table_name = 'completed_documents'
|
||||||
|
end
|
||||||
|
|
||||||
|
def up
|
||||||
|
submitters = MigrationSubmitter.where.not(completed_at: nil)
|
||||||
|
.preload(:submission, :submission_sms_events)
|
||||||
|
|
||||||
|
count = submitters.count
|
||||||
|
|
||||||
|
puts "Updating the database - it might take ~#{(count / 1000 * 3) + 1} seconds" if count > 2000
|
||||||
|
|
||||||
|
submitters.find_each do |submitter|
|
||||||
|
completed_submitter = MigrationCompletedSubmitter.find_or_initialize_by(submitter_id: submitter.id)
|
||||||
|
|
||||||
|
next if completed_submitter.persisted?
|
||||||
|
|
||||||
|
submission = submitter.submission
|
||||||
|
|
||||||
|
completed_submitter.assign_attributes(
|
||||||
|
submission_id: submitter.submission_id,
|
||||||
|
account_id: submission.account_id,
|
||||||
|
template_id: submission.template_id,
|
||||||
|
source: submission.source,
|
||||||
|
sms_count: submitter.submission_sms_events.size,
|
||||||
|
completed_at: submitter.completed_at,
|
||||||
|
created_at: submitter.completed_at,
|
||||||
|
updated_at: submitter.completed_at
|
||||||
|
)
|
||||||
|
|
||||||
|
completed_submitter.save!
|
||||||
|
end
|
||||||
|
|
||||||
|
attachments = ActiveStorage::Attachment.where(record_type: 'Submitter', name: 'documents').preload(:blob)
|
||||||
|
|
||||||
|
attachments.find_each do |attachment|
|
||||||
|
sha256 = attachment.metadata['sha256']
|
||||||
|
|
||||||
|
next if sha256.blank?
|
||||||
|
|
||||||
|
completed_document = MigrationCompletedDocument.find_or_initialize_by(submitter_id: attachment.record_id, sha256:)
|
||||||
|
|
||||||
|
next if completed_document.persisted?
|
||||||
|
|
||||||
|
completed_document.assign_attributes(created_at: attachment.created_at, updated_at: attachment.created_at)
|
||||||
|
|
||||||
|
completed_document.save!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
Loaded 100 of 137 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user