Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

OpnForm V2 🚀#1053

Draft
chiragchhatrala wants to merge 110 commits intomainOpnForm/OpnForm:mainfrom
main-v2OpnForm/OpnForm:main-v2Copy head branch name to clipboard
Draft

OpnForm V2 🚀#1053
chiragchhatrala wants to merge 110 commits intomainOpnForm/OpnForm:mainfrom
main-v2OpnForm/OpnForm:main-v2Copy head branch name to clipboard

Conversation

@chiragchhatrala
Copy link
Copy Markdown
Collaborator

No description provided.

chiragchhatrala and others added 30 commits January 3, 2026 18:20
* Add analytics support to forms

- Introduced an 'analytics' field in the UserFormRequest for validation.
- Updated the Form model to include 'analytics' in the fillable and cast attributes.
- Enhanced FormCleaner to handle default analytics settings.
- Created a migration to add an 'analytics' JSON column to the forms table.
- Developed FormAnalyticsScript and FormAnalyticsSettings components for managing analytics configurations.
- Integrated analytics settings into the FormSettingsModal and updated the form page to utilize the analytics script on submission.

This update allows users to integrate various analytics providers, enhancing form performance tracking.

* Enhance analytics tracking configuration in UserFormRequest and related components

- Updated UserFormRequest to enforce regex validation on tracking IDs and adjusted required conditions based on the selected analytics provider.
- Refactored FormAnalyticsScript to dynamically generate script keys using form IDs, ensuring unique identification for each form's analytics scripts.
- Modified FormAnalyticsSettings to clear tracking IDs when the analytics provider is changed, improving user experience.
- Updated index.vue to conditionally render the analytics script component based on the presence of both provider and tracking ID.

These changes improve the robustness and clarity of analytics tracking setup in forms.

* feat: Add form analytics validation and tests

Adds validation and comprehensive tests for form analytics tracking IDs and providers.

Co-authored-by: julien <julien@nahum.net>

* fix: Correct analytics Pro feature gating tests

- Tests now correctly verify that analytics is cleaned when a form is
  publicly accessed by non-pro users (via PublicFormController)
- Form creation for non-pro users stores data but warns about cleaning
- Added test to verify analytics persists in DB for non-pro users
- Tests verify pro users' analytics is preserved in public responses

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: julien <julien@nahum.net>
* Add Input Mask Validation and Support in Form Requests and Components

- Introduced a new `InputMaskRule` for validating input masks in form requests, enhancing data integrity for text fields.
- Updated `AnswerFormRequest` and `UserFormRequest` to include input mask validation rules, allowing for flexible input formats.
- Enhanced `TextInput` component to support input masks, improving user experience with formatted input fields.
- Added `useInputMask` composable for managing input mask logic, ensuring consistent behavior across components.
- Updated `FieldOptions` to allow configuration of input masks for text fields, providing users with more customization options.

These changes aim to improve form handling and user input validation, ensuring that data adheres to specified formats while enhancing the overall user experience in form interactions.

* Fix lint

* Whenever a character is wrong and not allowed, we should just prevent it, not clear the whole input

* show with underscore remaing characters to help the user fill the form

* Create a dedicated MaskInput

* Help link for mask pattern

* Add input mask validation and update help text in FieldOptions component

- Implemented a new method to validate input mask patterns, ensuring only allowed characters (a, 9, *, and common punctuation) are accepted.
- Updated the help text to clarify the format and provide examples for users, improving usability and guidance for input mask patterns.

* update maskinput as per new changes

* mask input option as popover

* MaskInput add support for slotchar

* maskinput only for without multi select

* Apply latest changes to MaskInput

* Refactor input mask handling and validation

- Updated regex patterns in UserFormRequest and InputMaskRule to improve input mask validation.
- Enhanced MaskInput component to utilize getUnmaskedValue for accurate character counting.
- Refactored useInputMask composable to correctly mark tokens as optional and validate mask patterns.
- Improved FieldOptions component by reintroducing input mask pattern help text and examples.

These changes enhance the functionality and user experience of input masks across the application.

* Enhance InputMaskRule and MaskInput component functionality

- Improved InputMaskRule to handle optional mask tokens more effectively, allowing for better validation of input values.
- Updated error messages to escape mask patterns for XSS prevention.
- Enhanced MaskInput component to support pasting formatted values and maintain cursor position during input changes.
- Refactored useInputMask composable to streamline mask validation and formatting processes.

These changes improve the robustness and user experience of input masking across the application.

* Enhance Input Mask Validation and Add Slot Character Support

- Updated InputMaskRule to ensure proper boolean return type for mask pattern validation.
- Introduced 'slot_char' property in TypePropertyValidator for validating single character inputs, disallowing alphanumeric characters.
- Expanded InputMaskRuleTest to include tests for masks with only question marks, ensuring correct validation behavior.
- Refactored MaskInput component to improve handling of input and display values, including new methods for cursor management and character validation.

These changes improve the robustness of input masking and validation logic, enhancing user experience and data integrity.

* Refactor MaskInput and FieldOptions Components for Improved Input Mask Handling

- Updated MaskInput component to accept a function for slot character, enhancing flexibility in input masking.
- Replaced the UPopover component in FieldOptions with a new InputMaskOptions component, streamlining the UI and improving code organization.
- Removed redundant input mask change handling logic from FieldOptions, simplifying the component's setup.

These changes enhance the maintainability and usability of input masking features across the application.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: julien <julien@nahum.net>
* Add versioning support for forms and implement version history functionality

- Introduced a new `Version` model to handle versioning of form data, utilizing the `mpociot/versionable` package for version management.
- Created `VersionController` to manage version retrieval and restoration, allowing users to view and revert to previous versions of forms.
- Added `VersionResource` for formatting version data in API responses.
- Implemented a migration to create the `versions` table for storing version records.
- Updated the `Form` model to support versioning, including configuration for version retention and fields to ignore during versioning.
- Developed a `FormHistory` component in the client to display and manage form version history, enhancing user experience with version control features.
- Updated API routes to include endpoints for version operations, ensuring seamless integration with the frontend.

* Refactor VersionController and Form components for improved version restoration and UI enhancements

- Commented out the version revert functionality in VersionController to prevent unintended behavior during restoration.
- Updated success response to include model data in addition to the success message for better clarity.
- Added 'share_url' field to the Form model for enhanced data management.
- Improved the FormHistory component's UI by adjusting layout and spacing, and added conditional rendering for change tags to provide clearer version information.
- Enhanced the restore functionality to update the form data directly from the response, improving user experience.

* Add accessor for model data array in Version model

- Introduced a new accessor method `getModelDataArrayAttribute` to expose stored snapshot data as an array, improving data handling.
- Removed the private method `getModelData` to streamline the code and avoid redundancy in unserializing model data.

* fix pint

* Update composer.lock to reflect new package addition and content hash change

- Updated content-hash to a new value.
- Added new package 'mpociot/versionable' (version 4.4.5) for Laravel model versioning and restoring, including its dependencies and metadata.

* Improve Form Versions & Restore

* Implement Version on Form Submission

* Add VersionableNestedDiff interface and implement nested diffing in Version model

- Introduced VersionableNestedDiff interface for defining nested diff fields.
- Implemented nested diffing logic in the Version model to compare specified fields.
- Added fetch method in FormSubmissionController to retrieve specific submissions.
- Updated FormSubmission model to implement VersionableNestedDiff and define nested diff fields.
- Enhanced API routes and client-side code to support fetching submission details.

* Fix SubmissionHistory component to use optional chaining for submission ID

* Refactor version restoration logic and enhance version resource response

- Updated VersionController to check if the authenticated user is a Pro user before allowing version restoration.
- Modified VersionResource to handle cases where the user may be null, ensuring graceful handling in the response.
- Added comprehensive tests for form and submission version functionalities, including listing, restoring, and handling permissions for different user types.
- Improved client-side components to conditionally render submission history based on the presence of a submission ID.

* Fix alert usage in FormHistory component for version restoration success message

* fix lint

* Enhance version handling and user display in components

- Limited the number of versions fetched in VersionController to prevent N+1 issues.
- Improved security in FormController by ensuring version retrieval is restricted to the correct form.
- Implemented VersionableNestedDiff interface in Form model for nested diffing.
- Updated SubmissionHistory and FormHistory components to use optional chaining for user display, providing fallback for missing user data.

* Refactor version restoration logic and enhance user data handling

- Updated VersionController to check the current authenticated user's pro status for version restoration.
- Added validation to ensure the version belongs to the correct model, preventing cross-model access.
- Modified VersionResource to handle cases where user data may be missing.
- Improved API route definitions for better clarity and organization.
- Enhanced error handling in SubmissionHistory and FormHistory components for version fetching.

* Refactor user access check in SubmissionHistory component

- Updated the logic in the SubmissionHistory component to use the form's pro status instead of the user data for version restoration checks.
- This change enhances the clarity of the access control mechanism and ensures that the correct pro status is evaluated during submission history restoration.

* Update VersionControllerTest to ensure error message for non-pro user restoration attempts

- Removed unnecessary blank line in the test case for restoring versions.
- This change clarifies the test's intent and maintains consistency in formatting.

* Refactor VersionController and enhance error handling

- Simplified the getModelClass method by removing unnecessary JsonResponse handling and using abort for error responses.
- Improved version ownership verification by checking class existence before fetching the model, preventing potential errors.
- Updated VersionControllerTest to include a new test case ensuring unauthorized users cannot restore versions of forms they do not own.
- Enhanced SubmissionHistory and FormHistory components to manage loading states during version fetching, improving user experience.

* Enhance authorization and error handling in form submission and version restoration

- Added authorization check in FormSubmissionController to ensure users can only view their submissions.
- Updated VersionControllerTest to create user workspaces for pro user validation, ensuring accurate test scenarios.
- Refactored SubmissionHistory and FormHistory components to utilize `useAlert` directly, improving error handling during version restoration and enhancing user feedback on success or failure.

* Refactor FormHistory component and update FormEditorNavbar layout

- Changed tooltip content positioning in FormHistory from 'left' to 'bottom' for improved visibility.
- Updated FormHistory button variant to 'ghost' and icon to 'i-heroicons-clock' for better UI consistency.
- Adjusted layout in FormEditorNavbar to use 'items-center' instead of 'items-stretch' for a more balanced appearance.

These changes enhance the user interface and improve the overall user experience in the form editing components.

* Fix property indexing in FormEditorPreview component for accurate field targeting during editing. Updated the method to use 'id' instead of 'nf_id' for better consistency with the data structure.

* Refactor FormHistory component for improved UI and functionality

- Updated the layout of the FormHistory modal, enhancing the header with a more informative title and description.
- Changed the body structure to use a list format for better readability and organization of version history.
- Improved user interaction by adding a tooltip for time ago display and refining the restore button's appearance.
- Enhanced date formatting and added a new function to display time elapsed since version creation.

These changes enhance the user experience and visual consistency of the FormHistory component.

* Enhance EditSubmissionModal and SubmissionHistory components for improved user experience

- Added SubmissionHistory component to EditSubmissionModal for better context on submission changes.
- Updated layout and styling in SubmissionHistory for improved readability and user interaction.
- Enhanced date formatting and added a 'time ago' feature for version timestamps.
- Provided form size context in both EditSubmissionModal and ViewSubmissionModal for consistent UI presentation.

These changes improve the overall usability and visual consistency of the submission editing and history viewing experience.

* Enhance submission restoration functionality in EditSubmissionModal and SubmissionHistory components

- Added event emission for submission restoration in EditSubmissionModal and ViewSubmissionModal to update parent components.
- Implemented restoration logic in SubmissionHistory to fetch and emit restored submission data, improving user experience during version management.
- Updated component props to include the new 'restored' event, ensuring consistent handling of restored submissions across modals.

