@narrative.io/jsonforms-provider-protocols 1.1.0-beta.8 → 1.1.0

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/dist/index.js CHANGED
@@ -8,13 +8,13 @@ import { default as default2 } from "./vue/components/ProviderAutocomplete.vue.j
8
8
  import { default as default3 } from "./vue/primevue/JfText.vue.js";
9
9
  import { default as default4 } from "./vue/primevue/JfTextArea.vue.js";
10
10
  import { default as default5 } from "./vue/primevue/JfNumber.vue.js";
11
- import { default as default6 } from "./vue/primevue/JfEnumArray.vue.js";
12
- import { default as default7 } from "./vue/primevue/JfBoolean.vue.js";
11
+ import { default as default6 } from "./vue/primevue/JfEnum.vue.js";
12
+ import { default as default7 } from "./vue/primevue/JfEnumArray.vue.js";
13
+ import { default as default8 } from "./vue/primevue/JfBoolean.vue.js";
13
14
  import { primevueRenderers } from "./vue/primevue/index.js";
14
- import { default as default8 } from "./vue/components/ProviderSelect.vue.js";
15
- import { default as default9 } from "./vue/components/ProviderMultiSelect.vue.js";
15
+ import { default as default9 } from "./vue/components/ProviderSelect.vue.js";
16
+ import { default as default10 } from "./vue/components/ProviderMultiSelect.vue.js";
16
17
  import { useProvider } from "./vue/composables/useProvider.js";
