2024-09-23 20:02:38 +02:00
|
|
|
import clonedeep from 'clone-deep'
|
2024-04-15 19:39:03 +02:00
|
|
|
import { generateUUID } from "~/lib/utils.js"
|
2024-09-20 12:02:06 +02:00
|
|
|
export const DEFAULT_COLOR = '#3B82F6'
|
2023-12-20 16:10:32 +01:00
|
|
|
|
2024-02-01 18:21:30 +01:00
|
|
|
export const initForm = (defaultValue = {}, withDefaultProperties = false) => {
|
2023-12-20 16:10:32 +01:00
|
|
|
return useForm({
|
2024-04-15 19:39:03 +02:00
|
|
|
title: "My Form",
|
|
|
|
|
visibility: "public",
|
2023-12-20 16:10:32 +01:00
|
|
|
workspace_id: null,
|
2024-04-15 19:39:03 +02:00
|
|
|
properties: withDefaultProperties ? getDefaultProperties() : [],
|
2023-12-20 16:10:32 +01:00
|
|
|
|
|
|
|
|
// Customization
|
2024-12-04 18:32:14 +01:00
|
|
|
language: 'en',
|
2024-08-16 16:25:13 +02:00
|
|
|
font_family: null,
|
2024-04-15 19:39:03 +02:00
|
|
|
theme: "default",
|
|
|
|
|
width: "centered",
|
2024-11-20 15:29:08 +01:00
|
|
|
layout_rtl: false,
|
2024-04-15 19:39:03 +02:00
|
|
|
dark_mode: "auto",
|
2024-09-20 12:02:06 +02:00
|
|
|
color: DEFAULT_COLOR,
|
2023-12-20 16:10:32 +01:00
|
|
|
no_branding: false,
|
2024-06-27 17:52:49 +02:00
|
|
|
uppercase_labels: false,
|
2023-12-20 16:10:32 +01:00
|
|
|
transparent_background: false,
|
|
|
|
|
closes_at: null,
|
2024-04-15 19:39:03 +02:00
|
|
|
closed_text:
|
|
|
|
|
"This form has now been closed by its owner and does not accept submissions anymore.",
|
2023-12-20 16:10:32 +01:00
|
|
|
auto_save: true,
|
2024-08-23 11:32:09 +02:00
|
|
|
auto_focus: true,
|
2024-07-01 10:18:35 +02:00
|
|
|
border_radius: 'small',
|
|
|
|
|
size: 'md',
|
2023-12-20 16:10:32 +01:00
|
|
|
|
|
|
|
|
// Submission
|
2024-04-15 19:39:03 +02:00
|
|
|
submit_button_text: "Submit",
|
2023-12-20 16:10:32 +01:00
|
|
|
re_fillable: false,
|
2024-04-15 19:39:03 +02:00
|
|
|
re_fill_button_text: "Fill Again",
|
|
|
|
|
submitted_text:
|
|
|
|
|
"Amazing, we saved your answers. Thank you for your time and have a great day!",
|
2023-12-20 16:10:32 +01:00
|
|
|
use_captcha: false,
|
2024-12-18 16:35:09 +01:00
|
|
|
captcha_provider: 'recaptcha',
|
2023-12-20 16:10:32 +01:00
|
|
|
max_submissions_count: null,
|
2024-04-15 19:39:03 +02:00
|
|
|
max_submissions_reached_text:
|
|
|
|
|
"This form has now reached the maximum number of allowed submissions and is now closed.",
|
|
|
|
|
editable_submissions_button_text: "Edit submission",
|
2023-12-20 16:10:32 +01:00
|
|
|
confetti_on_submission: false,
|
|
|
|
|
|
|
|
|
|
// Security & Privacy
|
|
|
|
|
can_be_indexed: true,
|
|
|
|
|
|
|
|
|
|
// Custom SEO
|
|
|
|
|
seo_meta: {},
|
|
|
|
|
|
2024-04-15 19:39:03 +02:00
|
|
|
...defaultValue,
|
2023-12-20 16:10:32 +01:00
|
|
|
})
|
|
|
|
|
}
|
2024-02-01 18:21:30 +01:00
|
|
|
|
2024-04-15 19:39:03 +02:00
|
|
|
function getDefaultProperties() {
|
2024-02-01 18:21:30 +01:00
|
|
|
return [
|
Decouple title from title block (#696)
* Decouple title from title block
* fix lint
* remove dry run for FormTitleMigration
* Skip form title migration for forms with hidden titles
* Refactor AI Form Generation with Dedicated Prompt Services
- Extract AI form generation logic from GenerateTemplate command into dedicated prompt service classes
- Update GenerateAiForm job to use new prompt generation services
- Improve GptCompleter with more robust error handling and token tracking
- Add error field to AiFormCompletion model for better error logging
- Simplify command signature from 'ai:make-form-template' to 'form:generate'
* Consolidate Template Metadata Generation with Unified Prompt Service
- Create GenerateTemplateMetadataPrompt to centralize template metadata generation
- Update GenerateTemplate command to use new consolidated metadata generation approach
- Enhance GptCompleter to support strict JSON schema validation
- Increase form prompt max length to support more complex form descriptions
- Refactor form generation to simplify metadata extraction and processing
* Implement Form Mode Strategy for Flexible Form Rendering
- Introduce FormModeStrategy to centralize form rendering logic
- Add support for different form modes: LIVE, PREVIEW, TEST, EDIT, PREFILL
- Refactor components to use mode-based rendering strategy
- Remove legacy boolean props like adminPreview and creating
- Enhance form component flexibility and reusability
* Refine Form Mode Strategy Display Behavior
- Update FormModeStrategy to hide hidden fields in PREVIEW mode
- Add FormMode getter in UrlFormPrefill component for mode-specific rendering
- Clarify mode-specific validation and display logic in form strategies
* Enhance Form Template Generation with Advanced Field Options
- Update GenerateTemplate command to use front_url for template URL output
- Expand GenerateFormPrompt with comprehensive field configuration options
- Add support for advanced field types: date with time, toggle switches, radio/checkbox selections
- Introduce field width configuration and HTML formatting for text elements
- Re-enable select, multi-select, and matrix field type definitions with enhanced configurations
* Remove Deprecated Template Metadata Generation Services
- Delete multiple AI prompt services related to template metadata generation
- Simplify GenerateTemplate command to use default values instead of complex metadata generation
- Remove GenerateTemplateMetadataPrompt and related classes like GenerateTemplateDescriptionPrompt, GenerateTemplateImageKeywordsPrompt, etc.
- Update form template generation to use basic fallback metadata generation approach
* Restore GenerateTemplateMetadataPrompt for Comprehensive Template Generation
- Reintroduce GenerateTemplateMetadataPrompt to replace default metadata generation
- Update GenerateTemplate command to use consolidated metadata generation approach
- Extract detailed metadata components including title, description, industries, and image search query
- Improve template generation with more dynamic and AI-generated metadata
* Refactor Template Preview Section Layout
- Remove unnecessary nested div in template preview section
- Simplify HTML structure for the template preview component
- Maintain existing styling and functionality while improving code readability
* Refactor Constructor and Code Formatting in AI Form Generation and Prompt Classes
- Updated the constructor in GenerateAiForm.php to use a block structure for improved readability and consistency.
- Added a blank line in the Prompt.php file to enhance code formatting and maintain consistency with PHP coding standards.
- Modified the migration file to use a more concise class declaration syntax, improving clarity.
These changes aim to enhance code readability and maintainability across the affected files.
---------
Co-authored-by: Julien Nahum <julien@nahum.net>
2025-03-21 16:59:18 +01:00
|
|
|
{
|
|
|
|
|
type: "nf-text",
|
|
|
|
|
content: "<h1>My Form</h1>",
|
|
|
|
|
name: "Title",
|
|
|
|
|
id: generateUUID(),
|
|
|
|
|
},
|
2024-02-01 18:21:30 +01:00
|
|
|
{
|
2024-04-15 19:39:03 +02:00
|
|
|
name: "Name",
|
|
|
|
|
type: "text",
|
2024-02-01 18:21:30 +01:00
|
|
|
hidden: false,
|
|
|
|
|
required: true,
|
2024-04-15 19:39:03 +02:00
|
|
|
id: generateUUID(),
|
2024-02-01 18:21:30 +01:00
|
|
|
},
|
|
|
|
|
{
|
2024-04-15 19:39:03 +02:00
|
|
|
name: "Email",
|
|
|
|
|
type: "email",
|
2024-02-01 18:21:30 +01:00
|
|
|
hidden: false,
|
2024-04-15 19:39:03 +02:00
|
|
|
id: generateUUID(),
|
2024-02-01 18:21:30 +01:00
|
|
|
},
|
|
|
|
|
{
|
2024-04-15 19:39:03 +02:00
|
|
|
name: "Message",
|
|
|
|
|
type: "text",
|
2024-02-01 18:21:30 +01:00
|
|
|
hidden: false,
|
|
|
|
|
multi_lines: true,
|
2024-04-15 19:39:03 +02:00
|
|
|
id: generateUUID(),
|
|
|
|
|
},
|
2024-02-01 18:21:30 +01:00
|
|
|
]
|
|
|
|
|
}
|
2024-09-23 20:02:38 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Sets default values for form properties if they are not already defined.
|
|
|
|
|
* This function ensures that all necessary form fields have a valid initial value,
|
|
|
|
|
* which helps maintain consistency and prevents errors due to undefined properties.
|
|
|
|
|
*
|
|
|
|
|
* @param {Object} formData - The initial form data object
|
|
|
|
|
* @returns {Object} A new object with default values applied where necessary
|
|
|
|
|
*/
|
|
|
|
|
export function setFormDefaults(formData) {
|
|
|
|
|
const defaultValues = {
|
|
|
|
|
title: 'Untitled Form',
|
|
|
|
|
visibility: 'public',
|
|
|
|
|
theme: 'default',
|
|
|
|
|
width: 'centered',
|
|
|
|
|
size: 'md',
|
|
|
|
|
border_radius: 'small',
|
|
|
|
|
dark_mode: 'light',
|
|
|
|
|
color: '#3B82F6',
|
|
|
|
|
uppercase_labels: false,
|
|
|
|
|
no_branding: false,
|
|
|
|
|
transparent_background: false,
|
|
|
|
|
submit_button_text: 'Submit',
|
|
|
|
|
confetti_on_submission: false,
|
|
|
|
|
show_progress_bar: false,
|
|
|
|
|
bypass_success_page: false,
|
|
|
|
|
can_be_indexed: true,
|
|
|
|
|
use_captcha: false,
|
2024-12-18 16:35:09 +01:00
|
|
|
captcha_provider: 'recaptcha',
|
2024-09-23 20:02:38 +02:00
|
|
|
properties: [],
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const filledFormData = clonedeep(formData)
|
|
|
|
|
|
|
|
|
|
for (const [key, value] of Object.entries(defaultValues)) {
|
|
|
|
|
if (filledFormData[key] === undefined || filledFormData[key] === null || (typeof value === 'string' && filledFormData[key] === '')) {
|
|
|
|
|
filledFormData[key] = value
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Handle required nested properties
|
|
|
|
|
if (filledFormData.properties && Array.isArray(filledFormData.properties)) {
|
|
|
|
|
filledFormData.properties = filledFormData.properties.map(property => ({
|
|
|
|
|
...property,
|
|
|
|
|
name: property.name === '' || property.name === null || property.name === undefined ? 'Untitled' : property.name,
|
|
|
|
|
}))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return filledFormData
|
|
|
|
|
}
|