These changes enhance the interactivity and responsiveness of the submission editing and history viewing experience.

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
* Add form summary functionality with API integration and UI components

- Introduced `FormSummaryController` to handle summary requests and responses.
- Created `FormSummaryRequest` for validating incoming summary requests.
- Implemented `FormSummaryService` for generating summaries based on form submissions.
- Added new API routes for accessing form summaries and field values.
- Developed UI components for displaying summary data, including various summary types (e.g., distribution, numeric stats, boolean).
- Integrated summary functionality into the existing forms page layout and navigation.

This commit enhances the forms feature by providing detailed insights into submissions, improving user experience and data accessibility.

* fix lint

* Refactor FormSummaryService to load block types from resources and add new blocks configuration

- Updated `FormSummaryService` to load block types from `resource_path` instead of a relative path.
- Introduced a new `blocks_types.json` file containing detailed configurations for various form block types, enhancing the form functionality and customization options.

* remvoe ray

* Refactor FormSummaryService and UI components to support file list summary

- Updated `FormSummaryService` to replace `file_count` with `file_list`, allowing for the accumulation of actual file URLs.
- Modified related UI components to reflect the new file list structure, including the addition of `FileSummary.vue` for displaying uploaded files.
- Adjusted JSON configurations to align with the new summary type definitions.
- Enhanced various summary components to improve user experience and data presentation.

* Refactor FormSummaryController and FormSummaryRequest for improved validation and structure

- Replaced direct request validation in `FormSummaryController` with a dedicated `FormSummaryRequest` for cleaner code and better separation of concerns.
- Added methods in `FormSummaryRequest` to retrieve validated input values, enhancing readability and maintainability.
- Updated `FormSummaryService` to accommodate changes in method signatures and improve data handling.
- Adjusted UI components to reflect the new summary type definitions and removed the obsolete `FileSummary.vue` component.

* Enhance FormSummaryService and TextListSummary component to include submission IDs

- Updated `FormSummaryService` to pass submission IDs alongside text values during accumulation, improving data tracking.
- Modified `accumulateText` method to store submission IDs with text values for better context in summaries.
- Adjusted `TextListSummary.vue` to display submission IDs and ensure proper handling of file and URL links.
- Enhanced UI interactions to reflect the new data structure, improving user experience and data accessibility.

* Enhance form submission caching and summary functionality

- Updated `InvalidateFormSubmissionCache` to utilize `FormSummaryService` for clearing form summary cache upon submission.
- Introduced new methods in `FormSummaryService` to manage cache versioning and clearing, improving data accuracy and performance.
- Added comprehensive tests for form summary functionality, ensuring correct behavior for various submission scenarios and filters.
- Refactored UI components to enhance layout consistency and user experience across summary displays.

* Update VForm component to accept dynamic class binding

- Modified the VForm component to use a prop for dynamic class binding, allowing for greater flexibility in styling.
- Updated FormSummary component to utilize the new formClass prop, enhancing layout customization options for form submissions.

* Refactor MatrixSummary component to improve data presentation

- Updated the MatrixSummary component to display data in a table format, enhancing readability and organization.
- Replaced the previous empty state check with a condition based on row names for better clarity.
- Introduced dynamic column extraction from row distributions, allowing for flexible data representation.
- Added methods for calculating and formatting percentages, improving the visual feedback of data distribution.
- Enhanced cell styling based on percentage values to provide a more intuitive user experience.

* fix lint

* Fix property indexing in FormEditorPreview component for accurate field targeting during editing. Updated the method to use 'id' instead of 'nf_id' for better consistency with the data structure.

* Enhance form summary functionality and UI

- Introduced a new constant in FormSummaryService to limit processed submissions for performance optimization.
- Updated the FormSummary API response to include 'processed_submissions' and 'is_limited' fields for better client-side handling.
- Enhanced the FormSummary component to display processed submission stats and improved loading and empty states.
- Refactored various summary components for better UI consistency and responsiveness, including DateSummary, NumericStatsSummary, and others.
- Improved styling and layout across summary components for a more cohesive user experience.

These changes enhance the performance and usability of the form summary feature, providing users with clearer insights into their submission data.

---------

Co-authored-by: JhumanJ <julien@nahum.net>
* Add select options validation and image handling in form components

- Introduced a new SelectOptionsRule for validating select and multi-select options in UserFormRequest, ensuring options are provided as arrays and meet required criteria.
- Enhanced FlatSelectInput and SelectInput components to support displaying images based on the selected option display mode (text only, text and image, image only).
- Added a new SelectOptionEditor component for managing select options, including image uploads and display settings.
- Updated BlockRenderer and related components to accommodate new option display settings, improving user experience in form interactions.

These changes enhance the flexibility and functionality of select fields, allowing for richer user interactions with form options.

* Enhance FocusedSelectorInput and SelectOptionEditor with image support and display options

- Added image handling capabilities to FocusedSelectorInput, allowing options to display images based on the selected display mode (text only, text and image, image only).
- Introduced new props for option display mode and image size in FocusedSelectorInput to customize the rendering of options.
- Updated SelectOptionEditor to include a smaller button size for adding options, improving the UI consistency.

These changes improve the visual representation of options in forms, enhancing user interaction and experience.

* Fix property indexing in FormEditorPreview component for accurate field targeting during editing. Updated the method to use 'id' instead of 'nf_id' for better consistency with the data structure.

* Refactor SelectOptionEditor component for improved option management

- Replaced FlatSelectInput with OptionSelectorInput for better clarity in option display mode selection.
- Updated option structure to use 'label' for display names, enhancing consistency.
- Implemented unique default name generation for new options, ensuring no duplicates when adding options.

These changes enhance the user experience and maintainability of the SelectOptionEditor component.

* Refactor form components for improved layout and functionality

- Adjusted positioning and styling in FlatSelectInput and FocusedSelectorInput for better visual alignment and responsiveness.
- Updated SelectInput to standardize image size classes, enhancing consistency across components.
- Enhanced ImageInput to support a compact mode, improving usability in space-constrained layouts.
- Refined SelectOptionEditor to improve option management and layout, ensuring a more intuitive user experience.

These changes collectively enhance the user interface and maintainability of the form components.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: julien <julien@nahum.net>
* Refactor RichTextAreaInput and BlockRenderer components to enhance mention functionality

- Updated `RichTextAreaInput.client.vue` to ensure the mention format is included when mentions are enabled.
- Modified `BlockRenderer.vue` to debounce form data changes and process mentions in placeholders and help text.
- Enhanced `FieldOptions.vue` and `BlockOptions.vue` to support mentions in input fields.
- Added a new `MentionInput` component for better mention handling in placeholders.

This improves the user experience by ensuring mentions are processed correctly across various components.

* Refactor TextBlock and BlockRenderer components to improve mention processing

- Updated `TextBlock.vue` to use a reactive reference for processed content and added a watcher for dynamic updates based on props.
- Modified `BlockRenderer.vue` to make the `processMention` function asynchronous and implemented watchers for processing mentions in placeholders and help text.

These changes enhance the handling of mentions, ensuring they are processed correctly and efficiently across components.

* Implement caching for FormSubmissionFormatter instances and clear cache on form unmount

- Added a singleton cache for FormSubmissionFormatter instances to optimize performance by reusing formatters based on form slugs.
- Introduced `getCachedFormatter` to retrieve or create cached formatters, and `clearFormatterCache` to manage cache clearing when navigating away from forms.
- Updated `useParseMention` to utilize the cached formatter, enhancing efficiency.
- Ensured cache is cleared in `OpenCompleteForm.vue` on component unmount to prevent memory leaks.

These changes improve the performance and memory management of form submissions.

* Refactor processMention function to remove async/await and improve performance

- Changed the processMention function to a synchronous implementation, eliminating unnecessary async/await usage.
- Updated the watch function to reflect the synchronous nature of processMention, enhancing performance by reducing overhead.

These changes streamline the mention processing logic and improve the efficiency of the BlockRenderer component.

* feat: Add computed variables to forms

Co-authored-by: julien <julien@nahum.net>

* Checkpoint before follow-up message

Co-authored-by: julien <julien@nahum.net>

* feat: Implement computed variables and formula evaluation

This commit introduces computed variables and the underlying formula evaluation logic. It includes:

- **Client-side:**
  - Formula parsing, lexing, and evaluation components.
  - Dependency graph for ordered evaluation.
  - Validation for formulas and field references.
  - Vue composable for managing computed variables.
- **API-side:**
  - Unit and integration tests for computed variables and formula evaluation.
  - Logic for storing and retrieving computed variables in forms.
  - Integration with mention parsing and form logic conditions.

Co-authored-by: julien <julien@nahum.net>

* Refactor: Improve mention parsing and formatter caching

Co-authored-by: julien <julien@nahum.net>

* Add computed variables feature documentation

Co-authored-by: julien <julien@nahum.net>

* Refactor: Improve formula editor and function reference UI

Co-authored-by: julien <julien@nahum.net>

* Refactor: Implement live preview for computed variables

This commit introduces a new composable `useFormEditorPreviewData` to share form preview data between the `FormEditorPreview` component and the `ComputedVariableModal`. This allows computed variables to display live results based on the form preview, enhancing the user experience.

The changes include:

- **`useFormEditorPreviewData.js`**: A new composable that manages and provides access to form preview data and the form manager.
- **`FormEditorPreview.vue`**: Updated to use the new composable to set and clear preview data, and to watch for changes in form data and the form manager.
- **`ComputedVariableModal.vue`**: Modified to utilize the `useFormEditorPreviewData` composable to fetch live preview data for computed variable calculations and to display appropriate messages indicating whether live or sample data is being used.
- **`FormulaEditor.vue`**: Refactored the `toDisplayFormat` function to use a new `tokenizeFormula` helper. This improves the robustness and safety of syntax highlighting by tokenizing the formula before applying styling, preventing potential HTML corruption. The highlighting logic is now more granular and handles various token types (fields, functions, strings, numbers, operators) more effectively.

These changes collectively improve the accuracy and usability of computed variables by enabling live preview functionality and enhancing the formula editor's rendering.

Co-authored-by: julien <julien@nahum.net>

* Refactor computed variable modal and formula editor UI

Co-authored-by: julien <julien@nahum.net>

* Refactor computed variable modal and formula editor styling

Co-authored-by: julien <julien@nahum.net>

* Refactor: Improve computed variable field ID handling

Co-authored-by: julien <julien@nahum.net>

* Refactor: Update modal UI configuration for computed variables

Changed the modal's UI property from `width` to `content` to enhance layout management in the ComputedVariableModal component.

* Refactor computed variable formula handling

Co-authored-by: julien <julien@nahum.net>

* Implement computed variables validation and enhance formula engine

This commit introduces a new validation rule for computed variables, ensuring their structure, formula syntax, field references, and circular dependencies are checked. The `ComputedVariablesRule` class is added to handle this validation efficiently.

Additionally, the formula engine is enhanced with new array functions (COUNT, ISEMPTY, CONTAINS, JOIN) to support more complex computations. The parser and validator are updated to provide better error messages and handle function argument requirements.

Changes include:
- New `ComputedVariablesRule` for validating computed variables.
- Added array functions to the formula engine.
- Improved error handling in the parser for unexpected tokens.
- Updates to the formula validator to enforce function argument requirements.

These enhancements improve the robustness and usability of computed variables in the application.

* Refactor: Improve error message formatting in ComputedVariablesRule and clean up imports in validator.js

This commit enhances the error messages in the ComputedVariablesRule class by ensuring consistent spacing in the output. Additionally, it removes an unused import in the validator.js file, streamlining the codebase. These changes contribute to better readability and maintainability of the code.

* Refactor: Enhance mention parsing and improve SSR handling