17
- import { default as default10 } from "./vue/primevue/JfEnum.vue.js";
18
18
  const index = {
19
19
  install(app, opts) {
20
20
  const reg = registry;
@@ -29,15 +29,15 @@ const index = {
29
29
  }
30
30
  };
31
31
  export {
32
- default7 as JfBoolean,
33
- default10 as JfEnum,
34
- default6 as JfEnumArray,
32
+ default8 as JfBoolean,
33
+ default6 as JfEnum,
34
+ default7 as JfEnumArray,
35
35
  default5 as JfNumber,
36
36
  default3 as JfText,
37
37
  default4 as JfTextArea,
38
38
  default2 as ProviderAutocomplete,
39
- default9 as ProviderMultiSelect,
40
- default8 as ProviderSelect,
39
+ default10 as ProviderMultiSelect,
40
+ default9 as ProviderSelect,
41
41
  RestApiProtocol,
42
42
  cache,
43
43
  index as default,
@@ -6,7 +6,3 @@
6
6
  [data-v-259a0a08] .p-multiselect-label {
7
7
  text-align: left;
8
8
  }
9
-
10
- [data-v-b9a807d7] .p-dropdown-label {
11
- text-align: left;
12
- }
@@ -14,7 +14,7 @@ export declare const providerRenderers: {
14
14
  path: string;
15
15
  }> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
16
16
  }[];
17
- export { primevueRenderers } from "./primevue";
17
+ export { primevueRenderers, registerPrimevueRenderers } from "./primevue";
18
18
  export { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };
19
19
  export { useProvider } from "./composables/useProvider";
20
20
  export * from "./testers";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AAgDvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;GAI7B,CAAC;AAGF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/vue/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,cAAc,MAAM,iCAAiC,CAAC;AAC7D,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AAoFvE,eAAO,MAAM,iBAAiB;;;;;;;;;;;GAI7B,CAAC;AAGF,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAG1E,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,cAAc,WAAW,CAAC;AAG1B,OAAO,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC"}
package/dist/vue/index.js CHANGED
@@ -1,16 +1,16 @@
1
- import { rankWith, and, or, isStringControl, isNumberControl, isIntegerControl } from "@jsonforms/core";
1
+ import { rankWith, and, or, isStringControl, isNumberControl, isControl } from "@jsonforms/core";
2
2
  import _sfc_main from "./components/ProviderAutocomplete.vue.js";
3
3
  import ProviderSelect from "./components/ProviderSelect.vue.js";
4
4
  import ProviderMultiSelect from "./components/ProviderMultiSelect.vue.js";
5
- import { primevueRenderers } from "./primevue/index.js";
5
+ import { primevueRenderers, registerPrimevueRenderers } from "./primevue/index.js";
6
6
  import { useProvider } from "./composables/useProvider.js";
7
7
  import { providerTester } from "./testers.js";
8
8
  import { default as default2 } from "./primevue/JfText.vue.js";
9
9
  import { default as default3 } from "./primevue/JfTextArea.vue.js";
10
10
  import { default as default4 } from "./primevue/JfNumber.vue.js";
11
- import { default as default5 } from "./primevue/JfEnumArray.vue.js";
12
- import { default as default6 } from "./primevue/JfBoolean.vue.js";
13
- import { default as default7 } from "./primevue/JfEnum.vue.js";
11
+ import { default as default5 } from "./primevue/JfEnum.vue.js";
12
+ import { default as default6 } from "./primevue/JfEnumArray.vue.js";
13
+ import { default as default7 } from "./primevue/JfBoolean.vue.js";
14
14
  const hasProvider = (uischema) => {
15
15
  return uischema?.options?.provider !== void 0;
16
16
  };
@@ -18,7 +18,19 @@ const providerSelectTester = rankWith(
18
18
  106,
19
19
  // Higher than PrimeVue base (100) to ensure providers take precedence
20
20
  and(
21
- or(isStringControl, isNumberControl, isIntegerControl),
21
+ or(
22
+ isStringControl,
23
+ isNumberControl,
24
+ and(isControl, (uischema, schema) => {
25
+ const ui = uischema;
26
+ const rootSchema = schema;
27
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
28
+ return false;
29
+ const propertyName = ui.scope.replace("#/properties/", "");
30
+ const propertySchema = rootSchema.properties[propertyName];
31
+ return propertySchema?.type === "integer";
32
+ })
33
+ ),
22
34
  hasProvider,
23
35
  (uischema) => !uischema?.options?.autocomplete
24
36
  )
@@ -27,7 +39,19 @@ const providerAutocompleteTester = rankWith(
27
39
  107,
28
40
  // Higher than PrimeVue base (100) to ensure providers take precedence
29
41
  and(
30
- or(isStringControl, isNumberControl, isIntegerControl),
42
+ or(
43
+ isStringControl,
44
+ isNumberControl,
45
+ and(isControl, (uischema, schema) => {
46
+ const ui = uischema;
47
+ const rootSchema = schema;
48
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
49
+ return false;
50
+ const propertyName = ui.scope.replace("#/properties/", "");
51
+ const propertySchema = rootSchema.properties[propertyName];
52
+ return propertySchema?.type === "integer";
53
+ })
54
+ ),
31
55
  hasProvider,
32
56
  (uischema) => uischema?.options?.autocomplete === true
33
57
  )
@@ -53,9 +77,9 @@ const providerRenderers = [
53
77
  { tester: providerSelectTester, renderer: ProviderSelect }
54
78
  ];
55
79
  export {
56
- default6 as JfBoolean,
57
- default7 as JfEnum,
58
- default5 as JfEnumArray,
80
+ default7 as JfBoolean,
81
+ default5 as JfEnum,
82
+ default6 as JfEnumArray,
59
83
  default4 as JfNumber,
60
84
  default2 as JfText,
61
85
  default3 as JfTextArea,
@@ -65,6 +89,7 @@ export {
65
89
  primevueRenderers,
66
90
  providerRenderers,
67
91
  providerTester,
92
+ registerPrimevueRenderers,
68
93
  useProvider
69
94
  };
70
95
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/vue/index.ts"],"sourcesContent":["import type { UISchemaElement } from \"@jsonforms/core\";\nimport {\n and,\n isIntegerControl,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n} from \"@jsonforms/core\";\nimport ProviderAutocomplete from \"./components/ProviderAutocomplete.vue\";\nimport ProviderSelect from \"./components/ProviderSelect.vue\";\nimport ProviderMultiSelect from \"./components/ProviderMultiSelect.vue\";\n\n// Custom tester that checks if provider option exists (as object or boolean)\nconst hasProvider = (uischema: UISchemaElement) => {\n return uischema?.options?.provider !== undefined;\n};\n\n// Create specific testers for each component type\nconst providerSelectTester = rankWith(\n 106, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(isStringControl, isNumberControl, isIntegerControl),\n hasProvider,\n (uischema) => !uischema?.options?.autocomplete,\n ),\n);\n\nconst providerAutocompleteTester = rankWith(\n 107, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(isStringControl, isNumberControl, isIntegerControl),\n hasProvider,\n (uischema) => uischema?.options?.autocomplete === true,\n ),\n);\n\n// Custom array tester - check both uischema control type and schema type\nconst isArrayControl = (uischema: UISchemaElement, schema: unknown) => {\n const controlSchema = uischema as { type: string; scope?: string };\n if (controlSchema.type !== \"Control\" || !controlSchema.scope) {\n return false;\n }\n\n // Extract the property schema from the root schema\n const rootSchema = schema as { properties?: Record<string, unknown> };\n const propertyPath = controlSchema.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema?.properties?.[propertyPath] as {\n type?: string;\n };\n\n return propertySchema?.type === \"array\";\n};\n\nconst providerMultiSelectTester = rankWith(\n 108, // Highest priority for array controls with providers\n and(isArrayControl, hasProvider),\n);\n\nexport const providerRenderers = [\n { tester: providerMultiSelectTester, renderer: ProviderMultiSelect },\n { tester: providerAutocompleteTester, renderer: ProviderAutocomplete },\n { tester: providerSelectTester, renderer: ProviderSelect },\n];\n\n// Export PrimeVue renderers (styles are auto-injected)\nexport { primevueRenderers } from \"./primevue\";\n\n// Export individual components\nexport { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };\nexport { useProvider } from \"./composables/useProvider\";\nexport * from \"./testers\";\n\n// Export individual PrimeVue components using lazy evaluation to avoid circular deps\nexport {\n JfText,\n JfTextArea,\n JfNumber,\n JfEnum,\n JfEnumArray,\n JfBoolean,\n} from \"./primevue\";\n"],"names":["ProviderAutocomplete"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,cAAc,CAAC,aAA8B;AACjD,SAAO,UAAU,SAAS,aAAa;AACzC;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA,IACE,GAAG,iBAAiB,iBAAiB,gBAAgB;AAAA,IACrD;AAAA,IACA,CAAC,aAAa,CAAC,UAAU,SAAS;AAAA,EAAA;AAEtC;AAEA,MAAM,6BAA6B;AAAA,EACjC;AAAA;AAAA,EACA;AAAA,IACE,GAAG,iBAAiB,iBAAiB,gBAAgB;AAAA,IACrD;AAAA,IACA,CAAC,aAAa,UAAU,SAAS,iBAAiB;AAAA,EAAA;AAEtD;AAGA,MAAM,iBAAiB,CAAC,UAA2B,WAAoB;AACrE,QAAM,gBAAgB;AACtB,MAAI,cAAc,SAAS,aAAa,CAAC,cAAc,OAAO;AAC5D,WAAO;AAAA,EACT;AAGA,QAAM,aAAa;AACnB,QAAM,eAAe,cAAc,MAAM,QAAQ,iBAAiB,EAAE;AACpE,QAAM,iBAAiB,YAAY,aAAa,YAAY;AAI5D,SAAO,gBAAgB,SAAS;AAClC;AAEA,MAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA,IAAI,gBAAgB,WAAW;AACjC;AAEO,MAAM,oBAAoB;AAAA,EAC/B,EAAE,QAAQ,2BAA2B,UAAU,oBAAA;AAAA,EAC/C,EAAE,QAAQ,4BAA4B,UAAUA,UAAA;AAAA,EAChD,EAAE,QAAQ,sBAAsB,UAAU,eAAA;AAC5C;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/vue/index.ts"],"sourcesContent":["import type { UISchemaElement } from \"@jsonforms/core\";\nimport {\n and,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n isControl,\n} from \"@jsonforms/core\";\nimport ProviderAutocomplete from \"./components/ProviderAutocomplete.vue\";\nimport ProviderSelect from \"./components/ProviderSelect.vue\";\nimport ProviderMultiSelect from \"./components/ProviderMultiSelect.vue\";\n\n// Custom tester that checks if provider option exists (as object or boolean)\nconst hasProvider = (uischema: UISchemaElement) => {\n return uischema?.options?.provider !== undefined;\n};\n\n// Create specific testers for each component type\nconst providerSelectTester = rankWith(\n 106, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(\n isStringControl,\n isNumberControl,\n and(isControl, (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n const rootSchema = schema as {\n properties?: Record<string, { type?: string }>;\n };\n\n if (ui?.type !== \"Control\" || !ui?.scope || !rootSchema?.properties)\n return false;\n\n // Extract property name from scope (e.g., \"#/properties/age\" -> \"age\")\n const propertyName = ui.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema.properties[propertyName];\n\n return propertySchema?.type === \"integer\";\n }),\n ),\n hasProvider,\n (uischema) => !uischema?.options?.autocomplete,\n ),\n);\n\nconst providerAutocompleteTester = rankWith(\n 107, // Higher than PrimeVue base (100) to ensure providers take precedence\n and(\n or(\n isStringControl,\n isNumberControl,\n and(isControl, (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n const rootSchema = schema as {\n properties?: Record<string, { type?: string }>;\n };\n\n if (ui?.type !== \"Control\" || !ui?.scope || !rootSchema?.properties)\n return false;\n\n // Extract property name from scope (e.g., \"#/properties/age\" -> \"age\")\n const propertyName = ui.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema.properties[propertyName];\n\n return propertySchema?.type === \"integer\";\n }),\n ),\n hasProvider,\n (uischema) => uischema?.options?.autocomplete === true,\n ),\n);\n\n// Custom array tester - check both uischema control type and schema type\nconst isArrayControl = (uischema: UISchemaElement, schema: unknown) => {\n const controlSchema = uischema as { type: string; scope?: string };\n if (controlSchema.type !== \"Control\" || !controlSchema.scope) {\n return false;\n }\n\n // Extract the property schema from the root schema\n const rootSchema = schema as { properties?: Record<string, unknown> };\n const propertyPath = controlSchema.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema?.properties?.[propertyPath] as {\n type?: string;\n };\n\n return propertySchema?.type === \"array\";\n};\n\nconst providerMultiSelectTester = rankWith(\n 108, // Highest priority for array controls with providers\n and(isArrayControl, hasProvider),\n);\n\nexport const providerRenderers = [\n { tester: providerMultiSelectTester, renderer: ProviderMultiSelect },\n { tester: providerAutocompleteTester, renderer: ProviderAutocomplete },\n { tester: providerSelectTester, renderer: ProviderSelect },\n];\n\n// Export PrimeVue renderers (styles are auto-injected)\nexport { primevueRenderers, registerPrimevueRenderers } from \"./primevue\";\n\n// Export individual components\nexport { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };\nexport { useProvider } from \"./composables/useProvider\";\nexport * from \"./testers\";\n\n// Export individual PrimeVue components using lazy evaluation to avoid circular deps\nexport {\n JfText,\n JfTextArea,\n JfNumber,\n JfEnum,\n JfEnumArray,\n JfBoolean,\n} from \"./primevue\";\n"],"names":["ProviderAutocomplete"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,cAAc,CAAC,aAA8B;AACjD,SAAO,UAAU,SAAS,aAAa;AACzC;AAGA,MAAM,uBAAuB;AAAA,EAC3B;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI,WAAW,CAAC,UAAmB,WAAoB;AACrD,cAAM,KAAK;AACX,cAAM,aAAa;AAInB,YAAI,IAAI,SAAS,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY;AACvD,iBAAO;AAGT,cAAM,eAAe,GAAG,MAAM,QAAQ,iBAAiB,EAAE;AACzD,cAAM,iBAAiB,WAAW,WAAW,YAAY;AAEzD,eAAO,gBAAgB,SAAS;AAAA,MAClC,CAAC;AAAA,IAAA;AAAA,IAEH;AAAA,IACA,CAAC,aAAa,CAAC,UAAU,SAAS;AAAA,EAAA;AAEtC;AAEA,MAAM,6BAA6B;AAAA,EACjC;AAAA;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI,WAAW,CAAC,UAAmB,WAAoB;AACrD,cAAM,KAAK;AACX,cAAM,aAAa;AAInB,YAAI,IAAI,SAAS,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY;AACvD,iBAAO;AAGT,cAAM,eAAe,GAAG,MAAM,QAAQ,iBAAiB,EAAE;AACzD,cAAM,iBAAiB,WAAW,WAAW,YAAY;AAEzD,eAAO,gBAAgB,SAAS;AAAA,MAClC,CAAC;AAAA,IAAA;AAAA,IAEH;AAAA,IACA,CAAC,aAAa,UAAU,SAAS,iBAAiB;AAAA,EAAA;AAEtD;AAGA,MAAM,iBAAiB,CAAC,UAA2B,WAAoB;AACrE,QAAM,gBAAgB;AACtB,MAAI,cAAc,SAAS,aAAa,CAAC,cAAc,OAAO;AAC5D,WAAO;AAAA,EACT;AAGA,QAAM,aAAa;AACnB,QAAM,eAAe,cAAc,MAAM,QAAQ,iBAAiB,EAAE;AACpE,QAAM,iBAAiB,YAAY,aAAa,YAAY;AAI5D,SAAO,gBAAgB,SAAS;AAClC;AAEA,MAAM,4BAA4B;AAAA,EAChC;AAAA;AAAA,EACA,IAAI,gBAAgB,WAAW;AACjC;AAEO,MAAM,oBAAoB;AAAA,EAC/B,EAAE,QAAQ,2BAA2B,UAAU,oBAAA;AAAA,EAC/C,EAAE,QAAQ,4BAA4B,UAAUA,UAAA;AAAA,EAChD,EAAE,QAAQ,sBAAsB,UAAU,eAAA;AAC5C;"}
@@ -1 +1 @@
1
- {"version":3,"file":"JfEnum.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfEnum.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoMA,wBAkTK"}
1
+ {"version":3,"file":"JfEnum.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfEnum.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8LA,wBA8SK"}
@@ -1,8 +1,155 @@
1
- import _sfc_main from "./JfEnum.vue2.js";
2
- /* empty css */
3
- import _export_sfc from "../../_virtual/_plugin-vue_export-helper.js";
4
- const JfEnum = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-b9a807d7"]]);
1
+ import { defineComponent, getCurrentInstance, computed, inject, ref, createElementBlock, openBlock, createCommentVNode, createVNode, unref, toDisplayString } from "vue";
2
+ import { useJsonFormsControl } from "@jsonforms/vue";
3
+ import { useProvider } from "../composables/useProvider.js";
4
+ import { useDerive } from "../composables/useDerive.js";
5
+ import Dropdown from "primevue/dropdown";
6
+ const _hoisted_1 = { class: "flex flex-column gap-2" };
7
+ const _hoisted_2 = {
8
+ key: 0,
9
+ class: "text-color text-left"
10
+ };
11
+ const _hoisted_3 = {
12
+ key: 1,
13
+ class: "text-color-secondary text-left"
14
+ };
15
+ const _hoisted_4 = {
16
+ key: 2,
17
+ class: "p-error",
18
+ role: "alert"
19
+ };
20
+ const _hoisted_5 = {
21
+ key: 3,
22
+ class: "p-error"
23
+ };
24
+ const __default__ = {
25
+ name: "JfEnum",
26
+ props: {
27
+ uischema: {
28
+ type: Object,
29
+ required: true
30
+ },
31
+ schema: {
32
+ type: Object,
33
+ required: true
34
+ },
35
+ path: {
36
+ type: String,
37
+ required: true
38
+ },
39
+ enabled: {
40
+ type: Boolean,
41
+ default: void 0
42
+ },
43
+ renderers: {
44
+ type: Array,
45
+ required: false
46
+ },
47
+ cells: {
48
+ type: Array,
49
+ required: false
50
+ },
51
+ config: {
52
+ type: Object,
53
+ required: false
54
+ }
55
+ }
56
+ };
57
+ const _sfc_main = /* @__PURE__ */ defineComponent({
58
+ ...__default__,
59
+ setup(__props) {
60
+ const instance = getCurrentInstance();
61
+ const props = instance.props;
62
+ const { control, handleChange } = useJsonFormsControl(props);
63
+ const toOptions = (schema) => {
64
+ if (!schema) return [];
65
+ const s = schema;
66
+ if (Array.isArray(s.enum))
67
+ return s.enum.map((v) => ({ label: String(v), value: v }));
68
+ if (Array.isArray(s.oneOf))
69
+ return s.oneOf.map((o) => ({
70
+ label: o.title ?? String(o.const),
71
+ value: o.const
72
+ }));
73
+ return [];
74
+ };
75
+ const binding = computed(() => {
76
+ const provider = control.value.uischema?.options?.provider;
77
+ if (provider && typeof provider === "object" && !provider.load) {
78
+ return { ...provider, load: "mount" };
79
+ }
80
+ return provider;
81
+ });
82
+ const deps = computed(
83
+ () => control.value.schema?.["x-provider"]?.dependsOn ?? []
84
+ );
85
+ const depValues = computed(() => {
86
+ return deps.value.map((dep) => {
87
+ const path = dep.startsWith("#/") ? dep.slice(2) : dep;
88
+ const keys = path.replace(/\//g, ".").split(".");
89
+ let value = rootData.value;
90
+ for (const key of keys) {
91
+ if (value && typeof value === "object" && key in value) {
92
+ value = value[key];
93
+ } else {
94
+ return null;
95
+ }
96
+ }
97
+ return value;
98
+ });
99
+ });
100
+ const injectedFormData = inject("formData", { value: {} });
101
+ const rootData = computed(() => injectedFormData.value || {});
102
+ const {
103
+ items: providerItems,
104
+ loading,
105
+ error
106
+ } = useProvider(binding, {
107
+ data: rootData,
108
+ path: control.value.path,
109
+ dependsOnValues: depValues.value
110
+ });
111
+ const placeholder = computed(() => {
112
+ if (loading.value) return "Loading…";
113
+ return control.value.uischema?.options?.placeholder ?? control.value.description;
114
+ });
115
+ const options = computed(() => {
116
+ if (binding.value && providerItems.value.length > 0) {
117
+ return providerItems.value;
118
+ }
119
+ return toOptions(control.value.schema);
120
+ });
121
+ useDerive({ control, handleChange });
122
+ const hasInteracted = ref(false);
123
+ const showErrors = computed(() => hasInteracted.value && control.value.errors);
124
+ const onSelect = (val) => {
125
+ handleChange(control.value.path, val);
126
+ };
127
+ const onBlur = () => {
128
+ hasInteracted.value = true;
129
+ };
130
+ return (_ctx, _cache) => {
131
+ return openBlock(), createElementBlock("div", _hoisted_1, [
132
+ unref(control).label ? (openBlock(), createElementBlock("label", _hoisted_2, toDisplayString(unref(control).label), 1)) : createCommentVNode("", true),
133
+ unref(control).description ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(unref(control).description), 1)) : createCommentVNode("", true),
134
+ createVNode(unref(Dropdown), {
135
+ class: "w-full",
136
+ options: options.value,
137
+ "option-label": "label",
138
+ "option-value": "value",
139
+ "model-value": unref(control).data ?? null,
140
+ placeholder: placeholder.value,
141
+ disabled: !unref(control).enabled || unref(loading),
142
+ "aria-invalid": !!showErrors.value || void 0,
143
+ "show-clear": true,
144
+ "onUpdate:modelValue": onSelect,
145
+ onBlur
146
+ }, null, 8, ["options", "model-value", "placeholder", "disabled", "aria-invalid"]),
147
+ unref(error) ? (openBlock(), createElementBlock("small", _hoisted_4, "Failed to load: " + toDisplayString(unref(error)), 1)) : showErrors.value ? (openBlock(), createElementBlock("small", _hoisted_5, toDisplayString(unref(control).errors), 1)) : createCommentVNode("", true)
148
+ ]);
149
+ };
150
+ }
151
+ });
5
152
  export {
6
- JfEnum as default
153
+ _sfc_main as default
7
154
  };
8
155
  //# sourceMappingURL=JfEnum.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"JfEnum.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"JfEnum.vue.js","sources":["../../../src/vue/primevue/JfEnum.vue"],"sourcesContent":["<script lang=\"ts\">\n// Define props manually to avoid any potential circular dependency issues\nexport default {\n name: \"JfEnum\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n },\n cells: {\n type: Array,\n required: false,\n },\n config: {\n type: Object,\n required: false,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { JsonSchema } from \"@jsonforms/core\";\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, ref, inject, getCurrentInstance } from \"vue\";\nimport { useProvider } from \"../composables/useProvider\";\nimport { useDerive } from \"../composables/useDerive\";\nimport Dropdown from \"primevue/dropdown\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange } = useJsonFormsControl(props);\n\ntype Opt = { label: string; value: unknown };\nconst toOptions = (schema?: JsonSchema): Opt[] => {\n if (!schema) return [];\n const s = schema as {\n enum?: unknown[];\n oneOf?: Array<{ title?: string; const: unknown }>;\n };\n if (Array.isArray(s.enum))\n return s.enum.map((v: unknown) => ({ label: String(v), value: v }));\n if (Array.isArray(s.oneOf))\n return s.oneOf.map((o) => ({\n label: o.title ?? String(o.const),\n value: o.const,\n }));\n return [];\n};\n\n// Provider support\nconst binding = computed(() => {\n const provider = control.value.uischema?.options?.provider;\n // Ensure load property is set to 'mount' by default\n if (provider && typeof provider === \"object\" && !provider.load) {\n return { ...provider, load: \"mount\" };\n }\n return provider;\n});\n\nconst deps = computed(\n () =>\n ((\n (control.value.schema as Record<string, unknown>)?.[\n \"x-provider\"\n ] as Record<string, unknown>\n )?.dependsOn as string[]) ?? [],\n);\nconst depValues = computed(() => {\n return deps.value.map((dep) => {\n // Resolve dependency value from form data using JSON pointer-like path\n const path = dep.startsWith(\"#/\") ? dep.slice(2) : dep;\n const keys = path.replace(/\\//g, \".\").split(\".\");\n let value: unknown = rootData.value;\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return null;\n }\n }\n return value;\n });\n});\n\n// Get the root form data from JSONForms context for template URL resolution\nconst injectedFormData = inject<{ value: unknown }>(\"formData\", { value: {} });\nconst rootData = computed(() => injectedFormData.value || {});\n\n// Use provider if available, otherwise fall back to schema enum/oneOf\nconst {\n items: providerItems,\n loading,\n error,\n} = useProvider(binding, {\n data: rootData,\n path: control.value.path,\n dependsOnValues: depValues.value,\n});\n\nconst placeholder = computed<string | undefined>(() => {\n if (loading.value) return \"Loading…\";\n return (\n (control.value.uischema as { options?: { placeholder?: string } })?.options\n ?.placeholder ?? control.value.description\n );\n});\n\nconst options = computed(() => {\n // Use provider items if available, otherwise fall back to schema enum/oneOf\n if (binding.value && providerItems.value.length > 0) {\n return providerItems.value;\n }\n return toOptions(control.value.schema);\n});\n\n// Add derive functionality\nuseDerive({ control, handleChange });\n\n// Track user interaction\nconst hasInteracted = ref(false);\n\nconst showErrors = computed(() => hasInteracted.value && control.value.errors);\n\nconst onSelect = (val: unknown) => {\n handleChange(control.value.path, val);\n};\n\nconst onBlur = () => {\n hasInteracted.value = true;\n};\n</script>\n\n<template>\n <div class=\"flex flex-column gap-2\">\n <label v-if=\"control.label\" class=\"text-color text-left\">{{\n control.label\n }}</label>\n <div v-if=\"control.description\" class=\"text-color-secondary text-left\">\n {{ control.description }}\n </div>\n <Dropdown\n class=\"w-full\"\n :options=\"options\"\n option-label=\"label\"\n option-value=\"value\"\n :model-value=\"control.data ?? null\"\n :placeholder=\"placeholder\"\n :disabled=\"!control.enabled || loading\"\n :aria-invalid=\"!!showErrors || undefined\"\n :show-clear=\"true\"\n @update:model-value=\"onSelect\"\n @blur=\"onBlur\"\n />\n <small v-if=\"error\" class=\"p-error\" role=\"alert\"\n >Failed to load: {{ error }}</small\n >\n <small v-else-if=\"showErrors\" class=\"p-error\">{{ control.errors }}</small>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":"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"}
@@ -1,154 +1,4 @@
1
- import { defineComponent, getCurrentInstance, computed, inject, ref, createElementBlock, openBlock, createCommentVNode, createVNode, unref, toDisplayString } from "vue";
2
- import { useJsonFormsControl } from "@jsonforms/vue";
3
- import { useProvider } from "../composables/useProvider.js";
4
- import { useDerive } from "../composables/useDerive.js";
5
- import Dropdown from "primevue/dropdown";
6
- const _hoisted_1 = { class: "flex flex-column gap-2" };
7
- const _hoisted_2 = {
8
- key: 0,
9
- class: "text-color text-left"
10
- };
11
- const _hoisted_3 = {
12
- key: 1,
13
- class: "text-color-secondary text-left"
14
- };
15
- const _hoisted_4 = {
16
- key: 2,
17
- class: "p-error",
18
- role: "alert"
19
- };
20
- const _hoisted_5 = {
21
- key: 3,
22
- class: "p-error"
23
- };
24
- const __default__ = {
25
- name: "JfEnum",
26
- props: {
27
- uischema: {
28
- type: Object,
29
- required: true
30
- },
31
- schema: {
32
- type: Object,
33
- required: true
34
- },
35
- path: {
36
- type: String,
37
- required: true
38
- },
39
- enabled: {
40
- type: Boolean,
41
- default: void 0
42
- },
43
- renderers: {
44
- type: Array,
45
- required: false
46
- },
47
- cells: {
48
- type: Array,
49
- required: false
50
- },
51
- config: {
52
- type: Object,
53
- required: false
54
- }
55
- }
56
- };
57
- const _sfc_main = /* @__PURE__ */ defineComponent({
58
- ...__default__,
59
- setup(__props) {
60
- const instance = getCurrentInstance();
61
- const props = instance.props;
62
- const { control, handleChange } = useJsonFormsControl(props);
63
- const toOptions = (schema) => {
64
- if (!schema) return [];
65
- const s = schema;
66
- if (Array.isArray(s.enum))
67
- return s.enum.map((v) => ({ label: String(v), value: v }));
68
- if (Array.isArray(s.oneOf))
69
- return s.oneOf.map((o) => ({
70
- label: o.title ?? String(o.const),
71
- value: o.const
72
- }));
73
- return [];
74
- };
75
- const binding = computed(() => {
76
- const provider = control.value.uischema?.options?.provider;
77
- if (provider && typeof provider === "object" && !provider.load) {
78
- return { ...provider, load: "mount" };
79
- }
80
- return provider;
81
- });
82
- const deps = computed(
83
- () => control.value.schema?.["x-provider"]?.dependsOn ?? []
84
- );
85
- const depValues = computed(() => {
86
- return deps.value.map((dep) => {
87
- const path = dep.startsWith("#/") ? dep.slice(2) : dep;
88
- const keys = path.replace(/\//g, ".").split(".");
89
- let value = rootData.value;
90
- for (const key of keys) {
91
- if (value && typeof value === "object" && key in value) {
92
- value = value[key];
93
- } else {
94
- return null;
95
- }
96
- }
97
- return value;
98
- });
99
- });
100
- const injectedFormData = inject("formData", { value: {} });
101
- const rootData = computed(() => injectedFormData.value || {});
102
- const {
103
- items: providerItems,
104
- loading,
105
- error
106
- } = useProvider(binding, {
107
- data: rootData,
108
- path: control.value.path,
109
- dependsOnValues: depValues.value
110
- });
111
- const placeholder = computed(() => {
112
- if (loading.value) return "Loading…";
113
- return control.value.uischema?.options?.placeholder ?? control.value.description;
114
- });
115
- const options = computed(() => {
116
- if (binding.value && providerItems.value.length > 0) {
117
- return providerItems.value;
118
- }
119
- return toOptions(control.value.schema);
120
- });
121
- useDerive({ control, handleChange });
122
- const hasInteracted = ref(false);
123
- const showErrors = computed(() => hasInteracted.value && control.value.errors);
124
- const onSelect = (val) => {
125
- handleChange(control.value.path, val);
126
- };
127
- const onBlur = () => {
128
- hasInteracted.value = true;
129
- };
130
- return (_ctx, _cache) => {
131
- return openBlock(), createElementBlock("div", _hoisted_1, [
132
- unref(control).label ? (openBlock(), createElementBlock("label", _hoisted_2, toDisplayString(unref(control).label), 1)) : createCommentVNode("", true),
133
- unref(control).description ? (openBlock(), createElementBlock("div", _hoisted_3, toDisplayString(unref(control).description), 1)) : createCommentVNode("", true),
134
- createVNode(unref(Dropdown), {
135
- class: "w-full",
136
- options: options.value,
137
- "option-label": "label",
138
- "option-value": "value",
139
- "model-value": unref(control).data ?? null,
140
- placeholder: placeholder.value,
141
- disabled: !unref(control).enabled || unref(loading),
142
- "aria-invalid": !!showErrors.value || void 0,
143
- "show-clear": true,
144
- "onUpdate:modelValue": onSelect,
145
- onBlur
146
- }, null, 8, ["options", "model-value", "placeholder", "disabled", "aria-invalid"]),
147
- unref(error) ? (openBlock(), createElementBlock("small", _hoisted_4, "Failed to load: " + toDisplayString(unref(error)), 1)) : showErrors.value ? (openBlock(), createElementBlock("small", _hoisted_5, toDisplayString(unref(control).errors), 1)) : createCommentVNode("", true)
148
- ]);
149
- };
150
- }
151
- });
1
+ import _sfc_main from "./JfEnum.vue.js";
152
2
  export {
153
3
  _sfc_main as default
154
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"JfEnum.vue2.js","sources":["../../../src/vue/primevue/JfEnum.vue"],"sourcesContent":["<script lang=\"ts\">\n// Define props manually to avoid any potential circular dependency issues\nexport default {\n name: \"JfEnum\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n },\n cells: {\n type: Array,\n required: false,\n },\n config: {\n type: Object,\n required: false,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { JsonSchema } from \"@jsonforms/core\";\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, ref, inject, getCurrentInstance } from \"vue\";\nimport { useProvider } from \"../composables/useProvider\";\nimport { useDerive } from \"../composables/useDerive\";\nimport Dropdown from \"primevue/dropdown\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange } = useJsonFormsControl(props);\n\ntype Opt = { label: string; value: unknown };\nconst toOptions = (schema?: JsonSchema): Opt[] => {\n if (!schema) return [];\n const s = schema as {\n enum?: unknown[];\n oneOf?: Array<{ title?: string; const: unknown }>;\n };\n if (Array.isArray(s.enum))\n return s.enum.map((v: unknown) => ({ label: String(v), value: v }));\n if (Array.isArray(s.oneOf))\n return s.oneOf.map((o) => ({\n label: o.title ?? String(o.const),\n value: o.const,\n }));\n return [];\n};\n\n// Provider support\nconst binding = computed(() => {\n const provider = control.value.uischema?.options?.provider;\n // Ensure load property is set to 'mount' by default\n if (provider && typeof provider === \"object\" && !provider.load) {\n return { ...provider, load: \"mount\" };\n }\n return provider;\n});\n\nconst deps = computed(\n () =>\n ((\n (control.value.schema as Record<string, unknown>)?.[\n \"x-provider\"\n ] as Record<string, unknown>\n )?.dependsOn as string[]) ?? [],\n);\nconst depValues = computed(() => {\n return deps.value.map((dep) => {\n // Resolve dependency value from form data using JSON pointer-like path\n const path = dep.startsWith(\"#/\") ? dep.slice(2) : dep;\n const keys = path.replace(/\\//g, \".\").split(\".\");\n let value: unknown = rootData.value;\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = (value as Record<string, unknown>)[key];\n } else {\n return null;\n }\n }\n return value;\n });\n});\n\n// Get the root form data from JSONForms context for template URL resolution\nconst injectedFormData = inject<{ value: unknown }>(\"formData\", { value: {} });\nconst rootData = computed(() => injectedFormData.value || {});\n\n// Use provider if available, otherwise fall back to schema enum/oneOf\nconst {\n items: providerItems,\n loading,\n error,\n} = useProvider(binding, {\n data: rootData,\n path: control.value.path,\n dependsOnValues: depValues.value,\n});\n\nconst placeholder = computed<string | undefined>(() => {\n if (loading.value) return \"Loading…\";\n return (\n (control.value.uischema as { options?: { placeholder?: string } })?.options\n ?.placeholder ?? control.value.description\n );\n});\n\nconst options = computed(() => {\n // Use provider items if available, otherwise fall back to schema enum/oneOf\n if (binding.value && providerItems.value.length > 0) {\n return providerItems.value;\n }\n return toOptions(control.value.schema);\n});\n\n// Add derive functionality\nuseDerive({ control, handleChange });\n\n// Track user interaction\nconst hasInteracted = ref(false);\n\nconst showErrors = computed(() => hasInteracted.value && control.value.errors);\n\nconst onSelect = (val: unknown) => {\n handleChange(control.value.path, val);\n};\n\nconst onBlur = () => {\n hasInteracted.value = true;\n};\n</script>\n\n<template>\n <div class=\"flex flex-column gap-2\">\n <label v-if=\"control.label\" class=\"text-color text-left\">{{\n control.label\n }}</label>\n <div v-if=\"control.description\" class=\"text-color-secondary text-left\">\n {{ control.description }}\n </div>\n <Dropdown\n class=\"w-full\"\n :options=\"options\"\n option-label=\"label\"\n option-value=\"value\"\n :model-value=\"control.data ?? null\"\n :placeholder=\"placeholder\"\n :disabled=\"!control.enabled || loading\"\n :aria-invalid=\"!!showErrors || undefined\"\n :show-clear=\"true\"\n @update:model-value=\"onSelect\"\n @blur=\"onBlur\"\n />\n <small v-if=\"error\" class=\"p-error\" role=\"alert\"\n >Failed to load: {{ error }}</small\n >\n <small v-else-if=\"showErrors\" class=\"p-error\">{{ control.errors }}</small>\n </div>\n</template>\n\n<style scoped>\n:deep(.p-dropdown-label) {\n text-align: left;\n}\n</style>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAA,cAAe;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,IACL,UAAU;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,IAAA;AAAA,IAEX,WAAW;AAAA,MACT,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,OAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,IAEZ,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAAA,EACZ;AAEJ;;;;AAaA,UAAM,WAAW,mBAAA;AACjB,UAAM,QAAQ,SAAS;AACvB,UAAM,EAAE,SAAS,iBAAiB,oBAAoB,KAAK;AAG3D,UAAM,YAAY,CAAC,WAA+B;AAChD,UAAI,CAAC,OAAQ,QAAO,CAAA;AACpB,YAAM,IAAI;AAIV,UAAI,MAAM,QAAQ,EAAE,IAAI;AACtB,eAAO,EAAE,KAAK,IAAI,CAAC,OAAgB,EAAE,OAAO,OAAO,CAAC,GAAG,OAAO,EAAA,EAAI;AACpE,UAAI,MAAM,QAAQ,EAAE,KAAK;AACvB,eAAO,EAAE,MAAM,IAAI,CAAC,OAAO;AAAA,UACzB,OAAO,EAAE,SAAS,OAAO,EAAE,KAAK;AAAA,UAChC,OAAO,EAAE;AAAA,QAAA,EACT;AACJ,aAAO,CAAA;AAAA,IACT;AAGA,UAAM,UAAU,SAAS,MAAM;AAC7B,YAAM,WAAW,QAAQ,MAAM,UAAU,SAAS;AAElD,UAAI,YAAY,OAAO,aAAa,YAAY,CAAC,SAAS,MAAM;AAC9D,eAAO,EAAE,GAAG,UAAU,MAAM,QAAA;AAAA,MAC9B;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,OAAO;AAAA,MACX,MAEK,QAAQ,MAAM,SACb,YACF,GACC,aAA0B,CAAA;AAAA,IAAC;AAElC,UAAM,YAAY,SAAS,MAAM;AAC/B,aAAO,KAAK,MAAM,IAAI,CAAC,QAAQ;AAE7B,cAAM,OAAO,IAAI,WAAW,IAAI,IAAI,IAAI,MAAM,CAAC,IAAI;AACnD,cAAM,OAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,MAAM,GAAG;AAC/C,YAAI,QAAiB,SAAS;AAC9B,mBAAW,OAAO,MAAM;AACtB,cAAI,SAAS,OAAO,UAAU,YAAY,OAAO,OAAO;AACtD,oBAAS,MAAkC,GAAG;AAAA,UAChD,OAAO;AACL,mBAAO;AAAA,UACT;AAAA,QACF;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAGD,UAAM,mBAAmB,OAA2B,YAAY,EAAE,OAAO,CAAA,GAAI;AAC7E,UAAM,WAAW,SAAS,MAAM,iBAAiB,SAAS,CAAA,CAAE;AAG5D,UAAM;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IAAA,IACE,YAAY,SAAS;AAAA,MACvB,MAAM;AAAA,MACN,MAAM,QAAQ,MAAM;AAAA,MACpB,iBAAiB,UAAU;AAAA,IAAA,CAC5B;AAED,UAAM,cAAc,SAA6B,MAAM;AACrD,UAAI,QAAQ,MAAO,QAAO;AAC1B,aACG,QAAQ,MAAM,UAAqD,SAChE,eAAe,QAAQ,MAAM;AAAA,IAErC,CAAC;AAED,UAAM,UAAU,SAAS,MAAM;AAE7B,UAAI,QAAQ,SAAS,cAAc,MAAM,SAAS,GAAG;AACnD,eAAO,cAAc;AAAA,MACvB;AACA,aAAO,UAAU,QAAQ,MAAM,MAAM;AAAA,IACvC,CAAC;AAGD,cAAU,EAAE,SAAS,cAAc;AAGnC,UAAM,gBAAgB,IAAI,KAAK;AAE/B,UAAM,aAAa,SAAS,MAAM,cAAc,SAAS,QAAQ,MAAM,MAAM;AAE7E,UAAM,WAAW,CAAC,QAAiB;AACjC,mBAAa,QAAQ,MAAM,MAAM,GAAG;AAAA,IACtC;AAEA,UAAM,SAAS,MAAM;AACnB,oBAAc,QAAQ;AAAA,IACxB;;AAIE,aAAAA,UAAA,GAAAC,mBAwBM,OAxBN,YAwBM;AAAA,QAvBSC,MAAA,OAAA,EAAQ,SAArBF,UAAA,GAAAC,mBAEU,SAFV,YAEUE,gBADRD,MAAA,OAAA,EAAQ,KAAK,GAAA,CAAA;QAEJA,MAAA,OAAA,EAAQ,eAAnBF,UAAA,GAAAC,mBAEM,OAFN,YAEME,gBADDD,MAAA,OAAA,EAAQ,WAAW,GAAA,CAAA;QAExBE,YAYEF,MAAA,QAAA,GAAA;AAAA,UAXA,OAAM;AAAA,UACL,SAAS,QAAA;AAAA,UACV,gBAAa;AAAA,UACb,gBAAa;AAAA,UACZ,eAAaA,MAAA,OAAA,EAAQ,QAAI;AAAA,UACzB,aAAa,YAAA;AAAA,UACb,UAAQ,CAAGA,MAAA,OAAA,EAAQ,WAAWA,MAAA,OAAA;AAAA,UAC9B,gBAAY,CAAA,CAAI,WAAA,SAAc;AAAA,UAC9B,cAAY;AAAA,UACZ,uBAAoB;AAAA,UACpB;AAAA,QAAA;QAEUA,MAAA,KAAA,KAAbF,UAAA,GAAAC,mBAEC,SAFD,YACG,qCAAmBC,MAAA,KAAA,CAAK,GAAA,CAAA,KAET,WAAA,SAAlBF,UAAA,GAAAC,mBAA0E,SAA1E,YAA0EE,gBAAzBD,MAAA,OAAA,EAAQ,MAAM,GAAA,CAAA;;;;;"}
1
+ {"version":3,"file":"JfEnum.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1 +1 @@
1
- {"version":3,"file":"JfNumber.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfNumber.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8IA,wBA+PK"}
1
+ {"version":3,"file":"JfNumber.vue.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/JfNumber.vue"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkJA,wBAmQK"}
@@ -71,12 +71,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
71
71
  () => typeof options.value.currency === "string" ? options.value.currency : "USD"
72
72
  );
73
73
  const minFractionDigits = computed(() => {
74
+ if (control.value.schema?.type === "integer") return 0;
74
75
  if (mode.value === "currency") return 2;
75
76
  if (typeof options.value.precision === "number")
76
77
  return options.value.precision;
77
78
  return void 0;
78
79
  });
79
80
  const maxFractionDigits = computed(() => {
81
+ if (control.value.schema?.type === "integer") return 0;
80
82
  if (mode.value === "currency") return 2;
81
83
  if (typeof options.value.precision === "number")
82
84
  return options.value.precision;
@@ -1 +1 @@
1
- {"version":3,"file":"JfNumber.vue.js","sources":["../../../src/vue/primevue/JfNumber.vue"],"sourcesContent":["<script lang=\"ts\">\nexport default {\n name: \"JfNumber\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n },\n cells: {\n type: Array,\n required: false,\n },\n config: {\n type: Object,\n required: false,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, ref, getCurrentInstance } from \"vue\";\nimport { useDerive } from \"../composables/useDerive\";\nimport InputNumber from \"primevue/inputnumber\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange } = useJsonFormsControl(props);\n\nconst options = computed(\n () =>\n (control.value.uischema as { options?: Record<string, unknown> })\n ?.options ?? {},\n);\n\nconst placeholder = computed<string | undefined>(\n () => (options.value.placeholder as string) ?? control.value.description,\n);\n\n// Add derive functionality\nuseDerive({ control, handleChange });\n\n// Currency and decimal configuration\nconst mode = computed(() => {\n if (options.value.currency) return \"currency\";\n if (options.value.decimal || typeof options.value.precision === \"number\")\n return \"decimal\";\n return undefined;\n});\n\nconst currency = computed(() =>\n typeof options.value.currency === \"string\" ? options.value.currency : \"USD\",\n);\n\nconst minFractionDigits = computed(() => {\n if (mode.value === \"currency\") return 2;\n if (typeof options.value.precision === \"number\")\n return options.value.precision;\n return undefined;\n});\n\nconst maxFractionDigits = computed(() => {\n if (mode.value === \"currency\") return 2;\n if (typeof options.value.precision === \"number\")\n return options.value.precision;\n return undefined;\n});\n\nconst useGrouping = computed(() => {\n // Enable grouping for currency by default, or if explicitly set\n if (mode.value === \"currency\") return true;\n return options.value.useGrouping === true;\n});\n\n// Track user interaction\nconst hasInteracted = ref(false);\n\nconst showErrors = computed(() => hasInteracted.value && control.value.errors);\n\nconst onNumber = (val: number | null) => {\n handleChange(control.value.path, val ?? undefined);\n};\n\nconst onBlur = () => {\n hasInteracted.value = true;\n};\n</script>\n\n<template>\n <div class=\"flex flex-column gap-2\">\n <label v-if=\"control.label\" class=\"text-color text-left\">{{\n control.label\n }}</label>\n <div v-if=\"control.description\" class=\"text-color-secondary text-left\">\n {{ control.description }}\n </div>\n <InputNumber\n class=\"w-full\"\n input-class=\"w-full\"\n :use-grouping=\"useGrouping\"\n :mode=\"mode\"\n :currency=\"currency\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"maxFractionDigits\"\n :model-value=\"typeof control.data === 'number' ? control.data : null\"\n :placeholder=\"placeholder\"\n :disabled=\"!control.enabled\"\n :aria-invalid=\"!!showErrors || undefined\"\n @update:model-value=\"onNumber\"\n @blur=\"onBlur\"\n />\n <small v-if=\"showErrors\" class=\"p-error\">{{ control.errors }}</small>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":"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"}
1
+ {"version":3,"file":"JfNumber.vue.js","sources":["../../../src/vue/primevue/JfNumber.vue"],"sourcesContent":["<script lang=\"ts\">\nexport default {\n name: \"JfNumber\",\n props: {\n uischema: {\n type: Object,\n required: true,\n },\n schema: {\n type: Object,\n required: true,\n },\n path: {\n type: String,\n required: true,\n },\n enabled: {\n type: Boolean,\n default: undefined,\n },\n renderers: {\n type: Array,\n required: false,\n },\n cells: {\n type: Array,\n required: false,\n },\n config: {\n type: Object,\n required: false,\n },\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport type { ControlProps } from \"@jsonforms/vue\";\nimport { useJsonFormsControl } from \"@jsonforms/vue\";\nimport { computed, ref, getCurrentInstance } from \"vue\";\nimport { useDerive } from \"../composables/useDerive\";\nimport InputNumber from \"primevue/inputnumber\";\n\n// Access props from the component instance\nconst instance = getCurrentInstance()!;\nconst props = instance.props as unknown as ControlProps;\nconst { control, handleChange } = useJsonFormsControl(props);\n\nconst options = computed(\n () =>\n (control.value.uischema as { options?: Record<string, unknown> })\n ?.options ?? {},\n);\n\nconst placeholder = computed<string | undefined>(\n () => (options.value.placeholder as string) ?? control.value.description,\n);\n\n// Add derive functionality\nuseDerive({ control, handleChange });\n\n// Currency and decimal configuration\nconst mode = computed(() => {\n if (options.value.currency) return \"currency\";\n if (options.value.decimal || typeof options.value.precision === \"number\")\n return \"decimal\";\n return undefined;\n});\n\nconst currency = computed(() =>\n typeof options.value.currency === \"string\" ? options.value.currency : \"USD\",\n);\n\nconst minFractionDigits = computed(() => {\n // For integer types, no fractional digits\n if (control.value.schema?.type === \"integer\") return 0;\n if (mode.value === \"currency\") return 2;\n if (typeof options.value.precision === \"number\")\n return options.value.precision;\n return undefined;\n});\n\nconst maxFractionDigits = computed(() => {\n // For integer types, no fractional digits\n if (control.value.schema?.type === \"integer\") return 0;\n if (mode.value === \"currency\") return 2;\n if (typeof options.value.precision === \"number\")\n return options.value.precision;\n return undefined;\n});\n\nconst useGrouping = computed(() => {\n // Enable grouping for currency by default, or if explicitly set\n if (mode.value === \"currency\") return true;\n return options.value.useGrouping === true;\n});\n\n// Track user interaction\nconst hasInteracted = ref(false);\n\nconst showErrors = computed(() => hasInteracted.value && control.value.errors);\n\nconst onNumber = (val: number | null) => {\n handleChange(control.value.path, val ?? undefined);\n};\n\nconst onBlur = () => {\n hasInteracted.value = true;\n};\n</script>\n\n<template>\n <div class=\"flex flex-column gap-2\">\n <label v-if=\"control.label\" class=\"text-color text-left\">{{\n control.label\n }}</label>\n <div v-if=\"control.description\" class=\"text-color-secondary text-left\">\n {{ control.description }}\n </div>\n <InputNumber\n class=\"w-full\"\n input-class=\"w-full\"\n :use-grouping=\"useGrouping\"\n :mode=\"mode\"\n :currency=\"currency\"\n :min-fraction-digits=\"minFractionDigits\"\n :max-fraction-digits=\"maxFractionDigits\"\n :model-value=\"typeof control.data === 'number' ? control.data : null\"\n :placeholder=\"placeholder\"\n :disabled=\"!control.enabled\"\n :aria-invalid=\"!!showErrors || undefined\"\n @update:model-value=\"onNumber\"\n @blur=\"onBlur\"\n />\n <small v-if=\"showErrors\" class=\"p-error\">{{ control.errors }}</small>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_unref","_toDisplayString","_createVNode"],"mappings":"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"}
@@ -4,69 +4,7 @@ import JfNumber from "./JfNumber.vue";
4
4
  import JfEnum from "./JfEnum.vue";
5
5
  import JfEnumArray from "./JfEnumArray.vue";
6
6
  import JfBoolean from "./JfBoolean.vue";
7
- export declare const primevueRenderers: {
8
- tester: (uischema: import("@jsonforms/core").UISchemaElement, schema: import("@jsonforms/core").JsonSchema, context: import("@jsonforms/core").TesterContext) => number;
9
- renderer: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
10
- uischema: {
11
- type: ObjectConstructor;
12
- required: true;
13
- };
14
- schema: {
15
- type: ObjectConstructor;
16
- required: true;
17
- };
18
- path: {
19
- type: StringConstructor;
20
- required: true;
21
- };
22
- enabled: {
23
- type: BooleanConstructor;
24
- default: undefined;
25
- };
26
- renderers: {
27
- type: ArrayConstructor;
28
- required: false;
29
- };
30
- cells: {
31
- type: ArrayConstructor;
32
- required: false;
33
- };
34
- config: {
35
- type: ObjectConstructor;
36
- required: false;
37
- };
38
- }>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
39
- uischema: {
40
- type: ObjectConstructor;
41
- required: true;
42
- };
43
- schema: {
44
- type: ObjectConstructor;
45
- required: true;
46
- };
47
- path: {
48
- type: StringConstructor;
49
- required: true;
50
- };
51
- enabled: {
52
- type: BooleanConstructor;
53
- default: undefined;
54
- };
55
- renderers: {
56
- type: ArrayConstructor;
57
- required: false;
58
- };
59
- cells: {
60
- type: ArrayConstructor;
61
- required: false;
62
- };
63
- config: {
64
- type: ObjectConstructor;
65
- required: false;
66
- };
67
- }>> & Readonly<{}>, {
68
- enabled: boolean;
69
- }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
70
- }[];
7
+ export declare const primevueRenderers: unknown[];
8
+ export declare function registerPrimevueRenderers(jsonformsCore: any): unknown[];
71
9
  export { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };
72
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AA0ExC,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiB7B,CAAC;AAEF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vue/primevue/index.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAC1C,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AAkCxC,eAAO,MAAM,iBAAiB,EAAE,OAAO,EAAO,CAAC;AAK/C,wBAAgB,yBAAyB,CAAC,aAAa,EAAE,GAAG,GAAG,OAAO,EAAE,CAqFvE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC"}
@@ -1,10 +1,9 @@
1
1
  import _sfc_main$1 from "./JfText.vue.js";
2
2
  import _sfc_main from "./JfTextArea.vue.js";
3
3
  import _sfc_main$2 from "./JfNumber.vue.js";
4
- import JfEnum from "./JfEnum.vue.js";
5
- import _sfc_main$3 from "./JfEnumArray.vue.js";
6
- import _sfc_main$4 from "./JfBoolean.vue.js";
7
- import { rankWith, isStringControl, or, isNumberControl, isIntegerControl, and, isControl, schemaMatches, isBooleanControl } from "@jsonforms/core";
4
+ import _sfc_main$3 from "./JfEnum.vue.js";
5
+ import _sfc_main$4 from "./JfEnumArray.vue.js";
6
+ import _sfc_main$5 from "./JfBoolean.vue.js";
8
7
  const injectLayoutStyles = () => {
9
8
  if (typeof window !== "undefined" && typeof document !== "undefined") {
10
9
  if (!document.getElementById("jsonforms-primevue-styles")) {
@@ -29,43 +28,73 @@ const injectLayoutStyles = () => {
29
28
  }
30
29
  };
31
30
  injectLayoutStyles();
32
- const isScalarEnum = (s) => {
33
- const schema = s;
34
- return schema && schema.type !== "array" && (Array.isArray(schema.enum) || Array.isArray(schema.oneOf));
35
- };
36
- const isEnumArray = (s) => {
37
- const schema = s;
38
- return schema?.type === "array" && (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf));
39
- };
40
- const isMultilineString = (uischema, schema) => {
41
- return isStringControl(uischema, schema, {}) && uischema?.options?.multi === true;
42
- };
43
- const PRIME = 100;
44
- const primevueRenderers = [
45
- // Multiline text has higher priority than regular text
46
- { tester: rankWith(PRIME + 4, isMultilineString), renderer: _sfc_main },
47
- { tester: rankWith(PRIME + 3, isStringControl), renderer: _sfc_main$1 },
48
- {
49
- tester: rankWith(PRIME + 4, or(isNumberControl, isIntegerControl)),
50
- renderer: _sfc_main$2
51
- },
52
- {
53
- tester: rankWith(PRIME + 5, and(isControl, schemaMatches(isScalarEnum))),
54
- renderer: JfEnum
55
- },
56
- {
57
- tester: rankWith(PRIME + 6, and(isControl, schemaMatches(isEnumArray))),
58
- renderer: _sfc_main$3
59
- },
60
- { tester: rankWith(PRIME + 3, isBooleanControl), renderer: _sfc_main$4 }
61
- ];
31
+ let renderersInitialized = false;
32
+ const primevueRenderers = [];
33
+ function registerPrimevueRenderers(jsonformsCore) {
34
+ if (renderersInitialized) {
35
+ return primevueRenderers;
36
+ }
37
+ const {
38
+ rankWith,
39
+ isStringControl,
40
+ isNumberControl,
41
+ isIntegerControl,
42
+ and,
43
+ isControl,
44
+ schemaMatches,
45
+ isBooleanControl
46
+ } = jsonformsCore;
47
+ const PRIME = 100;
48
+ const isScalarEnum = (s) => {
49
+ const schema = s;
50
+ return schema && schema.type !== "array" && (Array.isArray(schema.enum) || Array.isArray(schema.oneOf));
51
+ };
52
+ const isEnumArray = (s) => {
53
+ const schema = s;
54
+ return schema?.type === "array" && (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf));
55
+ };
56
+ const isMultilineString = (uischema, schema) => {
57
+ const controlUischema = uischema;
58
+ return and(isStringControl, () => controlUischema?.options?.multi === true)(
59
+ uischema,
60
+ schema,
61
+ {}
62
+ );
63
+ };
64
+ const renderers = [
65
+ // Multiline text has higher priority than regular text
66
+ { tester: rankWith(PRIME + 4, isMultilineString), renderer: _sfc_main },
67
+ { tester: rankWith(PRIME + 3, isStringControl), renderer: _sfc_main$1 },
68
+ {
69
+ tester: rankWith(PRIME + 6, isIntegerControl),
70
+ renderer: _sfc_main$2
71
+ },
72
+ {
73
+ tester: rankWith(PRIME + 4, isNumberControl),
74
+ renderer: _sfc_main$2
75
+ },
76
+ {
77
+ tester: rankWith(PRIME + 7, and(isControl, schemaMatches(isScalarEnum))),
78
+ renderer: _sfc_main$3
79
+ },
80
+ {
81
+ tester: rankWith(PRIME + 8, and(isControl, schemaMatches(isEnumArray))),
82
+ renderer: _sfc_main$4
83
+ },
84
+ { tester: rankWith(PRIME + 3, isBooleanControl), renderer: _sfc_main$5 }
85
+ ];
86
+ primevueRenderers.splice(0, primevueRenderers.length, ...renderers);
87
+ renderersInitialized = true;
88
+ return renderers;
89
+ }
62
90
  export {
63
- _sfc_main$4 as JfBoolean,
64
- JfEnum,
65
- _sfc_main$3 as JfEnumArray,
91
+ _sfc_main$5 as JfBoolean,
92
+ _sfc_main$3 as JfEnum,
93
+ _sfc_main$4 as JfEnumArray,
66
94
  _sfc_main$2 as JfNumber,
67
95
  _sfc_main$1 as JfText,
68
96
  _sfc_main as JfTextArea,
69
- primevueRenderers
97
+ primevueRenderers,
98
+ registerPrimevueRenderers
70
99
  };
71
100
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/vue/primevue/index.ts"],"sourcesContent":["import JfText from \"./JfText.vue\";\nimport JfTextArea from \"./JfTextArea.vue\";\nimport JfNumber from \"./JfNumber.vue\";\nimport JfEnum from \"./JfEnum.vue\";\nimport JfEnumArray from \"./JfEnumArray.vue\";\nimport JfBoolean from \"./JfBoolean.vue\";\n\n// Auto-inject layout styles\nconst injectLayoutStyles = () => {\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!document.getElementById(\"jsonforms-primevue-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"jsonforms-primevue-styles\";\n style.textContent = `\n/* JSONForms PrimeVue Provider Protocols Layout Styles */\n.vertical-layout {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 1rem;\n width: 100%;\n}\n\n.vertical-layout-item {\n width: 100%;\n}\n `;\n document.head.appendChild(style);\n }\n }\n};\n\n// Inject styles when this module is imported\ninjectLayoutStyles();\n\nimport {\n rankWith,\n isStringControl,\n or,\n isNumberControl,\n isIntegerControl,\n and,\n isControl,\n schemaMatches,\n isBooleanControl,\n} from \"@jsonforms/core\";\n\n// helpers for enum detection\nconst isScalarEnum = (s?: object) => {\n const schema = s as { type?: string; enum?: unknown[]; oneOf?: unknown[] };\n return (\n schema &&\n schema.type !== \"array\" &&\n (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))\n );\n};\n\nconst isEnumArray = (s?: object) => {\n const schema = s as {\n type?: string;\n items?: { enum?: unknown[]; oneOf?: unknown[] };\n };\n return (\n schema?.type === \"array\" &&\n (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))\n );\n};\n\n// helper for multiline detection\nconst isMultilineString = (uischema: unknown, schema: unknown) => {\n return (\n isStringControl(uischema as never, schema as never, {} as never) &&\n (uischema as { options?: { multi?: boolean } })?.options?.multi === true\n );\n};\n\n// Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)\nconst PRIME = 100;\n\nexport const primevueRenderers = [\n // Multiline text has higher priority than regular text\n { tester: rankWith(PRIME + 4, isMultilineString), renderer: JfTextArea },\n { tester: rankWith(PRIME + 3, isStringControl), renderer: JfText },\n {\n tester: rankWith(PRIME + 4, or(isNumberControl, isIntegerControl)),\n renderer: JfNumber,\n },\n {\n tester: rankWith(PRIME + 5, and(isControl, schemaMatches(isScalarEnum))),\n renderer: JfEnum,\n },\n {\n tester: rankWith(PRIME + 6, and(isControl, schemaMatches(isEnumArray))),\n renderer: JfEnumArray,\n },\n { tester: rankWith(PRIME + 3, isBooleanControl), renderer: JfBoolean },\n];\n\nexport { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };\n"],"names":["JfTextArea","JfText","JfNumber","JfEnumArray","JfBoolean"],"mappings":";;;;;;;AAQA,MAAM,qBAAqB,MAAM;AAC/B,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,QAAI,CAAC,SAAS,eAAe,2BAA2B,GAAG;AACzD,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,KAAK;AACX,YAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcpB,eAAS,KAAK,YAAY,KAAK;AAAA,IACjC;AAAA,EACF;AACF;AAGA,mBAAA;AAeA,MAAM,eAAe,CAAC,MAAe;AACnC,QAAM,SAAS;AACf,SACE,UACA,OAAO,SAAS,YACf,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,KAAK;AAE7D;AAEA,MAAM,cAAc,CAAC,MAAe;AAClC,QAAM,SAAS;AAIf,SACE,QAAQ,SAAS,YAChB,MAAM,QAAQ,OAAO,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK;AAE3E;AAGA,MAAM,oBAAoB,CAAC,UAAmB,WAAoB;AAChE,SACE,gBAAgB,UAAmB,QAAiB,CAAA,CAAW,KAC9D,UAAgD,SAAS,UAAU;AAExE;AAGA,MAAM,QAAQ;AAEP,MAAM,oBAAoB;AAAA;AAAA,EAE/B,EAAE,QAAQ,SAAS,QAAQ,GAAG,iBAAiB,GAAG,UAAUA,UAAA;AAAA,EAC5D,EAAE,QAAQ,SAAS,QAAQ,GAAG,eAAe,GAAG,UAAUC,YAAA;AAAA,EAC1D;AAAA,IACE,QAAQ,SAAS,QAAQ,GAAG,GAAG,iBAAiB,gBAAgB,CAAC;AAAA,IACjE,UAAUC;AAAAA,EAAA;AAAA,EAEZ;AAAA,IACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,YAAY,CAAC,CAAC;AAAA,IACvE,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,WAAW,CAAC,CAAC;AAAA,IACtE,UAAUC;AAAAA,EAAA;AAAA,EAEZ,EAAE,QAAQ,SAAS,QAAQ,GAAG,gBAAgB,GAAG,UAAUC,YAAA;AAC7D;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/vue/primevue/index.ts"],"sourcesContent":["import JfText from \"./JfText.vue\";\nimport JfTextArea from \"./JfTextArea.vue\";\nimport JfNumber from \"./JfNumber.vue\";\nimport JfEnum from \"./JfEnum.vue\";\nimport JfEnumArray from \"./JfEnumArray.vue\";\nimport JfBoolean from \"./JfBoolean.vue\";\n\n// Auto-inject layout styles\nconst injectLayoutStyles = () => {\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!document.getElementById(\"jsonforms-primevue-styles\")) {\n const style = document.createElement(\"style\");\n style.id = \"jsonforms-primevue-styles\";\n style.textContent = `\n/* JSONForms PrimeVue Provider Protocols Layout Styles */\n.vertical-layout {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 1rem;\n width: 100%;\n}\n\n.vertical-layout-item {\n width: 100%;\n}\n `;\n document.head.appendChild(style);\n }\n }\n};\n\n// Inject styles when this module is imported\ninjectLayoutStyles();\n\n// Track whether renderers have been registered to avoid duplicate registrations\nlet renderersInitialized = false;\n\n// Return empty renderers array initially\nexport const primevueRenderers: unknown[] = [];\n\n// Export a function that can be called by the consumer to register renderers\n// This should only be called once during application initialization\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function registerPrimevueRenderers(jsonformsCore: any): unknown[] {\n // Prevent duplicate registration which causes AJV schema recompilation\n if (renderersInitialized) {\n return primevueRenderers as unknown[];\n }\n\n const {\n rankWith,\n isStringControl,\n isNumberControl,\n isIntegerControl,\n and,\n isControl,\n schemaMatches,\n isBooleanControl,\n } = jsonformsCore;\n\n // Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)\n const PRIME = 100;\n\n // helpers for enum detection - using simple schema checks instead of JSONForms internal functions\n const isScalarEnum = (s?: object) => {\n const schema = s as {\n type?: string;\n enum?: unknown[];\n oneOf?: unknown[];\n };\n return (\n schema &&\n schema.type !== \"array\" &&\n (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))\n );\n };\n\n const isEnumArray = (s?: object) => {\n const schema = s as {\n type?: string;\n items?: { enum?: unknown[]; oneOf?: unknown[] };\n };\n return (\n schema?.type === \"array\" &&\n (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))\n );\n };\n\n // helper for multiline detection\n const isMultilineString = (uischema: unknown, schema: unknown) => {\n const controlUischema = uischema as { options?: { multi?: boolean } };\n return and(isStringControl, () => controlUischema?.options?.multi === true)(\n uischema as Parameters<typeof isStringControl>[0],\n schema as Parameters<typeof isStringControl>[1],\n {} as Parameters<typeof isStringControl>[2],\n );\n };\n\n const renderers = [\n // Multiline text has higher priority than regular text\n { tester: rankWith(PRIME + 4, isMultilineString), renderer: JfTextArea },\n { tester: rankWith(PRIME + 3, isStringControl), renderer: JfText },\n {\n tester: rankWith(PRIME + 6, isIntegerControl),\n renderer: JfNumber,\n },\n {\n tester: rankWith(PRIME + 4, isNumberControl),\n renderer: JfNumber,\n },\n {\n tester: rankWith(PRIME + 7, and(isControl, schemaMatches(isScalarEnum))),\n renderer: JfEnum,\n },\n {\n tester: rankWith(PRIME + 8, and(isControl, schemaMatches(isEnumArray))),\n renderer: JfEnumArray,\n },\n { tester: rankWith(PRIME + 3, isBooleanControl), renderer: JfBoolean },\n ];\n\n // Update the exported array\n primevueRenderers.splice(0, primevueRenderers.length, ...renderers);\n\n // Mark as initialized to prevent duplicate registrations\n renderersInitialized = true;\n\n return renderers;\n}\n\nexport { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };\n"],"names":["JfTextArea","JfText","JfNumber","JfEnum","JfEnumArray","JfBoolean"],"mappings":";;;;;;AAQA,MAAM,qBAAqB,MAAM;AAC/B,MAAI,OAAO,WAAW,eAAe,OAAO,aAAa,aAAa;AACpE,QAAI,CAAC,SAAS,eAAe,2BAA2B,GAAG;AACzD,YAAM,QAAQ,SAAS,cAAc,OAAO;AAC5C,YAAM,KAAK;AACX,YAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAcpB,eAAS,KAAK,YAAY,KAAK;AAAA,IACjC;AAAA,EACF;AACF;AAGA,mBAAA;AAGA,IAAI,uBAAuB;AAGpB,MAAM,oBAA+B,CAAA;AAKrC,SAAS,0BAA0B,eAA+B;AAEvE,MAAI,sBAAsB;AACxB,WAAO;AAAA,EACT;AAEA,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAGJ,QAAM,QAAQ;AAGd,QAAM,eAAe,CAAC,MAAe;AACnC,UAAM,SAAS;AAKf,WACE,UACA,OAAO,SAAS,YACf,MAAM,QAAQ,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,KAAK;AAAA,EAE7D;AAEA,QAAM,cAAc,CAAC,MAAe;AAClC,UAAM,SAAS;AAIf,WACE,QAAQ,SAAS,YAChB,MAAM,QAAQ,OAAO,OAAO,IAAI,KAAK,MAAM,QAAQ,OAAO,OAAO,KAAK;AAAA,EAE3E;AAGA,QAAM,oBAAoB,CAAC,UAAmB,WAAoB;AAChE,UAAM,kBAAkB;AACxB,WAAO,IAAI,iBAAiB,MAAM,iBAAiB,SAAS,UAAU,IAAI;AAAA,MACxE;AAAA,MACA;AAAA,MACA,CAAA;AAAA,IAAC;AAAA,EAEL;AAEA,QAAM,YAAY;AAAA;AAAA,IAEhB,EAAE,QAAQ,SAAS,QAAQ,GAAG,iBAAiB,GAAG,UAAUA,UAAA;AAAA,IAC5D,EAAE,QAAQ,SAAS,QAAQ,GAAG,eAAe,GAAG,UAAUC,YAAA;AAAA,IAC1D;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,gBAAgB;AAAA,MAC5C,UAAUC;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,eAAe;AAAA,MAC3C,UAAUA;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,YAAY,CAAC,CAAC;AAAA,MACvE,UAAUC;AAAAA,IAAA;AAAA,IAEZ;AAAA,MACE,QAAQ,SAAS,QAAQ,GAAG,IAAI,WAAW,cAAc,WAAW,CAAC,CAAC;AAAA,MACtE,UAAUC;AAAAA,IAAA;AAAA,IAEZ,EAAE,QAAQ,SAAS,QAAQ,GAAG,gBAAgB,GAAG,UAAUC,YAAA;AAAA,EAAU;AAIvE,oBAAkB,OAAO,GAAG,kBAAkB,QAAQ,GAAG,SAAS;AAGlE,yBAAuB;AAEvB,SAAO;AACT;"}
@@ -1 +1 @@
1
- {"version":3,"file":"testers.d.ts","sourceRoot":"","sources":["../../src/vue/testers.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,iKAQ1B,CAAC"}
1
+ {"version":3,"file":"testers.d.ts","sourceRoot":"","sources":["../../src/vue/testers.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,iKA0B1B,CAAC"}
@@ -1,8 +1,20 @@
1
- import { rankWith, and, or, isStringControl, isNumberControl, isIntegerControl } from "@jsonforms/core";
1
+ import { rankWith, and, or, isStringControl, isNumberControl, isControl } from "@jsonforms/core";
2
2
  const providerTester = rankWith(
3
3
  5,
4
4
  and(
5
- or(isStringControl, isNumberControl, isIntegerControl),
5
+ or(
6
+ isStringControl,
7
+ isNumberControl,
8
+ and(isControl, (uischema, schema) => {
9
+ const ui = uischema;
10
+ const rootSchema = schema;
11
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
12
+ return false;
13
+ const propertyName = ui.scope.replace("#/properties/", "");
14
+ const propertySchema = rootSchema.properties[propertyName];
15
+ return propertySchema?.type === "integer";
16
+ })
17
+ ),
6
18
  (uischema) => uischema?.options?.provider !== void 0 && uischema?.options?.provider !== null
7
19
  )
8
20
  );
@@ -1 +1 @@
1
- {"version":3,"file":"testers.js","sources":["../../src/vue/testers.ts"],"sourcesContent":["import {\n and,\n isIntegerControl,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n} from \"@jsonforms/core\";\n\n// Tester that checks if provider option exists (as object or boolean)\nexport const providerTester = rankWith(\n 5,\n and(\n or(isStringControl, isNumberControl, isIntegerControl),\n (uischema: import(\"@jsonforms/core\").UISchemaElement) =>\n uischema?.options?.provider !== undefined &&\n uischema?.options?.provider !== null,\n ),\n);\n"],"names":[],"mappings":";AAUO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,IACE,GAAG,iBAAiB,iBAAiB,gBAAgB;AAAA,IACrD,CAAC,aACC,UAAU,SAAS,aAAa,UAChC,UAAU,SAAS,aAAa;AAAA,EAAA;AAEtC;"}
1
+ {"version":3,"file":"testers.js","sources":["../../src/vue/testers.ts"],"sourcesContent":["import {\n and,\n isNumberControl,\n isStringControl,\n or,\n rankWith,\n isControl,\n} from \"@jsonforms/core\";\n\n// Tester that checks if provider option exists (as object or boolean)\nexport const providerTester = rankWith(\n 5,\n and(\n or(\n isStringControl,\n isNumberControl,\n and(isControl, (uischema: unknown, schema: unknown) => {\n const ui = uischema as { type?: string; scope?: string };\n const rootSchema = schema as {\n properties?: Record<string, { type?: string }>;\n };\n\n if (ui?.type !== \"Control\" || !ui?.scope || !rootSchema?.properties)\n return false;\n\n // Extract property name from scope (e.g., \"#/properties/age\" -> \"age\")\n const propertyName = ui.scope.replace(\"#/properties/\", \"\");\n const propertySchema = rootSchema.properties[propertyName];\n\n return propertySchema?.type === \"integer\";\n }),\n ),\n (uischema: import(\"@jsonforms/core\").UISchemaElement) =>\n uischema?.options?.provider !== undefined &&\n uischema?.options?.provider !== null,\n ),\n);\n"],"names":[],"mappings":";AAUO,MAAM,iBAAiB;AAAA,EAC5B;AAAA,EACA;AAAA,IACE;AAAA,MACE;AAAA,MACA;AAAA,MACA,IAAI,WAAW,CAAC,UAAmB,WAAoB;AACrD,cAAM,KAAK;AACX,cAAM,aAAa;AAInB,YAAI,IAAI,SAAS,aAAa,CAAC,IAAI,SAAS,CAAC,YAAY;AACvD,iBAAO;AAGT,cAAM,eAAe,GAAG,MAAM,QAAQ,iBAAiB,EAAE;AACzD,cAAM,iBAAiB,WAAW,WAAW,YAAY;AAEzD,eAAO,gBAAgB,SAAS;AAAA,MAClC,CAAC;AAAA,IAAA;AAAA,IAEH,CAAC,aACC,UAAU,SAAS,aAAa,UAChC,UAAU,SAAS,aAAa;AAAA,EAAA;AAEtC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@narrative.io/jsonforms-provider-protocols",
3
- "version": "1.1.0-beta.8",
3
+ "version": "1.1.0",
4
4
  "description": "Dynamic data provider capabilities for JSONForms with Vue 3 integration",
5
5
  "type": "module",
6
6
  "author": "Narrative I/O",
package/src/vue/index.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  import type { UISchemaElement } from "@jsonforms/core";
2
2
  import {
3
3
  and,
4
- isIntegerControl,
5
4
  isNumberControl,
6
5
  isStringControl,
7
6
  or,
8
7
  rankWith,
8
+ isControl,
9
9
  } from "@jsonforms/core";
10
10
  import ProviderAutocomplete from "./components/ProviderAutocomplete.vue";
11
11
  import ProviderSelect from "./components/ProviderSelect.vue";
@@ -20,7 +20,25 @@ const hasProvider = (uischema: UISchemaElement) => {
20
20
  const providerSelectTester = rankWith(
21
21
  106, // Higher than PrimeVue base (100) to ensure providers take precedence
22
22
  and(
23
- or(isStringControl, isNumberControl, isIntegerControl),
23
+ or(
24
+ isStringControl,
25
+ isNumberControl,
26
+ and(isControl, (uischema: unknown, schema: unknown) => {
27
+ const ui = uischema as { type?: string; scope?: string };
28
+ const rootSchema = schema as {
29
+ properties?: Record<string, { type?: string }>;
30
+ };
31
+
32
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
33
+ return false;
34
+
35
+ // Extract property name from scope (e.g., "#/properties/age" -> "age")
36
+ const propertyName = ui.scope.replace("#/properties/", "");
37
+ const propertySchema = rootSchema.properties[propertyName];
38
+
39
+ return propertySchema?.type === "integer";
40
+ }),
41
+ ),
24
42
  hasProvider,
25
43
  (uischema) => !uischema?.options?.autocomplete,
26
44
  ),
@@ -29,7 +47,25 @@ const providerSelectTester = rankWith(
29
47
  const providerAutocompleteTester = rankWith(
30
48
  107, // Higher than PrimeVue base (100) to ensure providers take precedence
31
49
  and(
32
- or(isStringControl, isNumberControl, isIntegerControl),
50
+ or(
51
+ isStringControl,
52
+ isNumberControl,
53
+ and(isControl, (uischema: unknown, schema: unknown) => {
54
+ const ui = uischema as { type?: string; scope?: string };
55
+ const rootSchema = schema as {
56
+ properties?: Record<string, { type?: string }>;
57
+ };
58
+
59
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
60
+ return false;
61
+
62
+ // Extract property name from scope (e.g., "#/properties/age" -> "age")
63
+ const propertyName = ui.scope.replace("#/properties/", "");
64
+ const propertySchema = rootSchema.properties[propertyName];
65
+
66
+ return propertySchema?.type === "integer";
67
+ }),
68
+ ),
33
69
  hasProvider,
34
70
  (uischema) => uischema?.options?.autocomplete === true,
35
71
  ),
@@ -64,7 +100,7 @@ export const providerRenderers = [
64
100
  ];
65
101
 
66
102
  // Export PrimeVue renderers (styles are auto-injected)
67
- export { primevueRenderers } from "./primevue";
103
+ export { primevueRenderers, registerPrimevueRenderers } from "./primevue";
68
104
 
69
105
  // Export individual components
70
106
  export { ProviderAutocomplete, ProviderSelect, ProviderMultiSelect };
@@ -176,9 +176,3 @@ const onBlur = () => {
176
176
  <small v-else-if="showErrors" class="p-error">{{ control.errors }}</small>
177
177
  </div>
178
178
  </template>
179
-
180
- <style scoped>
181
- :deep(.p-dropdown-label) {
182
- text-align: left;
183
- }
184
- </style>
@@ -72,6 +72,8 @@ const currency = computed(() =>
72
72
  );
73
73
 
74
74
  const minFractionDigits = computed(() => {
75
+ // For integer types, no fractional digits
76
+ if (control.value.schema?.type === "integer") return 0;
75
77
  if (mode.value === "currency") return 2;
76
78
  if (typeof options.value.precision === "number")
77
79
  return options.value.precision;
@@ -79,6 +81,8 @@ const minFractionDigits = computed(() => {
79
81
  });
80
82
 
81
83
  const maxFractionDigits = computed(() => {
84
+ // For integer types, no fractional digits
85
+ if (control.value.schema?.type === "integer") return 0;
82
86
  if (mode.value === "currency") return 2;
83
87
  if (typeof options.value.precision === "number")
84
88
  return options.value.precision;
@@ -33,67 +33,100 @@ const injectLayoutStyles = () => {
33
33
  // Inject styles when this module is imported
34
34
  injectLayoutStyles();
35
35
 
36
- import {
37
- rankWith,
38
- isStringControl,
39
- or,
40
- isNumberControl,
41
- isIntegerControl,
42
- and,
43
- isControl,
44
- schemaMatches,
45
- isBooleanControl,
46
- } from "@jsonforms/core";
47
-
48
- // helpers for enum detection
49
- const isScalarEnum = (s?: object) => {
50
- const schema = s as { type?: string; enum?: unknown[]; oneOf?: unknown[] };
51
- return (
52
- schema &&
53
- schema.type !== "array" &&
54
- (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))
55
- );
56
- };
36
+ // Track whether renderers have been registered to avoid duplicate registrations
37
+ let renderersInitialized = false;
38
+
39
+ // Return empty renderers array initially
40
+ export const primevueRenderers: unknown[] = [];
41
+
42
+ // Export a function that can be called by the consumer to register renderers
43
+ // This should only be called once during application initialization
44
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
45
+ export function registerPrimevueRenderers(jsonformsCore: any): unknown[] {
46
+ // Prevent duplicate registration which causes AJV schema recompilation
47
+ if (renderersInitialized) {
48
+ return primevueRenderers as unknown[];
49
+ }
57
50
 
58
- const isEnumArray = (s?: object) => {
59
- const schema = s as {
60
- type?: string;
61
- items?: { enum?: unknown[]; oneOf?: unknown[] };
51
+ const {
52
+ rankWith,
53
+ isStringControl,
54
+ isNumberControl,
55
+ isIntegerControl,
56
+ and,
57
+ isControl,
58
+ schemaMatches,
59
+ isBooleanControl,
60
+ } = jsonformsCore;
61
+
62
+ // Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)
63
+ const PRIME = 100;
64
+
65
+ // helpers for enum detection - using simple schema checks instead of JSONForms internal functions
66
+ const isScalarEnum = (s?: object) => {
67
+ const schema = s as {
68
+ type?: string;
69
+ enum?: unknown[];
70
+ oneOf?: unknown[];
71
+ };
72
+ return (
73
+ schema &&
74
+ schema.type !== "array" &&
75
+ (Array.isArray(schema.enum) || Array.isArray(schema.oneOf))
76
+ );
62
77
  };
63
- return (
64
- schema?.type === "array" &&
65
- (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))
66
- );
67
- };
68
78
 
69
- // helper for multiline detection
70
- const isMultilineString = (uischema: unknown, schema: unknown) => {
71
- return (
72
- isStringControl(uischema as never, schema as never, {} as never) &&
73
- (uischema as { options?: { multi?: boolean } })?.options?.multi === true
74
- );
75
- };
79
+ const isEnumArray = (s?: object) => {
80
+ const schema = s as {
81
+ type?: string;
82
+ items?: { enum?: unknown[]; oneOf?: unknown[] };
83
+ };
84
+ return (
85
+ schema?.type === "array" &&
86
+ (Array.isArray(schema.items?.enum) || Array.isArray(schema.items?.oneOf))
87
+ );
88
+ };
89
+
90
+ // helper for multiline detection
91
+ const isMultilineString = (uischema: unknown, schema: unknown) => {
92
+ const controlUischema = uischema as { options?: { multi?: boolean } };
93
+ return and(isStringControl, () => controlUischema?.options?.multi === true)(
94
+ uischema as Parameters<typeof isStringControl>[0],
95
+ schema as Parameters<typeof isStringControl>[1],
96
+ {} as Parameters<typeof isStringControl>[2],
97
+ );
98
+ };
99
+
100
+ const renderers = [
101
+ // Multiline text has higher priority than regular text
102
+ { tester: rankWith(PRIME + 4, isMultilineString), renderer: JfTextArea },
103
+ { tester: rankWith(PRIME + 3, isStringControl), renderer: JfText },
104
+ {
105
+ tester: rankWith(PRIME + 6, isIntegerControl),
106
+ renderer: JfNumber,
107
+ },
108
+ {
109
+ tester: rankWith(PRIME + 4, isNumberControl),
110
+ renderer: JfNumber,
111
+ },
112
+ {
113
+ tester: rankWith(PRIME + 7, and(isControl, schemaMatches(isScalarEnum))),
114
+ renderer: JfEnum,
115
+ },
116
+ {
117
+ tester: rankWith(PRIME + 8, and(isControl, schemaMatches(isEnumArray))),
118
+ renderer: JfEnumArray,
119
+ },
120
+ { tester: rankWith(PRIME + 3, isBooleanControl), renderer: JfBoolean },
121
+ ];
76
122
 
77
- // Give PrimeVue renderers a high base rank; vanilla commonly uses small ranks (2–5)
78
- const PRIME = 100;
79
-
80
- export const primevueRenderers = [
81
- // Multiline text has higher priority than regular text
82
- { tester: rankWith(PRIME + 4, isMultilineString), renderer: JfTextArea },
83
- { tester: rankWith(PRIME + 3, isStringControl), renderer: JfText },
84
- {
85
- tester: rankWith(PRIME + 4, or(isNumberControl, isIntegerControl)),
86
- renderer: JfNumber,
87
- },
88
- {
89
- tester: rankWith(PRIME + 5, and(isControl, schemaMatches(isScalarEnum))),
90
- renderer: JfEnum,
91
- },
92
- {
93
- tester: rankWith(PRIME + 6, and(isControl, schemaMatches(isEnumArray))),
94
- renderer: JfEnumArray,
95
- },
96
- { tester: rankWith(PRIME + 3, isBooleanControl), renderer: JfBoolean },
97
- ];
123
+ // Update the exported array
124
+ primevueRenderers.splice(0, primevueRenderers.length, ...renderers);
125
+
126
+ // Mark as initialized to prevent duplicate registrations
127
+ renderersInitialized = true;
128
+
129
+ return renderers;
130
+ }
98
131
 
99
132
  export { JfText, JfTextArea, JfNumber, JfEnum, JfEnumArray, JfBoolean };
@@ -13,3 +13,8 @@
13
13
  .vertical-layout-item {
14
14
  width: 100%;
15
15
  }
16
+
17
+ /* PrimeVue dropdown text alignment fix */
18
+ .p-dropdown-label {
19
+ text-align: left !important;
20
+ }
@@ -1,17 +1,35 @@
1
1
  import {
2
2
  and,
3
- isIntegerControl,
4
3
  isNumberControl,
5
4
  isStringControl,
6
5
  or,
7
6
  rankWith,
7
+ isControl,
8
8
  } from "@jsonforms/core";
9
9
 
10
10
  // Tester that checks if provider option exists (as object or boolean)
11
11
  export const providerTester = rankWith(
12
12
  5,
13
13
  and(
14
- or(isStringControl, isNumberControl, isIntegerControl),
14
+ or(
15
+ isStringControl,
16
+ isNumberControl,
17
+ and(isControl, (uischema: unknown, schema: unknown) => {
18
+ const ui = uischema as { type?: string; scope?: string };
19
+ const rootSchema = schema as {
20
+ properties?: Record<string, { type?: string }>;
21
+ };
22
+
23
+ if (ui?.type !== "Control" || !ui?.scope || !rootSchema?.properties)
24
+ return false;
25
+
26
+ // Extract property name from scope (e.g., "#/properties/age" -> "age")
27
+ const propertyName = ui.scope.replace("#/properties/", "");
28
+ const propertySchema = rootSchema.properties[propertyName];
29
+
30
+ return propertySchema?.type === "integer";
31
+ }),
32
+ ),
15
33
  (uischema: import("@jsonforms/core").UISchemaElement) =>
16
34
  uischema?.options?.provider !== undefined &&
17
35
  uischema?.options?.provider !== null,