@atscript/vue-form 0.1.58

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.
Files changed (190) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -0
  3. package/dist/as-action-71f9E_bL.cjs +208 -0
  4. package/dist/as-action-DU17rykn.mjs +203 -0
  5. package/dist/as-action.cjs +2 -0
  6. package/dist/as-action.d.cts +2 -0
  7. package/dist/as-action.d.mts +2 -0
  8. package/dist/as-action.mjs +2 -0
  9. package/dist/as-action.vue-BdbAOZCL.d.cts +13 -0
  10. package/dist/as-action.vue-CmY3eil1.d.mts +13 -0
  11. package/dist/as-adornment-shell-9UmdNIPR.cjs +97 -0
  12. package/dist/as-adornment-shell-knFiB7Ct.mjs +92 -0
  13. package/dist/as-array-Bn27x9cq.cjs +466 -0
  14. package/dist/as-array-DwarTaKP.mjs +455 -0
  15. package/dist/as-array-clear-btn-DAGervXL.cjs +48 -0
  16. package/dist/as-array-clear-btn-DIhzCKC9.mjs +43 -0
  17. package/dist/as-array.cjs +11 -0
  18. package/dist/as-array.d.cts +2 -0
  19. package/dist/as-array.d.mts +2 -0
  20. package/dist/as-array.mjs +11 -0
  21. package/dist/as-array.vue-C5r_ycIa.d.mts +9 -0
  22. package/dist/as-array.vue-CeBZRVm7.d.cts +9 -0
  23. package/dist/as-checkbox-B_9mwla6.mjs +285 -0
  24. package/dist/as-checkbox-DXGTVHPE.cjs +296 -0
  25. package/dist/as-checkbox.cjs +6 -0
  26. package/dist/as-checkbox.d.cts +2 -0
  27. package/dist/as-checkbox.d.mts +2 -0
  28. package/dist/as-checkbox.mjs +6 -0
  29. package/dist/as-checkbox.vue-BL53Xjmi.d.mts +9 -0
  30. package/dist/as-checkbox.vue-Da1KVG5J.d.cts +9 -0
  31. package/dist/as-collapsible-CqxeJut7.cjs +148 -0
  32. package/dist/as-collapsible-DtNCofNT.mjs +143 -0
  33. package/dist/as-date-C7tFQDkh.mjs +253 -0
  34. package/dist/as-date-k3MW3dmA.cjs +258 -0
  35. package/dist/as-date.cjs +8 -0
  36. package/dist/as-date.d.cts +2 -0
  37. package/dist/as-date.d.mts +2 -0
  38. package/dist/as-date.mjs +8 -0
  39. package/dist/as-date.vue-C5JaS3Sd.d.mts +9 -0
  40. package/dist/as-date.vue-e2ewS_V4.d.cts +9 -0
  41. package/dist/as-datetime-C030mzI5.cjs +258 -0
  42. package/dist/as-datetime-elcOoDT5.mjs +253 -0
  43. package/dist/as-datetime.cjs +8 -0
  44. package/dist/as-datetime.d.cts +2 -0
  45. package/dist/as-datetime.d.mts +2 -0
  46. package/dist/as-datetime.mjs +8 -0
  47. package/dist/as-datetime.vue-ClsSnJSV.d.mts +9 -0
  48. package/dist/as-datetime.vue-vfHFsby6.d.cts +9 -0
  49. package/dist/as-decimal-BJIGgPXU.cjs +711 -0
  50. package/dist/as-decimal-DtXjFPhe.mjs +694 -0
  51. package/dist/as-decimal.cjs +7 -0
  52. package/dist/as-decimal.d.cts +2 -0
  53. package/dist/as-decimal.d.mts +2 -0
  54. package/dist/as-decimal.mjs +7 -0
  55. package/dist/as-decimal.vue-B1pEKdjM.d.cts +25 -0
  56. package/dist/as-decimal.vue-CSCtYRRa.d.mts +25 -0
  57. package/dist/as-field-CXVjrEPQ.mjs +481 -0
  58. package/dist/as-field-shell-B2iTn-iM.cjs +346 -0
  59. package/dist/as-field-shell-Pdy3sAvr.mjs +341 -0
  60. package/dist/as-field-shell.cjs +5 -0
  61. package/dist/as-field-shell.d.cts +2 -0
  62. package/dist/as-field-shell.d.mts +2 -0
  63. package/dist/as-field-shell.mjs +5 -0
  64. package/dist/as-field-shell.vue-Ddnp8KxY.d.mts +37 -0
  65. package/dist/as-field-shell.vue-Dmt05vGD.d.cts +37 -0
  66. package/dist/as-field-wLYoaZnT.cjs +498 -0
  67. package/dist/as-field.cjs +4 -0
  68. package/dist/as-field.d.cts +25 -0
  69. package/dist/as-field.d.mts +26 -0
  70. package/dist/as-field.mjs +4 -0
  71. package/dist/as-form-CWwgyvfw.mjs +425 -0
  72. package/dist/as-form-DAIkyt7H.cjs +448 -0
  73. package/dist/as-form.cjs +7 -0
  74. package/dist/as-form.d.cts +2 -0
  75. package/dist/as-form.d.mts +2 -0
  76. package/dist/as-form.mjs +7 -0
  77. package/dist/as-form.vue-B4Bn0pbC.d.cts +158 -0
  78. package/dist/as-form.vue-DRrb_yoj.d.mts +158 -0
  79. package/dist/as-input-CpbV2k3s.cjs +231 -0
  80. package/dist/as-input-DIa8BzLv.mjs +226 -0
  81. package/dist/as-input-control-BzELjheN.mjs +266 -0
  82. package/dist/as-input-control-C5-DelZT.cjs +271 -0
  83. package/dist/as-input.cjs +8 -0
  84. package/dist/as-input.d.cts +2 -0
  85. package/dist/as-input.d.mts +2 -0
  86. package/dist/as-input.mjs +8 -0
  87. package/dist/as-input.vue-11ldp9uT.d.cts +17 -0
  88. package/dist/as-input.vue-fUhcvfv2.d.mts +17 -0
  89. package/dist/as-iterator-BYMNe6UJ.cjs +61 -0
  90. package/dist/as-iterator-CT5y1jyn.mjs +56 -0
  91. package/dist/as-iterator.cjs +5 -0
  92. package/dist/as-iterator.d.cts +14 -0
  93. package/dist/as-iterator.d.mts +15 -0
  94. package/dist/as-iterator.mjs +5 -0
  95. package/dist/as-number-BA55JIq1.cjs +387 -0
  96. package/dist/as-number-JPEwPK8Q.mjs +376 -0
  97. package/dist/as-number.cjs +8 -0
  98. package/dist/as-number.d.cts +2 -0
  99. package/dist/as-number.d.mts +2 -0
  100. package/dist/as-number.mjs +8 -0
  101. package/dist/as-number.vue-Bk-W7Vwv.d.mts +26 -0
  102. package/dist/as-number.vue-C2Aih98s.d.cts +26 -0
  103. package/dist/as-object-CT6lNEqt.mjs +300 -0
  104. package/dist/as-object-qUL7l8V1.cjs +305 -0
  105. package/dist/as-object.cjs +11 -0
  106. package/dist/as-object.d.cts +2 -0
  107. package/dist/as-object.d.mts +2 -0
  108. package/dist/as-object.mjs +11 -0
  109. package/dist/as-object.vue-CKwMyM_F.d.cts +13 -0
  110. package/dist/as-object.vue-Cg52b61-.d.mts +13 -0
  111. package/dist/as-paragraph-BGO-j4US.cjs +203 -0
  112. package/dist/as-paragraph-jIG_dg7_.mjs +198 -0
  113. package/dist/as-paragraph.cjs +2 -0
  114. package/dist/as-paragraph.d.cts +2 -0
  115. package/dist/as-paragraph.d.mts +2 -0
  116. package/dist/as-paragraph.mjs +2 -0
  117. package/dist/as-paragraph.vue-BDt0pBG-.d.cts +9 -0
  118. package/dist/as-paragraph.vue-C3FgTEt5.d.mts +9 -0
  119. package/dist/as-radio-B1N-gmoI.mjs +242 -0
  120. package/dist/as-radio-U3OK7bTg.cjs +247 -0
  121. package/dist/as-radio.cjs +6 -0
  122. package/dist/as-radio.d.cts +2 -0
  123. package/dist/as-radio.d.mts +2 -0
  124. package/dist/as-radio.mjs +6 -0
  125. package/dist/as-radio.vue-D_fweoN1.d.mts +9 -0
  126. package/dist/as-radio.vue-ZC4kLBnT.d.cts +9 -0
  127. package/dist/as-ref-CIifSSCQ.mjs +337 -0
  128. package/dist/as-ref-SImaIrwK.cjs +342 -0
  129. package/dist/as-ref.cjs +7 -0
  130. package/dist/as-ref.d.cts +2 -0
  131. package/dist/as-ref.d.mts +2 -0
  132. package/dist/as-ref.mjs +7 -0
  133. package/dist/as-ref.vue-BNeQeQpO.d.cts +9 -0
  134. package/dist/as-ref.vue-Cr5jeNDn.d.mts +9 -0
  135. package/dist/as-select-BB3uxACS.cjs +246 -0
  136. package/dist/as-select-UBGCVhku.mjs +241 -0
  137. package/dist/as-select.cjs +6 -0
  138. package/dist/as-select.d.cts +2 -0
  139. package/dist/as-select.d.mts +2 -0
  140. package/dist/as-select.mjs +6 -0
  141. package/dist/as-select.vue-Dd7huPq2.d.cts +9 -0
  142. package/dist/as-select.vue-RYpbZbKt.d.mts +9 -0
  143. package/dist/as-time-C24rvslH.cjs +258 -0
  144. package/dist/as-time-CQsxUs8P.mjs +253 -0
  145. package/dist/as-time.cjs +8 -0
  146. package/dist/as-time.d.cts +2 -0
  147. package/dist/as-time.d.mts +2 -0
  148. package/dist/as-time.mjs +8 -0
  149. package/dist/as-time.vue-huLx2B4l.d.mts +9 -0
  150. package/dist/as-time.vue-nMEHLXke.d.cts +9 -0
  151. package/dist/as-tuple-BU--cuuI.cjs +351 -0
  152. package/dist/as-tuple-DkI9swlW.mjs +340 -0
  153. package/dist/as-tuple.cjs +11 -0
  154. package/dist/as-tuple.d.cts +2 -0
  155. package/dist/as-tuple.d.mts +2 -0
  156. package/dist/as-tuple.mjs +11 -0
  157. package/dist/as-tuple.vue-CQhzOJsn.d.mts +9 -0
  158. package/dist/as-tuple.vue-DyskCkf-.d.cts +9 -0
  159. package/dist/as-union-BGvdxr3G.mjs +351 -0
  160. package/dist/as-union-C0btoJn3.cjs +368 -0
  161. package/dist/as-union.cjs +6 -0
  162. package/dist/as-union.d.cts +2 -0
  163. package/dist/as-union.d.mts +2 -0
  164. package/dist/as-union.mjs +6 -0
  165. package/dist/as-union.vue-BjlDPZn0.d.mts +9 -0
  166. package/dist/as-union.vue-CqjU3O10.d.cts +9 -0
  167. package/dist/as-variant-picker-BVs0AvjK.mjs +96 -0
  168. package/dist/as-variant-picker-DObQZHmm.cjs +107 -0
  169. package/dist/index.cjs +173 -0
  170. package/dist/index.d.cts +966 -0
  171. package/dist/index.d.mts +966 -0
  172. package/dist/index.mjs +105 -0
  173. package/dist/types-C4HRSxgV.d.cts +233 -0
  174. package/dist/types-Czm-Gtud.d.mts +233 -0
  175. package/dist/use-as-date-B7CtcRQd.cjs +329 -0
  176. package/dist/use-as-date-C39i9mzE.mjs +318 -0
  177. package/dist/use-as-dropdown-BMnEm6jF.mjs +82 -0
  178. package/dist/use-as-dropdown-C-Qy7Vt0.cjs +105 -0
  179. package/dist/use-as-locale-BrFdAgnU.mjs +23 -0
  180. package/dist/use-as-locale-C4z5stwD.cjs +34 -0
  181. package/dist/use-as-nested-sections-store-jdMRxjBE.cjs +80 -0
  182. package/dist/use-as-nested-sections-store-lhi0z5z1.mjs +63 -0
  183. package/dist/use-as-optional-add-flow-CuXEir_i.mjs +43 -0
  184. package/dist/use-as-optional-add-flow-STOaQWo9.cjs +48 -0
  185. package/dist/use-as-value-help-CBykDEjZ.mjs +89 -0
  186. package/dist/use-as-value-help-uANI3zWa.cjs +100 -0
  187. package/dist/use-form-context-Dwr8Ai1v.cjs +207 -0
  188. package/dist/use-form-context-bAj7UoSe.mjs +106 -0
  189. package/package.json +180 -0
  190. package/styles.d.ts +2 -0
