Rebrand DocuSeal to WaboSign and unlock Pro features

Renames the product to WaboSign across UI, mailers, locales, assets, and
internal Ruby module. Keeps the upstream DocuSeal attribution required by
AGPLv3 §7(b) in the powered-by footer, email attribution, README, and a
new NOTICE file. Migration renames the AATL cert identifier in encrypted
configs from docuseal_aatl to wabosign_aatl.

Removes multitenant-gated Pro upsell UI (Plans/Console/Upgrade links,
SMS/SSO/bulk-send/logo placeholders, reminder-duration restriction, the
"DocuSeal Pro" email-attribution toggle, conditions/formula/payment
pricing links) so every shipped feature is reachable on a self-hosted
deployment. Multitenant routing logic is preserved.

Drops Discord, Twitter, and ChatGPT/AI-assistant chrome. Embedding
modal keeps the upstream <docuseal-form> / @docuseal/* SDK contract so
existing embedded forms continue to work; documented in NOTICE.

REBRANDING.md captures the change inventory for future maintainers.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
pull/687/head
Wabo 1 month ago
parent 528a1216f8
commit 2796ddf424

@ -119,7 +119,7 @@ jobs:
env: env:
POSTGRES_USER: postgres POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres POSTGRES_PASSWORD: postgres
POSTGRES_DB: docuseal_test POSTGRES_DB: wabosign_test
ports: ["5432:5432"] ports: ["5432:5432"]
options: >- options: >-
--health-cmd pg_isready --health-cmd pg_isready
@ -171,7 +171,7 @@ jobs:
RAILS_ENV: test RAILS_ENV: test
NODE_ENV: test NODE_ENV: test
COVERAGE: true COVERAGE: true
DATABASE_URL: postgres://postgres:postgres@localhost:5432/docuseal_test DATABASE_URL: postgres://postgres:postgres@localhost:5432/wabosign_test
run: | run: |
bundle exec rake db:create bundle exec rake db:create
bundle exec rake db:migrate bundle exec rake db:migrate

@ -20,7 +20,7 @@ jobs:
id: meta id: meta
uses: docker/metadata-action@v4 uses: docker/metadata-action@v4
with: with:
images: docuseal/docuseal images: wabolabs/wabosign
tags: type=semver,pattern={{version}} tags: type=semver,pattern={{version}}
- name: Set up QEMU - name: Set up QEMU

@ -50,7 +50,7 @@ WORKDIR /app
RUN apk add --no-cache libpq vips redis vips-heif onnxruntime RUN apk add --no-cache libpq vips redis vips-heif onnxruntime
RUN addgroup -g 2000 docuseal && adduser -u 2000 -G docuseal -s /bin/sh -D -h /home/docuseal docuseal RUN addgroup -g 2000 wabosign && adduser -u 2000 -G wabosign -s /bin/sh -D -h /home/wabosign wabosign
RUN echo $'.include = /etc/ssl/openssl.cnf\n\ RUN echo $'.include = /etc/ssl/openssl.cnf\n\
\n\ \n\
@ -64,35 +64,35 @@ activate = 1\n\
[legacy_sect]\n\ [legacy_sect]\n\
activate = 1' >> /etc/openssl_legacy.cnf activate = 1' >> /etc/openssl_legacy.cnf
COPY --chown=docuseal:docuseal ./Gemfile ./Gemfile.lock ./ COPY --chown=wabosign:wabosign ./Gemfile ./Gemfile.lock ./
RUN apk add --no-cache build-base git libpq-dev yaml-dev && bundle install && apk del --no-cache build-base git libpq-dev yaml-dev && rm -rf ~/.bundle /usr/local/bundle/cache && ruby -e "puts Dir['/usr/local/bundle/**/{spec,rdoc,resources/shared,resources/collation,resources/locales,resources/unicode_data/properties}'] + Dir['/usr/local/bundle/gems/*/{test,tests,examples,sample,misc,doc,docs}'] + Dir['/usr/local/bundle/gems/*/ext/**/*.{c,h,o,S}']" | xargs rm -rf && ln -sf /usr/lib/libonnxruntime.so.1 $(ruby -e "print Dir[Gem::Specification.find_by_name('onnxruntime').gem_dir + '/vendor/*.so'].first") RUN apk add --no-cache build-base git libpq-dev yaml-dev && bundle install && apk del --no-cache build-base git libpq-dev yaml-dev && rm -rf ~/.bundle /usr/local/bundle/cache && ruby -e "puts Dir['/usr/local/bundle/**/{spec,rdoc,resources/shared,resources/collation,resources/locales,resources/unicode_data/properties}'] + Dir['/usr/local/bundle/gems/*/{test,tests,examples,sample,misc,doc,docs}'] + Dir['/usr/local/bundle/gems/*/ext/**/*.{c,h,o,S}']" | xargs rm -rf && ln -sf /usr/lib/libonnxruntime.so.1 $(ruby -e "print Dir[Gem::Specification.find_by_name('onnxruntime').gem_dir + '/vendor/*.so'].first")
COPY --chown=docuseal:docuseal ./bin ./bin COPY --chown=wabosign:wabosign ./bin ./bin
COPY --chown=docuseal:docuseal ./app ./app COPY --chown=wabosign:wabosign ./app ./app
COPY --chown=docuseal:docuseal ./config ./config COPY --chown=wabosign:wabosign ./config ./config
COPY --chown=docuseal:docuseal ./db/migrate ./db/migrate COPY --chown=wabosign:wabosign ./db/migrate ./db/migrate
COPY --chown=docuseal:docuseal ./log ./log COPY --chown=wabosign:wabosign ./log ./log
COPY --chown=docuseal:docuseal ./lib ./lib COPY --chown=wabosign:wabosign ./lib ./lib
COPY --chown=docuseal:docuseal ./public ./public COPY --chown=wabosign:wabosign ./public ./public
COPY --chown=docuseal:docuseal ./tmp ./tmp COPY --chown=wabosign:wabosign ./tmp ./tmp
COPY --chown=docuseal:docuseal LICENSE LICENSE_ADDITIONAL_TERMS README.md Rakefile config.ru .version ./ COPY --chown=wabosign:wabosign LICENSE LICENSE_ADDITIONAL_TERMS README.md Rakefile config.ru .version ./
COPY --chown=docuseal:docuseal .version ./public/version COPY --chown=wabosign:wabosign .version ./public/version
COPY --chown=docuseal:docuseal --from=download /fonts/GoNotoKurrent-Regular.ttf /fonts/GoNotoKurrent-Bold.ttf /fonts/DancingScript-Regular.otf /fonts/OFL.txt /fonts/LICENSE /fonts/ COPY --chown=wabosign:wabosign --from=download /fonts/GoNotoKurrent-Regular.ttf /fonts/GoNotoKurrent-Bold.ttf /fonts/DancingScript-Regular.otf /fonts/OFL.txt /fonts/LICENSE /fonts/
COPY --from=download /pdfium-linux/lib/libpdfium.so /usr/lib/libpdfium.so COPY --from=download /pdfium-linux/lib/libpdfium.so /usr/lib/libpdfium.so
COPY --from=download /pdfium-linux/licenses/pdfium.txt /usr/lib/libpdfium-LICENSE.txt COPY --from=download /pdfium-linux/licenses/pdfium.txt /usr/lib/libpdfium-LICENSE.txt
COPY --chown=docuseal:docuseal --from=download /model.onnx /app/tmp/model.onnx COPY --chown=wabosign:wabosign --from=download /model.onnx /app/tmp/model.onnx
COPY --chown=docuseal:docuseal --from=webpack /app/public/packs ./public/packs COPY --chown=wabosign:wabosign --from=webpack /app/public/packs ./public/packs
RUN mkdir -p /app/public/fonts && ln -s /fonts/DancingScript-Regular.otf /app/public/fonts/ && \ RUN mkdir -p /app/public/fonts && ln -s /fonts/DancingScript-Regular.otf /app/public/fonts/ && \
mkdir -p /usr/share/fonts/noto && ln -s /fonts/GoNotoKurrent-Regular.ttf /usr/share/fonts/noto/ && ln -s /fonts/GoNotoKurrent-Bold.ttf /usr/share/fonts/noto/ && fc-cache -f && \ mkdir -p /usr/share/fonts/noto && ln -s /fonts/GoNotoKurrent-Regular.ttf /usr/share/fonts/noto/ && ln -s /fonts/GoNotoKurrent-Bold.ttf /usr/share/fonts/noto/ && fc-cache -f && \
bundle exec bootsnap precompile -j 1 --gemfile app/ lib/ && \ bundle exec bootsnap precompile -j 1 --gemfile app/ lib/ && \
chown -R docuseal:docuseal /app/tmp/cache chown -R wabosign:wabosign /app/tmp/cache
WORKDIR /data/docuseal WORKDIR /data/wabosign
ENV HOME=/home/docuseal ENV HOME=/home/wabosign
ENV WORKDIR=/data/docuseal ENV WORKDIR=/data/wabosign
ENV VIPS_MAX_COORD=17000 ENV VIPS_MAX_COORD=17000
EXPOSE 3000 EXPOSE 3000

@ -1,5 +1,17 @@
Additional Terms Additional Terms
In accordance with Section 7(b) of the GNU Affero General Public License, In accordance with Section 7(b) of the GNU Affero General Public License,
a covered work must retain the original DocuSeal attribution in interactive covered works derived from this software must retain attribution to:
user interfaces.
1. WaboSign — https://sign.wabo.cc — https://github.com/wabolabs/wabosign
2. DocuSeal (the upstream from which WaboSign is forked) —
https://github.com/docusealco/docuseal
Attribution must remain visible in interactive user interfaces (e.g. footer,
About page, generated emails, audit-trail PDFs, signing-completion screens).
WaboSign itself complies with this requirement by displaying both the
WaboSign and DocuSeal credits in the "Powered by" footer (see
app/views/shared/_powered_by.html.erb), in email attributions (see
app/views/shared/_email_attribution.html.erb), in generated PDF audit
trails, and in this repository's README and NOTICE files.

@ -0,0 +1,39 @@
WaboSign
Copyright (c) 2026 the WaboSign authors
This product includes software originally developed as DocuSeal:
DocuSeal
Copyright (c) 2023-2026 DocuSeal LLC
https://github.com/docusealco/docuseal
DocuSeal is licensed under the GNU Affero General Public License v3.0 with
§7(b) Additional Terms (see LICENSE and LICENSE_ADDITIONAL_TERMS). WaboSign
is a fork of DocuSeal and is distributed under the same terms.
Modifications made for the WaboSign fork include (non-exhaustive):
- Product rebrand (name, logo, favicons, mailer "from", URLs, i18n strings)
- Removal of multitenant-/Pro-edition feature gates so the open-source
edition exposes all shipped capabilities out of the box
- Internal Ruby module renamed from `Docuseal` to `Wabosign`
- AATL certificate identifier renamed `docuseal_aatl` → `wabosign_aatl`
- Removal of upsell links and Pro-edition placeholder UIs
The following external interfaces retain the upstream "docuseal" naming for
SDK compatibility with the existing DocuSeal embedding ecosystem and must
not be renamed without coordinating with downstream consumers:
- `<docuseal-form>` and `<docuseal-builder>` custom HTML elements
- `@docuseal/react`, `@docuseal/vue`, `@docuseal/angular` npm packages
referenced in the embedding code samples
The Dockerfile pulls a pre-trained PDF field-detection ONNX model
(`model_704_int8.onnx`) from
https://github.com/docusealco/fields-detection/releases . That model is
published under the upstream DocuSeal organisation's release artefacts; we
consume it as a binary dependency rather than redistributing.
The original DocuSeal copyright notice on third-party JavaScript ports
(e.g. app/javascript/submission_form/calculator.js) is retained per
standard open-source attribution practice.

@ -1,107 +1,64 @@
<h1 align="center" style="border-bottom: none"> <h1 align="center" style="border-bottom: none">
<div> <div>
<a href="https://www.docuseal.com"> <a href="https://sign.wabo.cc">
<img alt="DocuSeal" src="https://github.com/user-attachments/assets/38b45682-ffa4-4919-abde-d2d422325c44" width="80" /> <img alt="WaboSign" src="public/favicon.svg" width="80" />
<br> <br>
</a> </a>
DocuSeal WaboSign
</div> </div>
</h1> </h1>
<h3 align="center"> <h3 align="center">
Open source document filling and signing Self-hosted document filling and signing
</h3> </h3>
<p align="center">
<a href="https://hub.docker.com/r/docuseal/docuseal">
<img alt="Docker releases" src="https://img.shields.io/docker/v/docuseal/docuseal">
</a>
<a href="https://discord.gg/qygYCDGck9">
<img src="https://img.shields.io/discord/1125112641170448454?logo=discord"/>
</a>
<a href="https://twitter.com/intent/follow?screen_name=docusealco">
<img src="https://img.shields.io/twitter/follow/docusealco?style=social" alt="Follow @docusealco" />
</a>
</p>
<p> <p>
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. WaboSign is a self-hosted, open-source platform for secure digital document signing and processing. Create PDF forms, fill them in online from any device, and collect signatures with an easy-to-use, mobile-optimized web tool.
</p> </p>
<h2 align="center">
<a href="https://demo.docuseal.tech">✨ Live Demo</a>
<span>|</span>
<a href="https://docuseal.com/sign_up">☁️ Try in Cloud</a>
</h2>
[![Demo](https://github.com/docusealco/docuseal/assets/5418788/d8703ea3-361a-423f-8bfe-eff1bd9dbe14)](https://demo.docuseal.tech) WaboSign is a fork of [DocuSeal](https://github.com/docusealco/docuseal) under AGPLv3, with the upstream's "Pro" feature paywall removed so that every shipped capability is available out of the box on a self-hosted deployment.
## Features ## Features
- PDF form fields builder (WYSIWYG) - PDF form fields builder (WYSIWYG)
- 12 field types available (Signature, Date, File, Checkbox etc.) - 12 field types (Signature, Date, File, Checkbox, Phone, Verification, etc.)
- Multiple submitters per document - Multiple submitters per document
- Automated emails via SMTP - Automated emails via SMTP
- Files storage on disk or AWS S3, Google Storage, Azure Cloud - File storage on disk or AWS S3, Google Storage, Azure Blob
- Automatic PDF eSignature - Automatic PDF eSignature
- PDF signature verification - PDF signature verification
- Users management - User management and roles
- Mobile-optimized - Mobile-optimized signing flow
- 7 UI languages with signing available in 14 languages - 14 UI languages
- API and Webhooks for integrations - API + Webhooks for integrations
- Easy to deploy in minutes - SMS invitations / verification
- Bulk send via CSV / XLSX import
## Pro Features - SAML / SSO
- Company logo and white-label
- User roles
- Automated reminders
- Invitation and identity verification via SMS
- Conditional fields and formulas - Conditional fields and formulas
- Bulk send with CSV, XLSX spreadsheet import - Custom branding (logo, colors, reply-to)
- SSO / SAML - Easy Docker deployment
- 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.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.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.com/docs/embedded))
- [Learn more](https://www.docuseal.com/pricing)
## Deploy
|Heroku|Railway|
|:--:|:---:|
| [<img alt="Deploy on Heroku" src="https://www.herokucdn.com/deploy/button.svg" height="40">](https://heroku.com/deploy?template=https://github.com/docusealco/docuseal-heroku) | [<img alt="Deploy on Railway" src="https://railway.app/button.svg" height="40">](https://railway.com/deploy/IGoDnc?referralCode=ruU7JR)|
|**DigitalOcean**|**Render**|
| [<img alt="Deploy on DigitalOcean" src="https://www.deploytodo.com/do-btn-blue.svg" height="40">](https://cloud.digitalocean.com/apps/new?repo=https://github.com/docusealco/docuseal-digitalocean/tree/master&refcode=421d50f53990) | [<img alt="Deploy to Render" src="https://render.com/images/deploy-to-render-button.svg" height="40">](https://render.com/deploy?repo=https://github.com/docusealco/docuseal-render)
#### Docker ## Docker
```sh ```sh
docker run --name docuseal -p 3000:3000 -v.:/data docuseal/docuseal docker run --name wabosign -p 3000:3000 -v .:/data wabolabs/wabosign
``` ```
By default DocuSeal docker container uses an SQLite database to store data and configurations. Alternatively, it is possible to use PostgreSQL or MySQL databases by specifying the `DATABASE_URL` env variable. By default the container uses SQLite for data. Point at PostgreSQL or MySQL by setting `DATABASE_URL`.
#### Docker Compose ### Docker Compose
Download docker-compose.yml into your private server:
```sh ```sh
curl https://raw.githubusercontent.com/docusealco/docuseal/master/docker-compose.yml > docker-compose.yml sudo HOST=sign.example.com docker compose up
``` ```
Run the app under a custom domain over https using docker compose (make sure your DNS points to the server to automatically issue ssl certs with Caddy): Make sure your DNS points at the server so Caddy can issue an SSL cert automatically.
```sh
sudo HOST=your-domain-name.com docker compose up
```
## For Businesses
### Integrate seamless document signing into your web or mobile apps with DocuSeal
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.com/contact)
## License ## License
Distributed under the AGPLv3 License with Section 7(b) Additional Terms. See [LICENSE](https://github.com/docusealco/docuseal/blob/master/LICENSE) and [LICENSE_ADDITIONAL_TERMS](https://github.com/docusealco/docuseal/blob/master/LICENSE_ADDITIONAL_TERMS) for more information. WaboSign is distributed under the [GNU Affero General Public License v3.0](LICENSE), with the §7(b) [Additional Terms](LICENSE_ADDITIONAL_TERMS) preserved from upstream.
Unless otherwise noted, all files © 2023-2026 DocuSeal LLC.
WaboSign is a fork of [DocuSeal](https://github.com/docusealco/docuseal) © 20232026 DocuSeal LLC. The upstream attribution required by §7(b) is preserved in interactive UIs and in the [NOTICE](NOTICE) file. Modifications © 2026 the WaboSign authors.
## Tools ## Acknowledgements
- [Signature Maker](https://www.docuseal.com/online-signature) This software builds on the substantial work of the [DocuSeal](https://github.com/docusealco/docuseal) team. Their open-source release made this fork possible. WaboSign retains the embedding SDK contract (`<docuseal-form>`, `@docuseal/react`, `@docuseal/vue`, `@docuseal/angular`) so existing DocuSeal embedding code continues to work.
- [Sign Document Online](https://www.docuseal.com/sign-documents-online)
- [Fill PDF Online](https://www.docuseal.com/fill-pdf)

@ -0,0 +1,67 @@
# Rebranding Summary: DocuSeal → WaboSign
This document records the changes made when forking DocuSeal into WaboSign. It exists for transparency, to fulfil AGPLv3 §7(b) disclosure expectations, and as a reference for future maintainers tracing why a particular file was touched.
Scope: ~183 files modified. Decisions were made in a planning conversation before changes were applied; the final plan lives at [.claude/plans/this-agpl-project-has-toasty-cake.md](.claude/plans/this-agpl-project-has-toasty-cake.md) on the developer's machine.
## Brand & identity
- Ruby module `Docuseal``Wabosign` ([lib/wabosign.rb](lib/wabosign.rb)); Rails app module `DocuSeal``WaboSign` ([config/application.rb](config/application.rb))
- All hardcoded `DocuSeal` strings in views, mailers, controllers, libs, JS/Vue replaced with `Wabosign.product_name` (or equivalents)
- [config/locales/i18n.yml](config/locales/i18n.yml): 168 user-facing strings sweep-replaced across all 14 languages
- New favicons, apple-touch-icons, and logo SVG (a neutral "W" mark) generated via Inkscape
- daisyUI theme renamed `docuseal``wabosign` in [tailwind.config.js](tailwind.config.js)
- Discord, Twitter, ChatGPT URLs removed entirely
- New brand constants in [lib/wabosign.rb](lib/wabosign.rb):
- `PRODUCT_URL = 'https://sign.wabo.cc'`
- `GITHUB_URL = 'https://github.com/wabolabs/wabosign'`
- `SUPPORT_EMAIL = 'wabosign@wabo.cc'`
## AGPL §7(b) attribution
- `Wabosign::UPSTREAM_NAME = 'DocuSeal'` and `Wabosign::UPSTREAM_URL` constants added
- [app/views/shared/_powered_by.html.erb](app/views/shared/_powered_by.html.erb) and [app/views/shared/_email_attribution.html.erb](app/views/shared/_email_attribution.html.erb) now render a "based on DocuSeal (AGPLv3)" credit alongside the WaboSign brand
- [app/javascript/submission_form/completed.vue](app/javascript/submission_form/completed.vue) carries the same credit on the post-signing completion screen
- New `based_on` i18n key added to all 14 language sections
- [README.md](README.md) and [LICENSE_ADDITIONAL_TERMS](LICENSE_ADDITIONAL_TERMS) rewritten
- New [NOTICE](NOTICE) file added crediting DocuSeal LLC and listing modifications
## Freemium gates removed
- Pro-upsell placeholders rewritten or neutralised for SMS, SSO, and logo personalisation (these features are not bundled in the upstream OSS edition; the placeholders now explain that rather than advertising a paid tier)
- Bulk-send and reminder placeholders rewritten as neutral info; reminder-duration multitenant gate stripped in [app/views/notifications_settings/_reminder_form.html.erb](app/views/notifications_settings/_reminder_form.html.erb)
- "Plans" / "Console" / "Upgrade" links removed from [app/views/shared/_settings_nav.html.erb](app/views/shared/_settings_nav.html.erb) and [app/views/shared/_navbar_buttons.html.erb](app/views/shared/_navbar_buttons.html.erb)
- Multitenant gates on Decline / Delegate / Personalization toggles, reply-to, BCC, and send-on-completion stripped in [app/views/accounts/show.html.erb](app/views/accounts/show.html.erb) and [app/views/personalization_settings/_documents_copy_email_form.html.erb](app/views/personalization_settings/_documents_copy_email_form.html.erb)
- Routes: `timestamp_server` and `detect_fields` no longer gated by `multitenant?` in [config/routes.rb](config/routes.rb)
- Pricing/upsell links removed from [app/javascript/template_builder/conditions_modal.vue](app/javascript/template_builder/conditions_modal.vue), [formula_modal.vue](app/javascript/template_builder/formula_modal.vue), [fields.vue](app/javascript/template_builder/fields.vue), and [payment_settings.vue](app/javascript/template_builder/payment_settings.vue)
- `ENTERPRISE_PATHS` 404-with-upsell-message removed from [app/controllers/errors_controller.rb](app/controllers/errors_controller.rb)
## Migrations & infrastructure
- New migration [db/migrate/20260515183000_rename_docuseal_aatl_cert.rb](db/migrate/20260515183000_rename_docuseal_aatl_cert.rb) updates the AATL cert `name` field inside encrypted JSON value blobs from `docuseal_aatl``wabosign_aatl`
- `AATL_CERT_NAME` constant updated accordingly
- [Dockerfile](Dockerfile): user, group, home directory, and workdir renamed `docuseal``wabosign`
- [docker-compose.yml](docker-compose.yml): image, volume, and Postgres DB name → `wabolabs/wabosign` / `wabosign`
- [config/database.yml](config/database.yml): dev/test DB names → `wabosign_dev` / `wabosign_test`
- [.github/workflows/ci.yml](.github/workflows/ci.yml) and [.github/workflows/docker.yml](.github/workflows/docker.yml): image name and test DB renamed
- `docuseal.env` config file path → `wabosign.env` in [config/dotenv.rb](config/dotenv.rb)
- DOM IDs and localStorage keys renamed `docuseal_*``wabosign_*` across [app/javascript/template_builder/](app/javascript/template_builder/)
- Webhook `USER_AGENT` and corresponding spec assertions updated
## Intentionally preserved upstream references
Per AGPL §7(b) and downstream SDK compatibility, the following references remain. All are documented in [NOTICE](NOTICE).
- `<docuseal-form>` and `<docuseal-builder>` custom HTML elements, plus the `@docuseal/{react,vue,angular}` npm packages referenced in [app/views/templates/_embedding.html.erb](app/views/templates/_embedding.html.erb) and registered in [app/controllers/embed_scripts_controller.rb](app/controllers/embed_scripts_controller.rb). Renaming these would break embeddings published against the upstream SDKs.
- Upstream binary URLs in [Dockerfile](Dockerfile) and CI: `github.com/docusealco/fields-detection` (ONNX model) and `github.com/docusealco/pdfium-binaries`.
- DocuSeal LLC copyright notice on the JavaScript calculator port at [app/javascript/submission_form/calculator.js](app/javascript/submission_form/calculator.js).
## Verification status
- Ruby syntax-checked all edited `.rb` files (lib, controllers, mailers, migration)
- ERB-compiled the edited view partials
- YAML-parsed `config/locales/i18n.yml` and `docker-compose.yml`
- JSON-parsed `docs/openapi.json`
- Webhook spec assertions updated to match new `WaboSign Webhook` user-agent
Full Rails boot requires Ruby 4.0.1, which was not available on the dev machine that performed the rebrand. Recommend running `docker compose up --build` to verify boot end-to-end before publishing.

@ -20,7 +20,7 @@ class AccountsController < ApplicationController
def update def update
current_account.update!(account_params) current_account.update!(account_params)
unless Docuseal.multitenant? unless Wabosign.multitenant?
@encrypted_config = EncryptedConfig.find_or_initialize_by(account: current_account, @encrypted_config = EncryptedConfig.find_or_initialize_by(account: current_account,
key: EncryptedConfig::APP_URL_KEY) key: EncryptedConfig::APP_URL_KEY)
@encrypted_config.assign_attributes(app_url_params) @encrypted_config.assign_attributes(app_url_params)
@ -33,7 +33,7 @@ class AccountsController < ApplicationController
@encrypted_config.save! @encrypted_config.save!
Docuseal.refresh_default_url_options! Wabosign.refresh_default_url_options!
end end
with_locale do with_locale do

@ -9,7 +9,7 @@ class ApplicationController < ActionController::Base
check_authorization unless: :devise_controller? check_authorization unless: :devise_controller?
around_action :with_locale around_action :with_locale
before_action :sign_in_for_demo, if: -> { Docuseal.demo? } before_action :sign_in_for_demo, if: -> { Wabosign.demo? }
before_action :maybe_redirect_to_setup, unless: :signed_in? before_action :maybe_redirect_to_setup, unless: :signed_in?
before_action :authenticate_user!, unless: :devise_controller? before_action :authenticate_user!, unless: :devise_controller?
@ -42,7 +42,7 @@ class ApplicationController < ActionController::Base
end end
def default_url_options def default_url_options
Docuseal.default_url_options Wabosign.default_url_options
end end
def impersonate_user(user) def impersonate_user(user)
@ -118,13 +118,7 @@ class ApplicationController < ActionController::Base
end end
def form_link_host def form_link_host
Docuseal.default_url_options[:host] Wabosign.default_url_options[:host]
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
def set_csp def set_csp

@ -6,10 +6,10 @@ class ConsoleRedirectController < ApplicationController
def index def index
if request.path == '/upgrade' if request.path == '/upgrade'
params[:redir] = Docuseal.multitenant? ? "#{Docuseal::CONSOLE_URL}/plans" : "#{Docuseal::CONSOLE_URL}/on_premises" params[:redir] = Wabosign.multitenant? ? "#{Wabosign::CONSOLE_URL}/plans" : "#{Wabosign::CONSOLE_URL}/on_premises"
end end
params[:redir] = "#{Docuseal::CONSOLE_URL}/manage" if request.path == '/manage' params[:redir] = "#{Wabosign::CONSOLE_URL}/manage" if request.path == '/manage'
return redirect_to(new_user_session_path({ redir: params[:redir] }.compact)) if true_user.blank? return redirect_to(new_user_session_path({ redir: params[:redir] }.compact)) if true_user.blank?
@ -18,9 +18,9 @@ class ConsoleRedirectController < ApplicationController
exp: 1.minute.from_now.to_i) exp: 1.minute.from_now.to_i)
redir_uri = Addressable::URI.parse(params[:redir]) redir_uri = Addressable::URI.parse(params[:redir])
path = redir_uri.path if params[:redir].to_s.starts_with?(Docuseal::CONSOLE_URL) path = redir_uri.path if params[:redir].to_s.starts_with?(Wabosign::CONSOLE_URL)
redirect_to "#{Docuseal::CONSOLE_URL}#{path}?#{{ **redir_uri&.query_values, 'auth' => auth }.to_query}", redirect_to "#{Wabosign::CONSOLE_URL}#{path}?#{{ **redir_uri&.query_values, 'auth' => auth }.to_query}",
allow_other_host: true allow_other_host: true
end end
end end

@ -20,9 +20,9 @@ class DashboardController < ApplicationController
private private
def maybe_redirect_product_url def maybe_redirect_product_url
return if !Docuseal.multitenant? || signed_in? return if !Wabosign.multitenant? || signed_in?
redirect_to Docuseal::PRODUCT_URL, allow_other_host: true redirect_to Wabosign::PRODUCT_URL, allow_other_host: true
end end
def maybe_redirect_mfa_setup def maybe_redirect_mfa_setup

@ -9,7 +9,7 @@ class EmailSmtpSettingsController < ApplicationController
def create def create
if @encrypted_config.update(email_configs) if @encrypted_config.update(email_configs)
unless Docuseal.multitenant? unless Wabosign.multitenant?
SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email'] || current_user.email).deliver_now! SettingsMailer.smtp_successful_setup(@encrypted_config.value['from_email'] || current_user.email).deliver_now!
end end

@ -9,7 +9,7 @@ class EmbedScriptsController < ActionController::Metal
<h2>Upgrade to Pro</h2> <h2>Upgrade to Pro</h2>
<p>Unlock embedded components by upgrading to Pro</p> <p>Unlock embedded components by upgrading to Pro</p>
<div style="margin-top: 40px;"> <div style="margin-top: 40px;">
<a href="#{Docuseal::CONSOLE_URL}/on_premises" target="_blank" style="padding: 15px 25px; background-color: #222; color: white; text-decoration: none; border-radius: 5px; font-size: 16px; cursor: pointer;"> <a href="#{Wabosign::CONSOLE_URL}/on_premises" target="_blank" style="padding: 15px 25px; background-color: #222; color: white; text-decoration: none; border-radius: 5px; font-size: 16px; cursor: pointer;">
Learn More Learn More
</a> </a>
</div> </div>
@ -20,11 +20,11 @@ class EmbedScriptsController < ActionController::Metal
const DummyForm = class extends DummyBuilder {}; const DummyForm = class extends DummyBuilder {};
if (!window.customElements.get('docuseal-builder')) { if (!window.customElements.get('wabosign-builder')) {
window.customElements.define('docuseal-builder', DummyBuilder); window.customElements.define('docuseal-builder', DummyBuilder);
} }
if (!window.customElements.get('docuseal-form')) { if (!window.customElements.get('wabosign-form')) {
window.customElements.define('docuseal-form', DummyForm); window.customElements.define('docuseal-form', DummyForm);
} }
JAVASCRIPT JAVASCRIPT

@ -6,7 +6,7 @@ class EnquiriesController < ApplicationController
def create def create
if params[:talk_to_sales] == 'on' if params[:talk_to_sales] == 'on'
Faraday.post(Docuseal::ENQUIRIES_URL, Faraday.post(Wabosign::ENQUIRIES_URL,
enquiry_params.merge(type: :talk_to_sales).to_json, enquiry_params.merge(type: :talk_to_sales).to_json,
'Content-Type' => 'application/json') 'Content-Type' => 'application/json')
end end

@ -1,34 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
class ErrorsController < ActionController::Base class ErrorsController < ActionController::Base
ENTERPRISE_FEATURE_MESSAGE =
'This feature is available in Pro Edition: https://www.docuseal.com/pricing'
ENTERPRISE_PATHS = [
'/submissions/html',
'/api/submissions/html',
'/templates/html',
'/api/templates/html',
'/submissions/pdf',
'/api/submissions/pdf',
'/templates/pdf',
'/api/templates/pdf',
'/templates/doc',
'/api/templates/doc',
'/templates/docx',
'/api/templates/docx'
].freeze
SAFE_ERROR_MESSAGE_CLASSES = [ SAFE_ERROR_MESSAGE_CLASSES = [
ActionDispatch::Http::Parameters::ParseError, ActionDispatch::Http::Parameters::ParseError,
JSON::ParserError JSON::ParserError
].freeze ].freeze
def show def show
if request.original_fullpath.in?(ENTERPRISE_PATHS) && error_status_code == 404
return render json: { status: 404, message: ENTERPRISE_FEATURE_MESSAGE }, status: :not_found
end
respond_to do |f| respond_to do |f|
f.json do f.json do
set_cors_headers set_cors_headers

@ -1,7 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
class EsignSettingsController < ApplicationController class EsignSettingsController < ApplicationController
DEFAULT_CERT_NAME = 'DocuSeal Self-Host Autogenerated' DEFAULT_CERT_NAME = 'WaboSign Self-Host Autogenerated'
CertFormRecord = Struct.new(:name, :file, :password) do CertFormRecord = Struct.new(:name, :file, :password) do
include ActiveModel::Validations include ActiveModel::Validations
@ -74,7 +74,7 @@ class EsignSettingsController < ApplicationController
if custom_cert_data if custom_cert_data
custom_cert_data['status'] = 'default' custom_cert_data['status'] = 'default'
elsif params[:name] == Docuseal::AATL_CERT_NAME elsif params[:name] == Wabosign::AATL_CERT_NAME
@encrypted_config.value['custom'] ||= [] @encrypted_config.value['custom'] ||= []
@encrypted_config.value['custom'] << { 'name' => params[:name], 'status' => 'default' } @encrypted_config.value['custom'] << { 'name' => params[:name], 'status' => 'default' }
end end

@ -33,7 +33,7 @@ class McpController < ActionController::API
end end
def verify_mcp_enabled! def verify_mcp_enabled!
return if Docuseal.multitenant? return if Wabosign.multitenant?
return if AccountConfig.exists?(account_id: current_user.account_id, return if AccountConfig.exists?(account_id: current_user.account_id,
key: AccountConfig::ENABLE_MCP_KEY, key: AccountConfig::ENABLE_MCP_KEY,

@ -20,7 +20,7 @@ class MfaSetupController < ApplicationController
redirect_to settings_profile_index_path, notice: I18n.t('2fa_has_been_configured') redirect_to settings_profile_index_path, notice: I18n.t('2fa_has_been_configured')
else else
@provision_url = current_user.otp_provisioning_uri(current_user.email, issuer: Docuseal.product_name) @provision_url = current_user.otp_provisioning_uri(current_user.email, issuer: Wabosign.product_name)
@error_message = I18n.t('code_is_invalid') @error_message = I18n.t('code_is_invalid')
@ -49,6 +49,6 @@ class MfaSetupController < ApplicationController
current_user.save! current_user.save!
@provision_url = current_user.otp_provisioning_uri(current_user.email, issuer: Docuseal.product_name) @provision_url = current_user.otp_provisioning_uri(current_user.email, issuer: Wabosign.product_name)
end end
end end

@ -6,7 +6,7 @@ class NewslettersController < ApplicationController
def show; end def show; end
def update def update
Faraday.post(Docuseal::NEWSLETTER_URL, newsletter_params.to_json, 'Content-Type' => 'application/json') Faraday.post(Wabosign::NEWSLETTER_URL, newsletter_params.to_json, 'Content-Type' => 'application/json')
rescue StandardError => e rescue StandardError => e
Rails.logger.error(e) Rails.logger.error(e)
ensure ensure

@ -13,7 +13,7 @@ class PasswordsController < Devise::PasswordsController
def create def create
super do |resource| super do |resource|
resource.errors.clear unless Docuseal.multitenant? resource.errors.clear unless Wabosign.multitenant?
end end
end end

@ -8,7 +8,7 @@ class PersonalizationSettingsController < ApplicationController
AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY, AccountConfig::SUBMITTER_DOCUMENTS_COPY_EMAIL_KEY,
AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY, AccountConfig::SUBMITTER_COMPLETED_EMAIL_KEY,
AccountConfig::FORM_COMPLETED_MESSAGE_KEY, AccountConfig::FORM_COMPLETED_MESSAGE_KEY,
*(Docuseal.multitenant? ? [] : [AccountConfig::POLICY_LINKS_KEY]) *(Wabosign.multitenant? ? [] : [AccountConfig::POLICY_LINKS_KEY])
].freeze ].freeze
InvalidKey = Class.new(StandardError) InvalidKey = Class.new(StandardError)

@ -9,7 +9,7 @@ class SearchEntriesReindexController < ApplicationController
AccountConfig.find_or_initialize_by(account_id: Account.minimum(:id), key: :fulltext_search) AccountConfig.find_or_initialize_by(account_id: Account.minimum(:id), key: :fulltext_search)
.update!(value: true) .update!(value: true)
Docuseal.instance_variable_set(:@fulltext_search, nil) Wabosign.instance_variable_set(:@fulltext_search, nil)
redirect_back(fallback_location: settings_account_path, redirect_back(fallback_location: settings_account_path,
notice: "Started building search index. Visit #{root_url}jobs/busy to check progress.") notice: "Started building search index. Visit #{root_url}jobs/busy to check progress.")

@ -8,7 +8,7 @@ class SessionsController < Devise::SessionsController
def create def create
email = sign_in_params[:email].to_s.downcase email = sign_in_params[:email].to_s.downcase
if Docuseal.multitenant? && !User.exists?(email:) if Wabosign.multitenant? && !User.exists?(email:)
Rollbar.warning('Sign in new user') if defined?(Rollbar) Rollbar.warning('Sign in new user') if defined?(Rollbar)
return redirect_to new_registration_path(sign_up: true, user: sign_in_params.slice(:email)), return redirect_to new_registration_path(sign_up: true, user: sign_in_params.slice(:email)),
@ -26,7 +26,7 @@ class SessionsController < Devise::SessionsController
def after_sign_in_path_for(...) def after_sign_in_path_for(...)
if params[:redir].present? if params[:redir].present?
return console_redirect_index_path(redir: params[:redir]) if params[:redir].starts_with?(Docuseal::CONSOLE_URL) return console_redirect_index_path(redir: params[:redir]) if params[:redir].starts_with?(Wabosign::CONSOLE_URL)
return params[:redir] return params[:redir]
end end

@ -36,7 +36,7 @@ class SetupController < ApplicationController
@account.encrypted_configs.create!(encrypted_configs) @account.encrypted_configs.create!(encrypted_configs)
@account.account_configs.create!(key: :fulltext_search, value: true) if SearchEntry.table_exists? @account.account_configs.create!(key: :fulltext_search, value: true) if SearchEntry.table_exists?
Docuseal.refresh_default_url_options! Wabosign.refresh_default_url_options!
sign_in(@user) sign_in(@user)

@ -31,7 +31,7 @@ class SubmittersAutocompleteController < ApplicationController
def search_submitters(submitters, field) def search_submitters(submitters, field)
if field if field
if Docuseal.fulltext_search? if Wabosign.fulltext_search?
Submitters.fulltext_search_field(current_user, submitters, params[:q], field) Submitters.fulltext_search_field(current_user, submitters, params[:q], field)
else else
column = Submitter.arel_table[field.to_sym] column = Submitter.arel_table[field.to_sym]

@ -50,7 +50,7 @@ class SubmittersController < ApplicationController
def maybe_resend_email_sms(submitter, params) def maybe_resend_email_sms(submitter, params)
if params[:send_email] == '1' && submitter.email.present? if params[:send_email] == '1' && submitter.email.present?
is_sent_recently = Docuseal.multitenant? && is_sent_recently = Wabosign.multitenant? &&
EmailEvent.exists?(email: submitter.email, EmailEvent.exists?(email: submitter.email,
tag: 'submitter_invitation', tag: 'submitter_invitation',
emailable: submitter, emailable: submitter,

@ -4,7 +4,7 @@ class SubmittersSendEmailController < ApplicationController
load_and_authorize_resource :submitter load_and_authorize_resource :submitter
def create def create
if Docuseal.multitenant? && SubmissionEvent.exists?(submitter: @submitter, if Wabosign.multitenant? && SubmissionEvent.exists?(submitter: @submitter,
event_type: 'send_email', event_type: 'send_email',
created_at: 10.hours.ago..Time.current) created_at: 10.hours.ago..Time.current)
Rollbar.warning("Already sent: #{@submitter.id}") if defined?(Rollbar) Rollbar.warning("Already sent: #{@submitter.id}") if defined?(Rollbar)

@ -49,9 +49,9 @@ class TemplatesDashboardController < ApplicationController
rel = templates.active rel = templates.active
if params[:q].blank? if params[:q].blank?
if Docuseal.multitenant? ? current_account.testing? : current_account.linked_account_account if Wabosign.multitenant? ? current_account.testing? : current_account.linked_account_account
shared_account_ids = [current_user.account_id] shared_account_ids = [current_user.account_id]
shared_account_ids << TemplateSharing::ALL_ID if !Docuseal.multitenant? && !current_account.testing? shared_account_ids << TemplateSharing::ALL_ID if !Wabosign.multitenant? && !current_account.testing?
shared_template_ids = TemplateSharing.where(account_id: shared_account_ids).select(:template_id) shared_template_ids = TemplateSharing.where(account_id: shared_account_ids).select(:template_id)

@ -9,7 +9,7 @@ class TimestampServerController < ApplicationController
TimestampError = Class.new(StandardError) TimestampError = Class.new(StandardError)
def create def create
return head :not_found if Docuseal.multitenant? return head :not_found if Wabosign.multitenant?
test_timeserver_url(@encrypted_config.value) if @encrypted_config.value.present? test_timeserver_url(@encrypted_config.value) if @encrypted_config.value.present?

@ -64,7 +64,7 @@ class UsersController < ApplicationController
end end
def update def update
return redirect_to settings_users_path, notice: I18n.t('unable_to_update_user') if Docuseal.demo? return redirect_to settings_users_path, notice: I18n.t('unable_to_update_user') if Wabosign.demo?
attrs = user_params.compact_blank attrs = user_params.compact_blank
attrs = attrs.merge(user_params.slice(:archived_at)) if current_ability.can?(:create, @user) attrs = attrs.merge(user_params.slice(:archived_at)) if current_ability.can?(:create, @user)
@ -92,7 +92,7 @@ class UsersController < ApplicationController
end end
def destroy def destroy
if Docuseal.demo? || @user.id == current_user.id if Wabosign.demo? || @user.id == current_user.id
return redirect_to settings_users_path, notice: I18n.t('unable_to_remove_user') return redirect_to settings_users_path, notice: I18n.t('unable_to_remove_user')
end end

@ -77,17 +77,17 @@
<a <a
v-if="isDemo" v-if="isDemo"
target="_blank" target="_blank"
href="https://github.com/docusealco/docuseal" :href="githubUrl"
class="white-button flex items-center space-x-1 w-full" class="white-button flex items-center space-x-1 w-full"
> >
<IconBrandGithub /> <IconBrandGithub />
<span> <span>
Star on Github {{ t('view_on_github') }}
</span> </span>
</a> </a>
<a <a
v-if="isDemo" v-if="isDemo"
href="https://docuseal.com/sign_up" :href="productUrl"
class="white-button flex items-center space-x-1 w-full" class="white-button flex items-center space-x-1 w-full"
> >
<IconLogin /> <IconLogin />
@ -98,14 +98,20 @@
</div> </div>
<div <div
v-if="attribution" v-if="attribution"
class="text-center mt-4" class="text-center mt-4 text-sm"
> >
{{ t('powered_by') }} {{ t('powered_by') }}
<a <a
href="https://www.docuseal.com/start" :href="productUrl"
target="_blank" target="_blank"
class="underline" class="underline"
>DocuSeal</a> - {{ t('open_source_documents_software') }} >{{ productName }}</a>
&mdash; {{ t('based_on') }}
<a
href="https://github.com/docusealco/docuseal"
target="_blank"
class="underline"
>DocuSeal</a> (AGPLv3)
</div> </div>
</div> </div>
</template> </template>
@ -142,6 +148,21 @@ export default {
required: false, required: false,
default: true default: true
}, },
productName: {
type: String,
required: false,
default: 'WaboSign'
},
productUrl: {
type: String,
required: false,
default: 'https://sign.wabo.cc'
},
githubUrl: {
type: String,
required: false,
default: 'https://github.com/wabolabs/wabosign'
},
hasSignatureFields: { hasSignatureFields: {
type: Boolean, type: Boolean,
required: false, required: false,

@ -320,7 +320,7 @@
class="text-base-content/60 text-xs text-center w-full mt-1 select-none" class="text-base-content/60 text-xs text-center w-full mt-1 select-none"
> >
{{ 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.com/esign-disclosure" :href="esignDisclosureUrl || 'https://www.docuseal.com/esign-disclosure'"
target="_blank" target="_blank"
> >
<span class="inline md:hidden"> <span class="inline md:hidden">
@ -400,6 +400,11 @@ export default {
required: false, required: false,
default: false default: false
}, },
esignDisclosureUrl: {
type: String,
required: false,
default: ''
},
withQrButton: { withQrButton: {
type: Boolean, type: Boolean,
required: false, required: false,

@ -124,7 +124,7 @@ export default {
docId: this.eidEasyData.doc_id, docId: this.eidEasyData.doc_id,
language: this.locale, language: this.locale,
countryCode: this.countryCode, countryCode: this.countryCode,
sandbox: ['demo.docuseal.tech'].includes(location.host), sandbox: false,
enabledMethods: { enabledMethods: {
signature: this.eidEasyData.available_methods signature: this.eidEasyData.available_methods
}, },

@ -314,7 +314,7 @@ export default {
return this.buildDefaultName(this.field) return this.buildDefaultName(this.field)
}, },
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
} }
}, },
methods: { methods: {

@ -634,7 +634,7 @@
</div> </div>
</Transition> </Transition>
<div <div
id="docuseal_modal_container" id="wabosign_modal_container"
class="modal-container" class="modal-container"
> >
<RevisionsModal <RevisionsModal
@ -2216,7 +2216,7 @@ export default {
delete clipboardData.field.submitter_uuid delete clipboardData.field.submitter_uuid
try { try {
localStorage.setItem('docuseal_clipboard', JSON.stringify(clipboardData)) localStorage.setItem('wabosign_clipboard', JSON.stringify(clipboardData))
} catch (e) { } catch (e) {
console.error('Failed to save clipboard:', e) console.error('Failed to save clipboard:', e)
} }
@ -2254,20 +2254,20 @@ export default {
} }
try { try {
localStorage.setItem('docuseal_clipboard', JSON.stringify(clipboardData)) localStorage.setItem('wabosign_clipboard', JSON.stringify(clipboardData))
} catch (e) { } catch (e) {
console.error('Failed to save clipboard:', e) console.error('Failed to save clipboard:', e)
} }
}, },
pasteField (targetPosition = null) { pasteField (targetPosition = null) {
const clipboard = localStorage.getItem('docuseal_clipboard') const clipboard = localStorage.getItem('wabosign_clipboard')
if (!clipboard) return if (!clipboard) return
const data = JSON.parse(clipboard) const data = JSON.parse(clipboard)
if (Date.now() - data.timestamp >= 3600000) { if (Date.now() - data.timestamp >= 3600000) {
localStorage.removeItem('docuseal_clipboard') localStorage.removeItem('wabosign_clipboard')
return return
} }
@ -2420,7 +2420,7 @@ export default {
}, },
hasClipboardData () { hasClipboardData () {
try { try {
const clipboard = localStorage.getItem('docuseal_clipboard') const clipboard = localStorage.getItem('wabosign_clipboard')
if (clipboard) { if (clipboard) {
const data = JSON.parse(clipboard) const data = JSON.parse(clipboard)

@ -18,16 +18,6 @@
>&times;</a> >&times;</a>
</div> </div>
<div> <div>
<div
v-if="!withConditions"
class="bg-base-300 rounded-xl py-2 px-3 text-center"
>
<a
href="https://www.docuseal.com/pricing"
target="_blank"
class="link"
>{{ t('available_in_pro') }}</a>
</div>
<form @submit.prevent="validateSaveAndClose"> <form @submit.prevent="validateSaveAndClose">
<div class="my-4"> <div class="my-4">
<div <div

@ -218,7 +218,7 @@ export default {
return ['', null, 'transparent'].includes(this.backgroundColor) ? 'white' : this.backgroundColor return ['', null, 'transparent'].includes(this.backgroundColor) ? 'white' : this.backgroundColor
}, },
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
} }
}, },
created () { created () {

@ -414,7 +414,7 @@ export default {
}) })
}, },
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
}, },
defaultName () { defaultName () {
return this.buildDefaultName(this.field) return this.buildDefaultName(this.field)
@ -588,7 +588,7 @@ export default {
hiddenEl.style.opacity = '0' hiddenEl.style.opacity = '0'
hiddenEl.style.position = 'fixed' hiddenEl.style.position = 'fixed'
root.querySelector('#docuseal_modal_container')?.appendChild(hiddenEl) root.querySelector('#wabosign_modal_container')?.appendChild(hiddenEl)
event.dataTransfer?.setDragImage(hiddenEl, 0, 0) event.dataTransfer?.setDragImage(hiddenEl, 0, 0)
setTimeout(() => { hiddenEl.remove() }, 1000) setTimeout(() => { hiddenEl.remove() }, 1000)

@ -585,7 +585,7 @@ export default {
prefillableFieldTypes: FieldSettings.computed.prefillableFieldTypes, prefillableFieldTypes: FieldSettings.computed.prefillableFieldTypes,
verificationMethods: FieldSettings.computed.verificationMethods, verificationMethods: FieldSettings.computed.verificationMethods,
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
}, },
modalFieldName () { modalFieldName () {
return (this.defaultField ? (this.defaultField.title || this.field.title || this.field.name) : this.field.name) || this.buildDefaultName(this.field) return (this.defaultField ? (this.defaultField.title || this.field.title || this.field.name) : this.field.name) || this.buildDefaultName(this.field)

@ -270,59 +270,6 @@
</span> </span>
</div> </div>
</button> </button>
<div
v-else-if="type == 'phone' && (fieldTypes.length === 0 || fieldTypes.includes(type))"
class="tooltip tooltip-bottom flex"
:class="{'tooltip-bottom-end': withPayment, 'tooltip-bottom': !withPayment }"
:data-tip="t('unlock_sms_verified_phone_number_field_with_paid_plan_use_text_field_for_phone_numbers_without_verification')"
>
<a
href="https://www.docuseal.com/pricing"
target="_blank"
class="opacity-50 flex items-center justify-center border border-dashed border-base-300 w-full rounded relative fields-grid-item"
:style="{ backgroundColor }"
>
<div class="w-0 absolute left-0">
<IconLock
width="18"
height="18"
stroke-width="1.5"
/>
</div>
<div class="flex items-center flex-col px-2 py-2">
<component :is="icon" />
<span class="text-xs mt-1">
{{ fieldNames[type] }}
</span>
</div>
</a>
</div>
<div
v-else-if="withVerification === false && type == 'verification' && (fieldTypes.length === 0 || fieldTypes.includes(type))"
class="tooltip tooltip-bottom flex tooltip-bottom-start"
:data-tip="t('obtain_qualified_electronic_signature_with_the_trusted_provider_click_to_learn_more')"
>
<a
href="https://www.docuseal.com/qualified-electronic-signature"
target="_blank"
class="opacity-50 flex items-center justify-center border border-dashed border-base-300 w-full rounded relative fields-grid-item"
:style="{ backgroundColor }"
>
<div class="w-0 absolute left-0">
<IconLock
width="18"
height="18"
stroke-width="1.5"
/>
</div>
<div class="flex items-center flex-col px-2 py-2">
<component :is="icon" />
<span class="text-xs mt-1">
{{ fieldNames[type] }}
</span>
</div>
</a>
</div>
</template> </template>
</div> </div>
<div <div
@ -616,7 +563,7 @@ export default {
}, },
mounted () { mounted () {
try { try {
this.showCustomTab = localStorage.getItem('docuseal_builder_tab') === 'custom' this.showCustomTab = localStorage.getItem('wabosign_builder_tab') === 'custom'
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
@ -672,7 +619,7 @@ export default {
}, },
setFieldsTab (type) { setFieldsTab (type) {
try { try {
localStorage.setItem('docuseal_builder_tab', type) localStorage.setItem('wabosign_builder_tab', type)
} catch (e) { } catch (e) {
console.error(e) console.error(e)
} }
@ -864,7 +811,7 @@ export default {
hiddenEl.style.opacity = '0' hiddenEl.style.opacity = '0'
hiddenEl.style.position = 'fixed' hiddenEl.style.position = 'fixed'
root.querySelector('#docuseal_modal_container').appendChild(hiddenEl) root.querySelector('#wabosign_modal_container').appendChild(hiddenEl)
event.dataTransfer.setDragImage(hiddenEl, 0, 0) event.dataTransfer.setDragImage(hiddenEl, 0, 0)

@ -18,16 +18,6 @@
>&times;</a> >&times;</a>
</div> </div>
<div> <div>
<div
v-if="!withFormula"
class="bg-base-300 rounded-xl py-2 px-3 text-center"
>
<a
href="https://www.docuseal.com/pricing"
target="_blank"
class="link"
>{{ t('available_in_pro') }}</a>
</div>
<div class="flex flex-wrap mb-2 gap-y-1 pt-1"> <div class="flex flex-wrap mb-2 gap-y-1 pt-1">
<button <button
v-for="f in fields" v-for="f in fields"

@ -85,7 +85,7 @@ export default {
}, },
hasClipboardData () { hasClipboardData () {
try { try {
const clipboard = localStorage.getItem('docuseal_clipboard') const clipboard = localStorage.getItem('wabosign_clipboard')
if (clipboard) { if (clipboard) {
const data = JSON.parse(clipboard) const data = JSON.parse(clipboard)

@ -194,13 +194,6 @@
</span> </span>
</button> </button>
</form> </form>
<a
v-if="!isConnected"
class="block link text-center mt-1"
href="https://www.docuseal.com/blog/accept-payments-and-request-signatures-with-ease"
target="_blank"
data-turbo="false"
>{{ t('learn_more') }}</a>
</div> </div>
<li <li
class="field-settings-formula mb-1" class="field-settings-formula mb-1"

@ -262,7 +262,7 @@ export default {
return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))[0] return [...this.document.preview_images].sort((a, b) => parseInt(a.filename) - parseInt(b.filename))[0]
}, },
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
} }
}, },
methods: { methods: {

@ -185,7 +185,7 @@ export default {
}, },
computed: { computed: {
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
}, },
selectedFields () { selectedFields () {
return this.selectedAreasRef.value.map((area) => { return this.selectedAreasRef.value.map((area) => {

@ -238,7 +238,7 @@ export default {
return `/auth/google_oauth2?${query}` return `/auth/google_oauth2?${query}`
}, },
modalContainerEl () { modalContainerEl () {
return this.$el.getRootNode().querySelector('#docuseal_modal_container') return this.$el.getRootNode().querySelector('#wabosign_modal_container')
} }
}, },
mounted () { mounted () {

@ -1,5 +1,5 @@
# frozen_string_literal: true # frozen_string_literal: true
class ApplicationJob < ActiveJob::Base class ApplicationJob < ActiveJob::Base
retry_on StandardError, wait: 6.seconds, attempts: 5 unless Docuseal.multitenant? retry_on StandardError, wait: 6.seconds, attempts: 5 unless Wabosign.multitenant?
end end

@ -22,7 +22,7 @@ class SendFormCompletedWebhookRequestJob
Submissions::EnsureResultGenerated.call(submitter) Submissions::EnsureResultGenerated.call(submitter)
ActiveStorage::Current.url_options = Docuseal.default_url_options ActiveStorage::Current.url_options = Wabosign.default_url_options
resp = SendWebhookRequest.call(webhook_url, event_type: 'form.completed', resp = SendWebhookRequest.call(webhook_url, event_type: 'form.completed',
event_uuid: params['event_uuid'], event_uuid: params['event_uuid'],

@ -20,7 +20,7 @@ class SendFormDeclinedWebhookRequestJob
return if webhook_url.url.blank? || webhook_url.events.exclude?('form.declined') return if webhook_url.url.blank? || webhook_url.events.exclude?('form.declined')
ActiveStorage::Current.url_options = Docuseal.default_url_options ActiveStorage::Current.url_options = Wabosign.default_url_options
resp = SendWebhookRequest.call(webhook_url, event_type: 'form.declined', resp = SendWebhookRequest.call(webhook_url, event_type: 'form.declined',
event_uuid: params['event_uuid'], event_uuid: params['event_uuid'],

@ -20,7 +20,7 @@ class SendFormStartedWebhookRequestJob
return if webhook_url.url.blank? || webhook_url.events.exclude?('form.started') return if webhook_url.url.blank? || webhook_url.events.exclude?('form.started')
ActiveStorage::Current.url_options = Docuseal.default_url_options ActiveStorage::Current.url_options = Wabosign.default_url_options
resp = SendWebhookRequest.call(webhook_url, event_type: 'form.started', resp = SendWebhookRequest.call(webhook_url, event_type: 'form.started',
event_uuid: params['event_uuid'], event_uuid: params['event_uuid'],

@ -20,7 +20,7 @@ class SendFormViewedWebhookRequestJob
return if webhook_url.url.blank? || webhook_url.events.exclude?('form.viewed') return if webhook_url.url.blank? || webhook_url.events.exclude?('form.viewed')
ActiveStorage::Current.url_options = Docuseal.default_url_options ActiveStorage::Current.url_options = Wabosign.default_url_options
resp = SendWebhookRequest.call(webhook_url, event_type: 'form.viewed', resp = SendWebhookRequest.call(webhook_url, event_type: 'form.viewed',
event_uuid: params['event_uuid'], event_uuid: params['event_uuid'],

@ -5,7 +5,7 @@ class SendTestWebhookRequestJob
sidekiq_options retry: 0 sidekiq_options retry: 0
USER_AGENT = 'DocuSeal.com Webhook' USER_AGENT = 'WaboSign Webhook'
HttpsError = Class.new(StandardError) HttpsError = Class.new(StandardError)
LocalhostError = Class.new(StandardError) LocalhostError = Class.new(StandardError)
@ -19,7 +19,7 @@ class SendTestWebhookRequestJob
return unless webhook_url return unless webhook_url
if Docuseal.multitenant? if Wabosign.multitenant?
uri = begin uri = begin
URI(webhook_url.url) URI(webhook_url.url)
rescue URI::Error rescue URI::Error

@ -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.com>' default from: "#{Wabosign.product_name} <#{Wabosign::SUPPORT_EMAIL}>"
layout 'mailer' layout 'mailer'
register_interceptor ActionMailerConfigsInterceptor register_interceptor ActionMailerConfigsInterceptor
@ -11,14 +11,14 @@ class ApplicationMailer < ActionMailer::Base
register_observer ActionMailerEventsObserver register_observer ActionMailerEventsObserver
before_action do before_action do
ActiveStorage::Current.url_options = Docuseal.default_url_options ActiveStorage::Current.url_options = Wabosign.default_url_options
end end
after_action :set_message_metadata after_action :set_message_metadata
after_action :set_message_uuid after_action :set_message_uuid
def default_url_options def default_url_options
Docuseal.default_url_options.merge(host: ENV.fetch('EMAIL_HOST', Docuseal.default_url_options[:host])) Wabosign.default_url_options.merge(host: ENV.fetch('EMAIL_HOST', Wabosign.default_url_options[:host]))
end end
def set_message_metadata def set_message_metadata

@ -263,7 +263,7 @@ class SubmitterMailer < ApplicationMailer
end end
def maybe_set_custom_domain(submitter) def maybe_set_custom_domain(submitter)
if Docuseal.multitenant? && (config = AccountConfig.find_by(account_id: submitter.account_id, key: :custom_domain)) if Wabosign.multitenant? && (config = AccountConfig.find_by(account_id: submitter.account_id, key: :custom_domain))
@custom_domain = config.value @custom_domain = config.value
end end
end end

@ -10,7 +10,7 @@ class UserMailer < ApplicationMailer
I18n.with_locale(@current_account.locale) do I18n.with_locale(@current_account.locale) do
mail(to: @user.friendly_name, mail(to: @user.friendly_name,
subject: I18n.t('you_are_invited_to_product_name', product_name: Docuseal.product_name)) subject: I18n.t('you_are_invited_to_product_name', product_name: Wabosign.product_name))
end end
end end
end end

@ -59,7 +59,7 @@ class Submitter < ApplicationRecord
has_many_attached :attachments has_many_attached :attachments
has_many_attached :preview_documents has_many_attached :preview_documents
has_many :template_accesses, through: :submission has_many :template_accesses, through: :submission
has_many :email_events, as: :emailable, dependent: (Docuseal.multitenant? ? nil : :destroy) has_many :email_events, as: :emailable, dependent: (Wabosign.multitenant? ? nil : :destroy)
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
@ -68,7 +68,7 @@ class Submitter < ApplicationRecord
scope :completed, -> { where.not(completed_at: nil) } scope :completed, -> { where.not(completed_at: nil) }
after_destroy :anonymize_email_events, if: -> { Docuseal.multitenant? } after_destroy :anonymize_email_events, if: -> { Wabosign.multitenant? }
def status def status
if declined_at? if declined_at?

@ -27,7 +27,7 @@
</div> </div>
<% end %> <% end %>
<% encrypted_config = @encrypted_config || EncryptedConfig.find_or_initialize_by(account: current_account, key: EncryptedConfig::APP_URL_KEY) %> <% encrypted_config = @encrypted_config || EncryptedConfig.find_or_initialize_by(account: current_account, key: EncryptedConfig::APP_URL_KEY) %>
<% if !Docuseal.multitenant? && can?(:manage, encrypted_config) && !current_account.testing? && ENV['APP_URL'].blank? %> <% if !Wabosign.multitenant? && can?(:manage, encrypted_config) && !current_account.testing? && ENV['APP_URL'].blank? %>
<%= fields_for encrypted_config do |ff| %> <%= fields_for encrypted_config do |ff| %>
<div class="form-control"> <div class="form-control">
<%= ff.label :value, t('app_url'), class: 'label' %> <%= ff.label :value, t('app_url'), class: 'label' %>
@ -70,7 +70,7 @@
<div class="flex items-center justify-between gap-4 py-2.5"> <div class="flex items-center justify-between gap-4 py-2.5">
<div class="flex items-center space-x-1"> <div class="flex items-center space-x-1">
<span class="text-left"><%= t('add_signature_id_to_the_documents') %></span> <span class="text-left"><%= t('add_signature_id_to_the_documents') %></span>
<span class="tooltip tooltip-top flex cursor-pointer" data-tip="<%= t('add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_docuseals_21_cfr_part_11_compliance_settings') %>"> <span class="tooltip tooltip-top flex cursor-pointer" data-tip="<%= t('add_a_unique_signature_id_and_timestamp_to_each_signature_for_audit_and_traceability_purposes_along_with_the_timestamp_part_of_wabosigns_21_cfr_part_11_compliance_settings') %>">
<%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %>
</span> </span>
</div> </div>
@ -87,7 +87,7 @@
<div class="flex items-center justify-between gap-4 py-2.5"> <div class="flex items-center justify-between gap-4 py-2.5">
<div class="flex items-center space-x-1"> <div class="flex items-center space-x-1">
<span class="text-left"><%= t('require_signing_reason') %></span> <span class="text-left"><%= t('require_signing_reason') %></span>
<span class="tooltip tooltip-top flex cursor-pointer" data-tip="<%= t('require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_docuseals_21_cfr_part_11_compliance_settings') %>"> <span class="tooltip tooltip-top flex cursor-pointer" data-tip="<%= t('require_signer_to_provide_a_reason_for_signing_before_completing_their_signature_e_g_approvals_certifications_part_of_wabosigns_21_cfr_part_11_compliance_settings') %>">
<%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %>
</span> </span>
</div> </div>
@ -142,15 +142,9 @@
<%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %>
</span> </span>
</div> </div>
<% if !Docuseal.multitenant? || can?(:manage, :disable_decline) %> <submit-form data-on="change" class="flex">
<submit-form data-on="change" class="flex"> <%= f.check_box :value, class: 'toggle', checked: account_config.value != false %>
<%= f.check_box :value, class: 'toggle', checked: account_config.value != false %> </submit-form>
</submit-form>
<% else %>
<a href="<%= console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") %>" data-turbo="false" data-tip="<%= I18n.t('unlock_with_docuseal_pro') %>" data-on="change" class="flex tooltip">
<%= f.check_box :value, class: 'toggle pointer-events-none', checked: account_config.value != false, disabled: true %>
</a>
<% end %>
</div> </div>
<% end %> <% end %>
<% end %> <% end %>
@ -165,15 +159,9 @@
<%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %> <%= svg_icon('info_circle', class: 'hidden md:inline-block w-4 h-4 shrink-0') %>
</span> </span>
</div> </div>
<% if !Docuseal.multitenant? || can?(:manage, :delegate_form) %> <submit-form data-on="change" class="flex">
<submit-form data-on="change" class="flex"> <%= f.check_box :value, class: 'toggle', checked: account_config.value == true %>
<%= f.check_box :value, class: 'toggle', checked: account_config.value == true %> </submit-form>
</submit-form>
<% else %>
<a href="<%= console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") %>" data-turbo="false" data-tip="<%= I18n.t('unlock_with_docuseal_pro') %>" class="flex tooltip">
<%= f.check_box :value, class: 'toggle pointer-events-none', checked: account_config.value == true, disabled: true %>
</a>
<% end %>
</div> </div>
<% end %> <% end %>
<% end %> <% end %>
@ -245,7 +233,7 @@
</div> </div>
<% end %> <% end %>
<% end %> <% end %>
<% if !Docuseal.multitenant? || can?(:manage, :personalization_advanced) %> <% if true # personalization_advanced gate removed in fork %>
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ENFORCE_SIGNING_ORDER_KEY) %> <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::ENFORCE_SIGNING_ORDER_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| %>
@ -264,7 +252,7 @@
<% end %> <% end %>
<% end %> <% end %>
<% end %> <% end %>
<% if !Docuseal.multitenant? || can?(:manage, :personalization_advanced) %> <% if true # personalization_advanced gate removed in fork %>
<% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::WITH_FILE_LINKS_KEY) %> <% account_config = AccountConfig.find_or_initialize_by(account: current_account, key: AccountConfig::WITH_FILE_LINKS_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| %>
@ -281,7 +269,7 @@
<% end %> <% end %>
<% end %> <% end %>
<%= render 'extra_preferences' %> <%= render 'extra_preferences' %>
<% if !Docuseal.multitenant? && SearchEntry.table_exists? && (!Docuseal.fulltext_search? || params[:reindex] == 'true') && can?(:manage, EncryptedConfig) %> <% if !Wabosign.multitenant? && SearchEntry.table_exists? && (!Wabosign.fulltext_search? || params[:reindex] == 'true') && can?(:manage, EncryptedConfig) %>
<div class="flex items-center justify-between gap-4 py-2.5"> <div class="flex items-center justify-between gap-4 py-2.5">
<span> <span>
<%= t('efficient_search_with_search_index') %> <%= t('efficient_search_with_search_index') %>
@ -293,7 +281,7 @@
<% end %> <% end %>
<%= render 'compliances' %> <%= render 'compliances' %>
<%= render 'integrations' %> <%= render 'integrations' %>
<% if can?(:manage, current_account) && Docuseal.multitenant? && true_user == current_user %> <% if can?(:manage, current_account) && Wabosign.multitenant? && true_user == current_user %>
<div class="px-1 mt-8"> <div class="px-1 mt-8">
<h2 class="text-2xl font-bold mb-2"> <h2 class="text-2xl font-bold mb-2">
<%= t('danger_zone') %> <%= t('danger_zone') %>

@ -118,7 +118,7 @@
</div> </div>
</div> </div>
<div class="text-center"> <div class="text-center">
<%= link_to t('open_full_api_reference'), "#{Docuseal::PRODUCT_URL}/docs/api", class: 'btn btn-warning text-base mt-4 px-8', target: '_blank', rel: 'noopener' %> <%= link_to t('open_full_api_reference'), "#{Wabosign::PRODUCT_URL}/docs/api", class: 'btn btn-warning text-base mt-4 px-8', target: '_blank', rel: 'noopener' %>
</div> </div>
</div> </div>
</div> </div>

@ -5,6 +5,6 @@
<p><%= t('if_you_didnt_request_this_you_can_ignore_this_email') %></p> <p><%= t('if_you_didnt_request_this_you_can_ignore_this_email') %></p>
<p> <p>
<%= t('thanks') %>,<br> <%= t('thanks') %>,<br>
<%= Docuseal.product_name %> <%= Wabosign.product_name %>
</p> </p>
<% content_for(:remove_attribution, true) %> <% content_for(:remove_attribution, true) %>

@ -1,6 +1,6 @@
<%= content_for(:canonical_url, new_user_session_url) %> <%= content_for(:canonical_url, new_user_session_url) %>
<div class="max-w-lg mx-auto px-2"> <div class="max-w-lg mx-auto px-2">
<%= render 'devise/shared/select_server' if Docuseal.multitenant? %> <%= render 'devise/shared/select_server' if Wabosign.multitenant? %>
<h1 class="text-4xl font-bold text-center mt-8"><%= t('sign_in') %></h1> <h1 class="text-4xl font-bold text-center mt-8"><%= t('sign_in') %></h1>
<%= form_for(resource, as: resource_name, html: { class: 'space-y-6' }, data: { turbo: params[:redir].blank? }, url: session_path(resource_name)) do |f| %> <%= form_for(resource, as: resource_name, html: { class: 'space-y-6' }, data: { turbo: params[:redir].blank? }, url: session_path(resource_name)) do |f| %>
<%= render 'hidden_fields' %> <%= render 'hidden_fields' %>

@ -35,7 +35,7 @@
<%= ff.select :authentication, options_for_select([%w[Plain plain], %w[Login login], %w[CRAM-MD5 cram_md5]], value.fetch('authentication', 'plain')), { prompt: true }, required: true, class: 'base-select' %> <%= ff.select :authentication, options_for_select([%w[Plain plain], %w[Login login], %w[CRAM-MD5 cram_md5]], value.fetch('authentication', 'plain')), { prompt: true }, required: true, class: 'base-select' %>
</div> </div>
</div> </div>
<% if !Docuseal.multitenant? || can?(:manage, :personalization_advanced) %> <% if !Wabosign.multitenant? || can?(:manage, :personalization_advanced) %>
<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">
@ -50,7 +50,7 @@
<% end %> <% end %>
<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: !Docuseal.multitenant?, class: 'base-input' %> <%= ff.email_field :from_email, value: value['from_email'], required: !Wabosign.multitenant?, class: 'base-input' %>
</div> </div>
<% end %> <% end %>
<div class="form-control pt-2"> <div class="form-control pt-2">

@ -1,25 +0,0 @@
<tr scope="row" class="group">
<td class="flex items-center space-x-1">
<%= svg_icon('discount_check_filled', class: 'w-6 h-6 text-green-500') %>
<span class="flex items-center">
<%= t('docuseal_trusted_signature') %>
<div class="tooltip ml-1" data-tip="<%= t('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') %>">
<%= svg_icon('circle_question', class: 'w-4 h-4 stroke-1') %>
</div>
</span>
</td>
<td>
<a href="<%= "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" class="btn btn-neutral btn-sm text-white">
<%= t('unlock_with_docuseal_pro') %>
</a>
</td>
<td>
<div class="tooltip" data-tip="<%= t('unlock_with_docuseal_pro') %>">
<%= button_to settings_esign_path, method: :put, params: { name: Docuseal::AATL_CERT_NAME }, class: 'btn btn-outline btn-neutral btn-xs whitespace-nowrap', title: t('make_default'), disabled: true do %>
<%= t('make_default') %>
<% end %>
</div>
</td>
<td>
</td>
</tr>

@ -99,14 +99,11 @@
</td> </td>
</tr> </tr>
<% end %> <% end %>
<% unless Docuseal.multitenant? %>
<%= render 'default_signature_row' %>
<% end %>
</tbody> </tbody>
</table> </table>
</div> </div>
<% encrypted_config = EncryptedConfig.find_or_initialize_by(account: current_account, key: EncryptedConfig::TIMESTAMP_SERVER_URL_KEY) %> <% encrypted_config = EncryptedConfig.find_or_initialize_by(account: current_account, key: EncryptedConfig::TIMESTAMP_SERVER_URL_KEY) %>
<% if !Docuseal.multitenant? && can?(:manage, encrypted_config) %> <% if can?(:manage, encrypted_config) %>
<div class="flex-grow max-w-xl"> <div class="flex-grow max-w-xl">
<div class="flex justify-between items-end mb-4 mt-8"> <div class="flex justify-between items-end mb-4 mt-8">
<h2 class="text-3xl font-bold"> <h2 class="text-3xl font-bold">

@ -1,7 +1,7 @@
<div class="max-w-xl mx-auto px-2"> <div class="max-w-xl mx-auto px-2">
<h1 class="flex text-4xl font-bold items-center justify-center my-8 space-x-2"> <h1 class="flex text-4xl font-bold items-center justify-center my-8 space-x-2">
<%= svg_icon('waving_hand', class: 'h-10 w-10') %> <%= svg_icon('waving_hand', class: 'h-10 w-10') %>
<span><%= t('welcome_to_product_name', product_name: Docuseal.product_name) %></span> <span><%= t('welcome_to_product_name', product_name: Wabosign.product_name) %></span>
</h1> </h1>
<%= form_for(resource, as: resource_name, url: invitation_path, html: { method: :put, class: 'space-y-6' }) do |f| %> <%= form_for(resource, as: resource_name, url: invitation_path, html: { method: :put, class: 'space-y-6' }) do |f| %>
<div class="space-y-2"> <div class="space-y-2">

@ -1,4 +1,4 @@
<title> <title>
<%= content_for(:html_title) || (signed_in? ? 'DocuSeal' : 'DocuSeal | Open Source Document Signing') %> <%= content_for(:html_title) || (signed_in? ? Wabosign.product_name : "#{Wabosign.product_name} | Open Source Document Signing") %>
</title> </title>
<%= render 'shared/meta' %> <%= render 'shared/meta' %>

@ -1,8 +1,8 @@
<!DOCTYPE html> <!DOCTYPE html>
<html data-theme="docuseal" lang="<%= I18n.locale %>"> <html data-theme="wabosign" lang="<%= I18n.locale %>">
<head> <head>
<%= render 'layouts/head_tags' %> <%= render 'layouts/head_tags' %>
<% if Docuseal.enable_pwa? %> <% if Wabosign.enable_pwa? %>
<link rel="manifest" href="/manifest.json"> <link rel="manifest" href="/manifest.json">
<% end %> <% end %>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html data-theme="docuseal" lang="<%= I18n.locale %>"> <html data-theme="wabosign" lang="<%= I18n.locale %>">
<head> <head>
<%= render 'layouts/head_tags' %> <%= render 'layouts/head_tags' %>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

@ -1,5 +1,5 @@
<!DOCTYPE html> <!DOCTYPE html>
<html data-theme="docuseal" lang="<%= I18n.locale %>"> <html data-theme="wabosign" lang="<%= I18n.locale %>">
<head> <head>
<%= render 'layouts/head_tags' %> <%= render 'layouts/head_tags' %>
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

@ -33,10 +33,10 @@
</p> </p>
<div class="card bg-base-200"> <div class="card bg-base-200">
<div class="card-body p-6"> <div class="card-body p-6">
<p class="text-2xl font-semibold"><%= t('connect_to_docuseal_mcp') %></p> <p class="text-2xl font-semibold"><%= t('connect_to_wabosign_mcp') %></p>
<p class="text-lg"><%= t('add_the_following_to_your_mcp_client_configuration') %>:</p> <p class="text-lg"><%= t('add_the_following_to_your_mcp_client_configuration') %>:</p>
<div class="mockup-code overflow-hidden"> <div class="mockup-code overflow-hidden">
<% text = JSON.pretty_generate({ mcpServers: { docuseal: { type: 'http', url: "#{root_url(Docuseal.default_url_options)}mcp", headers: { Authorization: "Bearer #{@mcp_token.token}" } } } }).strip %> <% text = JSON.pretty_generate({ mcpServers: { wabosign: { type: 'http', url: "#{root_url(Wabosign.default_url_options)}mcp", headers: { Authorization: "Bearer #{@mcp_token.token}" } } } }).strip %>
<span class="top-0 right-0 absolute"> <span class="top-0 right-0 absolute">
<%= render 'shared/clipboard_copy', icon: 'copy', text:, class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %> <%= render 'shared/clipboard_copy', icon: 'copy', text:, class: 'btn btn-ghost text-white', icon_class: 'w-6 h-6 text-white', copy_title: t('copy'), copied_title: t('copied') %>
</span> </span>

@ -1 +0,0 @@
<%= render 'reminder_placeholder' %>

@ -2,7 +2,7 @@
<%= f.hidden_field :key %> <%= f.hidden_field :key %>
<div class="form-control"> <div class="form-control">
<% record = Struct.new(:first_duration, :second_duration, :third_duration).new(*(f.object.value || {}).values_at('first_duration', 'second_duration', 'third_duration')) %> <% record = Struct.new(:first_duration, :second_duration, :third_duration).new(*(f.object.value || {}).values_at('first_duration', 'second_duration', 'third_duration')) %>
<% durations = (Docuseal.multitenant? ? AccountConfigs::REMINDER_DURATIONS.except('one_hour', 'two_hours') : AccountConfigs::REMINDER_DURATIONS).keys.map { |v| [t(v.underscore), v] } %> <% durations = AccountConfigs::REMINDER_DURATIONS.keys.map { |v| [t(v.underscore), v] } %>
<div class="flex flex-col md:flex-row gap-2"> <div class="flex flex-col md:flex-row gap-2">
<div class="w-full"> <div class="w-full">
<%= f.fields_for :value, record do |ff| %> <%= f.fields_for :value, record do |ff| %>

@ -1,15 +0,0 @@
<div class="alert my-4">
<%= svg_icon('info_circle', class: 'w-6 h-6') %>
<div>
<p class="font-bold">
<%= t('unlock_with_docuseal_pro') %>
</p>
<p>
<%= t('send_automatic_email_reminders_to_your_recipients') %>
<br>
<a class="link font-medium" target="_blank" href="<%= Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" data-turbo="false">
<%= t('learn_more') %>
</a>
</p>
</div>
</div>

@ -26,7 +26,6 @@
<%= t('sign_request_email_reminders') %> <%= t('sign_request_email_reminders') %>
</h2> </h2>
</div> </div>
<%= render 'reminder_banner' %>
<%= render 'reminder_form', config: @reminder_config %> <%= render 'reminder_form', config: @reminder_config %>
</div> </div>
<div class="w-0 md:w-52"></div> <div class="w-0 md:w-52"></div>

@ -5,11 +5,11 @@
<div class="relative flex flex-col items-center"> <div class="relative flex flex-col items-center">
<%= render 'shared/logo', width: '100', height: '100' %> <%= render 'shared/logo', width: '100', height: '100' %>
<h1 class="text-6xl font-bold mt-4 mb-4"> <h1 class="text-6xl font-bold mt-4 mb-4">
DocuSeal <%= Wabosign.product_name %>
</h1> </h1>
<% if Docuseal.version.present? %> <% if Wabosign.version.present? %>
<a href="https://github.com/docusealco/docuseal/releases" target="_blank" class="badge badge-outline badge-lg block mx-auto"> <a href="<%= Wabosign::GITHUB_URL %>/releases" target="_blank" class="badge badge-outline badge-lg block mx-auto">
v<%= Docuseal.version %> v<%= Wabosign.version %>
</a> </a>
<% end %> <% end %>
</div> </div>
@ -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.com/install" class="link link-neutral font-bold">click</a>. Run on your own host using Docker container, or deploy on your favorite managed PaaS.
</p> </p>
</div> </div>
</div> </div>
@ -41,7 +41,7 @@
<h3 class="mb-4 text-2xl font-semibold">Mobile Optimized</h3> <h3 class="mb-4 text-2xl font-semibold">Mobile Optimized</h3>
<p class="text-base text-gray-500"> <p class="text-base text-gray-500">
Review and sign digital documents online from any device. Review and sign digital documents online from any device.
Docuseal document forms are optimized for screens of all sizes. Wabosign document forms are optimized for screens of all sizes.
</p> </p>
</div> </div>
</div> </div>
@ -67,7 +67,7 @@
</div> </div>
<h3 class="mb-4 text-2xl font-semibold">Open Source</h3> <h3 class="mb-4 text-2xl font-semibold">Open Source</h3>
<p class="text-base text-gray-500"> <p class="text-base text-gray-500">
Source code is available under <a href="<%= Docuseal::GITHUB_URL %>" class="link link-neutral font-bold" target="_blank">github.com/docusealco</a>.<br> Source code is available on <a href="<%= Wabosign::GITHUB_URL %>" class="link link-neutral font-bold" target="_blank">GitHub</a>.<br>
Open-source contributors are always ready to help! Open-source contributors are always ready to help!
</p> </p>
</div> </div>

@ -14,12 +14,10 @@
<%= ff.text_field :subject, required: true, class: 'base-input', dir: 'auto' %> <%= ff.text_field :subject, required: true, class: 'base-input', dir: 'auto' %>
</div> </div>
<%= render 'personalization_settings/email_body_field', ff:, config: f.object %> <%= render 'personalization_settings/email_body_field', ff:, config: f.object %>
<% if can?(:manage, :reply_to) || can?(:manage, :personalization_advanced) %> <div class="form-control">
<div class="form-control"> <%= ff.label :reply_to, t('reply_to'), class: 'label' %>
<%= ff.label :reply_to, t('reply_to'), class: 'label' %> <%= ff.email_field :reply_to, class: 'base-input', dir: 'auto', placeholder: t(:email) %>
<%= ff.email_field :reply_to, class: 'base-input', dir: 'auto', placeholder: t(:email) %> </div>
</div>
<% end %>
<div class="space-y-3.5"> <div class="space-y-3.5">
<div class="flex items-center justify-between mx-1"> <div class="flex items-center justify-between mx-1">
<span> <span>
@ -33,22 +31,18 @@
</span> </span>
<%= ff.check_box :attach_audit_log, { checked: ff.object.attach_audit_log != false, class: 'toggle' }, 'true', 'false' %> <%= ff.check_box :attach_audit_log, { checked: ff.object.attach_audit_log != false, class: 'toggle' }, 'true', 'false' %>
</div> </div>
<% unless Docuseal.multitenant? %> <div class="flex items-center justify-between mx-1">
<div class="flex items-center justify-between mx-1"> <span>
<span> <%= t('bcc_recipients') %>
<%= t('bcc_recipients') %> </span>
</span> <%= ff.check_box :bcc_recipients, { checked: ff.object.bcc_recipients == true, class: 'toggle' }, 'true', 'false' %>
<%= ff.check_box :bcc_recipients, { checked: ff.object.bcc_recipients == true, class: 'toggle' }, 'true', 'false' %> </div>
</div> <div class="flex items-center justify-between mx-1">
<% end %> <span>
<% if !Docuseal.multitenant? || can?(:manage, :personalization_advanced) %> <%= t('send_emails_automatically_on_completion') %>
<div class="flex items-center justify-between mx-1"> </span>
<span> <%= ff.check_box :enabled, { checked: ff.object.enabled != false, class: 'toggle' }, 'true', 'false' %>
<%= t('send_emails_automatically_on_completion') %> </div>
</span>
<%= ff.check_box :enabled, { checked: ff.object.enabled != false, class: 'toggle' }, 'true', 'false' %>
</div>
<% end %>
</div> </div>
<% end %> <% end %>
<div class="form-control pt-2"> <div class="form-control pt-2">

@ -1,4 +1,4 @@
<% unless Docuseal.multitenant? %> <% unless Wabosign.multitenant? %>
<div class="collapse collapse-plus bg-base-200 mt-4"> <div class="collapse collapse-plus bg-base-200 mt-4">
<input type="checkbox"> <input type="checkbox">
<div class="collapse-title text-xl font-medium"> <div class="collapse-title text-xl font-medium">

@ -2,14 +2,10 @@
<%= svg_icon('info_circle', class: 'w-6 h-6') %> <%= svg_icon('info_circle', class: 'w-6 h-6') %>
<div> <div>
<p class="font-bold"> <p class="font-bold">
<%= t('unlock_with_docuseal_pro') %> <%= t('display_your_company_name_and_logo_when_signing_documents') %>
</p> </p>
<p> <p>
<%= t('display_your_company_name_and_logo_when_signing_documents') %> Logo upload UI is not bundled with this open-source edition. Drop your custom logo into public/logo.svg and edit app/views/shared/_logo.html.erb to white-label the signing UI.
<br>
<a class="link font-medium" target="_blank" href="<%= Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" data-turbo="false">
<%= t('learn_more') %>
</a>
</p> </p>
</div> </div>
</div> </div>

@ -1,6 +1,6 @@
{ {
"name": "<%= Docuseal.product_name %>", "name": "<%= Wabosign.product_name %>",
"short_name": "<%= Docuseal.product_name %>", "short_name": "<%= Wabosign.product_name %>",
"id": "/", "id": "/",
"icons": [ "icons": [
{ {
@ -18,7 +18,7 @@
"display": "standalone", "display": "standalone",
"scope": "/", "scope": "/",
"orientation": "any", "orientation": "any",
"description": "<%= Docuseal.product_name %> is an open source platform that provides secure and efficient digital document signing and processing.", "description": "<%= Wabosign.product_name %> is an open source platform that provides secure and efficient digital document signing and processing.",
"categories": ["productivity", "utilities"], "categories": ["productivity", "utilities"],
"theme_color": "#FAF7F4", "theme_color": "#FAF7F4",
"background_color": "#FAF7F4" "background_color": "#FAF7F4"

@ -3,8 +3,13 @@
</p> </p>
<p> <p>
<% if @current_account&.testing? %> <% if @current_account&.testing? %>
<%= t('sent_using_product_name_in_testing_mode_html', product_url: "#{Docuseal::PRODUCT_EMAIL_URL}/start", product_name: Docuseal.product_name) %> <%= t('sent_using_product_name_in_testing_mode_html', product_url: "#{Wabosign::PRODUCT_EMAIL_URL}/start", product_name: Wabosign.product_name) %>
<% else %> <% else %>
<%= t('sent_using_product_name_free_document_signing_html', product_url: "#{Docuseal::PRODUCT_EMAIL_URL}/start", product_name: Docuseal.product_name) %> <%= t('sent_using_product_name_free_document_signing_html', product_url: "#{Wabosign::PRODUCT_EMAIL_URL}/start", product_name: Wabosign.product_name) %>
<% end %> <% end %>
</p> </p>
<p style="font-size: 11px; opacity: 0.7;">
<%= t('based_on') %>
<a href="<%= Wabosign::UPSTREAM_URL %>"><%= Wabosign::UPSTREAM_NAME %></a>
(AGPLv3)
</p>

@ -1,4 +1,4 @@
<a target="_blank" href="<%= Docuseal::GITHUB_URL %>" rel="noopener noreferrer nofollow" class="relative flex items-center rounded-full px-2 py-0.5 text-xs leading-4 mt-1 text-base-content border border-base-300 tooltip tooltip-bottom" data-tip="Give a star on GitHub"> <a target="_blank" href="<%= Wabosign::GITHUB_URL %>" rel="noopener noreferrer nofollow" class="relative flex items-center rounded-full px-2 py-0.5 text-xs leading-4 mt-1 text-base-content border border-base-300 tooltip tooltip-bottom" data-tip="Give a star on GitHub">
<span class="flex items-center justify-between space-x-0.5 font-medium"> <span class="flex items-center justify-between space-x-0.5 font-medium">
<%= svg_icon('start', class: 'h-3 w-3') %> <%= svg_icon('start', class: 'h-3 w-3') %>
<span>16k</span> <span>16k</span>

@ -1,10 +1,10 @@
<a href="https://github.com/docusealco/docuseal" class="btn btn-neutral btn-sm btn-outline inline-flex items-center justify-center" target="_blank" alt="Star on GitHub" style="height: 37px"> <a href="<%= Wabosign::GITHUB_URL %>" class="btn btn-neutral btn-sm btn-outline inline-flex items-center justify-center" target="_blank" alt="Star on GitHub" style="height: 37px">
<span> <span>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
<path fill="currentColor" d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" /> <path fill="currentColor" d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z" />
</svg> </svg>
</span> </span>
<span class="flex"> <span class="flex">
<span class="hidden lg:block">Star on&nbsp</span>GitHub <span class="hidden lg:block">View on&nbsp</span>GitHub
</span> </span>
</a> </a>

@ -1,4 +1,4 @@
<svg class="<%= local_assigns[:class] %>" height="<%= local_assigns.fetch(:height, '37') %>" width="<%= local_assigns.fetch(:width, '37') %>" style="color: #e97a42" viewBox="0 0 180 180" xmlns="http://www.w3.org/2000/svg"> <svg class="<%= local_assigns[:class] %>" height="<%= local_assigns.fetch(:height, '37') %>" width="<%= local_assigns.fetch(:width, '37') %>" style="color: #e97a42" viewBox="0 0 180 180" xmlns="http://www.w3.org/2000/svg">
<path fill="currentColor" d="M 178.224 72.09 c -0.296 -1.463 -0.627 -2.919 -0.996 -4.364 -0.293 -1.151 -0.616 -2.293 -0.956 -3.433 -0.301 -1.008 -0.612 -2.014 -0.95 -3.012 -0.531 -1.578 -1.113 -3.142 -1.735 -4.694 -0.216 -0.54 -0.433 -1.082 -0.661 -1.618 -0.195 -0.462 -0.399 -0.917 -0.601 -1.375 -0.262 -0.591 -0.53 -1.177 -0.804 -1.762 -0.074 -0.159 -0.151 -0.315 -0.226 -0.474 -0.209 -0.441 -0.422 -0.881 -0.638 -1.318 -0.076 -0.154 -0.153 -0.306 -0.229 -0.459 -0.236 -0.471 -0.477 -0.939 -0.721 -1.406 -0.053 -0.101 -0.105 -0.201 -0.158 -0.302 -1.143 -2.16 -2.367 -4.269 -3.68 -6.322 -0.116 -0.181 -0.237 -0.359 -0.355 -0.539 -0.094 -0.144 -0.189 -0.288 -0.284 -0.432 -0.284 -0.431 -0.57 -0.861 -0.862 -1.287 -0.112 -0.164 -0.225 -0.326 -0.338 -0.489 -0.193 -0.279 -0.382 -0.56 -0.579 -0.836 -0.089 -0.125 -0.182 -0.249 -0.273 -0.374 -0.13 -0.182 -0.264 -0.362 -0.395 -0.542 -0.277 -0.38 -0.556 -0.76 -0.838 -1.135 -0.15 -0.199 -0.303 -0.395 -0.454 -0.593 -0.21 -0.274 -0.417 -0.552 -0.63 -0.823 -0.055 -0.069 -0.111 -0.136 -0.166 -0.205 -0.482 -0.61 -0.971 -1.216 -1.47 -1.814 -0.129 -0.155 -0.262 -0.306 -0.392 -0.461 -0.402 -0.476 -0.808 -0.95 -1.22 -1.417 -0.186 -0.212 -0.375 -0.422 -0.563 -0.631 -0.384 -0.428 -0.773 -0.854 -1.167 -1.276 -0.176 -0.189 -0.351 -0.379 -0.529 -0.567 -0.564 -0.595 -1.134 -1.186 -1.716 -1.768 -1.091 -1.091 -2.207 -2.15 -3.346 -3.178 -1.016 -0.919 -2.05 -1.815 -3.103 -2.684 -0.772 -0.636 -1.557 -1.255 -2.348 -1.864 -3.465 -2.67 -7.112 -5.075 -10.927 -7.209 -2.869 -1.604 -5.83 -3.06 -8.883 -4.351 -2.443 -1.033 -4.922 -1.948 -7.428 -2.756 -8.879 -2.863 -18.13 -4.318 -27.605 -4.318 -3.19 0 -6.354 0.169 -9.488 0.496 -4.036 0.421 -8.019 1.114 -11.94 2.073 -1.732 0.423 -3.452 0.892 -5.157 1.42 -2.856 0.883 -5.673 1.912 -8.447 3.085 -2.645 1.118 -5.222 2.357 -7.729 3.711 -2.574 1.39 -5.073 2.901 -7.494 4.533 -1.195 0.805 -2.37 1.64 -3.527 2.503 -1.156 0.864 -2.292 1.756 -3.408 2.676 -0.553 0.456 -1.1 0.919 -1.643 1.389 -1.649 1.427 -3.252 2.92 -4.806 4.473 -2.582 2.582 -4.991 5.299 -7.222 8.138 -0.892 1.135 -1.756 2.292 -2.59 3.467 -0.417 0.588 -0.827 1.18 -1.23 1.778 -0.403 0.597 -0.798 1.199 -1.186 1.806 -0.388 0.607 -0.769 1.218 -1.143 1.835 -2.241 3.697 -4.216 7.562 -5.916 11.582 -1.095 2.589 -2.059 5.217 -2.901 7.877 -0.153 0.482 -0.3 0.965 -0.444 1.449 -0.339 1.14 -0.663 2.282 -0.956 3.433 -0.369 1.446 -0.7 2.901 -0.996 4.364 -1.034 5.121 -1.618 10.343 -1.749 15.637 -0.018 0.757 -0.028 1.514 -0.028 2.274 0 1.123 0.02 2.244 0.062 3.361 0.285 7.82 1.568 15.475 3.825 22.879 0.044 0.147 0.088 0.295 0.133 0.441 0.877 2.823 1.894 5.608 3.054 8.35 0.85 2.009 1.769 3.98 2.755 5.912 0.539 1.057 1.105 2.099 1.685 3.132 4.013 7.142 8.98 13.698 14.846 19.564 7.713 7.713 16.611 13.878 26.477 18.352 0.705 0.32 1.415 0.632 2.131 0.935 2.081 0.88 4.185 1.679 6.313 2.396 9.217 3.106 18.85 4.677 28.719 4.677 8.031 0 15.902 -1.047 23.522 -3.107 0.633 -0.172 1.266 -0.35 1.895 -0.535 0.757 -0.222 1.509 -0.456 2.26 -0.698 0.717 -0.232 1.431 -0.474 2.145 -0.723 1.752 -0.616 3.49 -1.281 5.211 -2.009 0.755 -0.319 1.503 -0.651 2.247 -0.989 1.237 -0.563 2.459 -1.15 3.664 -1.766 0.644 -0.328 1.283 -0.665 1.917 -1.009 1.654 -0.896 3.274 -1.848 4.865 -2.844 5.736 -3.591 11.06 -7.827 15.912 -12.679 0.775 -0.775 1.534 -1.562 2.278 -2.36 5.204 -5.59 9.636 -11.754 13.246 -18.417 0.343 -0.634 0.68 -1.274 1.009 -1.917 0.482 -0.944 0.943 -1.9 1.392 -2.863 0.471 -1.007 0.928 -2.021 1.364 -3.049 1.22 -2.886 2.281 -5.82 3.187 -8.793 0.559 -1.833 1.056 -3.68 1.494 -5.542 0.108 -0.458 0.211 -0.916 0.312 -1.376 0.194 -0.883 0.373 -1.77 0.539 -2.659 1.02 -5.455 1.542 -11.02 1.542 -16.663 0 -6.074 -0.595 -12.058 -1.776 -17.911 z m -161.733 19.614 c -1.118 -56.662 44.604 -74.877 60.998 -67.647 2.187 0.965 4.732 2.431 7.042 2.96 5.295 1.213 13.432 -3.113 13.521 6.273 0.078 8.156 -3.389 13.108 -10.797 16.177 -7.539 3.124 -14.777 9.181 -19.95 15.493 -21.487 26.216 -31.231 68.556 -7.565 94.296 -13.679 -5.545 -42.418 -25.467 -43.248 -67.552 z m 91.109 72.619 c -0.053 0.008 -4.171 0.775 -4.171 0.775 0 0 -15.862 -22.957 -23.509 -21.719 11.291 16.04 12.649 22.625 12.649 22.625 -0.053 0.001 -0.107 0.001 -0.161 0.003 -51.831 2.131 -42.785 -64.026 -28.246 -86.502 -1.555 13.073 8.878 39.992 39.034 44.1 9.495 1.293 32.302 -3.275 41.015 -11.38 0.098 1.825 0.163 3.85 0.159 6.013 -0.046 23.538 -13.47 42.743 -36.77 46.085 z m 30.575 -15.708 c 9.647 -9.263 12.869 -27.779 9.103 -44.137 -4.608 -20.011 -28.861 -32.383 -40.744 -35.564 5.766 -8.089 27.908 -14.274 39.567 5.363 -5.172 -10.519 -13.556 -23.023 -1.732 -33.128 12.411 13.329 19.411 29.94 20.161 48.7 0.75 18.753 -6.64 41.768 -26.355 58.765 z" /> <rect x="6" y="6" width="168" height="168" rx="34" ry="34" fill="currentColor" />
<circle fill="currentColor" cx="71.927" cy="32.004" r="2.829" /> <path fill="#faf7f5" d="M 40 56 L 60 134 L 78 78 L 90 132 L 102 78 L 120 134 L 140 56" stroke="#faf7f5" stroke-width="11" stroke-linejoin="round" stroke-linecap="round" fill="none" />
</svg> </svg>

Before

Width:  |  Height:  |  Size: 4.8 KiB

After

Width:  |  Height:  |  Size: 500 B

@ -1,14 +1,14 @@
<% if Docuseal.demo? || (request.path != '/' && !devise_controller?) %> <% if Wabosign.demo? || (request.path != '/' && !devise_controller?) %>
<meta name="robots" content="noindex"> <meta name="robots" content="noindex">
<% end %> <% end %>
<% title = content_for(:html_title) || (signed_in? ? 'DocuSeal' : 'DocuSeal | Open Source Document Signing') %> <% title = content_for(:html_title) || (signed_in? ? Wabosign.product_name : "#{Wabosign.product_name} | Open Source Document Signing") %>
<% description = content_for(:html_description) || 'Open source, self-hosted tool to streamline document filling and signing. Create custom PDF forms to complete and sign with an easy to use online tool.' %> <% description = content_for(:html_description) || 'Open source, self-hosted tool to streamline document filling and signing. Create custom PDF forms to complete and sign with an easy to use online tool.' %>
<meta name="description" content="<%= description %>"> <meta name="description" content="<%= description %>">
<meta property="og:title" content="<%= title %>"> <meta property="og:title" content="<%= title %>">
<meta property="og:description" content="<%= description %>"> <meta property="og:description" content="<%= description %>">
<meta property="og:type" content="website"> <meta property="og:type" content="website">
<meta property="og:url" content="<%= root_url %>"> <meta property="og:url" content="<%= root_url %>">
<meta property="og:site_name" content="DocuSeal"> <meta property="og:site_name" content="<%= Wabosign.product_name %>">
<% if content_for(:disable_image_preview) %> <% if content_for(:disable_image_preview) %>
<meta property="og:image" content=""> <meta property="og:image" content="">
<meta name="twitter:image" content=""> <meta name="twitter:image" content="">
@ -19,8 +19,6 @@
<meta name="twitter:image" content="<%= content_for(:preview_image_url).presence || "#{root_url}preview.png" %>"> <meta name="twitter:image" content="<%= content_for(:preview_image_url).presence || "#{root_url}preview.png" %>">
<% end %> <% end %>
<meta name="twitter:card" content="summary"> <meta name="twitter:card" content="summary">
<meta name="twitter:creator" content="@docusealco">
<meta name="twitter:site" content="@docusealco">
<meta name="twitter:title" content="<%= title %>"> <meta name="twitter:title" content="<%= title %>">
<meta name="twitter:description" content="<%= description %>"> <meta name="twitter:description" content="<%= description %>">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png"> <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">

@ -10,8 +10,8 @@
</div> </div>
<% 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 Wabosign.demo? %>
<a href="https://docuseal.com/sign_up" class="btn btn-neutral btn-sm btn-outline inline-flex items-center justify-center" style="height: 37px"> <a href="<%= Wabosign::PRODUCT_URL %>" 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">
@ -34,9 +34,9 @@
<span class="mr-1"><%= t('profile') %></span> <span class="mr-1"><%= t('profile') %></span>
<% end %> <% end %>
</li> </li>
<% if !Docuseal.demo? && can?(:manage, EncryptedConfig) %> <% if !Wabosign.demo? && can?(:manage, EncryptedConfig) %>
<li> <li>
<%= link_to Docuseal.multitenant? ? console_redirect_index_path : Docuseal::CONSOLE_URL, data: { prefetch: false }, class: 'flex items-center' do %> <%= link_to Wabosign.multitenant? ? console_redirect_index_path : Wabosign::CONSOLE_URL, data: { prefetch: false }, class: 'flex items-center' do %>
<%= svg_icon('terminal', class: 'w-5 h-5 flex-shrink-0 stroke-2') %> <%= svg_icon('terminal', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
<%= t('console') %> <%= t('console') %>
<% end %> <% end %>
@ -50,14 +50,6 @@
<% end %> <% end %>
</li> </li>
<% end %> <% end %>
<% if Docuseal.multitenant? || current_user.role == 'superadmin' %>
<li>
<%= link_to Docuseal::CHATGPT_URL, target: 'blank', class: 'flex items-center' do %>
<%= svg_icon('sparkles', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
<span class="mr-1 whitespace-nowrap"><%= t('ask_ai') %></span>
<% end %>
</li>
<% end %>
<% if (can?(:manage, EncryptedConfig) && current_user == true_user) || (current_user != true_user && current_account.testing?) %> <% if (can?(:manage, EncryptedConfig) && current_user == true_user) || (current_user != true_user && current_account.testing?) %>
<%= form_for '', url: testing_account_path, method: current_account.testing? ? :delete : :post, html: { class: 'w-full py-1' } do |f| %> <%= form_for '', url: testing_account_path, method: current_account.testing? ? :delete : :post, html: { class: 'w-full py-1' } do |f| %>
<label class="flex items-center pl-6 pr-4 py-2 border-y border-base-300 -ml-2 -mr-2" for="testing_toggle"> <label class="flex items-center pl-6 pr-4 py-2 border-y border-base-300 -ml-2 -mr-2" for="testing_toggle">
@ -89,7 +81,7 @@
</span> </span>
<% end %> <% end %>
<% end %> <% end %>
<% if Docuseal.multitenant? && !request.path.in?([registration_path, new_registration_path]) %> <% if Wabosign.multitenant? && !request.path.in?([registration_path, new_registration_path]) %>
<%= link_to registration_path({ lang: params[:lang] }.compact_blank), class: 'btn btn-neutral btn-sm btn-outline' do %> <%= link_to registration_path({ lang: params[:lang] }.compact_blank), class: 'btn btn-neutral btn-sm btn-outline' do %>
<span class="flex items-center justify-center space-x-1"> <span class="flex items-center justify-center space-x-1">
<span class="hidden sm:block capitalize"><%= t('create_free_account') %></span> <span class="hidden sm:block capitalize"><%= t('create_free_account') %></span>

@ -1,8 +1,3 @@
<% if signed_in? && current_user != true_user %> <% if signed_in? && current_user != true_user %>
<%= render 'shared/test_alert' %> <%= render 'shared/test_alert' %>
<% elsif request.path.starts_with?('/settings') %>
<%= link_to "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}", class: 'hidden md:inline-flex btn btn-warning btn-sm', data: { prefetch: false } do %>
<%= t('upgrade') %>
<% end %>
<span class="hidden md:inline-flex h-3 border-r border-base-content"></span>
<% end %> <% end %>

@ -9,5 +9,10 @@
<% else %> <% else %>
<%= t('powered_by') %> <%= t('powered_by') %>
<% end %> <% end %>
<a href="<%= Docuseal::PRODUCT_URL %><%= local_assigns[:link_path] %>" class="underline"><%= Docuseal.product_name %></a> - <%= t('open_source_documents_software') %> <a href="<%= Wabosign::PRODUCT_URL %><%= local_assigns[:link_path] %>" class="underline"><%= Wabosign.product_name %></a> - <%= t('open_source_documents_software') %>
</div>
<div class="text-center px-2 text-xs opacity-70 mt-1">
<%= t('based_on') %>
<a href="<%= Wabosign::UPSTREAM_URL %>" class="underline" target="_blank" rel="noopener"><%= Wabosign::UPSTREAM_NAME %></a>
(AGPLv3)
</div> </div>

@ -12,7 +12,7 @@
<li> <li>
<%= link_to t('account'), settings_account_path, class: 'text-base hover:bg-base-300' %> <%= link_to t('account'), settings_account_path, class: 'text-base hover:bg-base-300' %>
</li> </li>
<% unless Docuseal.multitenant? %> <% unless Wabosign.multitenant? %>
<% if can?(:read, EncryptedConfig.new(key: EncryptedConfig::EMAIL_SMTP_KEY, account: current_account)) && ENV['SMTP_ADDRESS'].blank? && true_user == current_user %> <% if can?(:read, EncryptedConfig.new(key: EncryptedConfig::EMAIL_SMTP_KEY, account: current_account)) && ENV['SMTP_ADDRESS'].blank? && true_user == current_user %>
<li> <li>
<%= link_to t('email'), settings_email_index_path, class: 'text-base hover:bg-base-300' %> <%= link_to t('email'), settings_email_index_path, class: 'text-base hover:bg-base-300' %>
@ -50,47 +50,27 @@
</li> </li>
<% end %> <% end %>
<%= render 'shared/settings_nav_extra' %> <%= render 'shared/settings_nav_extra' %>
<% if Docuseal.demo? || !Docuseal.multitenant? %> <% if Wabosign.demo? || !Wabosign.multitenant? %>
<% if can?(:read, AccessToken) %> <% if can?(:read, AccessToken) %>
<li> <li>
<%= link_to 'API', settings_api_index_path, class: 'text-base hover:bg-base-300' %> <%= link_to 'API', settings_api_index_path, class: 'text-base hover:bg-base-300' %>
</li> </li>
<% end %> <% end %>
<% end %> <% end %>
<% if Docuseal.demo? || !Docuseal.multitenant? || (current_user != true_user && !current_account.testing?) %> <% if Wabosign.demo? || !Wabosign.multitenant? || (current_user != true_user && !current_account.testing?) %>
<% if can?(:read, WebhookUrl) %> <% if can?(:read, WebhookUrl) %>
<li> <li>
<%= link_to 'Webhooks', settings_webhooks_path, class: 'text-base hover:bg-base-300' %> <%= link_to 'Webhooks', settings_webhooks_path, class: 'text-base hover:bg-base-300' %>
</li> </li>
<% end %> <% end %>
<% end %> <% end %>
<% if !Docuseal.demo? && can?(:manage, EncryptedConfig) && (current_user != true_user || !current_account.linked_account_account) %> <% if !Wabosign.demo? && can?(:manage, EncryptedConfig) && (current_user == true_user || current_account.testing?) %>
<li> <% if can?(:read, EncryptedConfig.new(key: 'saml_configs', account: current_account)) && true_user == current_user %>
<%= content_for(:pro_link) || link_to(Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}", class: 'text-base hover:bg-base-300', data: { turbo: false }) do %>
<%= t('plans') %>
<span class="badge badge-warning"><%= t('pro') %></span>
<% end %>
</li>
<% end %>
<% if !Docuseal.demo? && can?(:manage, EncryptedConfig) && (current_user == true_user || current_account.testing?) %>
<li>
<%= link_to Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}#{'/test' if current_account.testing?}/api") : "#{Docuseal::CONSOLE_URL}/on_premises", class: 'text-base hover:bg-base-300', data: { turbo: false } do %>
<% if Docuseal.multitenant? %> API <% else %> <%= t('console') %> <% end %>
<% end %>
</li>
<% if Docuseal.multitenant? %>
<li>
<%= link_to console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}#{'/test' if current_account.testing?}/embedding/form"), class: 'text-base hover:bg-base-300', data: { turbo: false } do %>
<%= t('embedding') %>
<% end %>
</li>
<% end %>
<% if (!Docuseal.multitenant? || can?(:manage, :saml_sso)) && can?(:read, EncryptedConfig.new(key: 'saml_configs', account: current_account)) && true_user == current_user %>
<li> <li>
<%= link_to 'SSO', settings_sso_index_path, class: 'text-base hover:bg-base-300' %> <%= link_to 'SSO', settings_sso_index_path, class: 'text-base hover:bg-base-300' %>
</li> </li>
<% end %> <% end %>
<% if !Docuseal.multitenant? && can?(:read, McpToken) && can?(:manage, :mcp) %> <% if can?(:read, McpToken) && can?(:manage, :mcp) %>
<li> <li>
<%= link_to 'MCP', settings_mcp_index_path, class: 'text-base hover:bg-base-300' %> <%= link_to 'MCP', settings_mcp_index_path, class: 'text-base hover:bg-base-300' %>
</li> </li>
@ -113,36 +93,24 @@
<% end %> <% end %>
</ul> </ul>
</menu-active> </menu-active>
<% if Docuseal.multitenant? || cannot?(:manage, :tenants) %> <% if Wabosign.multitenant? || cannot?(:manage, :tenants) %>
<div id="support_channels" class="mx-4 border-t border-base-300 hidden md:block"> <div id="support_channels" class="mx-4 border-t border-base-300 hidden md:block">
<div class="text-sm mt-3"> <div class="text-sm mt-3">
<%= t('need_help_ask_a_question_') %> <%= t('need_help_ask_a_question_') %>
</div> </div>
<div class="flex mt-3 space-x-3"> <div class="flex mt-3 space-x-3">
<div class="tooltip" data-tip="GitHub"> <div class="tooltip" data-tip="GitHub">
<a href="<%= Docuseal::GITHUB_URL %>" target="_blank" class="btn btn-circle btn-primary btn-md"> <a href="<%= Wabosign::GITHUB_URL %>" target="_blank" class="btn btn-circle btn-primary btn-md">
<%= svg_icon('brand_github', class: 'w-8 h-8') %> <%= svg_icon('brand_github', class: 'w-8 h-8') %>
</a> </a>
</div> </div>
<div class="tooltip" data-tip="<%= t('discord_community') %>">
<a href="<%= Docuseal::DISCORD_URL %>" target="_blank" class="btn btn-circle btn-primary btn-md">
<%= svg_icon('brand_discord', class: 'w-8 h-8') %>
</a>
</div>
<%= capture do %>
<div class="tooltip" data-tip="<%= t('ai_assistant') %>">
<a href="<%= Docuseal::CHATGPT_URL %>" target="_blank" class="btn btn-circle btn-primary btn-md">
<%= svg_icon('brand_openai', class: 'w-8 h-8') %>
</a>
</div>
<% end %>
</div> </div>
<a href="mailto:<%= Docuseal::SUPPORT_EMAIL %>" target="_blank" class="w-full block mt-4 underline text-center"> <a href="mailto:<%= Wabosign::SUPPORT_EMAIL %>" target="_blank" class="w-full block mt-4 underline text-center">
<%= Docuseal::SUPPORT_EMAIL %> <%= Wabosign::SUPPORT_EMAIL %>
</a> </a>
<% if Docuseal.version.present? && !Docuseal.multitenant? && can?(:manage, EncryptedConfig) %> <% if Wabosign.version.present? && !Wabosign.multitenant? && can?(:manage, EncryptedConfig) %>
<a href="https://github.com/docusealco/docuseal/releases" target="_blank" class="badge badge-outline text-xs block mx-auto mt-4"> <a href="<%= Wabosign::GITHUB_URL %>/releases" target="_blank" class="badge badge-outline text-xs block mx-auto mt-4">
v<%= Docuseal.version %> v<%= Wabosign.version %>
</a> </a>
<% end %> <% end %>
</div> </div>

@ -1,2 +1,2 @@
<%= render 'shared/logo' %> <%= render 'shared/logo' %>
<span>DocuSeal</span> <span><%= Wabosign.product_name %></span>

@ -5,11 +5,7 @@
<%= t('send_signature_requests_via_sms') %> <%= t('send_signature_requests_via_sms') %>
</p> </p>
<p class="text-gray-700"> <p class="text-gray-700">
<%= t('unlock_with_docuseal_pro') %> SMS signing invitations require an SMS provider integration (e.g. Twilio, AWS SNS) that is not bundled with this open-source edition. Wire up your preferred provider in the submitter mailer/SMS service to enable.
<br>
<a class="link font-medium" target="_blank" href="<%= Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" data-turbo="false">
<%= t('learn_more') %>
</a>
</p> </p>
</div> </div>
</div> </div>

@ -5,11 +5,7 @@
<%= t('single_sign_on_with_saml_2_0') %> <%= t('single_sign_on_with_saml_2_0') %>
</p> </p>
<p class="text-gray-700"> <p class="text-gray-700">
<%= t('unlock_with_docuseal_pro') %> SAML 2.0 SSO requires a SAML library integration (e.g. ruby-saml) that is not bundled with this open-source edition. Encrypted config is stored under the saml_configs key on the account.
<br>
<a class="link font-medium" target="_blank" href="<%= Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" data-turbo="false">
<%= t('learn_more') %>
</a>
</p> </p>
</div> </div>
</div> </div>

@ -1 +1 @@
<%= render 'start_form/docuseal_logo' %> <%= render 'start_form/brand_logo' %>

@ -2,5 +2,5 @@
<span class="mr-3"> <span class="mr-3">
<%= render 'shared/logo', width: '50px', height: '50px' %> <%= render 'shared/logo', width: '50px', height: '50px' %>
</span> </span>
<h1 class="text-5xl font-bold text-center">DocuSeal</h1> <h1 class="text-5xl font-bold text-center"><%= Wabosign.product_name %></h1>
</a> </a>

@ -21,7 +21,7 @@
<div dir="auto" class="text-center text-2xl font-semibold"> <div dir="auto" class="text-center text-2xl font-semibold">
<%= @submitter.with_signature_fields? ? t('document_has_been_signed_already') : t('form_has_been_submitted_already') %> <%= @submitter.with_signature_fields? ? t('document_has_been_signed_already') : t('form_has_been_submitted_already') %>
</div> </div>
<% if Docuseal.multitenant? || Accounts.can_send_emails?(@submitter.account) %> <% if Wabosign.multitenant? || Accounts.can_send_emails?(@submitter.account) %>
<toggle-submit class="block"> <toggle-submit class="block">
<%= button_to button_title(title: t('send_copy_to_email'), disabled_with: t('sending'), icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { template_slug: @template.slug, email: params[:email] }, class: 'base-button w-full' %> <%= button_to button_title(title: t('send_copy_to_email'), disabled_with: t('sending'), icon: svg_icon('mail_forward', class: 'w-6 h-6')), send_submission_email_index_path, params: { template_slug: @template.slug, email: params[:email] }, class: 'base-button w-full' %>
</toggle-submit> </toggle-submit>

@ -1,4 +1,4 @@
<% content_for(:html_title, "#{@template.name} | DocuSeal") %> <% content_for(:html_title, "#{@template.name} | #{Wabosign.product_name}") %>
<% I18n.with_locale(@template.account.locale) do %> <% I18n.with_locale(@template.account.locale) do %>
<% content_for(:html_description, t('account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution', account_name: @template.account.name)) %> <% content_for(:html_description, t('account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution', account_name: @template.account.name)) %>
<% end %> <% end %>

@ -1,4 +1,4 @@
<% content_for(:html_title, "#{@template.name} | DocuSeal") %> <% content_for(:html_title, "#{@template.name} | #{Wabosign.product_name}") %>
<% I18n.with_locale(@template.account.locale) do %> <% I18n.with_locale(@template.account.locale) do %>
<% content_for(:html_description, t('share_link_is_currently_disabled')) %> <% content_for(:html_description, t('share_link_is_currently_disabled')) %>
<% end %> <% end %>

@ -1,4 +1,4 @@
<% content_for(:html_title, "#{@template.name} | DocuSeal") %> <% content_for(:html_title, "#{@template.name} | #{Wabosign.product_name}") %>
<% I18n.with_locale(@template.account.locale) do %> <% I18n.with_locale(@template.account.locale) do %>
<% content_for(:html_description, t('account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution', account_name: @template.account.name)) %> <% content_for(:html_description, t('account_name_has_invited_you_to_fill_and_sign_documents_online_effortlessly_with_a_secure_fast_and_user_friendly_digital_document_signing_solution', account_name: @template.account.name)) %>
<% end %> <% end %>

@ -5,11 +5,7 @@
<%= t('bulk_send_from_excel_xlsx_or_csv') %> <%= t('bulk_send_from_excel_xlsx_or_csv') %>
</p> </p>
<p class="text-gray-700"> <p class="text-gray-700">
<%= t('unlock_with_docuseal_pro') %> Bulk send via CSV/XLSX import is not bundled with this open-source edition. Use the JSON API (POST /api/submissions with an array of submitters) to create submissions in bulk programmatically.
<br>
<a class="link font-medium" target="_blank" href="<%= Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}" %>" data-turbo="false">
<%= t('learn_more') %>
</a>
</p> </p>
</div> </div>
</div> </div>

@ -23,7 +23,7 @@
</div> </div>
<% elsif submitters.size == 1 %> <% elsif submitters.size == 1 %>
<submitter-item class="form-control"> <submitter-item class="form-control">
<emails-textarea data-bulk-enabled="<%= Docuseal.demo? || !Docuseal.multitenant? || can?(:manage, :bulk_send) %>" data-limit="<%= Docuseal.multitenant? ? (can?(:manage, :bulk_send) ? 40 : 1) : nil %>"> <emails-textarea data-bulk-enabled="<%= Wabosign.demo? || !Wabosign.multitenant? || can?(:manage, :bulk_send) %>" data-limit="<%= Wabosign.multitenant? ? (can?(:manage, :bulk_send) ? 40 : 1) : nil %>">
<submitters-autocomplete data-field="email" class="block relative"> <submitters-autocomplete data-field="email" class="block relative">
<autoresize-textarea> <autoresize-textarea>
<%= f.text_area :emails, required: true, class: 'base-textarea w-full !text-lg', placeholder: "#{t('type_emails_here')}...", rows: 2 %> <%= f.text_area :emails, required: true, class: 'base-textarea w-full !text-lg', placeholder: "#{t('type_emails_here')}...", rows: 2 %>

@ -22,7 +22,7 @@
<% end %> <% end %>
</div> </div>
</div> </div>
<% if !Docuseal.multitenant? && !can_send_emails %> <% if !Wabosign.multitenant? && !can_send_emails %>
<div class="alert my-4"> <div class="alert my-4">
<%= svg_icon('info_circle', class: 'w-6 h-6') %> <%= svg_icon('info_circle', class: 'w-6 h-6') %>
<div> <div>

@ -1,5 +1,7 @@
<div class="mt-2 mb-1"> <div class="mt-2 mb-1">
<div class="tooltip w-full" data-tip="<%= t('unlock_with_docuseal_pro') %>"> <div class="tooltip w-full" data-tip="SMS provider integration not configured">
<%= link_to submitter.sent_at? ? t('re_send_sms') : t('send_sms'), Docuseal.multitenant? ? console_redirect_index_path(redir: "#{Docuseal::CONSOLE_URL}/plans") : "#{Docuseal::CLOUD_URL}/sign_up?#{{ redir: "#{Docuseal::CONSOLE_URL}/on_premises" }.to_query}", class: 'btn btn-sm btn-primary text-gray-400 w-full' %> <button type="button" class="btn btn-sm btn-primary text-gray-400 w-full" disabled>
<%= submitter.sent_at? ? t('re_send_sms') : t('send_sms') %>
</button>
</div> </div>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save