- Introduced a computeProcessedContent function to streamline the initial processing of content, reducing flash of unprocessed content.
- Updated useParseMention to handle server-side rendering (SSR) more effectively by returning original content during SSR to prevent hydration mismatches.
- Improved handling of empty and falsy values in mention parsing, ensuring better user experience and data integrity.
- Enhanced unit tests for useParseMention to cover various edge cases, including handling of numeric, boolean, and special character values.

These changes optimize the mention parsing logic and improve the overall performance and reliability of the component.

* Refactor delete confirmation in ComputedVariableCard component to use useAlert for improved user interaction. This change enhances the confirmation dialog experience when deleting a variable.

* Add code review and documentation guidelines

- Introduced a Code Review Checklist to ensure consistent quality and security practices in code reviews.
- Added a change-documentation mode to facilitate concise documentation of code changes.
- Updated front-end rules to enhance code style and structure guidelines.
- Enhanced billing-related API routes and components for improved user experience.
- Implemented new features and optimizations across various components, including form handling and submission summaries.

These changes aim to improve code quality, documentation practices, and user interactions within the application.

* Refactor FormulaTestPanel and FormSettingsModal components for improved functionality and UI

- Updated FormulaTestPanel to use a stable form manager instance and introduced a new reactive property, formManagerReady, to manage form readiness state.
- Enhanced the configuration update process by directly watching testFormConfig for changes, ensuring more responsive form behavior.
- Reorganized FormSettingsModal to swap the positions of the Variables and Analytics settings pages, improving the logical flow of settings navigation.

These changes enhance the user experience and maintainability of the form components.

* Refactor error handling in Evaluator class to use Throwable instead of Exception

- Updated catch blocks in the Evaluator class to handle Throwable, improving error handling robustness.
- Removed redundant normalizeFormula function from ComputedVariableModal.vue, streamlining the code and utilizing the imported normalizeFormula function instead.

These changes enhance error management and code clarity in the formula evaluation process.

* Implement sync check in CI/CD workflow and enhance error handling in formula validation

- Added a new job in the CI/CD workflow to verify that shared files between the client and API are in sync, providing clear error messages if discrepancies are found.
- Updated error handling in the Validator class to catch Throwable instead of Exception, improving robustness.
- Enhanced the FunctionRegistry to gracefully handle errors during function calls, ensuring stability in formula evaluations.
- Updated integrations.json to include new help page slugs for better user guidance.

These changes improve the reliability of the CI/CD process and enhance error management in formula handling.

---------

Co-authored-by: Chirag Chhatrala <chirag.chhatrala@gmail.com>
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
* Add OpnForm SDK for enhanced form interaction and communication

- Introduced the OpnForm SDK to facilitate programmatic interaction with embedded forms, enabling event callbacks and methods like setField() and toggleDarkMode().
- Implemented a new SDK bridge in useSdkBridge.js for communication between the form iframe and the parent window, handling events such as submit, error, and data changes.
- Updated OpenCompleteForm.vue to integrate the SDK, emitting events during form submission and reset processes.
- Enhanced EmbedCode.vue to provide updated embed code with SDK support, ensuring backward compatibility while promoting new features.

These changes significantly improve the flexibility and control over embedded forms, enhancing user experience and developer capabilities.

* Enhance JavaScript SDK documentation and improve dark mode handling

- Added a new documentation file for the JavaScript SDK, detailing installation, usage, events, and methods for programmatic interaction with embedded forms.
- Updated the `useSdkBridge.js` to streamline dark mode handling by removing unnecessary variable assignments, improving code clarity and efficiency.
- Included the new JavaScript SDK documentation in the main documentation index for better accessibility.

These changes enhance the developer experience by providing comprehensive guidance on using the SDK and optimizing the underlying code for dark mode functionality.

* Disable ESLint for useSdkBridge.js to prevent linting errors during development. This change allows for more flexibility in code modifications while working on the SDK bridge functionality.

* Disable ESLint for OpnForm SDK files to prevent linting errors, allowing for smoother development and code modifications. This change applies to both opnform-sdk.js and its minified version.

* Refactor EmbedCode component and enhance share page layout

- Simplified the EmbedCode.vue component by removing the alert section, focusing on the copy functionality for the embed code.
- Improved the layout of the share.vue page by adding a button for SDK documentation alongside the embed form title, enhancing user experience and accessibility to resources.

These changes streamline the embed code presentation and provide better guidance for users integrating the SDK.

* Update SDK documentation links in EmbedCode and share components

- Changed the documentation link in EmbedCode.vue to point to the correct JavaScript SDK page.
- Updated the share.vue component to simplify the SDK documentation link, removing unnecessary anchors for improved clarity.

These updates ensure users have direct access to the relevant SDK documentation, enhancing the overall user experience.

* Refactor FormSummaryService and update EmbedCode component for improved functionality

- Removed the `processAllFields` method from `FormSummaryService.php` to streamline field processing logic.
- Updated the `embedCode` computed property in `EmbedCode.vue` to enhance embed functionality with auto-resizing support and improved script loading.
- Changed the documentation link in `share.vue` to point to the correct embedding SDK page, ensuring users access the right resources.
- Added a new section in `docs.json` for embedding documentation, reflecting the updated structure and improving user guidance.

---------

Co-authored-by: JhumanJ <julien@nahum.net>
- Added a new documentation file for the JavaScript SDK, detailing installation, usage, events, and methods for programmatic interaction with embedded forms.
- Updated the `useSdkBridge.js` to streamline dark mode handling by removing unnecessary variable assignments, improving code clarity and efficiency.
- Included the new JavaScript SDK documentation in the main documentation index for better accessibility.

These changes enhance the developer experience by providing comprehensive guidance on using the SDK and optimizing the underlying code for dark mode functionality.
- Changed the documentation link in EmbedCode.vue to point to the correct JavaScript SDK page.
- Updated the share.vue component to simplify the SDK documentation link, removing unnecessary anchors for improved clarity.

These updates ensure users have direct access to the relevant SDK documentation, enhancing the overall user experience.
- Updated FormCustomCode.vue and CustomCode.vue to include a new "SDK Docs" button, providing direct access to the SDK documentation for users adding custom code.
- Expanded the SDK functionality in useSdkBridge.js to support local SDK operations without iframes, enabling better integration for custom code.
- Introduced a new opnform-local.js file to serve as a stub for the local SDK, allowing early access to SDK features on form pages.
- Enhanced documentation to include detailed instructions for using the SDK with custom code, improving developer guidance and accessibility.

These changes significantly improve the user experience for developers integrating custom code, ensuring they have the necessary resources and support for effective implementation.
- Removed unnecessary semicolons and standardized code formatting for better readability.
- Simplified function definitions and streamlined event listener management within the OpnForm SDK stub.
- Enhanced overall code clarity while maintaining existing functionality.

These changes contribute to a cleaner codebase, making it easier for developers to work with the OpnForm SDK.
- Introduced a new function, toPlainObject, to deep clone reactive objects and convert them to plain objects. This is necessary for proper serialization when using postMessage, as structured clone cannot handle Proxies.
- Updated payload handling in event and response messages to utilize the new cloning function, ensuring data integrity when sending messages between the iframe and parent window.

These changes enhance the reliability of data transmission within the OpnForm SDK, improving overall functionality and developer experience.
…nd accessibility

- Enhanced the code review checklist with instructions for fetching diffs from GitHub PRs and reviewing branches.
- Updated links in FormCustomCode.vue, CustomCode.vue, and EmbedCode.vue to direct users to the correct JavaScript SDK documentation.
- Removed outdated JavaScript SDK documentation file to streamline resources and avoid confusion.
- Revised embedding documentation to clarify custom code integration and provide examples for better user guidance.

These changes improve the developer experience by ensuring accurate documentation and clear instructions for code reviews.
- Introduced the OpnForm SDK to facilitate programmatic interaction with embedded forms, enabling event callbacks and methods like setField() and toggleDarkMode().
- Implemented a new SDK bridge in useSdkBridge.js for communication between the form iframe and the parent window, handling events such as submit, error, and data changes.
- Updated OpenCompleteForm.vue to integrate the SDK, emitting events during form submission and reset processes.
- Enhanced EmbedCode.vue to provide updated embed code with SDK support, ensuring backward compatibility while promoting new features.

These changes significantly improve the flexibility and control over embedded forms, enhancing user experience and developer capabilities.
- Added a new documentation file for the JavaScript SDK, detailing installation, usage, events, and methods for programmatic interaction with embedded forms.
- Updated the `useSdkBridge.js` to streamline dark mode handling by removing unnecessary variable assignments, improving code clarity and efficiency.
- Included the new JavaScript SDK documentation in the main documentation index for better accessibility.

These changes enhance the developer experience by providing comprehensive guidance on using the SDK and optimizing the underlying code for dark mode functionality.
- Simplified the EmbedCode.vue component by removing the alert section, focusing on the copy functionality for the embed code.
- Improved the layout of the share.vue page by adding a button for SDK documentation alongside the embed form title, enhancing user experience and accessibility to resources.

These changes streamline the embed code presentation and provide better guidance for users integrating the SDK.
Made-with: Cursor

# Conflicts:
#	api/app/Rules/PropertyValidators/TypePropertyValidator.php
#	api/app/Service/Forms/FormLogicConditionChecker.php
#	api/composer.lock
#	client/components/open/forms/BlockRenderer.vue
- Introduced PDF generation capabilities with a new PdfGenerateController and PdfTemplateController for managing PDF templates.
- Added PdfCacheService and PdfGeneratorService to handle PDF creation and caching.
- Implemented PDF download functionality in forms, allowing users to download PDFs of their submissions.
- Enhanced form model to include fields for PDF download settings and integration.
- Created migration for pdf_templates table and updated forms table to support new PDF features.
- Integrated PDF functionality into the client-side, including UI components for PDF downloads and template management.

These changes significantly enhance the form capabilities by allowing users to generate and manage PDFs, improving overall user experience and functionality.
- Introduced PdfNotSupportedException to handle unsupported PDF formats during generation and validation.
- Updated PdfGenerateController and PdfTemplateController to catch PdfNotSupportedException and return appropriate error responses.
- Enhanced PDF generation logic in PdfGeneratorService to throw exceptions for unsupported PDFs.
- Improved client-side components to ensure proper handling of PDF integration actions and error messages.

These changes enhance the robustness of PDF handling, providing clearer feedback to users when unsupported formats are encountered.
- Removed the 'type' field from zone mappings in PdfIntegration validation rules to simplify configuration.
- Updated PdfGeneratorService to auto-detect content type (text or image) based on the provided value, improving PDF generation logic.
- Refactored PdfZoneEditor component to streamline the UI by removing the type selection dropdown, enhancing user experience.
- Added comprehensive tests for PdfCacheService, PdfGeneratorService, and PDF template management to ensure robust functionality and error handling.

These changes improve the overall efficiency and usability of the PDF integration features, providing a more intuitive interface for users.
- Introduced a new method in PdfGeneratorService to retrieve image content from both external URLs and internal storage, improving flexibility in image handling.
- Updated the addImageToZone method to create temporary image files with the correct extension, ensuring compatibility with various image types.
- Modified getFormattedSubmissionData to retain raw filenames for file and signature fields, enhancing direct access to stored files.

These changes improve the PDF generation process by allowing for more robust image management and better handling of submission data.
- Introduced a new method in PdfGeneratorService to fetch external images with validation against SSRF attacks, ensuring only safe URLs are processed.
- Updated existing image handling logic to include detailed logging for failures when adding images from both external sources and storage.
- Refactored the getImageContent method to utilize the new fetchExternalImage method, improving code clarity and security.

These changes enhance the robustness of PDF generation by ensuring safer image handling and better error tracking.
- Added a locking mechanism in PdfCacheService to prevent concurrent PDF generation, ensuring only one request generates a PDF at a time.
- Introduced a method in PdfGeneratorService to block private IP addresses, enhancing security against SSRF attacks.
- Added comprehensive tests for the new IP blocking functionality and validation of external image fetching.

