@seed-ship/mcp-ui-solid 4.2.2 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/README.md +13 -8
- package/dist/components/FormFieldRenderer.cjs +132 -52
- package/dist/components/FormFieldRenderer.cjs.map +1 -1
- package/dist/components/FormFieldRenderer.js +133 -53
- package/dist/components/FormFieldRenderer.js.map +1 -1
- package/dist/components/FormRenderer.cjs +25 -6
- package/dist/components/FormRenderer.cjs.map +1 -1
- package/dist/components/FormRenderer.d.ts.map +1 -1
- package/dist/components/FormRenderer.js +25 -6
- package/dist/components/FormRenderer.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +583 -280
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.d.ts +2 -0
- package/dist/components/ScratchpadPanel.d.ts.map +1 -1
- package/dist/components/ScratchpadPanel.js +583 -280
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/dist/services/validation.cjs +8 -0
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +8 -0
- package/dist/services/validation.js.map +1 -1
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types.d.cts +8 -0
- package/dist/types.d.ts +8 -0
- package/package.json +1 -1
- package/src/components/FormFieldRenderer.tsx +89 -2
- package/src/components/FormRenderer.tsx +12 -0
- package/src/components/ScratchpadPanel.tsx +174 -1
- package/src/services/validation.ts +10 -0
- package/src/types/index.ts +8 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -5,7 +5,7 @@ import { useAction } from "../hooks/useAction.js";
|
|
|
5
5
|
import { validateFormData } from "../services/validation.js";
|
|
6
6
|
import { evaluateCondition } from "../hooks/useConditionalField.js";
|
|
7
7
|
import { useFormPersistence } from "../hooks/useFormPersistence.js";
|
|
8
|
-
var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md"><p class="text-sm text-red-600 dark:text-red-400"role=alert>`), _tmpl$3 = /* @__PURE__ */ template(`<div class="mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md"><span class="text-sm text-blue-700 dark:text-blue-300"><!$><!/> in <!$><!/>s...</span><button type=button class="text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200">Cancel`), _tmpl$4 = /* @__PURE__ */ template(`<button type=button class="px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors">Reset`), _tmpl$5 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><!$><!/><form novalidate
|
|
8
|
+
var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-4">`), _tmpl$2 = /* @__PURE__ */ template(`<div class="mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md"><p class="text-sm text-red-600 dark:text-red-400"role=alert>`), _tmpl$3 = /* @__PURE__ */ template(`<div class="mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md"><span class="text-sm text-blue-700 dark:text-blue-300"><!$><!/> in <!$><!/>s...</span><button type=button class="text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200">Cancel`), _tmpl$4 = /* @__PURE__ */ template(`<button type=button class="px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors">Reset`), _tmpl$5 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4"><!$><!/><form novalidate><!$><!/><div></div><!$><!/><!$><!/><div class="flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700"><button type=submit class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors"></button><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 mb-3"><!$><!/> champ<!$><!/> pré-rempli<!$><!/> sur <!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<span class="flex items-center gap-2"><span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></span>Submitting...`);
|
|
9
9
|
function getFieldDefault(type) {
|
|
10
10
|
switch (type) {
|
|
11
11
|
case "checkbox":
|
|
@@ -178,7 +178,7 @@ const FormRenderer = (props) => {
|
|
|
178
178
|
}
|
|
179
179
|
};
|
|
180
180
|
return (() => {
|
|
181
|
-
var _el$ = getNextElement(_tmpl$5), _el$
|
|
181
|
+
var _el$ = getNextElement(_tmpl$5), _el$25 = _el$.firstChild, [_el$26, _co$7] = getNextMarker(_el$25.nextSibling), _el$3 = _el$26.nextSibling, _el$19 = _el$3.firstChild, [_el$20, _co$4] = getNextMarker(_el$19.nextSibling), _el$4 = _el$20.nextSibling, _el$21 = _el$4.nextSibling, [_el$22, _co$5] = getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$6] = getNextMarker(_el$23.nextSibling), _el$14 = _el$24.nextSibling, _el$15 = _el$14.firstChild, _el$17 = _el$15.nextSibling, [_el$18, _co$3] = getNextMarker(_el$17.nextSibling);
|
|
182
182
|
insert(_el$, createComponent(Show, {
|
|
183
183
|
get when() {
|
|
184
184
|
return params().title;
|
|
@@ -188,8 +188,27 @@ const FormRenderer = (props) => {
|
|
|
188
188
|
insert(_el$2, () => params().title);
|
|
189
189
|
return _el$2;
|
|
190
190
|
}
|
|
191
|
-
}), _el$
|
|
191
|
+
}), _el$26, _co$7);
|
|
192
192
|
_el$3.addEventListener("submit", handleSubmit);
|
|
193
|
+
insert(_el$3, createComponent(Show, {
|
|
194
|
+
get when() {
|
|
195
|
+
return params().fields.some((f) => f.prefill != null);
|
|
196
|
+
},
|
|
197
|
+
get children() {
|
|
198
|
+
return (() => {
|
|
199
|
+
const prefilled = params().fields.filter((f) => f.prefill != null).length;
|
|
200
|
+
const total = params().fields.length;
|
|
201
|
+
return (() => {
|
|
202
|
+
var _el$27 = getNextElement(_tmpl$6), _el$31 = _el$27.firstChild, [_el$32, _co$8] = getNextMarker(_el$31.nextSibling), _el$28 = _el$32.nextSibling, _el$33 = _el$28.nextSibling, [_el$34, _co$9] = getNextMarker(_el$33.nextSibling), _el$29 = _el$34.nextSibling, _el$35 = _el$29.nextSibling, [_el$36, _co$0] = getNextMarker(_el$35.nextSibling), _el$30 = _el$36.nextSibling, _el$37 = _el$30.nextSibling, [_el$38, _co$1] = getNextMarker(_el$37.nextSibling);
|
|
203
|
+
insert(_el$27, prefilled, _el$32, _co$8);
|
|
204
|
+
insert(_el$27, prefilled > 1 ? "s" : "", _el$34, _co$9);
|
|
205
|
+
insert(_el$27, prefilled > 1 ? "s" : "", _el$36, _co$0);
|
|
206
|
+
insert(_el$27, total, _el$38, _co$1);
|
|
207
|
+
return _el$27;
|
|
208
|
+
})();
|
|
209
|
+
})();
|
|
210
|
+
}
|
|
211
|
+
}), _el$20, _co$4);
|
|
193
212
|
insert(_el$4, createComponent(For, {
|
|
194
213
|
get each() {
|
|
195
214
|
return params().fields;
|
|
@@ -218,7 +237,7 @@ const FormRenderer = (props) => {
|
|
|
218
237
|
insert(_el$6, () => errors()._form);
|
|
219
238
|
return _el$5;
|
|
220
239
|
}
|
|
221
|
-
}), _el$
|
|
240
|
+
}), _el$22, _co$5);
|
|
222
241
|
insert(_el$3, createComponent(Show, {
|
|
223
242
|
get when() {
|
|
224
243
|
return countdown() != null;
|
|
@@ -236,10 +255,10 @@ const FormRenderer = (props) => {
|
|
|
236
255
|
runHydrationEvents();
|
|
237
256
|
return _el$7;
|
|
238
257
|
}
|
|
239
|
-
}), _el$
|
|
258
|
+
}), _el$24, _co$6);
|
|
240
259
|
insert(_el$15, (() => {
|
|
241
260
|
var _c$ = memo(() => !!isSubmitting());
|
|
242
|
-
return () => _c$() ? getNextElement(_tmpl$
|
|
261
|
+
return () => _c$() ? getNextElement(_tmpl$7) : params().submitLabel || "Submit";
|
|
243
262
|
})());
|
|
244
263
|
insert(_el$14, createComponent(Show, {
|
|
245
264
|
get when() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormRenderer.js","sources":["../../src/components/FormRenderer.tsx"],"sourcesContent":["/**\n * FormRenderer - Main form component\n * Sprint 1: Form Foundation\n * Sprint 2: Conditional field visibility (showWhen)\n * Sprint 4: Form state persistence\n */\n\nimport { Component, createSignal, For, Show, onMount, createEffect, onCleanup } from 'solid-js'\nimport { FormFieldRenderer } from './FormFieldRenderer'\nimport type { UIComponent, FormComponentParams, FormFieldParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { validateFormData } from '../services/validation'\nimport { evaluateCondition } from '../hooks/useConditionalField'\nimport { useFormPersistence } from '../hooks/useFormPersistence'\n\nexport interface FormRendererProps {\n component: UIComponent\n onSubmit?: (data: Record<string, any>) => void\n onError?: (errors: Record<string, string>) => void\n}\n\n/**\n * Get default value for a field type\n */\nfunction getFieldDefault(type: FormFieldParams['type']): any {\n switch (type) {\n case 'checkbox':\n return false\n case 'number':\n return undefined\n case 'select':\n case 'radio':\n return ''\n default:\n return ''\n }\n}\n\nexport const FormRenderer: Component<FormRendererProps> = (props) => {\n const params = () => props.component.params as FormComponentParams\n const [formData, setFormData] = createSignal<Record<string, any>>({})\n const [errors, setErrors] = createSignal<Record<string, string>>({})\n const [isSubmitting, setIsSubmitting] = createSignal(false)\n const { execute } = useAction()\n\n // Form persistence (Sprint 4)\n let clearPersisted: (() => void) | undefined\n\n /**\n * Get fields that are currently visible based on showWhen conditions\n */\n const getVisibleFields = (): FormFieldParams[] => {\n return params().fields.filter((field) => {\n if (!field.showWhen) return true\n return evaluateCondition(field.showWhen, formData())\n })\n }\n\n // Auto-submit countdown state (v4.2.0)\n const [countdown, setCountdown] = createSignal<number | null>(null)\n let countdownTimer: ReturnType<typeof setInterval> | null = null\n const [userInteracted, setUserInteracted] = createSignal(false)\n\n const cancelCountdown = () => {\n if (countdownTimer) {\n clearInterval(countdownTimer)\n countdownTimer = null\n }\n setCountdown(null)\n }\n\n const handleUserInteraction = () => {\n if (!userInteracted()) {\n setUserInteracted(true)\n cancelCountdown()\n }\n }\n\n onCleanup(() => cancelCountdown())\n\n /**\n * Check if all required fields have prefill values\n */\n const allRequiredPrefilled = (): boolean => {\n return params().fields\n .filter((f) => f.required)\n .every((f) => f.prefill != null)\n }\n\n // Initialize form data with default values, applying prefill (v4.2.0)\n const initializeForm = (clearStorage = false) => {\n const initial: Record<string, any> = {}\n for (const field of params().fields) {\n // prefill takes priority over defaultValue\n initial[field.name] = field.prefill ?? field.defaultValue ?? getFieldDefault(field.type)\n }\n setFormData(initial)\n setErrors({})\n\n // Clear persisted data if requested\n if (clearStorage && clearPersisted) {\n clearPersisted()\n }\n }\n\n // Initialize on mount\n onMount(() => {\n initializeForm()\n })\n\n // Setup persistence if persistKey is provided (Sprint 4)\n createEffect(() => {\n const persistKey = params().persistKey\n if (persistKey) {\n const persistence = useFormPersistence({\n persistKey,\n formData,\n setFormData,\n excludeFields: params().excludeFromPersistence,\n expiresIn: params().persistExpiresIn,\n })\n clearPersisted = persistence.clearPersisted\n }\n })\n\n // Auto-submit countdown (v4.2.0)\n createEffect(() => {\n const delay = params().autoSubmitDelay\n if (!delay || !allRequiredPrefilled() || userInteracted()) return\n\n let remaining = Math.ceil(delay / 1000)\n setCountdown(remaining)\n\n countdownTimer = setInterval(() => {\n remaining--\n if (remaining <= 0) {\n cancelCountdown()\n // Trigger submit programmatically\n const form = document.querySelector(`#form-${props.component.id}`) as HTMLFormElement | null\n if (form) form.requestSubmit()\n } else {\n setCountdown(remaining)\n }\n }, 1000)\n })\n\n const handleFieldChange = (name: string, value: any) => {\n handleUserInteraction()\n setFormData((prev) => ({ ...prev, [name]: value }))\n // Clear error on change\n if (errors()[name]) {\n setErrors((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [name]: _removed, ...rest } = prev\n return rest\n })\n }\n }\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setIsSubmitting(true)\n setErrors({})\n\n // Get only visible fields for validation and submission\n const visibleFields = getVisibleFields()\n const visibleFieldNames = new Set(visibleFields.map((f) => f.name))\n\n // Filter form data to only include visible fields\n const visibleFormData: Record<string, any> = {}\n for (const [key, value] of Object.entries(formData())) {\n if (visibleFieldNames.has(key)) {\n visibleFormData[key] = value\n }\n }\n\n // Validate only visible fields\n const validationResult = validateFormData(visibleFormData, visibleFields)\n if (!validationResult.valid) {\n setErrors(validationResult.errors)\n setIsSubmitting(false)\n props.onError?.(validationResult.errors)\n return\n }\n\n // Submit via tool call if specified\n if (params().submitAction?.toolName) {\n try {\n const result = await execute(params().submitAction!.toolName, {\n ...params().submitAction!.params,\n formData: visibleFormData,\n })\n if (!result.success) {\n setErrors({ _form: result.error || 'Submission failed' })\n setIsSubmitting(false)\n props.onError?.({ _form: result.error || 'Submission failed' })\n return\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed'\n setErrors({ _form: errorMessage })\n setIsSubmitting(false)\n props.onError?.({ _form: errorMessage })\n return\n }\n }\n\n // Clear persisted data on successful submit\n if (clearPersisted) {\n clearPersisted()\n }\n\n props.onSubmit?.(visibleFormData)\n setIsSubmitting(false)\n }\n\n const layoutClass = () => {\n switch (params().layout) {\n case 'horizontal':\n return 'grid grid-cols-2 gap-4'\n case 'inline':\n return 'flex flex-wrap gap-4 items-end'\n default:\n return 'space-y-4'\n }\n }\n\n return (\n <div class=\"w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <Show when={params().title}>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n {params().title}\n </h3>\n </Show>\n\n <form id={`form-${props.component.id}`} onSubmit={handleSubmit} noValidate>\n <div class={layoutClass()}>\n <For each={params().fields}>\n {(field) => (\n <FormFieldRenderer\n field={field}\n value={formData()[field.name]}\n error={errors()[field.name]}\n onChange={(value) => handleFieldChange(field.name, value)}\n disabled={isSubmitting() || field.disabled}\n formData={formData}\n />\n )}\n </For>\n </div>\n\n <Show when={errors()._form}>\n <div class=\"mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md\">\n <p class=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {errors()._form}\n </p>\n </div>\n </Show>\n\n {/* Auto-submit countdown (v4.2.0) */}\n <Show when={countdown() != null}>\n <div class=\"mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md\">\n <span class=\"text-sm text-blue-700 dark:text-blue-300\">\n {params().submitLabel || 'Submit'} in {countdown()}s...\n </span>\n <button\n type=\"button\"\n onClick={() => { cancelCountdown(); setUserInteracted(true) }}\n class=\"text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200\"\n >\n Cancel\n </button>\n </div>\n </Show>\n\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"submit\"\n disabled={isSubmitting()}\n class=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting() ? (\n <span class=\"flex items-center gap-2\">\n <span class=\"animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full\" />\n Submitting...\n </span>\n ) : (\n params().submitLabel || 'Submit'\n )}\n </button>\n <Show when={params().showReset}>\n <button\n type=\"button\"\n onClick={() => initializeForm(true)}\n disabled={isSubmitting()}\n class=\"px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Reset\n </button>\n </Show>\n </div>\n </form>\n </div>\n )\n}\n"],"names":["getFieldDefault","type","undefined","FormRenderer","props","params","component","formData","setFormData","createSignal","errors","setErrors","isSubmitting","setIsSubmitting","execute","useAction","clearPersisted","getVisibleFields","fields","filter","field","showWhen","evaluateCondition","countdown","setCountdown","countdownTimer","userInteracted","setUserInteracted","cancelCountdown","clearInterval","handleUserInteraction","onCleanup","allRequiredPrefilled","f","required","every","prefill","initializeForm","clearStorage","initial","name","defaultValue","onMount","createEffect","persistKey","persistence","useFormPersistence","excludeFields","excludeFromPersistence","expiresIn","persistExpiresIn","delay","autoSubmitDelay","remaining","Math","ceil","setInterval","form","document","querySelector","id","requestSubmit","handleFieldChange","value","prev","_removed","rest","handleSubmit","e","preventDefault","visibleFields","visibleFieldNames","Set","map","visibleFormData","key","Object","entries","has","validationResult","validateFormData","valid","onError","submitAction","toolName","result","success","_form","error","errorMessage","Error","message","onSubmit","layoutClass","layout","_el$","_$getNextElement","_tmpl$5","_el$23","firstChild","_el$24","_co$6","_$getNextMarker","nextSibling","_el$3","_el$4","_el$19","_el$20","_co$4","_el$21","_el$22","_co$5","_el$14","_el$15","_el$17","_el$18","_co$3","_$insert","_$createComponent","Show","when","title","children","_el$2","_tmpl$","addEventListener","For","each","FormFieldRenderer","onChange","disabled","_el$5","_tmpl$2","_el$6","_el$7","_tmpl$3","_el$8","_el$1","_el$10","_co$","_el$9","_el$11","_el$12","_co$2","_el$13","submitLabel","$$click","_$runHydrationEvents","_c$","_$memo","_tmpl$6","showReset","_el$16","_tmpl$4","_$effect","_$setProperty","_p$","_v$","_v$2","_v$3","_$setAttribute","t","_$className","a","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormRenderer.js","sources":["../../src/components/FormRenderer.tsx"],"sourcesContent":["/**\n * FormRenderer - Main form component\n * Sprint 1: Form Foundation\n * Sprint 2: Conditional field visibility (showWhen)\n * Sprint 4: Form state persistence\n */\n\nimport { Component, createSignal, For, Show, onMount, createEffect, onCleanup } from 'solid-js'\nimport { FormFieldRenderer } from './FormFieldRenderer'\nimport type { UIComponent, FormComponentParams, FormFieldParams } from '../types'\nimport { useAction } from '../hooks/useAction'\nimport { validateFormData } from '../services/validation'\nimport { evaluateCondition } from '../hooks/useConditionalField'\nimport { useFormPersistence } from '../hooks/useFormPersistence'\n\nexport interface FormRendererProps {\n component: UIComponent\n onSubmit?: (data: Record<string, any>) => void\n onError?: (errors: Record<string, string>) => void\n}\n\n/**\n * Get default value for a field type\n */\nfunction getFieldDefault(type: FormFieldParams['type']): any {\n switch (type) {\n case 'checkbox':\n return false\n case 'number':\n return undefined\n case 'select':\n case 'radio':\n return ''\n default:\n return ''\n }\n}\n\nexport const FormRenderer: Component<FormRendererProps> = (props) => {\n const params = () => props.component.params as FormComponentParams\n const [formData, setFormData] = createSignal<Record<string, any>>({})\n const [errors, setErrors] = createSignal<Record<string, string>>({})\n const [isSubmitting, setIsSubmitting] = createSignal(false)\n const { execute } = useAction()\n\n // Form persistence (Sprint 4)\n let clearPersisted: (() => void) | undefined\n\n /**\n * Get fields that are currently visible based on showWhen conditions\n */\n const getVisibleFields = (): FormFieldParams[] => {\n return params().fields.filter((field) => {\n if (!field.showWhen) return true\n return evaluateCondition(field.showWhen, formData())\n })\n }\n\n // Auto-submit countdown state (v4.2.0)\n const [countdown, setCountdown] = createSignal<number | null>(null)\n let countdownTimer: ReturnType<typeof setInterval> | null = null\n const [userInteracted, setUserInteracted] = createSignal(false)\n\n const cancelCountdown = () => {\n if (countdownTimer) {\n clearInterval(countdownTimer)\n countdownTimer = null\n }\n setCountdown(null)\n }\n\n const handleUserInteraction = () => {\n if (!userInteracted()) {\n setUserInteracted(true)\n cancelCountdown()\n }\n }\n\n onCleanup(() => cancelCountdown())\n\n /**\n * Check if all required fields have prefill values\n */\n const allRequiredPrefilled = (): boolean => {\n return params().fields\n .filter((f) => f.required)\n .every((f) => f.prefill != null)\n }\n\n // Initialize form data with default values, applying prefill (v4.2.0)\n const initializeForm = (clearStorage = false) => {\n const initial: Record<string, any> = {}\n for (const field of params().fields) {\n // prefill takes priority over defaultValue\n initial[field.name] = field.prefill ?? field.defaultValue ?? getFieldDefault(field.type)\n }\n setFormData(initial)\n setErrors({})\n\n // Clear persisted data if requested\n if (clearStorage && clearPersisted) {\n clearPersisted()\n }\n }\n\n // Initialize on mount\n onMount(() => {\n initializeForm()\n })\n\n // Setup persistence if persistKey is provided (Sprint 4)\n createEffect(() => {\n const persistKey = params().persistKey\n if (persistKey) {\n const persistence = useFormPersistence({\n persistKey,\n formData,\n setFormData,\n excludeFields: params().excludeFromPersistence,\n expiresIn: params().persistExpiresIn,\n })\n clearPersisted = persistence.clearPersisted\n }\n })\n\n // Auto-submit countdown (v4.2.0)\n createEffect(() => {\n const delay = params().autoSubmitDelay\n if (!delay || !allRequiredPrefilled() || userInteracted()) return\n\n let remaining = Math.ceil(delay / 1000)\n setCountdown(remaining)\n\n countdownTimer = setInterval(() => {\n remaining--\n if (remaining <= 0) {\n cancelCountdown()\n // Trigger submit programmatically\n const form = document.querySelector(`#form-${props.component.id}`) as HTMLFormElement | null\n if (form) form.requestSubmit()\n } else {\n setCountdown(remaining)\n }\n }, 1000)\n })\n\n const handleFieldChange = (name: string, value: any) => {\n handleUserInteraction()\n setFormData((prev) => ({ ...prev, [name]: value }))\n // Clear error on change\n if (errors()[name]) {\n setErrors((prev) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { [name]: _removed, ...rest } = prev\n return rest\n })\n }\n }\n\n const handleSubmit = async (e: Event) => {\n e.preventDefault()\n setIsSubmitting(true)\n setErrors({})\n\n // Get only visible fields for validation and submission\n const visibleFields = getVisibleFields()\n const visibleFieldNames = new Set(visibleFields.map((f) => f.name))\n\n // Filter form data to only include visible fields\n const visibleFormData: Record<string, any> = {}\n for (const [key, value] of Object.entries(formData())) {\n if (visibleFieldNames.has(key)) {\n visibleFormData[key] = value\n }\n }\n\n // Validate only visible fields\n const validationResult = validateFormData(visibleFormData, visibleFields)\n if (!validationResult.valid) {\n setErrors(validationResult.errors)\n setIsSubmitting(false)\n props.onError?.(validationResult.errors)\n return\n }\n\n // Submit via tool call if specified\n if (params().submitAction?.toolName) {\n try {\n const result = await execute(params().submitAction!.toolName, {\n ...params().submitAction!.params,\n formData: visibleFormData,\n })\n if (!result.success) {\n setErrors({ _form: result.error || 'Submission failed' })\n setIsSubmitting(false)\n props.onError?.({ _form: result.error || 'Submission failed' })\n return\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Submission failed'\n setErrors({ _form: errorMessage })\n setIsSubmitting(false)\n props.onError?.({ _form: errorMessage })\n return\n }\n }\n\n // Clear persisted data on successful submit\n if (clearPersisted) {\n clearPersisted()\n }\n\n props.onSubmit?.(visibleFormData)\n setIsSubmitting(false)\n }\n\n const layoutClass = () => {\n switch (params().layout) {\n case 'horizontal':\n return 'grid grid-cols-2 gap-4'\n case 'inline':\n return 'flex flex-wrap gap-4 items-end'\n default:\n return 'space-y-4'\n }\n }\n\n return (\n <div class=\"w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4\">\n <Show when={params().title}>\n <h3 class=\"text-lg font-semibold text-gray-900 dark:text-white mb-4\">\n {params().title}\n </h3>\n </Show>\n\n <form id={`form-${props.component.id}`} onSubmit={handleSubmit} noValidate>\n {/* Proposal 3: prefill summary */}\n <Show when={params().fields.some((f) => f.prefill != null)}>\n {(() => {\n const prefilled = params().fields.filter((f) => f.prefill != null).length\n const total = params().fields.length\n return (\n <p class=\"text-xs text-gray-500 dark:text-gray-400 mb-3\">\n {prefilled} champ{prefilled > 1 ? 's' : ''} pré-rempli{prefilled > 1 ? 's' : ''} sur {total}\n </p>\n )\n })()}\n </Show>\n <div class={layoutClass()}>\n <For each={params().fields}>\n {(field) => (\n <FormFieldRenderer\n field={field}\n value={formData()[field.name]}\n error={errors()[field.name]}\n onChange={(value) => handleFieldChange(field.name, value)}\n disabled={isSubmitting() || field.disabled}\n formData={formData}\n />\n )}\n </For>\n </div>\n\n <Show when={errors()._form}>\n <div class=\"mt-4 p-3 bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-md\">\n <p class=\"text-sm text-red-600 dark:text-red-400\" role=\"alert\">\n {errors()._form}\n </p>\n </div>\n </Show>\n\n {/* Auto-submit countdown (v4.2.0) */}\n <Show when={countdown() != null}>\n <div class=\"mt-4 flex items-center gap-3 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-md\">\n <span class=\"text-sm text-blue-700 dark:text-blue-300\">\n {params().submitLabel || 'Submit'} in {countdown()}s...\n </span>\n <button\n type=\"button\"\n onClick={() => { cancelCountdown(); setUserInteracted(true) }}\n class=\"text-sm text-blue-600 dark:text-blue-400 underline hover:text-blue-800 dark:hover:text-blue-200\"\n >\n Cancel\n </button>\n </div>\n </Show>\n\n <div class=\"flex gap-2 pt-4 mt-4 border-t border-gray-200 dark:border-gray-700\">\n <button\n type=\"submit\"\n disabled={isSubmitting()}\n class=\"px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n {isSubmitting() ? (\n <span class=\"flex items-center gap-2\">\n <span class=\"animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full\" />\n Submitting...\n </span>\n ) : (\n params().submitLabel || 'Submit'\n )}\n </button>\n <Show when={params().showReset}>\n <button\n type=\"button\"\n onClick={() => initializeForm(true)}\n disabled={isSubmitting()}\n class=\"px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n >\n Reset\n </button>\n </Show>\n </div>\n </form>\n </div>\n )\n}\n"],"names":["getFieldDefault","type","undefined","FormRenderer","props","params","component","formData","setFormData","createSignal","errors","setErrors","isSubmitting","setIsSubmitting","execute","useAction","clearPersisted","getVisibleFields","fields","filter","field","showWhen","evaluateCondition","countdown","setCountdown","countdownTimer","userInteracted","setUserInteracted","cancelCountdown","clearInterval","handleUserInteraction","onCleanup","allRequiredPrefilled","f","required","every","prefill","initializeForm","clearStorage","initial","name","defaultValue","onMount","createEffect","persistKey","persistence","useFormPersistence","excludeFields","excludeFromPersistence","expiresIn","persistExpiresIn","delay","autoSubmitDelay","remaining","Math","ceil","setInterval","form","document","querySelector","id","requestSubmit","handleFieldChange","value","prev","_removed","rest","handleSubmit","e","preventDefault","visibleFields","visibleFieldNames","Set","map","visibleFormData","key","Object","entries","has","validationResult","validateFormData","valid","onError","submitAction","toolName","result","success","_form","error","errorMessage","Error","message","onSubmit","layoutClass","layout","_el$","_$getNextElement","_tmpl$5","_el$25","firstChild","_el$26","_co$7","_$getNextMarker","nextSibling","_el$3","_el$19","_el$20","_co$4","_el$4","_el$21","_el$22","_co$5","_el$23","_el$24","_co$6","_el$14","_el$15","_el$17","_el$18","_co$3","_$insert","_$createComponent","Show","when","title","children","_el$2","_tmpl$","addEventListener","some","prefilled","length","total","_el$27","_tmpl$6","_el$31","_el$32","_co$8","_el$28","_el$33","_el$34","_co$9","_el$29","_el$35","_el$36","_co$0","_el$30","_el$37","_el$38","_co$1","For","each","FormFieldRenderer","onChange","disabled","_el$5","_tmpl$2","_el$6","_el$7","_tmpl$3","_el$8","_el$1","_el$10","_co$","_el$9","_el$11","_el$12","_co$2","_el$13","submitLabel","$$click","_$runHydrationEvents","_c$","_$memo","_tmpl$7","showReset","_el$16","_tmpl$4","_$effect","_$setProperty","_p$","_v$","_v$2","_v$3","_$setAttribute","t","_$className","a","_$delegateEvents"],"mappings":"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"}
|