Remove unused parts of the app

This commit removes various visual elements like logos, banners, and
buttons to create a cleaner and more focused user experience. It also
adds context files for AI assistants to aid in development.
pull/501/head
Bernardo Anderson 4 months ago
parent 799a7207f6
commit c6eac5d543

1
.gitignore vendored

@ -37,3 +37,4 @@ yarn-debug.log*
/docuseal /docuseal
/ee /ee
dump.rdb dump.rdb
.aider*

@ -0,0 +1,137 @@
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Development Commands
### Starting the Application
```bash
# Start Rails server
PORT=3001 bundle exec rails s -p 3001
# Start Webpack dev server (separate terminal)
bundle exec ./bin/shakapacker-dev-server
# Or start both with foreman
foreman start -f Procfile.dev
```
### Database Operations
```bash
# Create and migrate database
rails db:create db:migrate
# Reset database
rails db:drop db:create db:migrate
# Run seeds
rails db:seed
```
### Testing
```bash
# Run all tests
bundle exec rspec
# Run specific test file
bundle exec rspec spec/path/to/test_spec.rb
# Run system tests with visible browser
HEADLESS=false bundle exec rspec spec/system/
# Run tests with coverage
COVERAGE=true bundle exec rspec
```
### Code Quality
```bash
# Ruby linting
bundle exec rubocop
bundle exec rubocop -a # auto-correct
# JavaScript linting
yarn eslint
# ERB linting
bundle exec erblint --lint-all
# Security scanning
bundle exec brakeman
```
### Asset Management
```bash
# Install JavaScript dependencies
yarn install
# Compile assets for production
bundle exec rails assets:precompile
# Start webpack dev server
bundle exec ./bin/shakapacker-dev-server
```
## Application Architecture
### Core Domain Models
- **Template**: PDF form templates with fields for signing/filling
- **Submission**: Instance of a template being processed with specific submitters
- **Submitter**: Individual who needs to fill/sign a document within a submission
- **User**: System users (admins, team members) who manage templates and submissions
- **Account**: Multi-tenant organization container
### Key Relationships
- Templates belong to Accounts and have many Submissions
- Submissions have many Submitters (signing parties)
- Each Submitter has specific fields to complete
- CompletedSubmitter and CompletedDocument track completion state
### Frontend Architecture
- **Rails Views**: Server-rendered ERB templates with Turbo for interactivity
- **Vue.js Components**: Used for complex interactive forms (template builder, submission forms)
- **Stimulus**: Lightweight JavaScript controllers for DOM interactions
- **Tailwind CSS**: Utility-first CSS framework with DaisyUI components
### Background Jobs (Sidekiq)
- Document processing and PDF generation
- Email notifications and reminders
- Webhook deliveries
- Search indexing
### File Storage
- Uses Active Storage for file management
- Supports local disk, AWS S3, Google Cloud, Azure storage
- PDF processing with HexaPDF library
- Image processing with ruby-vips
### API Structure
- RESTful JSON API under `/api` namespace
- API authentication via access tokens
- Webhook system for real-time integrations
- OpenAPI documentation in `docs/openapi.json`
## Key Configuration Files
- `config/routes.rb`: Main routing configuration with API and web routes
- `config/application.rb`: Rails application configuration
- `shakapacker.yml`: JavaScript build configuration
- `tailwind.config.js`: CSS framework configuration
## Development Environment
- Ruby 3.4.2 required
- Node.js 18 for asset compilation
- SQLite for development (PostgreSQL supported)
- Redis for background jobs
- VIPS for image processing
## Testing Setup
- RSpec for Ruby testing with FactoryBot fixtures
- Capybara + Cuprite for system/integration tests
- WebMock for HTTP request stubbing
- Sidekiq testing utilities for background jobs
## Security Features
- Devise for authentication with 2FA support
- CanCanCan for authorization
- PDF signature verification
- Encrypted configuration storage
- Rate limiting middleware