These changes improve the robustness and security of the PDF generation process, preventing potential vulnerabilities and ensuring efficient caching.
aasimdev and others added 30 commits March 17, 2026 16:06
…Integration, LiveDemo,TrustedTeams, enterprice, and index file.
… Pricing, Enterprise, Industry and Comparison pages.
Remove the footer's decorative raster background in favor of a lightweight CSS grid overlay. This keeps the visual structure users wanted while avoiding the oversized unused image path and simplifying the footer styling.
Normalize semicolon style across the files included in the design branch so the client lint job passes again. This also removes a few dead references left behind by commented UI blocks that eslint flagged as unused.
* Refactor landing page as per V2 design

* Opnform vs Typeform, enterprise, Testimonials, and landing page improvements as per V2 design

* Fix missing newline at end of integrations.json file to comply with formatting standards.

* Pricing, Industry, Feature Comparision pages as per V2 design

* improve footer as per new V2 design

* improve landing page UI

* improve V2 landing page as per final UI

* improve V2 pages as per final UI

* improve V2 pages as per final UI

* Improve new design V2

* Improve new design V2

* remove extra pricing component

* New Pricing changes

* New Pricing changes

* update testcase for new pricing

* update testcase

* New Pricing changes

* New Pricing changes

* Version restore as business plan

* Version restore as business plan

* update testcase

* SSO now enterprise plan

* fix testcase

* New Pricing changes

* Fix formatting in summary.vue for subscription message

* tariq commit

* tariq commit

* Pixel perfecting the enterprise, pricing, Features, OpenFormFooter, and TemplatesSlider

* Pixel perfecting the Integration and Testimonial section across different pages

* Pixel Perfecting the Navbar, OpenFormFooter, Features, MoreFeatures, Integration, LiveDemo,TrustedTeams, enterprice, and index file.

* Pixel Perfecting, left aligning, and fixing blury images in the Home, Pricing, Enterprise, Industry and Comparison pages.

* Refactor PdfEditorNavbar component to replace ProTag with PlanTag

- Updated the PdfEditorNavbar.vue to change the tag from ProTag to PlanTag, aligning with the new pricing structure.
- Adjusted the import statement accordingly to reflect the component name change.

These changes enhance the clarity and consistency of the PDF editor's user interface.

* Refactor plan handling and feature access across the application

- Removed the legacy `RequireProPlan` middleware and replaced it with a more flexible `RequirePlan` middleware that checks for the required tier based on workspace context.
- Updated various controllers and services to utilize the new tier-checking logic, ensuring that feature access is correctly gated based on the workspace's plan.
- Enhanced error responses to include required and current tier information for better user feedback.
- Introduced a new method in the `Workspace` model to check if the workspace meets the required tier for specific features.
- Adjusted tests to reflect the changes in plan requirements and feature access logic.

These changes improve the clarity and maintainability of plan-related logic throughout the application.

* Refactor subscription handling and improve user model

- Updated the `User` model to replace the `hasActiveDefaultSubscription` method with `hasActivePaidSubscription`, which checks for any active paid subscriptions.
- Adjusted the `Workspace` model to maintain consistent subscription filtering.
- Modified tests to use string literals for subscription names instead of constants for better clarity.
- Renamed `ProTag` to `PlanTag` in the EmailIntegration component for improved semantic clarity.

These changes enhance the subscription management logic and improve code readability across the application.

* Update version restoration test to reflect new error handling

- Changed the expected status code for unauthorized version restoration from 403 to 402.
- Updated the response assertion to include the required tier information for better clarity in error messages.

These modifications enhance the accuracy of the test cases related to version restoration and improve user feedback on subscription requirements.

* Enhance plan tier handling and feature access across the application

- Added `plan_tier` to the `FormResource` to provide workspace plan information.
- Updated various components to utilize `plan_tier` for feature access checks, replacing previous `is_pro` checks.
- Introduced a new `requireFeature` method in `usePlanFeatures` to streamline feature access validation and prompt subscription upgrades when necessary.
- Improved error handling and user feedback for features requiring specific plan tiers.

These changes improve the clarity and maintainability of plan-related logic and enhance user experience by providing accurate subscription requirements.

* Refactor plan features and pricing display for improved clarity

- Updated the `plans.php` configuration to better categorize features under 'PRO' and 'BUSINESS' tiers.
- Modified the `FeatureComparison.vue` component to reflect accurate file upload limits and integration statuses.
- Enhanced the `SubscriptionModal.vue` to utilize a computed property for selected plan pricing, improving clarity in pricing display.
- Cleaned up the `usePlanFeatures.js` by removing fallback pricing and features, relying on the manifest for accurate data.

These changes streamline the feature access logic and enhance the user interface for plan comparisons and subscription details.

* Refactor plan features handling by removing form features

- Eliminated the `form_features` from the plan manifest response in the API.
- Removed related functions and logic from `usePlanFeatures.js`, simplifying feature access checks.
- Updated the `getRequiredTier` function to rely solely on standard features.

These changes streamline the feature management process and enhance code clarity by focusing on core plan features.

* Update plan tiers configuration and simplify API response structure

- Added 'price_yearly_per_month' to each plan tier in the configuration for clearer pricing options.
- Simplified the API response for the '/plan-manifest' route to return the complete tier information directly.
- Refactored the `usePlanFeatures.js` to utilize the new tier structure, enhancing clarity in tier access and pricing retrieval.

These changes improve the pricing model and streamline the handling of plan features across the application.

* Refactor pricing display and plan features integration

- Updated the `FeatureComparison.vue` component to dynamically retrieve plan labels and prices using the `getTierDisplayName` and `getPlanPrice` functions.
- Simplified the pricing structure by utilizing computed properties for plan data, enhancing clarity and maintainability.
- Adjusted the `pricing.vue` component to reflect the new plan features structure, ensuring accurate display of plan details and features.

These changes improve the user interface for pricing comparisons and streamline the integration of plan features across the application.

* Remove nonprofit and student discount section from pricing page; add FAQ entry for discount eligibility. This update streamlines the pricing display while ensuring users can still find information about available discounts.

* Refactor pricing permissions and billing access

* Enhance feature access logic in PlanAccessService

- Updated the `hasFormFeature` method to include checks for feature overrides in workspaces, improving accuracy in feature access validation.
- Refactored the `getFeatures` method to merge workspace and form features more efficiently, ensuring no overlap in free workspace payloads.
- Added a new test case to verify that free workspaces do not have access to paid features, enhancing test coverage for feature access logic.

These changes improve the clarity and reliability of feature access management in the billing service.

* Refactor UI components for improved layout and accessibility

- Adjusted the `Navbar.vue` component to enhance spacing and visibility of navigation links across different screen sizes.
- Updated `UpgradeBanner.vue` to ensure proper formatting and consistency in script tags.
- Enhanced `FormHistory.vue` with a dynamic tooltip for better user feedback based on loading state.
- Improved `PasswordStrengthIndicator.vue` regex for password validation to include additional special characters.
- Refined `MonthlyYearlySelector.vue` for better user interaction and visual feedback on billing options.
- Streamlined `SubscriptionModal.vue` layout for clearer presentation of upgrade options and improved user experience.
- Enhanced `Testimonials.vue` with dynamic styling and additional review links for better engagement.
- Updated `Oidc.vue` to remove unnecessary whitespace for cleaner code.
- Refactored `checkout.vue` and `error.vue` to improve checkout flow and user alerts.

These changes enhance the overall user interface and experience across various components, ensuring better accessibility and clarity.

* Refactor pricing and feature display for improved layout and clarity

- Updated `FeatureComparison.vue` to enhance table structure and styling for better responsiveness and readability.
- Simplified the pricing display logic in `pricing.vue` by removing unnecessary suffixes for plan prices.
- Enhanced `Features.vue` with a new desktop layout for better feature presentation and user engagement.

These changes improve the overall user experience and visual consistency across pricing and feature components.

* fix pricing source and feature gating

Move displayed plan pricing to a backend-backed catalog and tighten feature access checks so unknown keys fail closed. This keeps pricing aligned with the server source of truth and closes gaps introduced by the new permissions model.

* Refactor exception handling and improve health check logic

- Updated `PdfNotSupportedException` to allow nullable message parameter for better flexibility in error handling.
- Refactored `HealthCheckController` to utilize the Redis factory for connection checks, enhancing reliability in health status reporting.
- Modified `UserInvite` model to accept nullable `validUntil` parameter, improving data handling.
- Adjusted `Version` model's `diff` method to accept nullable `againstVersion` parameter for better compatibility.
- Cleaned up `TemplatesSlider.vue` by removing unused mounted lifecycle hook.
- Simplified `usePlanCatalog` by initializing the catalog with an empty tiers object, improving clarity.
- Enhanced integration page to conditionally display fallback content based on availability, improving user experience.

* Align pricing page CTAs with upgrade flows

Update pricing CTAs so hosted paid plans use upgrade language when they lead into checkout, and remove self-hosted card buttons that should not present actions.

* Update OpenFormFooter links, enhance layout in Integrations and MoreFeatures, and refactor login and register pages for improved design and functionality

* Add Playwright E2E coverage and CI gating

Add a Docker-backed Playwright E2E stack, cover key auth and form flows, and run the suite before deploy in GitHub Actions. This also adds stable UI selectors and switches the E2E throttle bypass to an app environment-based flow.

* Fix E2E API readiness check

Avoid using a database-dependent HTTP route to detect API readiness in the E2E bootstrap. Wait for artisan to become available instead so CI does not fail while the container is still migrating.

* Track E2E client environment in CI

* Harden E2E auth readiness checks

* Update component styles and replace static elements with dynamic links

- Adjusted border-radius values in Integrations, LiveDemo, and MoreFeatures components for a more modern design.
- Replaced a static div with a NuxtLink in the index page to improve navigation to the enterprise section.
- Updated button visibility based on feature flags for better user experience.
- Modified several image assets in the welcome section to enhance visual content.

* Update OpenFormFooter links, adjust Testimonials layout, refine industry page styles, and modify pricing button label for improved user experience

* Refactor Typeform icon usage and add SVG asset

- Replaced UIcon components with Icon components for Typeform throughout the opnform-vs-typeform.vue file.
- Introduced a new SVG file for the Typeform icon to enhance visual consistency and maintainability.

---------

Co-authored-by: aasimdev <aasimdev0@gmail.com>
Co-authored-by: Julien Nahum <julien@nahum.net>
* Refactor landing page as per V2 design

* Opnform vs Typeform, enterprise, Testimonials, and landing page improvements as per V2 design

* Fix missing newline at end of integrations.json file to comply with formatting standards.

* Pricing, Industry, Feature Comparision pages as per V2 design

* improve footer as per new V2 design

* improve landing page UI

* improve V2 landing page as per final UI

* improve V2 pages as per final UI

* improve V2 pages as per final UI

* Improve new design V2

* Improve new design V2

* remove extra pricing component

* New Pricing changes

* New Pricing changes

* update testcase for new pricing

* update testcase

* New Pricing changes

* New Pricing changes

* Version restore as business plan

* Version restore as business plan

* update testcase

* SSO now enterprise plan

* fix testcase

* New Pricing changes

* Fix formatting in summary.vue for subscription message

* Refactor PdfEditorNavbar component to replace ProTag with PlanTag

- Updated the PdfEditorNavbar.vue to change the tag from ProTag to PlanTag, aligning with the new pricing structure.
- Adjusted the import statement accordingly to reflect the component name change.

These changes enhance the clarity and consistency of the PDF editor's user interface.

* Refactor plan handling and feature access across the application

