From ee69d23c50c39d2b535aee2cbbbe10e24391d2eb Mon Sep 17 00:00:00 2001 From: antoine Date: Thu, 19 Mar 2026 18:14:16 +0100 Subject: [PATCH 1/6] Fix GeneratorTest.php --- tests/Unit/Console/GeneratorTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/Unit/Console/GeneratorTest.php b/tests/Unit/Console/GeneratorTest.php index 557e47561..a0887070f 100644 --- a/tests/Unit/Console/GeneratorTest.php +++ b/tests/Unit/Console/GeneratorTest.php @@ -7,7 +7,6 @@ beforeEach(function () { login(); - File::deleteDirectory(base_path('app/Sharp')); }); afterEach(function () { From 499a57189beabd7a72157c639b9adacfdb40b33b Mon Sep 17 00:00:00 2001 From: antoine Date: Thu, 19 Mar 2026 18:47:58 +0100 Subject: [PATCH 2/6] Fix upload validation --- .../form/components/fields/Autocomplete.vue | 12 +- resources/js/form/components/fields/List.vue | 2 +- .../editor/extensions/upload/UploadNode.vue | 2 + .../form/components/fields/upload/Upload.vue | 18 +- resources/js/form/types.ts | 2 +- resources/js/form/useFieldContainerData.ts | 17 + resources/js/types/generated.d.ts | 9 +- resources/js/types/routes.d.ts | 15 +- src/Data/RequestFieldContainerData.php | 28 ++ .../Api/ApiFormUploadController.php | 25 +- .../Controllers/Api/HandlesFieldContainer.php | 19 +- src/routes/api.php | 2 +- .../Http/Api/ApiFormUploadControllerTest.php | 418 ++++++++++++++++-- tests/Http/Form/FormEditorUploadsTest.php | 28 +- tests/Http/Form/FormUploadsTest.php | 27 +- 15 files changed, 547 insertions(+), 77 deletions(-) create mode 100644 resources/js/form/useFieldContainerData.ts create mode 100644 src/Data/RequestFieldContainerData.php diff --git a/resources/js/form/components/fields/Autocomplete.vue b/resources/js/form/components/fields/Autocomplete.vue index 65b5fb18d..50d56628d 100644 --- a/resources/js/form/components/fields/Autocomplete.vue +++ b/resources/js/form/components/fields/Autocomplete.vue @@ -4,7 +4,7 @@ import { FormAutocompleteItemData, FormAutocompleteLocalFieldData, - FormAutocompleteRemoteFieldData, + FormAutocompleteRemoteFieldData } from "@/types"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { computed, ref } from "vue"; @@ -27,6 +27,7 @@ import { useIsInDialog } from "@/components/ui/dialog/Dialog.vue"; import { useFullTextSearch } from "@/composables/useFullTextSearch"; import { useRemoteAutocomplete } from "@/composables/useRemoteAutocomplete"; + import { useFieldContainerData } from "@/form/useFieldContainerData"; const props = defineProps>(); const emit = defineEmits>(); @@ -45,19 +46,16 @@ searchKeys: props.field.mode === 'local' ? props.field.searchKeys : [], } ); + const fieldContainerData = useFieldContainerData(); const { loading, search: remoteSearch } = useRemoteAutocomplete(({ query, signal, onSuccess, onError }) => { const field = props.field as FormAutocompleteRemoteFieldData; return api.post( route('code16.sharp.api.form.autocomplete.index', { entityKey: form.entityKey, - autocompleteFieldKey: props.parentField ? `${props.parentField.key}.${field.key}` : field.key, - embed_key: form.embedKey, - entity_list_command_key: parentCommands?.commandContainer === 'entityList' ? form.commandKey : null, - show_command_key: parentCommands?.commandContainer === 'show' ? form.commandKey : null, - dashboard_command_key: parentCommands?.commandContainer === 'dashboard' ? form.commandKey : null, - instance_id: form.instanceId, + autocompleteFieldKey: props.parentListField ? `${props.parentListField.key}.${field.key}` : field.key, endpoint: field.remoteEndpoint, search: query, + ...fieldContainerData, }), { formData: field.callbackLinkedFields ? Object.fromEntries( diff --git a/resources/js/form/components/fields/List.vue b/resources/js/form/components/fields/List.vue index ae61e6dd7..4f06d8c2a 100644 --- a/resources/js/form/components/fields/List.vue +++ b/resources/js/form/components/fields/List.vue @@ -226,7 +226,7 @@ :field="form.getField(itemFieldLayout.key, field.itemFields, item, props.field.readOnly)" :field-layout="itemFieldLayout" :field-error-key="`${field.key}.${item[errorIndex] ?? item[itemKey]}.${itemFieldLayout.key}`" - :parent-field="field" + :parent-list-field="field" :value="item[itemFieldLayout.key]" :locale="(form.getMeta(`${field.key}.${item[itemKey]}.${itemFieldLayout.key}`) as FieldMeta)?.locale ?? form.defaultLocale" :parent-data="item" diff --git a/resources/js/form/components/fields/editor/extensions/upload/UploadNode.vue b/resources/js/form/components/fields/editor/extensions/upload/UploadNode.vue index 9cfc8ecc9..965903fff 100644 --- a/resources/js/form/components/fields/editor/extensions/upload/UploadNode.vue +++ b/resources/js/form/components/fields/editor/extensions/upload/UploadNode.vue @@ -76,6 +76,8 @@ readOnly: parentEditor.props.field.readOnly, }" :field-error-key="`${parentEditor.props.fieldErrorKey}-upload-${props.node.attrs['data-key']}`" + :parent-list-field="parentEditor.props.parentListField" + :editor-field="parentEditor.props.field" :value="upload?.file" as-editor-embed persist-thumbnail-url diff --git a/resources/js/form/components/fields/upload/Upload.vue b/resources/js/form/components/fields/upload/Upload.vue index 7193a89ad..df469afcc 100644 --- a/resources/js/form/components/fields/upload/Upload.vue +++ b/resources/js/form/components/fields/upload/Upload.vue @@ -1,8 +1,7 @@