@@ -0,0 +1,25 @@
1
+ import { i as TAsComponentProps } from "./types-C4HRSxgV.cjs";
2
+ import * as vue from "vue";
3
+
4
+ //#region src/components/defaults/as-decimal.vue.d.ts
5
+ /**
6
+ * Default decimal renderer — the "bank UX": one bordered shell with an
7
+ * optional prefix pill, an integer input, a decimal separator pill, a
8
+ * decimal input, and an optional suffix pill. Keyboard arrows bridge
9
+ * between the two halves so typing a long decimal feels like a single
10
+ * field.
11
+ *
12
+ * Currency-agnostic — when `prefix` is set by AsField (either from
13
+ * `@ui.form.prefix`, `@ui.form.prefix.ref`, or the currency narrow
14
+ * symbol), it renders as the leading pill. When `suffix` is set
15
+ * (`@ui.form.suffix`, `@ui.form.suffix.ref`, or `@db.unit*`), it
16
+ * renders as the trailing pill.
17
+ *
18
+ * All value math goes through `useAsDecimal`; all keyboard glue goes
19
+ * through `useAsDualInput`. The SFC owns only render decisions.
20
+ */
21
+ type __VLS_Props = TAsComponentProps<string | number | null | undefined>;
22
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
23
+ declare const _default: typeof __VLS_export;
24
+ //#endregion
25
+ export { _default as t };
@@ -0,0 +1,25 @@
1
+ import { i as TAsComponentProps } from "./types-Czm-Gtud.mjs";
2
+ import * as vue from "vue";
3
+
4
+ //#region src/components/defaults/as-decimal.vue.d.ts
5
+ /**
6
+ * Default decimal renderer — the "bank UX": one bordered shell with an
7
+ * optional prefix pill, an integer input, a decimal separator pill, a
8
+ * decimal input, and an optional suffix pill. Keyboard arrows bridge
9
+ * between the two halves so typing a long decimal feels like a single
10
+ * field.
11
+ *
12
+ * Currency-agnostic — when `prefix` is set by AsField (either from
13
+ * `@ui.form.prefix`, `@ui.form.prefix.ref`, or the currency narrow
14
+ * symbol), it renders as the leading pill. When `suffix` is set
15
+ * (`@ui.form.suffix`, `@ui.form.suffix.ref`, or `@db.unit*`), it
16
+ * renders as the trailing pill.
17
+ *
18
+ * All value math goes through `useAsDecimal`; all keyboard glue goes
19
+ * through `useAsDualInput`. The SFC owns only render decisions.
20
+ */
21
+ type __VLS_Props = TAsComponentProps<string | number | null | undefined>;
22
+ declare const __VLS_export: vue.DefineComponent<__VLS_Props, {}, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, false, {}, any>;
23
+ declare const _default: typeof __VLS_export;
24
+ //#endregion
25
+ export { _default as t };
@@ -0,0 +1,481 @@
1
+ import { a as CHANGE_HANDLER_KEY, c as ERRORS_KEY, d as FORM_STATE_KEY, f as HIDE_ROOT_TITLE_KEY, g as TYPES_KEY, h as ROOT_DATA_KEY, i as ACTION_HANDLER_KEY, l as FORM_CONTEXT_KEY, m as PATH_PREFIX_KEY, o as COMPONENTS_KEY, p as LEVEL_KEY, r as useFormContext, s as DISMISS_EXTERNAL_AT_KEY, u as FORM_DATA_KEY } from "./use-form-context-bAj7UoSe.mjs";
2
+ import { n as useAsLocale } from "./use-as-locale-BrFdAgnU.mjs";
3
+ import { computed, createBlock, createElementBlock, defineComponent, inject, isRef, mergeProps, onUnmounted, openBlock, provide, ref, resolveDynamicComponent, toDisplayString, unref, useId, watch } from "vue";
4
+ import { DB_AMOUNT_CURRENCY, DB_AMOUNT_CURRENCY_REF, DB_COLUMN_PRECISION, DB_UNIT, DB_UNIT_REF, EXPECT_MAX_LENGTH, META_DEFAULT, META_DESCRIPTION, META_LABEL, META_READONLY, META_REQUIRED, UI_FORM_ACTION, UI_FORM_ATTR, UI_FORM_AUTOCOMPLETE, UI_FORM_CLASSES, UI_FORM_COMPONENT, UI_FORM_DISABLED, UI_FORM_FN_CLASSES, UI_FORM_FN_DESCRIPTION, UI_FORM_FN_DISABLED, UI_FORM_FN_HIDDEN, UI_FORM_FN_HINT, UI_FORM_FN_LABEL, UI_FORM_FN_PLACEHOLDER, UI_FORM_FN_PREFIX, UI_FORM_FN_READONLY, UI_FORM_FN_STYLES, UI_FORM_FN_TITLE, UI_FORM_FN_VALUE, UI_FORM_GRID_COL_SPAN, UI_FORM_GRID_ROW_SPAN, UI_FORM_HIDDEN, UI_FORM_HINT, UI_FORM_PLACEHOLDER, UI_FORM_PREFIX, UI_FORM_PREFIX_ICON, UI_FORM_PREFIX_REF, UI_FORM_STYLES, UI_FORM_SUFFIX, UI_FORM_SUFFIX_ICON, UI_FORM_SUFFIX_REF, UI_FORM_VALIDATE, WF_ACTION_WITH_DATA, buildGridClasses, createFieldValidator, createFormData, createFormValueResolver, extractValueHelp, getByPath, getCurrencyDecimals, getCurrencyDisplayParts, getFieldMeta, isArrayField, isObjectField, isTupleField, isUnionField, resolveAttrs, resolveFieldProp, resolveGridSpec, resolveOptions, resolveSingularLabel } from "@atscript/ui";
5
+ import { buildFieldEntry } from "@atscript/ui-fns";
6
+ //#region src/composables/use-as-field.ts
7
+ function useAsField(opts) {
8
+ const formState = inject(FORM_STATE_KEY);
9
+ const formData = inject(FORM_DATA_KEY);
10
+ const formContext = inject(FORM_CONTEXT_KEY);
11
+ const id = Symbol("form-field");
12
+ const submitError = ref();
13
+ const externalError = ref();
14
+ const touched = ref(false);
15
+ const blur = ref(false);
16
+ const model = computed({
17
+ get: opts.getValue,
18
+ set: opts.setValue
19
+ });
20
+ watch(model, () => {
21
+ submitError.value = void 0;
22
+ externalError.value = void 0;
23
+ touched.value = true;
24
+ formState?.freshFields.delete(id);
25
+ }, {});
26
+ const isValidationActive = computed(() => {
27
+ if (!formState?.firstValidation) return false;
28
+ if (formState.freshFields.has(id)) return false;
29
+ switch (formState.firstValidation) {
30
+ case "on-change": return formState.firstSubmitHappened || touched.value;
31
+ case "touched-on-blur": return formState.firstSubmitHappened || blur.value && touched.value;
32
+ case "on-blur": return formState.firstSubmitHappened || blur.value;
33
+ case "on-submit": return formState.firstSubmitHappened;
34
+ default: return false;
35
+ }
36
+ });
37
+ function validate() {
38
+ if (opts.rules?.length) for (const rule of opts.rules) {
39
+ const result = rule(model.value, formData?.value, formContext?.value);
40
+ if (result !== true) return result || "Wrong value";
41
+ }
42
+ }
43
+ const error = computed(() => {
44
+ if (externalError.value) return externalError.value;
45
+ if (submitError.value) return submitError.value;
46
+ if (isValidationActive.value) return validate();
47
+ });
48
+ function onBlur() {
49
+ blur.value = true;
50
+ formState?.freshFields.delete(id);
51
+ }
52
+ if (formState) formState.register(id, {
53
+ path: opts.path,
54
+ callbacks: {
55
+ validate: () => {
56
+ submitError.value = validate();
57
+ return submitError.value || true;
58
+ },
59
+ clearErrors: () => {
60
+ touched.value = false;
61
+ blur.value = false;
62
+ submitError.value = void 0;
63
+ externalError.value = void 0;
64
+ },
65
+ reset: () => {
66
+ model.value = opts.resetValue ?? "";
67
+ },
68
+ setExternalError: (msg) => {
69
+ externalError.value = msg;
70
+ }
71
+ }
72
+ });
73
+ onUnmounted(() => {
74
+ formState?.unregister(id);
75
+ });
76
+ return {
77
+ model,
78
+ error,
79
+ onBlur
80
+ };
81
+ }
82
+ //#endregion
83
+ //#region src/composables/use-as-data.ts
84
+ const EMPTY_PATH = computed(() => "");
85
+ const EMPTY_DATA = computed(() => void 0);
86
+ /**
87
+ * Reactive read-only access to form data at any point in the
88
+ * `<AsForm>` tree. Outside a form, all readers return `undefined`.
89
+ *
90
+ * Call sites get a `ComputedRef` so they can compose it directly with
91
+ * other reactive primitives without an extra `computed()` wrapper.
92
+ */
93
+ function useAsData() {
94
+ const wrapped = inject(ROOT_DATA_KEY, EMPTY_DATA);
95
+ const pathPrefix = inject(PATH_PREFIX_KEY, EMPTY_PATH);
96
+ const rootData = computed(() => {
97
+ return wrapped.value?.value;
98
+ });
99
+ function getValueAt(path) {
100
+ return computed(() => {
101
+ const w = wrapped.value;
102
+ if (!w) return void 0;
103
+ return getByPath(w, path);
104
+ });
105
+ }
106
+ function siblingValue(name) {
107
+ return computed(() => {
108
+ const w = wrapped.value;
109
+ if (!w) return void 0;
110
+ const prefix = pathPrefix.value;
111
+ return getByPath(w, prefix ? `${prefix}.${name}` : name);
112
+ });
113
+ }
114
+ return {
115
+ rootData,
116
+ getValueAt,
117
+ siblingValue
118
+ };
119
+ }
120
+ //#endregion
121
+ //#region src/components/as-field.vue?vue&type=script&setup=true&lang.ts
122
+ const _hoisted_1 = { key: 1 };
123
+ const emptyScope = {
124
+ v: void 0,
125
+ data: {},
126
+ context: {},
127
+ entry: void 0
128
+ };
129
+ //#endregion
130
+ //#region src/components/as-field.vue
131
+ var as_field_default = /* @__PURE__ */ defineComponent({
132
+ __name: "as-field",
133
+ props: {
134
+ field: {
135
+ type: Object,
136
+ required: true
137
+ },
138
+ error: {
139
+ type: String,
140
+ required: false
141
+ },
142
+ onRemove: {
143
+ type: Function,
144
+ required: false
145
+ },
146
+ canRemove: {
147
+ type: Boolean,
148
+ required: false
149
+ },
150
+ removeLabel: {
151
+ type: String,
152
+ required: false
153
+ },
154
+ arrayIndex: {
155
+ type: Number,
156
+ required: false
157
+ }
158
+ },
159
+ setup(__props) {
160
+ const props = __props;
161
+ const types = inject(TYPES_KEY);
162
+ const components = inject(COMPONENTS_KEY);
163
+ const errors = inject(ERRORS_KEY);
164
+ const hideRootTitle = inject(HIDE_ROOT_TITLE_KEY, false);
165
+ const handleAction = inject(ACTION_HANDLER_KEY, () => {});
166
+ const handleChange = inject(CHANGE_HANDLER_KEY, () => {});
167
+ const dismissExternalAt = inject(DISMISS_EXTERNAL_AT_KEY, () => {});
168
+ const { rootFormData, formContext, joinPath, buildPath, getByPath, setByPath, buildScope } = useFormContext("AsField");
169
+ const absolutePath = joinPath(() => props.field.path);
170
+ const isStructured = isObjectField(props.field) || isArrayField(props.field) || isTupleField(props.field);
171
+ const isUnion = isUnionField(props.field);
172
+ const parentLevel = inject(LEVEL_KEY, computed(() => -1));
173
+ const myLevel = isStructured || isUnion ? parentLevel.value + 1 : -1;
174
+ if (isStructured || isUnion) {
175
+ provide(PATH_PREFIX_KEY, computed(() => absolutePath.value));
176
+ provide(LEVEL_KEY, computed(() => myLevel));
177
+ }
178
+ const unwrap = (v) => isRef(v) ? v.value : v;
179
+ function maybeComputed(isDynamic, dynamicFn, staticVal) {
180
+ return isDynamic ? computed(dynamicFn) : staticVal;
181
+ }
182
+ function buildFieldClasses(classValue, isDisabled, isRequired, isOptional) {
183
+ return {
184
+ ...typeof classValue === "string" ? { [classValue]: true } : classValue,
185
+ disabled: isDisabled,
186
+ required: isRequired && !isOptional
187
+ };
188
+ }
189
+ const prop = props.field.prop;
190
+ const autocomplete = getFieldMeta(prop, UI_FORM_AUTOCOMPLETE);
191
+ const maxLength = getFieldMeta(prop, EXPECT_MAX_LENGTH)?.length;
192
+ const componentName = getFieldMeta(prop, UI_FORM_COMPONENT);
193
+ const prefixIcon = getFieldMeta(prop, UI_FORM_PREFIX_ICON);
194
+ const suffixIcon = getFieldMeta(prop, UI_FORM_SUFFIX_ICON);
195
+ const valueHelp = extractValueHelp(prop);
196
+ const currencyLiteral = getFieldMeta(prop, DB_AMOUNT_CURRENCY);
197
+ const currencyRefField = getFieldMeta(prop, DB_AMOUNT_CURRENCY_REF);
198
+ const unitLiteral = getFieldMeta(prop, DB_UNIT);
199
+ const unitRefField = getFieldMeta(prop, DB_UNIT_REF);
200
+ const prefixLiteral = getFieldMeta(prop, UI_FORM_PREFIX);
201
+ const prefixRefField = getFieldMeta(prop, UI_FORM_PREFIX_REF);
202
+ const suffixLiteral = getFieldMeta(prop, UI_FORM_SUFFIX);
203
+ const suffixRefField = getFieldMeta(prop, UI_FORM_SUFFIX_REF);
204
+ const precisionScale = getFieldMeta(prop, DB_COLUMN_PRECISION)?.scale;
205
+ const hasAdornment = currencyLiteral !== void 0 || currencyRefField !== void 0 || unitLiteral !== void 0 || unitRefField !== void 0 || prefixLiteral !== void 0 || prefixRefField !== void 0 || prefixIcon !== void 0 || suffixLiteral !== void 0 || suffixRefField !== void 0 || suffixIcon !== void 0;
206
+ let resolvedCurrencyCode;
207
+ let resolvedUnitCode;
208
+ let resolvedPrefix;
209
+ let resolvedSuffix;
210
+ let resolvedScale;
211
+ if (hasAdornment) {
212
+ const _data = useAsData();
213
+ const { locale: _locale } = useAsLocale();
214
+ if (currencyLiteral !== void 0) resolvedCurrencyCode = currencyLiteral;
215
+ else if (currencyRefField !== void 0) {
216
+ const ref = _data.siblingValue(currencyRefField);
217
+ resolvedCurrencyCode = computed(() => {
218
+ const v = ref.value;
219
+ return typeof v === "string" && v.length > 0 ? v : void 0;
220
+ });
221
+ }
222
+ if (unitLiteral !== void 0) resolvedUnitCode = unitLiteral;
223
+ else if (unitRefField !== void 0) {
224
+ const ref = _data.siblingValue(unitRefField);
225
+ resolvedUnitCode = computed(() => {
226
+ const v = ref.value;
227
+ return typeof v === "string" && v.length > 0 ? v : void 0;
228
+ });
229
+ }
230
+ const readCode = (v) => isRef(v) ? v.value : v;
231
+ const prefixRefValue = prefixRefField ? _data.siblingValue(prefixRefField) : void 0;
232
+ resolvedPrefix = computed(() => {
233
+ if (prefixLiteral !== void 0 && prefixLiteral.length > 0) return prefixLiteral;
234
+ if (prefixRefValue) {
235
+ const v = prefixRefValue.value;
236
+ if (typeof v === "string" && v.length > 0) return v;
237
+ }
238
+ const code = readCode(resolvedCurrencyCode);
239
+ if (code) return getCurrencyDisplayParts(code, _locale.value).symbol;
240
+ });
241
+ const suffixRefValue = suffixRefField ? _data.siblingValue(suffixRefField) : void 0;
242
+ resolvedSuffix = computed(() => {
243
+ if (suffixLiteral !== void 0 && suffixLiteral.length > 0) return suffixLiteral;
244
+ if (suffixRefValue) {
245
+ const v = suffixRefValue.value;
246
+ if (typeof v === "string" && v.length > 0) return v;
247
+ }
248
+ return readCode(resolvedUnitCode);
249
+ });
250
+ resolvedScale = computed(() => {
251
+ const code = readCode(resolvedCurrencyCode);
252
+ const currDecimals = code ? getCurrencyDecimals(code, _locale.value) : void 0;
253
+ if (currDecimals !== void 0 && typeof precisionScale === "number") return Math.min(currDecimals, precisionScale);
254
+ if (currDecimals !== void 0) return currDecimals;
255
+ if (typeof precisionScale === "number") return precisionScale;
256
+ });
257
+ }
258
+ let singularLabel;
259
+ if (isArrayField(props.field)) {
260
+ const fromArray = resolveSingularLabel(prop);
261
+ singularLabel = fromArray !== "item" ? fromArray : resolveSingularLabel(props.field.itemField.prop);
262
+ }
263
+ const inputId = `as-field-${useId()}`;
264
+ const errorId = `${inputId}-err`;
265
+ const descId = `${inputId}-desc`;
266
+ const formActionMeta = getFieldMeta(prop, UI_FORM_ACTION);
267
+ const wfActionWithData = getFieldMeta(prop, WF_ACTION_WITH_DATA);
268
+ const formAction = formActionMeta ? {
269
+ id: formActionMeta.id,
270
+ label: formActionMeta.label ?? getFieldMeta(prop, META_LABEL) ?? props.field.name
271
+ } : wfActionWithData ? {
272
+ id: wfActionWithData,
273
+ label: getFieldMeta(prop, META_LABEL) ?? props.field.name
274
+ } : void 0;
275
+ const gridClasses = buildGridClasses(resolveGridSpec(getFieldMeta(prop, UI_FORM_GRID_COL_SPAN), getFieldMeta(prop, UI_FORM_GRID_ROW_SPAN)));
276
+ const formValidate = createFieldValidator(prop, isStructured || isUnion ? { rootOnly: true } : void 0);
277
+ function getModel() {
278
+ return getByPath(absolutePath.value);
279
+ }
280
+ function setModel(value) {
281
+ setByPath(absolutePath.value, value);
282
+ }
283
+ function toggleOptional(enabled) {
284
+ if (enabled) {
285
+ const resolver = createFormValueResolver(rootFormData().value, formContext.value);
286
+ setModel(createFormData(props.field.prop, resolver).value);
287
+ } else setModel(void 0);
288
+ handleChange("update", absolutePath.value, getModel());
289
+ }
290
+ const resolvedComponent = computed(() => {
291
+ if (componentName) return components?.value?.[componentName];
292
+ const map = types?.value;
293
+ if (!map) return void 0;
294
+ return (props.field.customType ? map[props.field.customType] : void 0) ?? map[props.field.type];
295
+ });
296
+ let disabled;
297
+ let hidden;
298
+ let optional;
299
+ let readonly;
300
+ let required;
301
+ let label;
302
+ let description;
303
+ let hint;
304
+ let placeholder;
305
+ let title;
306
+ let styles;
307
+ let options;
308
+ let attrs;
309
+ let classesBase;
310
+ let phantomValue;
311
+ let hasCustomValidators;
312
+ const hasMetaRequired = getFieldMeta(prop, META_REQUIRED) !== void 0;
313
+ if (props.field.allStatic) {
314
+ hasCustomValidators = false;
315
+ disabled = getFieldMeta(prop, UI_FORM_DISABLED) !== void 0;
316
+ hidden = getFieldMeta(prop, UI_FORM_HIDDEN) !== void 0;
317
+ optional = props.field.prop.optional ?? false;
318
+ readonly = getFieldMeta(prop, META_READONLY) !== void 0;
319
+ required = props.field.phantom ? void 0 : hasMetaRequired;
320
+ label = getFieldMeta(prop, META_LABEL) ?? props.field.name;
321
+ description = getFieldMeta(prop, META_DESCRIPTION);
322
+ hint = getFieldMeta(prop, UI_FORM_HINT);
323
+ placeholder = getFieldMeta(prop, UI_FORM_PLACEHOLDER);
324
+ styles = getFieldMeta(prop, UI_FORM_STYLES);
325
+ options = resolveOptions(prop, emptyScope);
326
+ attrs = getFieldMeta(prop, UI_FORM_ATTR) !== void 0 ? resolveAttrs(prop, emptyScope) : void 0;
327
+ title = isStructured || isUnion ? getFieldMeta(prop, META_LABEL) ?? props.field.name : void 0;
328
+ classesBase = buildFieldClasses(getFieldMeta(prop, UI_FORM_CLASSES), disabled, hasMetaRequired, optional);
329
+ phantomValue = props.field.phantom ? getFieldMeta(prop, META_DEFAULT) : void 0;
330
+ } else {
331
+ const hasFn = /* @__PURE__ */ new Set();
332
+ for (const key of prop.metadata.keys()) {
333
+ const k = key;
334
+ if (k.startsWith(UI_FORM_FN_PREFIX)) hasFn.add(k.slice(UI_FORM_FN_PREFIX.length));
335
+ }
336
+ hasCustomValidators = getFieldMeta(prop, UI_FORM_VALIDATE) !== void 0;
337
+ const needsBaseScope = hasFn.has("disabled") || hasFn.has("hidden") || hasFn.has("readonly");
338
+ const needsFullScope = hasFn.has("label") || hasFn.has("description") || hasFn.has("hint") || hasFn.has("placeholder") || hasFn.has("classes") || hasFn.has("styles") || hasFn.has("options") || hasFn.has("value") || hasFn.has("attr") || hasFn.has("title") || hasCustomValidators;
339
+ const bs = needsBaseScope || needsFullScope ? computed(() => buildScope(getModel())) : void 0;
340
+ const boolOpts = { staticAsBoolean: true };
341
+ disabled = maybeComputed(hasFn.has("disabled"), () => resolveFieldProp(prop, UI_FORM_FN_DISABLED, UI_FORM_DISABLED, bs.value, boolOpts) ?? false, getFieldMeta(prop, UI_FORM_DISABLED) !== void 0);
342
+ hidden = maybeComputed(hasFn.has("hidden"), () => resolveFieldProp(prop, UI_FORM_FN_HIDDEN, UI_FORM_HIDDEN, bs.value, boolOpts) ?? false, getFieldMeta(prop, UI_FORM_HIDDEN) !== void 0);
343
+ optional = props.field.prop.optional ?? false;
344
+ readonly = maybeComputed(hasFn.has("readonly"), () => resolveFieldProp(prop, UI_FORM_FN_READONLY, META_READONLY, bs.value, boolOpts) ?? false, getFieldMeta(prop, META_READONLY) !== void 0);
345
+ required = props.field.phantom ? void 0 : hasMetaRequired;
346
+ const fs = needsFullScope ? computed(() => buildFieldEntry(prop, bs.value, props.field.path, {
347
+ type: props.field.type,
348
+ component: componentName,
349
+ name: props.field.name,
350
+ optional: unwrap(optional),
351
+ disabled: unwrap(disabled),
352
+ hidden: unwrap(hidden),
353
+ readonly: unwrap(readonly)
354
+ })) : void 0;
355
+ label = maybeComputed(hasFn.has("label"), () => resolveFieldProp(prop, UI_FORM_FN_LABEL, META_LABEL, fs.value) ?? props.field.name, getFieldMeta(prop, META_LABEL) ?? props.field.name);
356
+ description = maybeComputed(hasFn.has("description"), () => resolveFieldProp(prop, UI_FORM_FN_DESCRIPTION, META_DESCRIPTION, fs.value), getFieldMeta(prop, META_DESCRIPTION));
357
+ hint = maybeComputed(hasFn.has("hint"), () => resolveFieldProp(prop, UI_FORM_FN_HINT, UI_FORM_HINT, fs.value), getFieldMeta(prop, UI_FORM_HINT));
358
+ placeholder = maybeComputed(hasFn.has("placeholder"), () => resolveFieldProp(prop, UI_FORM_FN_PLACEHOLDER, UI_FORM_PLACEHOLDER, fs.value), getFieldMeta(prop, UI_FORM_PLACEHOLDER));
359
+ styles = maybeComputed(hasFn.has("styles"), () => resolveFieldProp(prop, UI_FORM_FN_STYLES, UI_FORM_STYLES, fs.value), getFieldMeta(prop, UI_FORM_STYLES));
360
+ options = maybeComputed(hasFn.has("options"), () => resolveOptions(prop, fs.value), resolveOptions(prop, emptyScope));
361
+ attrs = hasFn.has("attr") ? computed(() => resolveAttrs(prop, fs.value)) : getFieldMeta(prop, UI_FORM_ATTR) !== void 0 ? resolveAttrs(prop, emptyScope) : void 0;
362
+ title = isStructured || isUnion ? maybeComputed(hasFn.has("title"), () => resolveFieldProp(prop, UI_FORM_FN_TITLE, META_LABEL, fs.value) ?? props.field.name, getFieldMeta(prop, META_LABEL) ?? props.field.name) : void 0;
363
+ const hasFnClasses = hasFn.has("classes");
364
+ classesBase = hasFnClasses || typeof disabled !== "boolean" ? computed(() => buildFieldClasses(hasFnClasses ? resolveFieldProp(prop, UI_FORM_FN_CLASSES, void 0, fs.value) : getFieldMeta(prop, UI_FORM_CLASSES), unwrap(disabled), hasMetaRequired, optional)) : buildFieldClasses(getFieldMeta(prop, UI_FORM_CLASSES), disabled, hasMetaRequired, optional);
365
+ phantomValue = props.field.phantom ? maybeComputed(hasFn.has("value"), () => resolveFieldProp(prop, UI_FORM_FN_VALUE, META_DEFAULT, fs.value), getFieldMeta(prop, META_DEFAULT)) : void 0;
366
+ if (hasFn.has("value") && !props.field.phantom) watch(computed(() => {
367
+ if (unwrap(readonly)) return resolveFieldProp(prop, UI_FORM_FN_VALUE, META_DEFAULT, fs.value);
368
+ }), (newVal) => {
369
+ if (newVal !== void 0) setByPath(absolutePath.value, newVal);
370
+ }, { immediate: true });
371
+ }
372
+ function formRule(v) {
373
+ return formValidate(v, hasCustomValidators ? {
374
+ data: rootFormData(),
375
+ context: formContext.value
376
+ } : void 0);
377
+ }
378
+ const { model, error: formError, onBlur: _onBlur } = useAsField({
379
+ getValue: getModel,
380
+ setValue: setModel,
381
+ rules: [formRule],
382
+ path: () => absolutePath.value,
383
+ ...props.field.prop.optional ? { resetValue: void 0 } : isArrayField(props.field) || isTupleField(props.field) ? { resetValue: [] } : isObjectField(props.field) ? { resetValue: {} } : {}
384
+ });
385
+ let lastEmittedValue = model.value;
386
+ const onBlur = isStructured || isUnion ? _onBlur : () => {
387
+ _onBlur();
388
+ const current = model.value;
389
+ if (current !== lastEmittedValue) {
390
+ lastEmittedValue = current;
391
+ handleChange("update", absolutePath.value, current);
392
+ }
393
+ };
394
+ if (!isStructured && !isUnion) watch(model, (value, prev) => {
395
+ if (value === prev) return;
396
+ const path = absolutePath.value;
397
+ if (path) dismissExternalAt(path);
398
+ });
399
+ const mergedError = computed(() => {
400
+ const path = buildPath(props.field.path);
401
+ return (path ? errors?.value?.[path] : void 0) ?? props.error ?? formError.value;
402
+ });
403
+ const invariantProps = {
404
+ onBlur,
405
+ model: {
406
+ get value() {
407
+ return model.value;
408
+ },
409
+ set value(v) {
410
+ model.value = v;
411
+ }
412
+ },
413
+ type: props.field.type,
414
+ formAction,
415
+ name: props.field.name,
416
+ field: props.field,
417
+ maxLength,
418
+ autocomplete,
419
+ prefixIcon,
420
+ suffixIcon,
421
+ level: isStructured || isUnion ? myLevel : void 0,
422
+ path: absolutePath.value,
423
+ valueHelp,
424
+ singularLabel,
425
+ precisionScale,
426
+ hasAdornment,
427
+ inputId,
428
+ errorId,
429
+ descId
430
+ };
431
+ const displayProps = computed(() => {
432
+ const titleValue = myLevel === 0 && hideRootTitle ? void 0 : unwrap(title);
433
+ return {
434
+ value: unwrap(phantomValue),
435
+ label: unwrap(label),
436
+ description: unwrap(description),
437
+ hint: unwrap(hint),
438
+ placeholder: unwrap(placeholder),
439
+ style: unwrap(styles),
440
+ optional: unwrap(optional),
441
+ onToggleOptional: unwrap(optional) ? toggleOptional : void 0,
442
+ required: required !== void 0 ? unwrap(required) : void 0,
443
+ disabled: unwrap(disabled),
444
+ hidden: unwrap(hidden),
445
+ readonly: unwrap(readonly),
446
+ options: unwrap(options),
447
+ title: titleValue,
448
+ onRemove: props.onRemove,
449
+ canRemove: props.canRemove,
450
+ removeLabel: props.removeLabel,
451
+ arrayIndex: props.arrayIndex,
452
+ currencyCode: unwrap(resolvedCurrencyCode),
453
+ unitCode: unwrap(resolvedUnitCode),
454
+ prefix: unwrap(resolvedPrefix),
455
+ suffix: unwrap(resolvedSuffix),
456
+ scale: unwrap(resolvedScale),
457
+ ...unwrap(attrs)
458
+ };
459
+ });
460
+ const componentProps = computed(() => {
461
+ const dp = displayProps.value;
462
+ const err = mergedError.value;
463
+ const ariaDescribedBy = err || dp.hint ? errorId : dp.description ? descId : void 0;
464
+ return {
465
+ ...invariantProps,
466
+ ...dp,
467
+ error: err,
468
+ ariaDescribedBy,
469
+ class: [{
470
+ ...unwrap(classesBase),
471
+ error: !!err
472
+ }, gridClasses]
473
+ };
474
+ });
475
+ return (_ctx, _cache) => {
476
+ return resolvedComponent.value ? (openBlock(), createBlock(resolveDynamicComponent(resolvedComponent.value), mergeProps({ key: 0 }, componentProps.value, { onAction: unref(handleAction) }), null, 16, ["onAction"])) : (openBlock(), createElementBlock("div", _hoisted_1, " [" + toDisplayString(unwrap(unref(label))) + "] No component for type \"" + toDisplayString(__props.field.customType ?? __props.field.type) + "\"" + toDisplayString(unref(componentName) ? ` (component "${unref(componentName)}" not supplied)` : ""), 1));
477
+ };
478
+ }
479
+ });
480
+ //#endregion
481
+ export { useAsData as n, useAsField as r, as_field_default as t };