- Removed the legacy `RequireProPlan` middleware and replaced it with a more flexible `RequirePlan` middleware that checks for the required tier based on workspace context.
- Updated various controllers and services to utilize the new tier-checking logic, ensuring that feature access is correctly gated based on the workspace's plan.
- Enhanced error responses to include required and current tier information for better user feedback.
- Introduced a new method in the `Workspace` model to check if the workspace meets the required tier for specific features.
- Adjusted tests to reflect the changes in plan requirements and feature access logic.

These changes improve the clarity and maintainability of plan-related logic throughout the application.

* Refactor subscription handling and improve user model

- Updated the `User` model to replace the `hasActiveDefaultSubscription` method with `hasActivePaidSubscription`, which checks for any active paid subscriptions.
- Adjusted the `Workspace` model to maintain consistent subscription filtering.
- Modified tests to use string literals for subscription names instead of constants for better clarity.
- Renamed `ProTag` to `PlanTag` in the EmailIntegration component for improved semantic clarity.

These changes enhance the subscription management logic and improve code readability across the application.

* Update version restoration test to reflect new error handling

- Changed the expected status code for unauthorized version restoration from 403 to 402.
- Updated the response assertion to include the required tier information for better clarity in error messages.

These modifications enhance the accuracy of the test cases related to version restoration and improve user feedback on subscription requirements.

* Enhance plan tier handling and feature access across the application

- Added `plan_tier` to the `FormResource` to provide workspace plan information.
- Updated various components to utilize `plan_tier` for feature access checks, replacing previous `is_pro` checks.
- Introduced a new `requireFeature` method in `usePlanFeatures` to streamline feature access validation and prompt subscription upgrades when necessary.
- Improved error handling and user feedback for features requiring specific plan tiers.

These changes improve the clarity and maintainability of plan-related logic and enhance user experience by providing accurate subscription requirements.

* Refactor plan features and pricing display for improved clarity

- Updated the `plans.php` configuration to better categorize features under 'PRO' and 'BUSINESS' tiers.
- Modified the `FeatureComparison.vue` component to reflect accurate file upload limits and integration statuses.
- Enhanced the `SubscriptionModal.vue` to utilize a computed property for selected plan pricing, improving clarity in pricing display.
- Cleaned up the `usePlanFeatures.js` by removing fallback pricing and features, relying on the manifest for accurate data.

These changes streamline the feature access logic and enhance the user interface for plan comparisons and subscription details.

* Refactor plan features handling by removing form features

- Eliminated the `form_features` from the plan manifest response in the API.
- Removed related functions and logic from `usePlanFeatures.js`, simplifying feature access checks.
- Updated the `getRequiredTier` function to rely solely on standard features.

These changes streamline the feature management process and enhance code clarity by focusing on core plan features.

* Update plan tiers configuration and simplify API response structure

- Added 'price_yearly_per_month' to each plan tier in the configuration for clearer pricing options.
- Simplified the API response for the '/plan-manifest' route to return the complete tier information directly.
- Refactored the `usePlanFeatures.js` to utilize the new tier structure, enhancing clarity in tier access and pricing retrieval.

These changes improve the pricing model and streamline the handling of plan features across the application.

* Refactor pricing display and plan features integration

- Updated the `FeatureComparison.vue` component to dynamically retrieve plan labels and prices using the `getTierDisplayName` and `getPlanPrice` functions.
- Simplified the pricing structure by utilizing computed properties for plan data, enhancing clarity and maintainability.
- Adjusted the `pricing.vue` component to reflect the new plan features structure, ensuring accurate display of plan details and features.

These changes improve the user interface for pricing comparisons and streamline the integration of plan features across the application.

* Remove nonprofit and student discount section from pricing page; add FAQ entry for discount eligibility. This update streamlines the pricing display while ensuring users can still find information about available discounts.

* Refactor pricing permissions and billing access

* Enhance feature access logic in PlanAccessService

- Updated the `hasFormFeature` method to include checks for feature overrides in workspaces, improving accuracy in feature access validation.
- Refactored the `getFeatures` method to merge workspace and form features more efficiently, ensuring no overlap in free workspace payloads.
- Added a new test case to verify that free workspaces do not have access to paid features, enhancing test coverage for feature access logic.

These changes improve the clarity and reliability of feature access management in the billing service.

* Refactor UI components for improved layout and accessibility

- Adjusted the `Navbar.vue` component to enhance spacing and visibility of navigation links across different screen sizes.
- Updated `UpgradeBanner.vue` to ensure proper formatting and consistency in script tags.
- Enhanced `FormHistory.vue` with a dynamic tooltip for better user feedback based on loading state.
- Improved `PasswordStrengthIndicator.vue` regex for password validation to include additional special characters.
- Refined `MonthlyYearlySelector.vue` for better user interaction and visual feedback on billing options.
- Streamlined `SubscriptionModal.vue` layout for clearer presentation of upgrade options and improved user experience.
- Enhanced `Testimonials.vue` with dynamic styling and additional review links for better engagement.
- Updated `Oidc.vue` to remove unnecessary whitespace for cleaner code.
- Refactored `checkout.vue` and `error.vue` to improve checkout flow and user alerts.

These changes enhance the overall user interface and experience across various components, ensuring better accessibility and clarity.

* Refactor pricing and feature display for improved layout and clarity

- Updated `FeatureComparison.vue` to enhance table structure and styling for better responsiveness and readability.
- Simplified the pricing display logic in `pricing.vue` by removing unnecessary suffixes for plan prices.
- Enhanced `Features.vue` with a new desktop layout for better feature presentation and user engagement.

These changes improve the overall user experience and visual consistency across pricing and feature components.

* fix pricing source and feature gating

Move displayed plan pricing to a backend-backed catalog and tighten feature access checks so unknown keys fail closed. This keeps pricing aligned with the server source of truth and closes gaps introduced by the new permissions model.

* Refactor exception handling and improve health check logic

- Updated `PdfNotSupportedException` to allow nullable message parameter for better flexibility in error handling.
- Refactored `HealthCheckController` to utilize the Redis factory for connection checks, enhancing reliability in health status reporting.
- Modified `UserInvite` model to accept nullable `validUntil` parameter, improving data handling.
- Adjusted `Version` model's `diff` method to accept nullable `againstVersion` parameter for better compatibility.
- Cleaned up `TemplatesSlider.vue` by removing unused mounted lifecycle hook.
- Simplified `usePlanCatalog` by initializing the catalog with an empty tiers object, improving clarity.
- Enhanced integration page to conditionally display fallback content based on availability, improving user experience.

* Align pricing page CTAs with upgrade flows

Update pricing CTAs so hosted paid plans use upgrade language when they lead into checkout, and remove self-hosted card buttons that should not present actions.

* Update OpenFormFooter links, enhance layout in Integrations and MoreFeatures, and refactor login and register pages for improved design and functionality