@ -0,0 +1,34 @@
# DocuSeal Application Analysis
This document provides a comprehensive overview of the DocuSeal application, including its core functionality, technical stack, and key features.
## Core Functionality
* **Document Signing:** The primary purpose of DocuSeal is to facilitate the digital signing of documents. It allows users to upload PDF documents, add various form fields (signatures, dates, text, etc.), and send them to multiple recipients for signing.
* **PDF Form Builder:** It includes a WYSIWYG (What You See Is What You Get) editor for creating and arranging form fields on a PDF document.
* **User Management:** The application supports user accounts, allowing individuals and organizations to manage their documents and signing processes.
* **Email Automation:** It uses SMTP to send automated emails for document invitations, notifications, and reminders.
* **File Storage:** DocuSeal can store files on the local disk or integrate with cloud storage providers like AWS S3, Google Storage, and Azure Cloud.
* **Security:** It provides features like PDF eSignature, signature verification, and user authentication (including two-factor authentication and SSO/SAML).
* **Integrations:** The platform offers APIs and webhooks to integrate with other applications and services.
## Technical Stack
* **Backend:** Ruby on Rails
* **Frontend:** JavaScript, Vue.js, and Hotwired/Turbo for a reactive user experience. It uses Shakapacker (a successor to Webpacker) for managing JavaScript assets.
* **Database:** The `Gemfile` indicates support for PostgreSQL and SQLite. The local setup guide recommends SQLite for development and PostgreSQL for production.
* **Background Jobs:** Sidekiq is used for processing background jobs, such as sending emails.
* **Styling:** Tailwind CSS and DaisyUI are used for styling the user interface.
## Key Features from `routes.rb`
* **API:** A JSON API is available for managing users, submissions, templates, and other resources.
* **Document Management:** Routes for creating, viewing, and managing document templates and submissions.
* **User Authentication:** Devise is used for user authentication, including sessions, passwords, and invitations.
* **Settings:** A comprehensive settings area allows users to configure their account, email, storage, security, and other preferences.
* **Embedded Functionality:** The application supports embedding the signing form and document builder into other websites.
## Project Structure
The project follows a standard Ruby on Rails application structure, with controllers, models, views, and other components organized in their respective directories.

@ -58,12 +58,6 @@
:style="{ backgroundColor }" :style="{ backgroundColor }"
> >
<div class="flex items-center space-x-3"> <div class="flex items-center space-x-3">
<a
v-if="withLogo"
href="/"
>
<Logo />
</a>
<Contenteditable <Contenteditable
v-if="withTitle" v-if="withTitle"
:model-value="template.name" :model-value="template.name"
@ -79,78 +73,6 @@
name="buttons" name="buttons"
/> />
<template v-else> <template v-else>
<form
v-if="withSignYourselfButton && template.submitters.length < 2"
target="_blank"
data-turbo="false"
class="inline"
method="post"
:action="`/d/${template.slug}`"
@submit="maybeShowErrorTemplateAlert"
>
<input
type="hidden"
name="_method"
value="put"
autocomplete="off"
>
<input
type="hidden"
name="authenticity_token"
:value="authenticityToken"
autocomplete="off"
>
<input
type="hidden"
name="selfsign"
value="true"
autocomplete="off"
>
<button
class="btn btn-primary btn-ghost text-base hidden md:flex"
type="submit"
>
<IconWritingSign
width="22"
class="inline"
/>
<span class="hidden md:inline">
{{ t('sign_yourself') }}
</span>
</button>
</form>
<a
v-else-if="withSignYourselfButton"
id="sign_yourself_button"
:href="`/templates/${template.id}/submissions/new?selfsign=true`"
class="btn btn-primary btn-ghost text-base hidden md:flex"
data-turbo-frame="modal"
@click="maybeShowErrorTemplateAlert"
>
<IconWritingSign
width="22"
class="inline"
/>
<span class="hidden md:inline">
{{ t('sign_yourself') }}
</span>
</a>
<a
v-if="withSendButton"
id="send_button"
:href="`/templates/${template.id}/submissions/new?with_link=true`"
data-turbo-frame="modal"
class="white-button md:!px-6"
@click="maybeShowErrorTemplateAlert"
>
<IconUsersPlus
width="20"
class="inline"
/>
<span class="hidden md:inline">
{{ t('send') }}
</span>
</a>
<span <span
v-if="editable" v-if="editable"
id="save_button_container" id="save_button_container"
@ -198,17 +120,6 @@
<span class="whitespace-nowrap">{{ t('save_and_preview') }}</span> <span class="whitespace-nowrap">{{ t('save_and_preview') }}</span>
</a> </a>
</li> </li>
<li>
<a
:href="`/templates/${template.id}/preferences`"
data-turbo-frame="modal"
class="flex space-x-2"
@click="closeDropdown"
>
<IconAdjustments class="w-6 h-6 flex-shrink-0" />
<span class="whitespace-nowrap">{{ t('preferences') }}</span>
</a>
</li>
</ul> </ul>
</div> </div>
</span> </span>

