@mapomodule/form 2.0.0-beta.1 → 2.0.0-beta.10
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/README.md +2 -1
- package/dist/__tests__/__mocks__/nuxt-imports.d.ts +4 -0
- package/dist/__tests__/__mocks__/nuxt-imports.d.ts.map +1 -0
- package/dist/__tests__/camomillaRoundTrip.test.d.ts +2 -0
- package/dist/__tests__/camomillaRoundTrip.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/useFormFromSchema.test.d.ts +2 -0
- package/dist/__tests__/useFormFromSchema.test.d.ts.map +1 -0
- package/dist/__tests__/useMapoForm.test.d.ts +2 -0
- package/dist/__tests__/useMapoForm.test.d.ts.map +1 -0
- package/dist/index.d.mts +9 -1
- package/dist/index.d.ts +15 -1
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +7 -34
- package/dist/module.d.mts +20 -2
- package/dist/module.d.ts +12 -2
- package/dist/module.d.ts.map +1 -0
- package/dist/module.json +1 -1
- package/dist/module.mjs +187 -13
- package/dist/runtime/components/MapoFocusPortal.vue +115 -0
- package/dist/runtime/components/MapoFocusPortal.vue.d.ts +4 -0
- package/dist/runtime/components/MapoFocusPortal.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoForm.vue +168 -0
- package/dist/runtime/components/MapoForm.vue.d.ts +47 -0
- package/dist/runtime/components/MapoForm.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoFormField.vue +269 -0
- package/dist/runtime/components/MapoFormField.vue.d.ts +46 -0
- package/dist/runtime/components/MapoFormField.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoFormFlatSection.vue +149 -0
- package/dist/runtime/components/MapoFormFlatSection.vue.d.ts +15 -0
- package/dist/runtime/components/MapoFormFlatSection.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoFormGroup.vue +247 -0
- package/dist/runtime/components/MapoFormGroup.vue.d.ts +44 -0
- package/dist/runtime/components/MapoFormGroup.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoFormTabs.vue +110 -0
- package/dist/runtime/components/MapoFormTabs.vue.d.ts +15 -0
- package/dist/runtime/components/MapoFormTabs.vue.d.ts.map +1 -0
- package/dist/runtime/components/MapoUnknownField.vue +62 -0
- package/dist/runtime/components/MapoUnknownField.vue.d.ts +16 -0
- package/dist/runtime/components/MapoUnknownField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoDateField.vue +88 -0
- package/dist/runtime/components/fields/MapoDateField.vue.d.ts +17 -0
- package/dist/runtime/components/fields/MapoDateField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoDateTimeField.vue +159 -0
- package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts +17 -0
- package/dist/runtime/components/fields/MapoDateTimeField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoEnhancedMediaField.vue +130 -0
- package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoEnhancedMediaField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoFileField.vue +99 -0
- package/dist/runtime/components/fields/MapoFileField.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoFileField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoFksField.vue +122 -0
- package/dist/runtime/components/fields/MapoFksField.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoFksField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoMapField.vue +99 -0
- package/dist/runtime/components/fields/MapoMapField.vue.d.ts +22 -0
- package/dist/runtime/components/fields/MapoMapField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoMapFieldClient.vue +67 -0
- package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts +20 -0
- package/dist/runtime/components/fields/MapoMapFieldClient.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoMediaField.vue +91 -0
- package/dist/runtime/components/fields/MapoMediaField.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoMediaField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoMediaM2mField.vue +110 -0
- package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoMediaM2mField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoMediaUnavailable.vue +15 -0
- package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts +4 -0
- package/dist/runtime/components/fields/MapoMediaUnavailable.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoRepeater.vue +459 -0
- package/dist/runtime/components/fields/MapoRepeater.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoRepeater.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoRepeaterItem.vue +346 -0
- package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts +55 -0
- package/dist/runtime/components/fields/MapoRepeaterItem.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoSeoPreview.vue +122 -0
- package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts +22 -0
- package/dist/runtime/components/fields/MapoSeoPreview.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoTimeField.vue +44 -0
- package/dist/runtime/components/fields/MapoTimeField.vue.d.ts +17 -0
- package/dist/runtime/components/fields/MapoTimeField.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/MapoWygEditor.vue +252 -0
- package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts +16 -0
- package/dist/runtime/components/fields/MapoWygEditor.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiCheckbox.vue +9 -0
- package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiCheckbox.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiInput.vue +9 -0
- package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiInput.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiSelectMenu.vue +18 -0
- package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiSelectMenu.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiSlider.vue +9 -0
- package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiSlider.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiSwitch.vue +9 -0
- package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiSwitch.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/NuiTextarea.vue +9 -0
- package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts +4 -0
- package/dist/runtime/components/fields/nui/NuiTextarea.vue.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts +13 -0
- package/dist/runtime/components/fields/nui/useNuiFieldAttrs.d.ts.map +1 -0
- package/dist/runtime/components/fields/nui/useNuiFieldAttrs.js +19 -0
- package/dist/runtime/composables/defineFormField.d.ts +25 -0
- package/dist/runtime/composables/defineFormField.d.ts.map +1 -0
- package/dist/runtime/composables/defineFormField.js +27 -0
- package/dist/runtime/composables/useCurrentLang.d.ts +6 -0
- package/dist/runtime/composables/useCurrentLang.d.ts.map +1 -0
- package/dist/runtime/composables/useCurrentLang.js +9 -0
- package/dist/runtime/composables/useFocusMode.d.ts +40 -0
- package/dist/runtime/composables/useFocusMode.d.ts.map +1 -0
- package/dist/runtime/composables/useFocusMode.js +31 -0
- package/dist/runtime/composables/useFormDraft.d.ts +60 -0
- package/dist/runtime/composables/useFormDraft.d.ts.map +1 -0
- package/dist/runtime/composables/useFormDraft.js +52 -0
- package/dist/runtime/composables/useFormFromSchema.d.ts +21 -0
- package/dist/runtime/composables/useFormFromSchema.d.ts.map +1 -0
- package/dist/runtime/composables/useFormFromSchema.js +145 -0
- package/dist/runtime/composables/useMapoForm.d.ts +96 -0
- package/dist/runtime/composables/useMapoForm.d.ts.map +1 -0
- package/dist/runtime/composables/useMapoForm.js +325 -0
- package/dist/runtime/composables/useMediaManager.d.ts +17 -0
- package/dist/runtime/composables/useMediaManager.d.ts.map +1 -0
- package/dist/runtime/composables/useMediaManager.js +6 -0
- package/dist/runtime/composables/useProgressiveDisclosure.d.ts +44 -0
- package/dist/runtime/composables/useProgressiveDisclosure.d.ts.map +1 -0
- package/dist/runtime/composables/useProgressiveDisclosure.js +23 -0
- package/dist/runtime/composables/useUnsavedChangesGuard.d.ts +24 -0
- package/dist/runtime/composables/useUnsavedChangesGuard.d.ts.map +1 -0
- package/dist/runtime/composables/useUnsavedChangesGuard.js +28 -0
- package/dist/runtime/devtools/DevtoolsFormsPage.vue +235 -0
- package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts +4 -0
- package/dist/runtime/devtools/DevtoolsFormsPage.vue.d.ts.map +1 -0
- package/dist/runtime/plugins/form-registry.d.ts +18 -0
- package/dist/runtime/plugins/form-registry.d.ts.map +1 -0
- package/dist/runtime/plugins/form-registry.js +19 -0
- package/dist/runtime/registry/defaults.d.ts +3 -0
- package/dist/runtime/registry/defaults.d.ts.map +1 -0
- package/dist/runtime/registry/defaults.js +93 -0
- package/dist/runtime/types/descriptor.d.ts +373 -0
- package/dist/runtime/types/descriptor.d.ts.map +1 -0
- package/dist/runtime/types/descriptor.js +26 -0
- package/dist/runtime/types/index.d.ts +12 -0
- package/dist/runtime/types/index.d.ts.map +1 -0
- package/dist/runtime/types/index.js +6 -0
- package/dist/runtime/types/layout.d.ts +21 -0
- package/dist/runtime/types/layout.d.ts.map +1 -0
- package/dist/runtime/types/layout.js +0 -0
- package/dist/runtime/types/media.d.ts +43 -0
- package/dist/runtime/types/media.d.ts.map +1 -0
- package/dist/runtime/types/media.js +0 -0
- package/dist/runtime/types/registry.d.ts +62 -0
- package/dist/runtime/types/registry.d.ts.map +1 -0
- package/dist/runtime/types/registry.js +19 -0
- package/dist/runtime/utils/flattenFieldGroups.d.ts +50 -0
- package/dist/runtime/utils/flattenFieldGroups.d.ts.map +1 -0
- package/dist/runtime/utils/flattenFieldGroups.js +24 -0
- package/dist/types.d.mts +6 -10
- package/package.json +10 -8
- package/src/__tests__/article.schema.json +193 -0
- package/src/__tests__/camomillaRoundTrip.test.ts +73 -0
- package/src/__tests__/useFormFromSchema.test.ts +24 -0
- package/src/__tests__/useMapoForm.test.ts +5 -0
- package/src/index.ts +5 -0
- package/src/module.ts +34 -0
- package/src/runtime/components/MapoFocusPortal.vue +3 -1
- package/src/runtime/components/MapoFormTabs.vue +4 -1
- package/src/runtime/components/fields/MapoDateField.vue +3 -1
- package/src/runtime/components/fields/MapoDateTimeField.vue +3 -1
- package/src/runtime/components/fields/MapoEnhancedMediaField.vue +153 -0
- package/src/runtime/components/fields/MapoFileField.vue +3 -1
- package/src/runtime/components/fields/MapoFksField.vue +7 -2
- package/src/runtime/components/fields/MapoMapField.vue +5 -2
- package/src/runtime/components/fields/MapoMediaField.vue +104 -0
- package/src/runtime/components/fields/MapoMediaM2mField.vue +130 -0
- package/src/runtime/components/fields/MapoMediaUnavailable.vue +19 -0
- package/src/runtime/components/fields/MapoRepeater.vue +33 -26
- package/src/runtime/components/fields/MapoRepeaterItem.vue +14 -8
- package/src/runtime/components/fields/MapoSeoPreview.vue +17 -13
- package/src/runtime/components/fields/MapoWygEditor.vue +47 -5
- package/src/runtime/composables/useFormFromSchema.ts +4 -1
- package/src/runtime/composables/useMapoForm.ts +4 -2
- package/src/runtime/composables/useMediaManager.ts +21 -0
- package/src/runtime/composables/useUnsavedChangesGuard.ts +3 -3
- package/src/runtime/registry/defaults.ts +9 -1
- package/src/runtime/types/descriptor.ts +22 -7
- package/src/runtime/types/index.ts +4 -0
- package/src/runtime/types/media.ts +44 -0
- package/dist/index.d.cts +0 -1
- package/dist/module.d.cts +0 -2
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Form engine for Mapo v2 — descriptor-driven, typesafe, headless-ready admin fo
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
7
|
- **Descriptor-driven**: define fields as `FieldDescriptor[]` — layout, validation, i18n in one object
|
|
8
|
-
- **All field types built-in**: text, select, date/time, FK/M2M autocomplete, WYSIWYG editor, SEO preview, map, repeater
|
|
8
|
+
- **All field types built-in**: text, select, date/time, FK/M2M autocomplete, WYSIWYG editor, SEO preview, map, repeater, media pickers
|
|
9
9
|
- **Headless composable**: `useMapoForm()` for fully custom layouts; `<MapoForm>` for the default shell
|
|
10
10
|
- **Registry auto-injection**: `<MapoForm>` and `<MapoDetail>` resolve `$mapoFormRegistry` automatically — no boilerplate
|
|
11
11
|
- **Typed extension API**: `defineFormField(type, entry, opts)` to register custom fields with collision detection
|
|
@@ -16,6 +16,7 @@ Form engine for Mapo v2 — descriptor-driven, typesafe, headless-ready admin fo
|
|
|
16
16
|
- **Consistent repeater items**: `MapoRepeater` drives each item through `useMapoForm`, so nested-path keys, `translatable`, accessors, `descriptor.is` overrides and **client validation** behave identically inside a repeater
|
|
17
17
|
- **Draft persistence**: `draftKey` option on `useMapoForm()` auto-saves to localStorage every 2 s; `checkDraft()` / `draftBanner` offer restore/discard; clears on successful `submit()`
|
|
18
18
|
- **Fail-soft**: unknown field types render a non-destructive placeholder, never crash the form
|
|
19
|
+
- **Media pickers**: `media`, `media-m2m` and `enhanced-media` field types are built in; they drive the Media Manager from [`@mapomodule/uikit`](../uikit/README.md), resolved at runtime — install it to enable them
|
|
19
20
|
|
|
20
21
|
## Install
|
|
21
22
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuxt-imports.d.ts","sourceRoot":"","sources":["../../../src/__tests__/__mocks__/nuxt-imports.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa;;EAEvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"camomillaRoundTrip.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/camomillaRoundTrip.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFormFromSchema.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useFormFromSchema.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMapoForm.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/useMapoForm.test.ts"],"names":[],"mappings":""}
|
package/dist/index.d.mts
CHANGED
|
@@ -1 +1,9 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { MapoFormOptions } from './module.mjs';
|
|
2
|
+
export { UseFormFromSchemaOptions, useFormFromSchema } from '../dist/runtime/composables/useFormFromSchema.js';
|
|
3
|
+
export { UseFormDraftOptions, useFormDraft } from '../dist/runtime/composables/useFormDraft.js';
|
|
4
|
+
export { FocusTarget, useFocusMode } from '../dist/runtime/composables/useFocusMode.js';
|
|
5
|
+
export { UnsavedChangesGuardOptions, useUnsavedChangesGuard } from '../dist/runtime/composables/useUnsavedChangesGuard.js';
|
|
6
|
+
export { greaterThan, isEmpty, isNoneOf, isNotEmpty, isOneOf, lessThan, matches, matchesField, when, whenAny, whenNot } from '../dist/runtime/composables/useProgressiveDisclosure.js';
|
|
7
|
+
export { FieldGroupDescriptor, flattenFieldGroups } from '../dist/runtime/utils/flattenFieldGroups.js';
|
|
8
|
+
export { AnyFieldDescriptor, BooleanDescriptor, ColorDescriptor, CustomDescriptor, DateDescriptor, EditorDescriptor, EnhancedMediaDescriptor, EnhancedMediaValue, FieldAccessor, FieldComponentEntry, FieldDescriptor, FieldRegistry, FieldType, FileDescriptor, FksDescriptor, KnownFieldType, MapDescriptor, MediaDescriptor, MediaItem, MediaLink, MediaM2mDescriptor, NumberDescriptor, PartialFieldRegistry, RepeaterDescriptor, SelectDescriptor, SeoDescriptor, TextDescriptor } from '../dist/runtime/types/index.js';
|
|
9
|
+
import '@nuxt/schema';
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1,15 @@
|
|
|
1
|
-
export
|
|
1
|
+
export type { MapoFormOptions } from "./module.js";
|
|
2
|
+
export { useFormFromSchema } from "./runtime/composables/useFormFromSchema.js";
|
|
3
|
+
export type { UseFormFromSchemaOptions } from "./runtime/composables/useFormFromSchema.js";
|
|
4
|
+
export { useFormDraft } from "./runtime/composables/useFormDraft.js";
|
|
5
|
+
export type { UseFormDraftOptions } from "./runtime/composables/useFormDraft.js";
|
|
6
|
+
export { useFocusMode } from "./runtime/composables/useFocusMode.js";
|
|
7
|
+
export type { FocusTarget } from "./runtime/composables/useFocusMode.js";
|
|
8
|
+
export { useUnsavedChangesGuard } from "./runtime/composables/useUnsavedChangesGuard.js";
|
|
9
|
+
export type { UnsavedChangesGuardOptions } from "./runtime/composables/useUnsavedChangesGuard.js";
|
|
10
|
+
export { when, whenAny, whenNot, matchesField, isOneOf, isNoneOf, isNotEmpty, isEmpty, greaterThan, lessThan, matches, } from "./runtime/composables/useProgressiveDisclosure.js";
|
|
11
|
+
export { flattenFieldGroups } from "./runtime/utils/flattenFieldGroups.js";
|
|
12
|
+
export type { FieldGroupDescriptor } from "./runtime/utils/flattenFieldGroups.js";
|
|
13
|
+
export { KnownFieldType } from "./runtime/types/index.js";
|
|
14
|
+
export type { FieldType, FieldAccessor, FieldDescriptor, AnyFieldDescriptor, TextDescriptor, NumberDescriptor, BooleanDescriptor, SelectDescriptor, FksDescriptor, DateDescriptor, ColorDescriptor, FileDescriptor, EditorDescriptor, SeoDescriptor, MapDescriptor, RepeaterDescriptor, MediaDescriptor, MediaM2mDescriptor, EnhancedMediaDescriptor, CustomDescriptor, MediaLink, MediaItem, EnhancedMediaValue, FieldComponentEntry, FieldRegistry, PartialFieldRegistry, } from "./runtime/types/index.js";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,YAAY,EAAE,wBAAwB,EAAE,MAAM,4CAA4C,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,uCAAuC,CAAC;AACrE,YAAY,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,sBAAsB,EAAE,MAAM,iDAAiD,CAAC;AACzF,YAAY,EAAE,0BAA0B,EAAE,MAAM,iDAAiD,CAAC;AAElG,OAAO,EACL,IAAI,EACJ,OAAO,EACP,OAAO,EACP,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAU,EACV,OAAO,EACP,WAAW,EACX,QAAQ,EACR,OAAO,GACR,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EACV,SAAS,EACT,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,uBAAuB,EACvB,gBAAgB,EAChB,SAAS,EACT,SAAS,EACT,kBAAkB,EAClB,mBAAmB,EACnB,aAAa,EACb,oBAAoB,GACrB,MAAM,0BAA0B,CAAC"}
|
package/dist/index.mjs
CHANGED
|
@@ -1,34 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"transformOptions": {
|
|
9
|
-
"babel": {
|
|
10
|
-
"plugins": []
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
/** @type {import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.js")} */
|
|
16
|
-
const _module = await jiti.import("/home/runner/work/mapo-new/mapo-new/packages/@mapomodule/form/src/index.ts");
|
|
17
|
-
|
|
18
|
-
export const useFormFromSchema = _module.useFormFromSchema;
|
|
19
|
-
export const useFormDraft = _module.useFormDraft;
|
|
20
|
-
export const useFocusMode = _module.useFocusMode;
|
|
21
|
-
export const useUnsavedChangesGuard = _module.useUnsavedChangesGuard;
|
|
22
|
-
export const when = _module.when;
|
|
23
|
-
export const whenAny = _module.whenAny;
|
|
24
|
-
export const whenNot = _module.whenNot;
|
|
25
|
-
export const matchesField = _module.matchesField;
|
|
26
|
-
export const isOneOf = _module.isOneOf;
|
|
27
|
-
export const isNoneOf = _module.isNoneOf;
|
|
28
|
-
export const isNotEmpty = _module.isNotEmpty;
|
|
29
|
-
export const isEmpty = _module.isEmpty;
|
|
30
|
-
export const greaterThan = _module.greaterThan;
|
|
31
|
-
export const lessThan = _module.lessThan;
|
|
32
|
-
export const matches = _module.matches;
|
|
33
|
-
export const flattenFieldGroups = _module.flattenFieldGroups;
|
|
34
|
-
export const KnownFieldType = _module.KnownFieldType;
|
|
1
|
+
export { useFormFromSchema } from '../dist/runtime/composables/useFormFromSchema.js';
|
|
2
|
+
export { useFormDraft } from '../dist/runtime/composables/useFormDraft.js';
|
|
3
|
+
export { useFocusMode } from '../dist/runtime/composables/useFocusMode.js';
|
|
4
|
+
export { useUnsavedChangesGuard } from '../dist/runtime/composables/useUnsavedChangesGuard.js';
|
|
5
|
+
export { greaterThan, isEmpty, isNoneOf, isNotEmpty, isOneOf, lessThan, matches, matchesField, when, whenAny, whenNot } from '../dist/runtime/composables/useProgressiveDisclosure.js';
|
|
6
|
+
export { flattenFieldGroups } from '../dist/runtime/utils/flattenFieldGroups.js';
|
|
7
|
+
export { KnownFieldType } from '../dist/runtime/types/index.js';
|
package/dist/module.d.mts
CHANGED
|
@@ -1,2 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { NuxtModule } from '@nuxt/schema';
|
|
2
|
+
import { PartialFieldRegistry } from '../dist/runtime/types/index.js';
|
|
3
|
+
import '../dist/runtime/composables/useFormFromSchema.js';
|
|
4
|
+
import '../dist/runtime/composables/useFormDraft.js';
|
|
5
|
+
import '../dist/runtime/composables/useFocusMode.js';
|
|
6
|
+
import '../dist/runtime/composables/useUnsavedChangesGuard.js';
|
|
7
|
+
import '../dist/runtime/composables/useProgressiveDisclosure.js';
|
|
8
|
+
import '../dist/runtime/utils/flattenFieldGroups.js';
|
|
9
|
+
|
|
10
|
+
interface MapoFormOptions {
|
|
11
|
+
fields?: PartialFieldRegistry;
|
|
12
|
+
groups?: {
|
|
13
|
+
expanded?: boolean;
|
|
14
|
+
};
|
|
15
|
+
debounce?: number;
|
|
16
|
+
}
|
|
17
|
+
declare const _default: NuxtModule<MapoFormOptions, MapoFormOptions, false>;
|
|
18
|
+
|
|
19
|
+
export { _default as default };
|
|
20
|
+
export type { MapoFormOptions };
|
package/dist/module.d.ts
CHANGED
|
@@ -1,2 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type { NuxtModule } from "@nuxt/schema";
|
|
2
|
+
import type { PartialFieldRegistry } from "./runtime/types/index.js";
|
|
3
|
+
export interface MapoFormOptions {
|
|
4
|
+
fields?: PartialFieldRegistry;
|
|
5
|
+
groups?: {
|
|
6
|
+
expanded?: boolean;
|
|
7
|
+
};
|
|
8
|
+
debounce?: number;
|
|
9
|
+
}
|
|
10
|
+
declare const _default: NuxtModule<MapoFormOptions, MapoFormOptions, false>;
|
|
11
|
+
export default _default;
|
|
12
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;;AAED,wBAkOyC"}
|
package/dist/module.json
CHANGED
package/dist/module.mjs
CHANGED
|
@@ -1,18 +1,192 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineNuxtModule, createResolver, hasNuxtModule, installModule, addPlugin, addTypeTemplate, extendPages, addComponent, addImports } from '@nuxt/kit';
|
|
2
2
|
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
const module$1 = defineNuxtModule({
|
|
4
|
+
meta: {
|
|
5
|
+
name: "@mapomodule/form",
|
|
6
|
+
configKey: "mapoForm"
|
|
7
7
|
},
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
defaults: {
|
|
9
|
+
debounce: 300,
|
|
10
|
+
groups: { expanded: true }
|
|
11
|
+
},
|
|
12
|
+
async setup(options, nuxt) {
|
|
13
|
+
const resolver = createResolver(import.meta.url);
|
|
14
|
+
nuxt.options.build.transpile.push(resolver.resolve("./runtime"));
|
|
15
|
+
nuxt.options.imports.transform ??= {};
|
|
16
|
+
(nuxt.options.imports.transform.include ??= []).push(
|
|
17
|
+
/@mapomodule[\\/]form[\\/]/
|
|
18
|
+
);
|
|
19
|
+
if (!hasNuxtModule("@mapomodule/i18n")) {
|
|
20
|
+
await installModule(await resolver.resolvePath("@mapomodule/i18n"));
|
|
11
21
|
}
|
|
22
|
+
nuxt.options.runtimeConfig.public.mapoForm = {
|
|
23
|
+
groups: { expanded: options.groups?.expanded ?? true },
|
|
24
|
+
debounce: options.debounce ?? 300,
|
|
25
|
+
// attrs is JSON-serialisable (plain objects) — merged in the plugin
|
|
26
|
+
fields: { attrs: options.fields?.attrs ?? {} }
|
|
27
|
+
};
|
|
28
|
+
addPlugin(resolver.resolve("./runtime/plugins/form-registry"));
|
|
29
|
+
addTypeTemplate({
|
|
30
|
+
filename: "types/mapo-form-registry.d.ts",
|
|
31
|
+
getContents: () => `
|
|
32
|
+
import type { FieldRegistry } from '@mapomodule/form/types';
|
|
33
|
+
declare module '#app' {
|
|
34
|
+
interface NuxtApp {
|
|
35
|
+
$mapoFormRegistry: FieldRegistry;
|
|
12
36
|
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
37
|
+
}
|
|
38
|
+
declare module 'vue' {
|
|
39
|
+
interface ComponentCustomProperties {
|
|
40
|
+
$mapoFormRegistry: FieldRegistry;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export {};
|
|
44
|
+
`
|
|
45
|
+
});
|
|
46
|
+
if (nuxt.options.dev) {
|
|
47
|
+
extendPages((pages) => {
|
|
48
|
+
pages.push({
|
|
49
|
+
name: "mapo-devtools-forms",
|
|
50
|
+
path: "/_mapo/devtools/forms",
|
|
51
|
+
file: resolver.resolve("./runtime/devtools/DevtoolsFormsPage.vue")
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
nuxt.hook(
|
|
55
|
+
"devtools:customTabs",
|
|
56
|
+
(tabs) => {
|
|
57
|
+
tabs.push({
|
|
58
|
+
name: "mapo-forms",
|
|
59
|
+
title: "Mapo Forms",
|
|
60
|
+
icon: "i-lucide-layout-list",
|
|
61
|
+
view: { type: "iframe", src: "/_mapo/devtools/forms" }
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
const shellComponents = [
|
|
67
|
+
"MapoForm",
|
|
68
|
+
"MapoFormField",
|
|
69
|
+
"MapoFormGroup",
|
|
70
|
+
"MapoFormTabs",
|
|
71
|
+
"MapoUnknownField",
|
|
72
|
+
"MapoFocusPortal"
|
|
73
|
+
];
|
|
74
|
+
for (const name of shellComponents) {
|
|
75
|
+
addComponent({
|
|
76
|
+
name,
|
|
77
|
+
filePath: resolver.resolve(`./runtime/components/${name}.vue`)
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
const mediaFieldComponents = [
|
|
81
|
+
"MapoMediaField",
|
|
82
|
+
"MapoMediaM2mField",
|
|
83
|
+
"MapoEnhancedMediaField",
|
|
84
|
+
"MapoMediaUnavailable"
|
|
85
|
+
];
|
|
86
|
+
for (const name of mediaFieldComponents) {
|
|
87
|
+
addComponent({
|
|
88
|
+
name,
|
|
89
|
+
filePath: resolver.resolve(`./runtime/components/fields/${name}.vue`)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
addImports([
|
|
93
|
+
{
|
|
94
|
+
name: "useMapoForm",
|
|
95
|
+
from: resolver.resolve("./runtime/composables/useMapoForm")
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
name: "useCurrentLang",
|
|
99
|
+
from: resolver.resolve("./runtime/composables/useCurrentLang")
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "provideCurrentLang",
|
|
103
|
+
from: resolver.resolve("./runtime/composables/useCurrentLang")
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "useFormFromSchema",
|
|
107
|
+
from: resolver.resolve("./runtime/composables/useFormFromSchema")
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: "useFormDraft",
|
|
111
|
+
from: resolver.resolve("./runtime/composables/useFormDraft")
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
name: "useFocusMode",
|
|
115
|
+
from: resolver.resolve("./runtime/composables/useFocusMode")
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
name: "defineFormField",
|
|
119
|
+
from: resolver.resolve("./runtime/composables/defineFormField")
|
|
120
|
+
},
|
|
121
|
+
// Progressive disclosure DSL
|
|
122
|
+
{
|
|
123
|
+
name: "when",
|
|
124
|
+
from: resolver.resolve(
|
|
125
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
126
|
+
)
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
name: "whenAny",
|
|
130
|
+
from: resolver.resolve(
|
|
131
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
132
|
+
)
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
name: "whenNot",
|
|
136
|
+
from: resolver.resolve(
|
|
137
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
138
|
+
)
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
name: "matchesField",
|
|
142
|
+
from: resolver.resolve(
|
|
143
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
144
|
+
)
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
name: "isOneOf",
|
|
148
|
+
from: resolver.resolve(
|
|
149
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
150
|
+
)
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "isNoneOf",
|
|
154
|
+
from: resolver.resolve(
|
|
155
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
156
|
+
)
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "isNotEmpty",
|
|
160
|
+
from: resolver.resolve(
|
|
161
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
162
|
+
)
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
name: "isEmpty",
|
|
166
|
+
from: resolver.resolve(
|
|
167
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
168
|
+
)
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
name: "greaterThan",
|
|
172
|
+
from: resolver.resolve(
|
|
173
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
174
|
+
)
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
name: "lessThan",
|
|
178
|
+
from: resolver.resolve(
|
|
179
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
180
|
+
)
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "matches",
|
|
184
|
+
from: resolver.resolve(
|
|
185
|
+
"./runtime/composables/useProgressiveDisclosure"
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
]);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
17
191
|
|
|
18
|
-
export
|
|
192
|
+
export { module$1 as default };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed, ref, onMounted, onUnmounted } from "vue";
|
|
3
|
+
import { watch } from "vue";
|
|
4
|
+
import { useI18n } from "vue-i18n";
|
|
5
|
+
import { useFocusMode } from "../composables/useFocusMode.js";
|
|
6
|
+
import MapoForm from "./MapoForm.vue";
|
|
7
|
+
const { t } = useI18n();
|
|
8
|
+
const { focusTarget, exit } = useFocusMode();
|
|
9
|
+
const isOpen = computed(() => focusTarget.value !== null);
|
|
10
|
+
const canUseDocument = typeof document !== "undefined";
|
|
11
|
+
function onKeyDown(e) {
|
|
12
|
+
if (e.key === "Escape" && isOpen.value) exit();
|
|
13
|
+
}
|
|
14
|
+
onMounted(() => window.addEventListener("keydown", onKeyDown));
|
|
15
|
+
onUnmounted(() => window.removeEventListener("keydown", onKeyDown));
|
|
16
|
+
watch(isOpen, (open) => {
|
|
17
|
+
if (!canUseDocument) return;
|
|
18
|
+
document.body.style.overflow = open ? "hidden" : "";
|
|
19
|
+
});
|
|
20
|
+
const localModel = ref({});
|
|
21
|
+
watch(
|
|
22
|
+
() => focusTarget.value?.model,
|
|
23
|
+
(val) => {
|
|
24
|
+
if (val) localModel.value = { ...val };
|
|
25
|
+
},
|
|
26
|
+
{ immediate: true }
|
|
27
|
+
);
|
|
28
|
+
function onUpdate(val) {
|
|
29
|
+
localModel.value = val;
|
|
30
|
+
focusTarget.value?.onUpdate(val);
|
|
31
|
+
}
|
|
32
|
+
</script>
|
|
33
|
+
|
|
34
|
+
<template>
|
|
35
|
+
<Teleport to="body">
|
|
36
|
+
<Transition name="mapo-focus-portal">
|
|
37
|
+
<div
|
|
38
|
+
v-if="isOpen && focusTarget"
|
|
39
|
+
class="mapo-focus-portal fixed inset-0 z-[9999] flex flex-col bg-white"
|
|
40
|
+
role="dialog"
|
|
41
|
+
aria-modal="true"
|
|
42
|
+
>
|
|
43
|
+
<!-- ── Header ────────────────────────────────────────────────────── -->
|
|
44
|
+
<div
|
|
45
|
+
class="flex shrink-0 items-center gap-3 border-b border-gray-200 px-6 py-3"
|
|
46
|
+
>
|
|
47
|
+
<!-- Breadcrumb -->
|
|
48
|
+
<nav class="flex min-w-0 flex-1 items-center gap-1 text-sm">
|
|
49
|
+
<template v-for="(crumb, i) in focusTarget.breadcrumb" :key="i">
|
|
50
|
+
<span
|
|
51
|
+
:class="
|
|
52
|
+
i < focusTarget.breadcrumb.length - 1 ? 'text-gray-400' : 'font-semibold text-gray-800'
|
|
53
|
+
"
|
|
54
|
+
class="truncate"
|
|
55
|
+
>
|
|
56
|
+
{{ crumb }}
|
|
57
|
+
</span>
|
|
58
|
+
<UIcon
|
|
59
|
+
v-if="i < focusTarget.breadcrumb.length - 1"
|
|
60
|
+
name="i-lucide-chevron-right"
|
|
61
|
+
class="h-3.5 w-3.5 shrink-0 text-gray-300"
|
|
62
|
+
/>
|
|
63
|
+
</template>
|
|
64
|
+
</nav>
|
|
65
|
+
|
|
66
|
+
<!-- Close button -->
|
|
67
|
+
<UButton
|
|
68
|
+
variant="ghost"
|
|
69
|
+
color="neutral"
|
|
70
|
+
icon="i-lucide-x"
|
|
71
|
+
:label="t('mapo.close')"
|
|
72
|
+
size="sm"
|
|
73
|
+
@click="exit"
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<!-- ── Body: scrollable sub-form ────────────────────────────────── -->
|
|
78
|
+
<div class="min-h-0 flex-1 overflow-y-auto">
|
|
79
|
+
<div class="mx-auto max-w-3xl px-6 py-8">
|
|
80
|
+
<MapoForm
|
|
81
|
+
:model-value="localModel"
|
|
82
|
+
:fields="focusTarget.fields"
|
|
83
|
+
:errors="focusTarget.errors.value"
|
|
84
|
+
:languages="focusTarget.languages"
|
|
85
|
+
:current-lang="focusTarget.currentLang"
|
|
86
|
+
:registry="focusTarget.registry"
|
|
87
|
+
@update:model-value="onUpdate"
|
|
88
|
+
/>
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
|
|
92
|
+
<!-- ── Footer ───────────────────────────────────────────────────── -->
|
|
93
|
+
<div
|
|
94
|
+
class="flex shrink-0 items-center justify-end gap-3 border-t border-gray-200 px-6 py-3"
|
|
95
|
+
>
|
|
96
|
+
<p class="mr-auto text-xs text-gray-400">
|
|
97
|
+
<UIcon name="i-lucide-keyboard" class="mr-1 inline h-3 w-3" />
|
|
98
|
+
Press
|
|
99
|
+
<kbd class="rounded bg-gray-100 px-1 py-0.5 font-mono text-xs"
|
|
100
|
+
>ESC</kbd
|
|
101
|
+
>
|
|
102
|
+
to return to the form
|
|
103
|
+
</p>
|
|
104
|
+
<UButton variant="ghost" color="neutral" @click="exit">
|
|
105
|
+
Close
|
|
106
|
+
</UButton>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</Transition>
|
|
110
|
+
</Teleport>
|
|
111
|
+
</template>
|
|
112
|
+
|
|
113
|
+
<style scoped>
|
|
114
|
+
.mapo-focus-portal-enter-active{transition:opacity .2s ease,transform .2s ease}.mapo-focus-portal-leave-active{transition:opacity .15s ease,transform .15s ease}.mapo-focus-portal-enter-from,.mapo-focus-portal-leave-to{opacity:0;transform:scale(.98)}.mapo-focus-portal-enter-to,.mapo-focus-portal-leave-from{opacity:1;transform:scale(1)}
|
|
115
|
+
</style>
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
2
|
+
declare const _default: typeof __VLS_export;
|
|
3
|
+
export default _default;
|
|
4
|
+
//# sourceMappingURL=MapoFocusPortal.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MapoFocusPortal.vue.d.ts","sourceRoot":"","sources":["../../../src/runtime/components/MapoFocusPortal.vue"],"names":[],"mappings":"AAudA,QAAA,MAAM,YAAY,+QAChB,CAAC;wBACkB,OAAO,YAAY;AAAxC,wBAAyC"}
|