* Add Playwright E2E coverage and CI gating (#1056)

* Add Playwright E2E coverage and CI gating

Add a Docker-backed Playwright E2E stack, cover key auth and form flows, and run the suite before deploy in GitHub Actions. This also adds stable UI selectors and switches the E2E throttle bypass to an app environment-based flow.

* Fix E2E API readiness check

Avoid using a database-dependent HTTP route to detect API readiness in the E2E bootstrap. Wait for artisan to become available instead so CI does not fail while the container is still migrating.

* Track E2E client environment in CI

* Harden E2E auth readiness checks

---------

Co-authored-by: Chirag Chhatrala <chirag.chhatrala@gmail.com>
- Updated the `PdfGeneratorService` to include hidden fields in the formatted submission data, ensuring comprehensive data output.
- Modified the `useWorkingPdfStore` to display hidden fields in the form fields list, appending a label for clarity.

These changes improve the accuracy and usability of PDF generation and form data presentation.
…#1065)

- Implemented changePlan method in SubscriptionController to allow users to swap their subscription plans with automatic proration handled by Stripe.
- Added validation for plan and interval inputs, and included error handling for subscription changes.
- Updated API routes to include the new changePlan endpoint for authenticated users.
- Enhanced billing.js to include a method for calling the changePlan API.
- Updated SubscriptionModal.vue to reflect new button labels and logic for plan selection.
- Adjusted workspace settings to require the business plan for custom code capabilities.
* Refactor landing page as per V2 design

* Opnform vs Typeform, enterprise, Testimonials, and landing page improvements as per V2 design

* Fix missing newline at end of integrations.json file to comply with formatting standards.

* Pricing, Industry, Feature Comparision pages as per V2 design

* improve footer as per new V2 design

* improve landing page UI

* improve V2 landing page as per final UI

* improve V2 pages as per final UI

* improve V2 pages as per final UI

* Improve new design V2

* Improve new design V2

* remove extra pricing component

* New Pricing changes

* New Pricing changes

* update testcase for new pricing

* New Pricing changes

* New Pricing changes

* Version restore as business plan

* Version restore as business plan

* update testcase

* SSO now enterprise plan

* fix testcase

* New Pricing changes

* Fix formatting in summary.vue for subscription message

* Refactor plan handling and feature access across the application

- Removed the legacy `RequireProPlan` middleware and replaced it with a more flexible `RequirePlan` middleware that checks for the required tier based on workspace context.
- Updated various controllers and services to utilize the new tier-checking logic, ensuring that feature access is correctly gated based on the workspace's plan.
- Enhanced error responses to include required and current tier information for better user feedback.
- Introduced a new method in the `Workspace` model to check if the workspace meets the required tier for specific features.
- Adjusted tests to reflect the changes in plan requirements and feature access logic.

These changes improve the clarity and maintainability of plan-related logic throughout the application.

* Refactor subscription handling and improve user model

- Updated the `User` model to replace the `hasActiveDefaultSubscription` method with `hasActivePaidSubscription`, which checks for any active paid subscriptions.
- Adjusted the `Workspace` model to maintain consistent subscription filtering.
- Modified tests to use string literals for subscription names instead of constants for better clarity.
- Renamed `ProTag` to `PlanTag` in the EmailIntegration component for improved semantic clarity.

These changes enhance the subscription management logic and improve code readability across the application.

* Enhance plan tier handling and feature access across the application

- Added `plan_tier` to the `FormResource` to provide workspace plan information.
- Updated various components to utilize `plan_tier` for feature access checks, replacing previous `is_pro` checks.
- Introduced a new `requireFeature` method in `usePlanFeatures` to streamline feature access validation and prompt subscription upgrades when necessary.
- Improved error handling and user feedback for features requiring specific plan tiers.

These changes improve the clarity and maintainability of plan-related logic and enhance user experience by providing accurate subscription requirements.

* Refactor plan features and pricing display for improved clarity

- Updated the `plans.php` configuration to better categorize features under 'PRO' and 'BUSINESS' tiers.
- Modified the `FeatureComparison.vue` component to reflect accurate file upload limits and integration statuses.
- Enhanced the `SubscriptionModal.vue` to utilize a computed property for selected plan pricing, improving clarity in pricing display.
- Cleaned up the `usePlanFeatures.js` by removing fallback pricing and features, relying on the manifest for accurate data.

These changes streamline the feature access logic and enhance the user interface for plan comparisons and subscription details.

* Refactor plan features handling by removing form features

- Eliminated the `form_features` from the plan manifest response in the API.
- Removed related functions and logic from `usePlanFeatures.js`, simplifying feature access checks.
- Updated the `getRequiredTier` function to rely solely on standard features.

These changes streamline the feature management process and enhance code clarity by focusing on core plan features.

* Update plan tiers configuration and simplify API response structure

- Added 'price_yearly_per_month' to each plan tier in the configuration for clearer pricing options.
- Simplified the API response for the '/plan-manifest' route to return the complete tier information directly.
- Refactored the `usePlanFeatures.js` to utilize the new tier structure, enhancing clarity in tier access and pricing retrieval.

These changes improve the pricing model and streamline the handling of plan features across the application.

* Refactor pricing display and plan features integration

- Updated the `FeatureComparison.vue` component to dynamically retrieve plan labels and prices using the `getTierDisplayName` and `getPlanPrice` functions.
- Simplified the pricing structure by utilizing computed properties for plan data, enhancing clarity and maintainability.
- Adjusted the `pricing.vue` component to reflect the new plan features structure, ensuring accurate display of plan details and features.

These changes improve the user interface for pricing comparisons and streamline the integration of plan features across the application.

* Remove nonprofit and student discount section from pricing page; add FAQ entry for discount eligibility. This update streamlines the pricing display while ensuring users can still find information about available discounts.

* Refactor pricing permissions and billing access

* Enhance feature access logic in PlanAccessService

- Updated the `hasFormFeature` method to include checks for feature overrides in workspaces, improving accuracy in feature access validation.
- Refactored the `getFeatures` method to merge workspace and form features more efficiently, ensuring no overlap in free workspace payloads.
- Added a new test case to verify that free workspaces do not have access to paid features, enhancing test coverage for feature access logic.

These changes improve the clarity and reliability of feature access management in the billing service.

* Refactor UI components for improved layout and accessibility

- Adjusted the `Navbar.vue` component to enhance spacing and visibility of navigation links across different screen sizes.
- Updated `UpgradeBanner.vue` to ensure proper formatting and consistency in script tags.
- Enhanced `FormHistory.vue` with a dynamic tooltip for better user feedback based on loading state.
- Improved `PasswordStrengthIndicator.vue` regex for password validation to include additional special characters.
- Refined `MonthlyYearlySelector.vue` for better user interaction and visual feedback on billing options.
- Streamlined `SubscriptionModal.vue` layout for clearer presentation of upgrade options and improved user experience.
- Enhanced `Testimonials.vue` with dynamic styling and additional review links for better engagement.
- Updated `Oidc.vue` to remove unnecessary whitespace for cleaner code.
- Refactored `checkout.vue` and `error.vue` to improve checkout flow and user alerts.

These changes enhance the overall user interface and experience across various components, ensuring better accessibility and clarity.

* Refactor pricing and feature display for improved layout and clarity

- Updated `FeatureComparison.vue` to enhance table structure and styling for better responsiveness and readability.
- Simplified the pricing display logic in `pricing.vue` by removing unnecessary suffixes for plan prices.
- Enhanced `Features.vue` with a new desktop layout for better feature presentation and user engagement.

These changes improve the overall user experience and visual consistency across pricing and feature components.

* fix pricing source and feature gating

Move displayed plan pricing to a backend-backed catalog and tighten feature access checks so unknown keys fail closed. This keeps pricing aligned with the server source of truth and closes gaps introduced by the new permissions model.

* Refactor exception handling and improve health check logic

- Updated `PdfNotSupportedException` to allow nullable message parameter for better flexibility in error handling.
- Refactored `HealthCheckController` to utilize the Redis factory for connection checks, enhancing reliability in health status reporting.
- Modified `UserInvite` model to accept nullable `validUntil` parameter, improving data handling.
- Adjusted `Version` model's `diff` method to accept nullable `againstVersion` parameter for better compatibility.
- Cleaned up `TemplatesSlider.vue` by removing unused mounted lifecycle hook.
- Simplified `usePlanCatalog` by initializing the catalog with an empty tiers object, improving clarity.
- Enhanced integration page to conditionally display fallback content based on availability, improving user experience.

* Add Playwright E2E coverage and CI gating

Add a Docker-backed Playwright E2E stack, cover key auth and form flows, and run the suite before deploy in GitHub Actions. This also adds stable UI selectors and switches the E2E throttle bypass to an app environment-based flow.

* Fix E2E API readiness check

Avoid using a database-dependent HTTP route to detect API readiness in the E2E bootstrap. Wait for artisan to become available instead so CI does not fail while the container is still migrating.

* Harden E2E auth readiness checks

* Update OpenFormFooter links, enhance layout in Integrations and MoreFeatures, and refactor login and register pages for improved design and functionality

* Update component styles and replace static elements with dynamic links

- Adjusted border-radius values in Integrations, LiveDemo, and MoreFeatures components for a more modern design.
- Replaced a static div with a NuxtLink in the index page to improve navigation to the enterprise section.
- Updated button visibility based on feature flags for better user experience.
- Modified several image assets in the welcome section to enhance visual content.

* tariq commit

* tariq commit

* Pixel perfecting the enterprise, pricing, Features, OpenFormFooter, and TemplatesSlider

* Pixel perfecting the Integration and Testimonial section across different pages

* Pixel Perfecting the Navbar, OpenFormFooter, Features, MoreFeatures, Integration, LiveDemo,TrustedTeams, enterprice, and index file.

* Pixel Perfecting, left aligning, and fixing blury images in the Home, Pricing, Enterprise, Industry and Comparison pages.

* Update OpenFormFooter links, adjust Testimonials layout, refine industry page styles, and modify pricing button label for improved user experience

* Refactor Typeform icon usage and add SVG asset

- Replaced UIcon components with Icon components for Typeform throughout the opnform-vs-typeform.vue file.
- Introduced a new SVG file for the Typeform icon to enhance visual consistency and maintainability.

* Fix pricing source-of-truth regressions

* Fix PR 1062 CI regressions

* Fix features page template markup

* Restore register page e2e hook

* Fix e2e auth readiness checks

* Restore home page e2e hook

---------

Co-authored-by: Chirag Chhatrala <chirag.chhatrala@gmail.com>
Co-authored-by: aasimdev <aasimdev0@gmail.com>
- Introduced a new method to prevent automatic scrolling when the dropdown opens, enhancing user experience.
- Updated the VSelect component to include this method in the content configuration for better control over focus behavior.
* Improve Stripe tax export accuracy

* Fix tax export linting

* Fix Stripe export accounting window
* Add auto-next setting to user form and update related components

- Introduced 'settings.auto_next' to UserFormRequest for form navigation control.
- Updated ToggleSwitchInput to handle boolean values correctly.
- Implemented auto-next functionality in OpenFormFocused and related components, ensuring backward compatibility.
- Enhanced FormCustomization and PresentationStyleSwitch to include auto-next toggle in focused mode.
- Adjusted CreateFormBaseModal to set default auto-next value in focused mode.
- Updated initForm.js to handle readonly settings for better form initialization.
- Modified e2e tests to reflect changes in settings structure for focused presentation style.

* Fix focused auto-next keyboard navigation

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
* Refactor landing page as per V2 design

* Opnform vs Typeform, enterprise, Testimonials, and landing page improvements as per V2 design

* Fix missing newline at end of integrations.json file to comply with formatting standards.

* Pricing, Industry, Feature Comparision pages as per V2 design

* improve footer as per new V2 design

* improve landing page UI

* improve V2 landing page as per final UI

* improve V2 pages as per final UI

* improve V2 pages as per final UI

* Improve new design V2

* Improve new design V2

* remove extra pricing component

* New Pricing changes

* New Pricing changes

* update testcase for new pricing

* update testcase

* New Pricing changes

* New Pricing changes

* Version restore as business plan

* Version restore as business plan

* update testcase

* SSO now enterprise plan

* fix testcase

* New Pricing changes

* Fix formatting in summary.vue for subscription message

* Add form import functionality with support for multiple sources

* Refactor PdfEditorNavbar component to replace ProTag with PlanTag

- Updated the PdfEditorNavbar.vue to change the tag from ProTag to PlanTag, aligning with the new pricing structure.
- Adjusted the import statement accordingly to reflect the component name change.

These changes enhance the clarity and consistency of the PDF editor's user interface.

* Refactor plan handling and feature access across the application

- Removed the legacy `RequireProPlan` middleware and replaced it with a more flexible `RequirePlan` middleware that checks for the required tier based on workspace context.
- Updated various controllers and services to utilize the new tier-checking logic, ensuring that feature access is correctly gated based on the workspace's plan.
- Enhanced error responses to include required and current tier information for better user feedback.
- Introduced a new method in the `Workspace` model to check if the workspace meets the required tier for specific features.
- Adjusted tests to reflect the changes in plan requirements and feature access logic.

These changes improve the clarity and maintainability of plan-related logic throughout the application.

* Refactor subscription handling and improve user model

- Updated the `User` model to replace the `hasActiveDefaultSubscription` method with `hasActivePaidSubscription`, which checks for any active paid subscriptions.
- Adjusted the `Workspace` model to maintain consistent subscription filtering.
- Modified tests to use string literals for subscription names instead of constants for better clarity.
- Renamed `ProTag` to `PlanTag` in the EmailIntegration component for improved semantic clarity.

These changes enhance the subscription management logic and improve code readability across the application.

* Update version restoration test to reflect new error handling

- Changed the expected status code for unauthorized version restoration from 403 to 402.
- Updated the response assertion to include the required tier information for better clarity in error messages.

These modifications enhance the accuracy of the test cases related to version restoration and improve user feedback on subscription requirements.

* Enhance plan tier handling and feature access across the application

- Added `plan_tier` to the `FormResource` to provide workspace plan information.
- Updated various components to utilize `plan_tier` for feature access checks, replacing previous `is_pro` checks.
- Introduced a new `requireFeature` method in `usePlanFeatures` to streamline feature access validation and prompt subscription upgrades when necessary.
- Improved error handling and user feedback for features requiring specific plan tiers.

These changes improve the clarity and maintainability of plan-related logic and enhance user experience by providing accurate subscription requirements.

* Refactor plan features and pricing display for improved clarity

- Updated the `plans.php` configuration to better categorize features under 'PRO' and 'BUSINESS' tiers.
- Modified the `FeatureComparison.vue` component to reflect accurate file upload limits and integration statuses.
- Enhanced the `SubscriptionModal.vue` to utilize a computed property for selected plan pricing, improving clarity in pricing display.
- Cleaned up the `usePlanFeatures.js` by removing fallback pricing and features, relying on the manifest for accurate data.

These changes streamline the feature access logic and enhance the user interface for plan comparisons and subscription details.

* Refactor plan features handling by removing form features

- Eliminated the `form_features` from the plan manifest response in the API.
- Removed related functions and logic from `usePlanFeatures.js`, simplifying feature access checks.
- Updated the `getRequiredTier` function to rely solely on standard features.

These changes streamline the feature management process and enhance code clarity by focusing on core plan features.

* Update plan tiers configuration and simplify API response structure

- Added 'price_yearly_per_month' to each plan tier in the configuration for clearer pricing options.
- Simplified the API response for the '/plan-manifest' route to return the complete tier information directly.
- Refactored the `usePlanFeatures.js` to utilize the new tier structure, enhancing clarity in tier access and pricing retrieval.

These changes improve the pricing model and streamline the handling of plan features across the application.

* Refactor pricing display and plan features integration

- Updated the `FeatureComparison.vue` component to dynamically retrieve plan labels and prices using the `getTierDisplayName` and `getPlanPrice` functions.
- Simplified the pricing structure by utilizing computed properties for plan data, enhancing clarity and maintainability.
- Adjusted the `pricing.vue` component to reflect the new plan features structure, ensuring accurate display of plan details and features.

These changes improve the user interface for pricing comparisons and streamline the integration of plan features across the application.

* Remove nonprofit and student discount section from pricing page; add FAQ entry for discount eligibility. This update streamlines the pricing display while ensuring users can still find information about available discounts.

* Add defaultSource prop to FormImportModal and update source selection logic

- Introduced a new `defaultSource` prop in `FormImportModal.vue` to allow pre-selection of the import source.
- Updated the logic in `selectSource` and `handleBack` functions to utilize the new prop, improving user experience during form import.
- Integrated the `FormImportModal` in `opnform-vs-typeform.vue` with a button to open the modal, enhancing the import functionality for Typeform URLs.

These changes streamline the import process and provide a more intuitive interface for users.

* Add Fillout, Google Forms, and Typeform importers for form data integration

- Introduced `FilloutImporter`, `GoogleFormsImporter`, and `TypeformImporter` classes to handle form data imports from respective platforms.
- Implemented methods for data validation, fetching, and parsing to streamline the import process.
- Each importer includes domain restrictions and specific field mappings to ensure compatibility with the application's data structure.

These additions enhance the application's ability to integrate with popular form services, improving user experience and data management capabilities.

* Refactor arrow function syntax for consistency in importers and update placeholder text in FormImportModal

- Updated arrow function syntax in `FilloutImporter` and `TypeformImporter` for improved readability and consistency.
- Changed placeholder text in `FormImportModal.vue` to a more concise message, enhancing user communication.

These changes contribute to cleaner code and a better user experience in the form import process.

* Enhance Form Import functionality with Tally integration and UI improvements

- Updated `FormImportRegistry` to include labels for import sources, improving error messages and user feedback.
- Added `TallyImporter` class for handling form data imports from Tally, including comprehensive field mapping and data extraction methods.
- Enhanced `FormImportService` to utilize the new label method for clearer error reporting.
- Improved the `FormImportSourcePicker` component with updated icon classes and layout adjustments for better user experience.
- Introduced a new SVG icon for Tally to maintain visual consistency across import sources.

These changes significantly enhance the form import capabilities and user interface, providing a more intuitive experience for users integrating with Tally.

* Implement Google Forms import functionality and enhance OAuth integration

- Updated `OAuthController` and `OAuthRedirectRequest` to support a new `forms_import` intent for Google Forms.
- Enhanced `FormImportRequest` validation rules to include `oauth_provider_id` for Google Forms integration.
- Introduced `GoogleFormsImporter` class with methods for fetching and parsing Google Forms data, including error handling for authentication and form access.
- Added `FormImportOAuth` component to facilitate OAuth account selection for Google Forms, improving user experience during the import process.
- Updated tests to cover new `forms_import` intent and ensure proper authentication requirements.

These changes significantly enhance the application's ability to import Google Forms, providing a seamless integration experience for users.

* Fix lint

* Remove unused code

* fix testcase

* Remove unused `tierMeetsRequirement` import from AppSidebar.vue to streamline code and improve clarity.

* Refactor form import handling and enhance user experience

- Updated FormImportController to return imported form data directly instead of creating a new Form record, allowing users to customize the form before publishing.
- Adjusted TypeformImporter to streamline the flattening of composite fields by removing unnecessary page breaks.
- Modified FilloutImporter to correctly map 'MultipleChoice' fields to 'select' instead of 'multi_select'.
- Implemented localStorage handling in the form creation page to prefill imported form data, improving the user experience during form creation.
- Added comprehensive tests for form import functionality to ensure reliability and correctness of the import process.

* Fix import editor baseline and Typeform defaults

* Fix duplicate Pest testcase binding

* Refactor Google integration to utilize GoogleOAuthClient for improved token management

- Replaced direct Google Client instantiation in the Google class with a new GoogleOAuthClient class to encapsulate OAuth handling.
- Updated GoogleFormsImporter to resolve and manage OAuthProvider instances, enhancing token refresh logic and error handling.
- Introduced methods for streamlined access token retrieval and refresh, improving overall integration reliability.

* Refactor TypeformImporter to enhance form data extraction and validation

- Removed direct API calls to Typeform and implemented HTML scraping for form data extraction, improving reliability and handling of public forms.
- Introduced a new method for validating Typeform URLs to ensure correct format before processing.
- Updated tests to reflect changes in the import process, including adjustments to mock responses and validation checks for URL formats.
- Enhanced error handling for cases where form data cannot be found or parsed, providing clearer feedback for users.

* Enhance TallyImporter to improve form data mapping and settings handling

- Refactored the mapping logic in TallyImporter to better handle standalone label blocks and ensure they are used as input names.
- Introduced a new method, compactSettings, to filter out empty form-level attributes, improving data cleanliness.
- Updated the import process to correctly synthesize parent fields and handle standalone checkbox blocks.
- Added comprehensive tests for importing real Tally forms, ensuring accurate mapping and validation of form properties and settings.

* Refactor FilloutImporter to enhance form data mapping and presentation logic

- Improved the mapping of Fillout form steps to ensure correct order and handling of cover, question groups, and thank-you text.
- Introduced a new method, compactSettings, to filter out empty form-level attributes, enhancing data cleanliness.
- Updated the import process to infer presentation styles based on the number of fields, optimizing user experience.
- Added tests for importing real Fillout forms, ensuring accurate mapping and validation of form properties and settings.

* Enhance TypeformImporter to support welcome and thank-you screens

- Added functionality to import the first welcome screen as an editable nf-text block.
- Implemented logic to combine author-defined thank-you screens into a single submitted_text, while excluding the default Typeform thank-you screen.
- Updated tests to verify the correct import of welcome and thank-you screens, ensuring accurate representation in the final form data.
- Introduced a new fixture for testing the Customer Satisfaction Feedback Form, enhancing test coverage for Typeform imports.

* Refactor importers to enhance dropdown handling and form data integrity

- Updated GoogleFormsImporter, TallyImporter, and TypeformImporter to ensure dropdowns are preserved correctly, even with a limited number of options.
- Introduced logic to prevent flattening of dropdowns into checkboxes when the option count is low, maintaining user intent.
- Enhanced tests for Tally and Google Forms to verify that dropdowns remain intact and are accurately represented in the imported form data.

* Fix Typeform dropdown and screen copy imports

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
* Refactor landing page as per V2 design

* Opnform vs Typeform, enterprise, Testimonials, and landing page improvements as per V2 design

* Fix missing newline at end of integrations.json file to comply with formatting standards.

* Pricing, Industry, Feature Comparision pages as per V2 design

* improve footer as per new V2 design

* improve landing page UI

* improve V2 landing page as per final UI

* improve V2 pages as per final UI

* improve V2 pages as per final UI

* Improve new design V2

* Improve new design V2

* remove extra pricing component

* New Pricing changes

* New Pricing changes

* update testcase for new pricing

* update testcase

* New Pricing changes

* New Pricing changes

* Version restore as business plan

* Version restore as business plan

* update testcase

* SSO now enterprise plan

* fix testcase

* New Pricing changes

* Fix formatting in summary.vue for subscription message

* tariq commit

* tariq commit

* Pixel perfecting the enterprise, pricing, Features, OpenFormFooter, and TemplatesSlider

* Pixel perfecting the Integration and Testimonial section across different pages

* Pixel Perfecting the Navbar, OpenFormFooter, Features, MoreFeatures, Integration, LiveDemo,TrustedTeams, enterprice, and index file.

* Pixel Perfecting, left aligning, and fixing blury images in the Home, Pricing, Enterprise, Industry and Comparison pages.

* Refactor PdfEditorNavbar component to replace ProTag with PlanTag

- Updated the PdfEditorNavbar.vue to change the tag from ProTag to PlanTag, aligning with the new pricing structure.
- Adjusted the import statement accordingly to reflect the component name change.

These changes enhance the clarity and consistency of the PDF editor's user interface.

* Refactor plan handling and feature access across the application

- Removed the legacy `RequireProPlan` middleware and replaced it with a more flexible `RequirePlan` middleware that checks for the required tier based on workspace context.
- Updated various controllers and services to utilize the new tier-checking logic, ensuring that feature access is correctly gated based on the workspace's plan.
- Enhanced error responses to include required and current tier information for better user feedback.
- Introduced a new method in the `Workspace` model to check if the workspace meets the required tier for specific features.
- Adjusted tests to reflect the changes in plan requirements and feature access logic.

These changes improve the clarity and maintainability of plan-related logic throughout the application.

* Refactor subscription handling and improve user model

- Updated the `User` model to replace the `hasActiveDefaultSubscription` method with `hasActivePaidSubscription`, which checks for any active paid subscriptions.
- Adjusted the `Workspace` model to maintain consistent subscription filtering.
- Modified tests to use string literals for subscription names instead of constants for better clarity.
- Renamed `ProTag` to `PlanTag` in the EmailIntegration component for improved semantic clarity.

These changes enhance the subscription management logic and improve code readability across the application.

* Update version restoration test to reflect new error handling

- Changed the expected status code for unauthorized version restoration from 403 to 402.
- Updated the response assertion to include the required tier information for better clarity in error messages.

These modifications enhance the accuracy of the test cases related to version restoration and improve user feedback on subscription requirements.

* Enhance plan tier handling and feature access across the application

- Added `plan_tier` to the `FormResource` to provide workspace plan information.
- Updated various components to utilize `plan_tier` for feature access checks, replacing previous `is_pro` checks.
- Introduced a new `requireFeature` method in `usePlanFeatures` to streamline feature access validation and prompt subscription upgrades when necessary.
- Improved error handling and user feedback for features requiring specific plan tiers.

These changes improve the clarity and maintainability of plan-related logic and enhance user experience by providing accurate subscription requirements.

* Refactor plan features and pricing display for improved clarity

- Updated the `plans.php` configuration to better categorize features under 'PRO' and 'BUSINESS' tiers.
- Modified the `FeatureComparison.vue` component to reflect accurate file upload limits and integration statuses.
- Enhanced the `SubscriptionModal.vue` to utilize a computed property for selected plan pricing, improving clarity in pricing display.
- Cleaned up the `usePlanFeatures.js` by removing fallback pricing and features, relying on the manifest for accurate data.

These changes streamline the feature access logic and enhance the user interface for plan comparisons and subscription details.

* Refactor plan features handling by removing form features

- Eliminated the `form_features` from the plan manifest response in the API.
- Removed related functions and logic from `usePlanFeatures.js`, simplifying feature access checks.
- Updated the `getRequiredTier` function to rely solely on standard features.

These changes streamline the feature management process and enhance code clarity by focusing on core plan features.

* Update plan tiers configuration and simplify API response structure

- Added 'price_yearly_per_month' to each plan tier in the configuration for clearer pricing options.
- Simplified the API response for the '/plan-manifest' route to return the complete tier information directly.
- Refactored the `usePlanFeatures.js` to utilize the new tier structure, enhancing clarity in tier access and pricing retrieval.

These changes improve the pricing model and streamline the handling of plan features across the application.

* Refactor pricing display and plan features integration

- Updated the `FeatureComparison.vue` component to dynamically retrieve plan labels and prices using the `getTierDisplayName` and `getPlanPrice` functions.
- Simplified the pricing structure by utilizing computed properties for plan data, enhancing clarity and maintainability.
- Adjusted the `pricing.vue` component to reflect the new plan features structure, ensuring accurate display of plan details and features.

These changes improve the user interface for pricing comparisons and streamline the integration of plan features across the application.

* Remove nonprofit and student discount section from pricing page; add FAQ entry for discount eligibility. This update streamlines the pricing display while ensuring users can still find information about available discounts.

* Refactor pricing permissions and billing access

* Enhance feature access logic in PlanAccessService

- Updated the `hasFormFeature` method to include checks for feature overrides in workspaces, improving accuracy in feature access validation.
- Refactored the `getFeatures` method to merge workspace and form features more efficiently, ensuring no overlap in free workspace payloads.
- Added a new test case to verify that free workspaces do not have access to paid features, enhancing test coverage for feature access logic.

These changes improve the clarity and reliability of feature access management in the billing service.

* Refactor UI components for improved layout and accessibility

- Adjusted the `Navbar.vue` component to enhance spacing and visibility of navigation links across different screen sizes.
- Updated `UpgradeBanner.vue` to ensure proper formatting and consistency in script tags.
- Enhanced `FormHistory.vue` with a dynamic tooltip for better user feedback based on loading state.
- Improved `PasswordStrengthIndicator.vue` regex for password validation to include additional special characters.
- Refined `MonthlyYearlySelector.vue` for better user interaction and visual feedback on billing options.
- Streamlined `SubscriptionModal.vue` layout for clearer presentation of upgrade options and improved user experience.
- Enhanced `Testimonials.vue` with dynamic styling and additional review links for better engagement.
- Updated `Oidc.vue` to remove unnecessary whitespace for cleaner code.
- Refactored `checkout.vue` and `error.vue` to improve checkout flow and user alerts.

These changes enhance the overall user interface and experience across various components, ensuring better accessibility and clarity.

* Refactor pricing and feature display for improved layout and clarity

- Updated `FeatureComparison.vue` to enhance table structure and styling for better responsiveness and readability.
- Simplified the pricing display logic in `pricing.vue` by removing unnecessary suffixes for plan prices.
- Enhanced `Features.vue` with a new desktop layout for better feature presentation and user engagement.

These changes improve the overall user experience and visual consistency across pricing and feature components.

* fix pricing source and feature gating

Move displayed plan pricing to a backend-backed catalog and tighten feature access checks so unknown keys fail closed. This keeps pricing aligned with the server source of truth and closes gaps introduced by the new permissions model.

* Refactor exception handling and improve health check logic

- Updated `PdfNotSupportedException` to allow nullable message parameter for better flexibility in error handling.
- Refactored `HealthCheckController` to utilize the Redis factory for connection checks, enhancing reliability in health status reporting.
- Modified `UserInvite` model to accept nullable `validUntil` parameter, improving data handling.
- Adjusted `Version` model's `diff` method to accept nullable `againstVersion` parameter for better compatibility.
- Cleaned up `TemplatesSlider.vue` by removing unused mounted lifecycle hook.
- Simplified `usePlanCatalog` by initializing the catalog with an empty tiers object, improving clarity.
- Enhanced integration page to conditionally display fallback content based on availability, improving user experience.

* Align pricing page CTAs with upgrade flows

Update pricing CTAs so hosted paid plans use upgrade language when they lead into checkout, and remove self-hosted card buttons that should not present actions.

* Update OpenFormFooter links, enhance layout in Integrations and MoreFeatures, and refactor login and register pages for improved design and functionality

* Add Playwright E2E coverage and CI gating

Add a Docker-backed Playwright E2E stack, cover key auth and form flows, and run the suite before deploy in GitHub Actions. This also adds stable UI selectors and switches the E2E throttle bypass to an app environment-based flow.

* Fix E2E API readiness check

Avoid using a database-dependent HTTP route to detect API readiness in the E2E bootstrap. Wait for artisan to become available instead so CI does not fail while the container is still migrating.

* Track E2E client environment in CI

* Harden E2E auth readiness checks

* Update component styles and replace static elements with dynamic links

- Adjusted border-radius values in Integrations, LiveDemo, and MoreFeatures components for a more modern design.
- Replaced a static div with a NuxtLink in the index page to improve navigation to the enterprise section.
- Updated button visibility based on feature flags for better user experience.
- Modified several image assets in the welcome section to enhance visual content.

* Update OpenFormFooter links, adjust Testimonials layout, refine industry page styles, and modify pricing button label for improved user experience

* Refactor Typeform icon usage and add SVG asset

- Replaced UIcon components with Icon components for Typeform throughout the opnform-vs-typeform.vue file.
- Introduced a new SVG file for the Typeform icon to enhance visual consistency and maintainability.

* Enhance comparison pages for various form builders

- Added new comparison pages for 123FormBuilder, Fillout, Formbricks, Form.io, Google Forms, HeyForm, JotForm, and Tally, showcasing their features against OpnForm.
- Updated OpenFormFooter to include links to the new comparison pages for improved navigation.
- Each comparison page includes a detailed free plan comparison, switch reasons, and feature comparisons to highlight OpnForm's advantages.

* Enhance comparison pages for various form builders

- Updated the comparison pages for OpnForm against 123FormBuilder, Fillout, Formbricks, Form.io, HeyForm, JotForm, Tally, Typeform, and Youform.
- Improved the free plan comparison details, including submission limits, form capabilities, and feature availability.
- Enhanced switch reasons and feature comparisons to better highlight OpnForm's advantages, focusing on unlimited submissions, self-hosting options, and developer-friendly features.
- Refined UI elements for better clarity and consistency across all comparison pages.

* Enhance OpnForm vs Google Forms comparison page

- Updated hero subtitle to emphasize customization and control over data.
- Revised descriptions to highlight Google Forms' limitations and OpnForm's advantages in flexibility and scalability.
- Improved feature comparison table for clarity, including updates to conditional logic, multi-page forms, and file uploads.
- Enhanced switch reasons to better communicate OpnForm's benefits, focusing on advanced workflows and developer-friendly features.
- Refined overall layout for improved readability and user engagement.

* Update competitor icons in comparison pages and add new SVG assets

- Changed competitor icons in the OpnForm comparison pages for 123FormBuilder, Form.io, HeyForm, and Youform to use the new naming convention.
- Added new SVG icon files for 123FormBuilder, Form.io, HeyForm, and Youform to the public icons directory for improved visual consistency.

* Update pricing logic and competitor price display in comparison pages

- Modified the `getPrice` function across multiple comparison pages to reflect new pricing tiers and structures for various submission limits.
- Updated the `ComparisonPage.vue` to conditionally display competitor prices based on the presence of a price function, enhancing user experience.
- Removed outdated pricing logic from several comparison components to streamline code and improve maintainability.

* Update landing testimonials and comparison links

* Fix comparison pricing claims

* Update FormCleaner and PlanAccessService tests to reflect feature changes

- Modified FormCleanerTest to replace 'editable_submissions' with 'enable_ip_tracking' for pro tier validation.
- Updated PlanAccessServiceTest to ensure 'editable_submissions' is granted as a feature for pro users in both workspace and form contexts.

These changes enhance the accuracy of feature access tests in relation to the current plan structure.

* Add comparison import CTA flow

---------

Co-authored-by: aasimdev <aasimdev0@gmail.com>
Co-authored-by: Julien Nahum <julien@nahum.net>
* Enhance mention field handling in form logic

- Added support for resolving mention references in condition values, allowing single mentions to return raw field values and multiple mentions to resolve to plain-text strings.
- Updated `LogicPropertyValidator` to recognize strings containing 'mention-field-id' as valid types.
- Refactored `FormLogicConditionChecker` to utilize the new mention resolution logic when evaluating conditions.
- Introduced `MentionInput` component for various input types in `ColumnCondition.vue`, ensuring consistent handling of mention fields across the form.
- Enhanced `ConditionEditor.client.vue` and `FormPropertyLogicRule.js` to accommodate mention field logic in property conditions.

These changes improve the handling of mentions in form logic, enhancing user experience and data integrity.

* Refactor form logic handling to support context-aware conditions

- Updated `FormLogicPropertyResolver` to accept a form context, enhancing the evaluation of required and hidden properties based on the current form state.
- Modified `FormLogicConditionChecker` methods to utilize the new context-aware logic for condition evaluations.
- Adjusted various components and services to pass the form context when checking property visibility and requirements.
- Enhanced validation rules to ensure compatibility with the updated logic, improving overall form handling and user experience.

These changes streamline the form logic processing, allowing for more dynamic and context-sensitive behavior in form submissions.

* Fix guest editor bootstrap and computed logic

* Preserve computed values in nested condition groups

* Integrate PDF template functionality into FormSubmissionSettings component

- Imported `usePdfTemplates` composable to enhance form submission settings with PDF template capabilities.
- This addition lays the groundwork for improved PDF generation and customization in form submissions.

* Enhance form data handling and initialization logic

- Added `ensureSettingsObject` to `FormEditor.vue` to ensure proper settings structure when form data changes.
- Updated `initUpdatedForm` in `edit.vue` to utilize `nextTick` for more reliable form hash initialization, accommodating potential null values.

These changes improve the robustness of form data management and enhance user experience during form editing.

* Enhance mention styles in app.css

- Updated global mention styles for consistency across components, ensuring proper alignment and spacing.
- Adjusted styles for MentionInput to improve visual presentation and user experience in compact fields.

These changes refine the appearance and usability of mention fields in the application.

* Fix mention condition handling

* Fix condition validation edge cases

* Preserve zero mention fallbacks

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
* Enhance mention field handling in form logic

- Added support for resolving mention references in condition values, allowing single mentions to return raw field values and multiple mentions to resolve to plain-text strings.
- Updated `LogicPropertyValidator` to recognize strings containing 'mention-field-id' as valid types.
- Refactored `FormLogicConditionChecker` to utilize the new mention resolution logic when evaluating conditions.
- Introduced `MentionInput` component for various input types in `ColumnCondition.vue`, ensuring consistent handling of mention fields across the form.
- Enhanced `ConditionEditor.client.vue` and `FormPropertyLogicRule.js` to accommodate mention field logic in property conditions.

These changes improve the handling of mentions in form logic, enhancing user experience and data integrity.

* Refactor form logic handling to support context-aware conditions

- Updated `FormLogicPropertyResolver` to accept a form context, enhancing the evaluation of required and hidden properties based on the current form state.
- Modified `FormLogicConditionChecker` methods to utilize the new context-aware logic for condition evaluations.
- Adjusted various components and services to pass the form context when checking property visibility and requirements.
- Enhanced validation rules to ensure compatibility with the updated logic, improving overall form handling and user experience.

These changes streamline the form logic processing, allowing for more dynamic and context-sensitive behavior in form submissions.

* Fix guest editor bootstrap and computed logic

* Preserve computed values in nested condition groups

* Integrate PDF template functionality into FormSubmissionSettings component

- Imported `usePdfTemplates` composable to enhance form submission settings with PDF template capabilities.
- This addition lays the groundwork for improved PDF generation and customization in form submissions.

* Enhance form data handling and initialization logic

- Added `ensureSettingsObject` to `FormEditor.vue` to ensure proper settings structure when form data changes.
- Updated `initUpdatedForm` in `edit.vue` to utilize `nextTick` for more reliable form hash initialization, accommodating potential null values.

These changes improve the robustness of form data management and enhance user experience during form editing.

* Enhance mention styles in app.css

- Updated global mention styles for consistency across components, ensuring proper alignment and spacing.
- Adjusted styles for MentionInput to improve visual presentation and user experience in compact fields.

These changes refine the appearance and usability of mention fields in the application.

* Fix mention condition handling

* Fix condition validation edge cases

* Preserve zero mention fallbacks

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
* Implement OverlayScrollbars for improved scrolling experience

- Added `overlayscrollbars` and `overlayscrollbars-vue` dependencies to enhance scroll behavior across various components.
- Replaced standard scroll containers with `OverlayScrollbarsComponent` in `EditorRightSidebar.vue`, `GoogleFontPicker.vue`, `FormEditor.vue`, `FormFieldsEditor.vue`, `FormEditorPreview.vue`, `IntegrationModal.vue`, and other components to provide a consistent and customizable scrolling experience.
- Introduced global scrollbar initialization in `overlayscrollbars-global.client.js` to ensure body scrollbars are managed effectively.
- Added HTML attributes for SSR in `overlayscrollbars-html-attrs.js` to prevent layout shifts during client-side rendering.

These changes improve the user interface by providing smoother scrolling and better handling of overflow content.

* Fix OverlayScrollbars iframe attrs

* Limit OverlayScrollbars to editor surfaces

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
…ctionality (#1099)

- Removed dropdown feature from Navbar.vue to simplify navigation.
- Updated SingleTemplate.vue layout for better responsiveness and visual consistency, including adjustments to image handling and text styles.
- Enhanced spacing and padding in various elements to improve overall user experience.

These changes streamline the user interface and enhance the clarity of component layouts.
# Conflicts:
#	.github/workflows/ci-cd.yml
#	api/composer.lock
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Morty Proxy This is a proxified and sanitized view of the page, visit original site.