@ -135,33 +135,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 <div
v-else-if="withVerification === false && type == 'verification' && (fieldTypes.length === 0 || fieldTypes.includes(type))" v-else-if="withVerification === false && type == 'verification' && (fieldTypes.length === 0 || fieldTypes.includes(type))"
class="tooltip tooltip-bottom flex tooltip-bottom-start" class="tooltip tooltip-bottom flex tooltip-bottom-start"
@ -206,23 +179,6 @@
</li> </li>
</ul> </ul>
</div> </div>
<div
v-show="fields.length < 4 && editable && withHelp && showTourStartForm"
class="rounded py-2 px-4 w-full border border-dashed border-base-300"
>
<div class="text-center text-sm">
{{ t('start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document') }}
</div>
<div class="flex justify-center">
<label
for="start_tour_button"
class="btn btn-sm btn-warning w-40 mt-2"
@click="startTour"
>
{{ t('start_tour') }}
</label>
</div>
</div>
</template> </template>
<script> <script>

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="text-center text-4xl font-bold"> <div class="text-center text-4xl font-bold">
<%= t('email_has_been_sent') %> <%= t('email_has_been_sent') %>
</div> </div>

@ -4,97 +4,5 @@
<a href="<%= root_path %>" class="text-2xl font-bold items-center flex space-x-2"> <a href="<%= root_path %>" class="text-2xl font-bold items-center flex space-x-2">
<%= render 'shared/title' %> <%= render 'shared/title' %>
</a> </a>
<span class="hidden sm:inline">
<%= render 'shared/github' %>
</span>
</div> </div>
<% if signed_in? %>
<div class="space-x-4 flex items-center">
<% if Docuseal.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">
<%= t('sign_up') %>
</a>
<span class="hidden sm:inline">
<%= render 'shared/github_button' %>
</span>
<% else %>
<div class="flex items-center justify-center space-x-4 mr-1">
<%= render 'shared/navbar_buttons' %>
<%= link_to t('settings'), settings_profile_index_path, class: 'hidden md:inline-flex font-medium text-lg', id: 'account_settings_button' %>
</div>
<% end %>
<div class="dropdown dropdown-end">
<label tabindex="0" class="cursor-pointer bg-base-content text-purple-300 rounded-full p-2 w-9 justify-center flex">
<span class="text-sm align-text-top"><%= current_user.initials %></span>
</label>
<ul tabindex="0" class="z-10 dropdown-content p-2 mt-2 shadow menu text-base bg-base-100 rounded-box min-w-[160px] text-right">
<li>
<%= link_to settings_profile_index_path, class: 'flex items-center' do %>
<%= svg_icon('adjustments', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
<span class="mr-1"><%= t('profile') %></span>
<% end %>
</li>
<% if !Docuseal.demo? && can?(:manage, EncryptedConfig) %>
<li>
<%= link_to Docuseal.multitenant? ? console_redirect_index_path : Docuseal::CONSOLE_URL, data: { prefetch: false }, class: 'flex items-center' do %>
<%= svg_icon('terminal', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
<%= t('console') %>
<% end %>
</li>
<% end %>
<% if can?(:read, EncryptedConfig.new(key: EncryptedConfig::ESIGN_CERTS_KEY, account: current_account)) %>
<li>
<%= link_to settings_esign_path, class: 'flex items-center' do %>
<%= svg_icon('zoom_check', class: 'w-5 h-5 flex-shrink-0 stroke-2') %>
<span class="mr-1 whitespace-nowrap"><%= t('verify_pdf') %></span>
<% end %>
</li>
<% 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?) %>
<%= form_for '', url: testing_account_path, method: current_account.testing? ? :delete : :get, 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">
<%= f.check_box :testing_toggle, class: 'toggle', checked: current_account.testing?, onchange: 'this.form.requestSubmit()', style: 'height: 0.885rem; width: 1.35rem; --handleoffset: 0.395rem; margin-left: -2px; margin-right: 8px' %>
<span class="whitespace-nowrap">
<%= t('test_mode') %>
</span>
</label>
<% end %>
<% end %>
<li>
<%= button_to destroy_user_session_path, method: :delete, data: { turbo: false }, class: 'flex items-center' do %>
<%= svg_icon('logout', class: 'w-5 h-5 flex-shrink-0 stroke-2 mr-2 inline') %>
<span class="mr-1 whitespace-nowrap"><%= t('sign_out') %></span>
<% end %>
</li>
</ul>
</div>
</div>
<% else %>
<div class="flex space-x-2">
<% if request.path != new_user_session_path %>
<%= link_to new_user_session_path({ lang: params[:lang] }.compact_blank), class: 'font-medium text-lg' do %>
<span class="flex items-center justify-center space-x-1">
<%= svg_icon('login', class: 'w-6 h-6') %>
<span><%= t('sign_in') %></span>
</span>
<% end %>
<% end %>
<% if Docuseal.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 %>
<span class="flex items-center justify-center space-x-1">
<span class="hidden sm:block capitalize"><%= t('create_free_account') %></span>
<span class="md:hidden"><%= t('sign_up') %></span>
</span>
<% end %>
<% end %>
</div>
<% end %>
</div> </div>

@ -1,8 +1,4 @@
<%= 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: 'hidden md:inline-flex btn btn-warning btn-sm', data: { prefetch: false } do %>
<%= t('upgrade') %>
<% end %>
<% if signed_in? && current_user != true_user %> <% if signed_in? && current_user != true_user %>
<span class="hidden md:inline-flex h-3 border-r border-base-content"></span> <span class="hidden md:inline-flex h-3 border-r border-base-content"></span>
<%= render 'shared/test_alert' %> <%= render 'shared/test_alert' %>
<% end %> <% end %>
<span class="hidden md:inline-flex h-3 border-r border-base-content"></span>

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

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -4,7 +4,6 @@
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="text-center w-full space-y-6"> <div class="text-center w-full space-y-6">
<%= render 'banner' %>
<p class="text-xl font-semibold text-center"> <p class="text-xl font-semibold text-center">
<%= t('share_link_is_currently_disabled') %> <%= t('share_link_is_currently_disabled') %>
</p> </p>

@ -4,7 +4,6 @@
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="text-center w-full space-y-6"> <div class="text-center w-full space-y-6">
<%= render 'banner' %>
<% unless @template.archived_at? %> <% unless @template.archived_at? %>
<p class="text-xl font-semibold text-center"><%= t('you_have_been_invited_to_submit_a_form') %></p> <p class="text-xl font-semibold text-center"><%= t('you_have_been_invited_to_submit_a_form') %></p>
<% end %> <% end %>

@ -18,10 +18,6 @@
<span class="hidden sm:block"> <span class="hidden sm:block">
<%= render 'templates/upload_button' %> <%= render 'templates/upload_button' %>
</span> </span>
<%= link_to new_template_path, class: 'white-button !border gap-2', data: { turbo_frame: :modal } do %>
<%= svg_icon('plus', class: 'w-6 h-6 stroke-2') %>
<span class="hidden md:block"><%= t('create') %></span>
<% end %>
<% end %> <% end %>
</div> </div>
</div> </div>

@ -2,9 +2,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -1,4 +1,3 @@
<a href="<%= root_path %>" class="mx-auto text-2xl md:text-3xl font-bold items-center flex space-x-3"> <a href="<%= root_path %>" class="mx-auto text-2xl md:text-3xl font-bold items-center flex space-x-3">
<%= render 'shared/logo', class: 'w-9 h-9 md:w-12 md:h-12' %>
<span><%= Docuseal.product_name %></span> <span><%= Docuseal.product_name %></span>
</a> </a>

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -1,9 +1,6 @@
<div class="max-w-md mx-auto px-2 mt-12 mb-4"> <div class="max-w-md mx-auto px-2 mt-12 mb-4">
<div class="space-y-6 mx-auto"> <div class="space-y-6 mx-auto">
<div class="space-y-6"> <div class="space-y-6">
<div class="flex items-center justify-center">
<%= render 'start_form/banner' %>
</div>
<div class="flex items-center bg-base-200 rounded-xl p-4 mb-4"> <div class="flex items-center bg-base-200 rounded-xl p-4 mb-4">
<div class="flex items-center"> <div class="flex items-center">
<div class="mr-3"> <div class="mr-3">

@ -29,10 +29,6 @@
<span class="hidden sm:block"> <span class="hidden sm:block">
<%= render 'templates/upload_button' %> <%= render 'templates/upload_button' %>
</span> </span>
<%= link_to new_template_path, class: 'white-button !border gap-2', data: { turbo_frame: :modal } do %>
<%= svg_icon('plus', class: 'w-6 h-6 stroke-2') %>
<span class="hidden md:block"><%= t('create') %></span>
<% end %>
<% end %> <% end %>
</div> </div>
</div> </div>
@ -61,20 +57,6 @@
<% if user_config.new_record? || user_config.value || params[:tour] == 'true' %> <% if user_config.new_record? || user_config.value || params[:tour] == 'true' %>
<div class="hidden md:block"> <div class="hidden md:block">
<app-tour id="app_tour" data-show-tour="<%= params[:tour] == 'true' || user_config.value %>" data-type="dashboard" data-next-page-path="<%= @templates.first && can?(:edit, @templates.first) ? edit_template_path(@templates.first, params.permit(:tour)) : settings_account_path %>" data-i18n="<%= t('app_tour').to_json %>"></app-tour> <app-tour id="app_tour" data-show-tour="<%= params[:tour] == 'true' || user_config.value %>" data-type="dashboard" data-next-page-path="<%= @templates.first && can?(:edit, @templates.first) ? edit_template_path(@templates.first, params.permit(:tour)) : settings_account_path %>" data-i18n="<%= t('app_tour').to_json %>"></app-tour>
<% if user_config.new_record? && !params.key?(:tour) %>
<div class="h-36 rounded-2xl pt-3 px-7 w-full border border-dashed border-base-300">
<div class="text-xl text-center font-semibold text-base-content">
<%= t('welcome_to_docuseal') %>
</div>
<div class="my-2 text-center text-xs text-base-content/70">
<%= t('start_a_quick_tour_to_learn_how_to_create_an_send_your_first_document') %>
</div>
<div class="flex gap-2 mt-3 w-full">
<%= button_to button_title(title: t('skip'), icon_disabled: svg_icon('loader', class: 'w-4 h-4 animate-spin')), user_configs_path, params: { user_config: { key: UserConfig::SHOW_APP_TOUR, value: false } }, class: 'btn btn-sm btn-outline w-full', form_class: 'flex-1', method: :post, form: { onsubmit: 'window.app_tour.parentNode.remove()' } %>
<%= button_to t('start_tour'), user_configs_path, params: { user_config: { key: UserConfig::SHOW_APP_TOUR, value: true } }, class: 'btn btn-sm btn-warning w-full', form_class: 'flex-1', method: :post, form: { onsubmit: 'window.app_tour.start()' } %>
</div>
</div>
<% end %>
</div> </div>
<% end %> <% end %>
<% end %> <% end %>

@ -398,7 +398,7 @@ en: &en
back_to_active: Back to Active back_to_active: Back to Active
submissions: Submissions submissions: Submissions
templates: Templates templates: Templates
document_templates_html: <span class="hidden md:inline">Document</span> Templates document_templates_html: <span class="hidden md:inline">Upload</span> Documents
archived: Archived archived: Archived
search: Search search: Search
submissions_not_found: Submissions not Found submissions_not_found: Submissions not Found

@ -11,7 +11,7 @@ module.exports = {
secondary: '#ef9fbc', secondary: '#ef9fbc',
accent: '#eeaf3a', accent: '#eeaf3a',
neutral: '#291334', neutral: '#291334',
'base-100': '#faf7f5', 'base-100': '#f2f2f3',
'base-200': '#efeae6', 'base-200': '#efeae6',
'base-300': '#e7e2df', 'base-300': '#e7e2df',
'base-content': '#291334', 'base-content': '#291334',

Loading…
Cancel
Save