jsonforms-nuxt-ui-renderers 0.1.5 → 0.1.7

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
@@ -1,5 +1,7 @@
1
1
  // src/nuxtUiRenderers.ts
2
2
  import {
3
+ and,
4
+ formatIs,
3
5
  isBooleanControl,
4
6
  isEnumControl,
5
7
  isEnumSchema,
@@ -597,26 +599,24 @@ var NuxtUiNumberControl = defineComponent7({
597
599
  }
598
600
  });
599
601
 
600
- // src/renderers/controls/NuxtUiStringControl.ts
602
+ // src/renderers/controls/NuxtUiPasswordControl.ts
601
603
  import { rendererProps as rendererProps8, useJsonFormsControl as useJsonFormsControl6 } from "@jsonforms/vue";
602
- import {
603
- computed as computed9,
604
- defineComponent as defineComponent8,
605
- h as h8,
606
- resolveComponent as resolveComponent7
607
- } from "vue";
608
- var NuxtUiStringControl = defineComponent8({
609
- name: "NuxtUiStringControl",
604
+ import { computed as computed9, defineComponent as defineComponent8, h as h8, ref, resolveComponent as resolveComponent7 } from "vue";
605
+ var NuxtUiPasswordControl = defineComponent8({
606
+ name: "NuxtUiPasswordControl",
610
607
  props: rendererProps8(),
611
608
  setup(props) {
612
609
  const { control, handleChange } = useJsonFormsControl6(
613
610
  props
614
611
  );
615
612
  const errorMessage = computed9(() => trimmedOrUndefined(control.value.errors));
613
+ const showPassword = ref(false);
614
+ const inputType = computed9(() => showPassword.value ? "text" : "password");
616
615
  return () => {
617
616
  if (!control.value.visible) return null;
618
617
  const UFormField = resolveComponent7("UFormField");
619
618
  const UInput = resolveComponent7("UInput");
619
+ const UButton = resolveComponent7("UButton");
620
620
  return h8(
621
621
  "div",
622
622
  {},
@@ -629,7 +629,74 @@ var NuxtUiStringControl = defineComponent8({
629
629
  error: errorMessage.value
630
630
  },
631
631
  {
632
- default: () => h8(UInput, {
632
+ default: () => h8(
633
+ UInput,
634
+ {
635
+ modelValue: control.value.data ?? "",
636
+ class: "w-full",
637
+ type: inputType.value,
638
+ autocomplete: "current-password",
639
+ disabled: !control.value.enabled,
640
+ color: errorMessage.value ? "error" : void 0,
641
+ "aria-invalid": Boolean(errorMessage.value),
642
+ "onUpdate:modelValue": (v) => handleChange(control.value.path, v)
643
+ },
644
+ {
645
+ trailing: () => h8(UButton, {
646
+ type: "button",
647
+ color: "neutral",
648
+ variant: "ghost",
649
+ square: true,
650
+ icon: showPassword.value ? "i-heroicons-eye-slash" : "i-heroicons-eye",
651
+ "aria-pressed": showPassword.value,
652
+ "aria-label": showPassword.value ? "Hide password" : "Show password",
653
+ disabled: !control.value.enabled,
654
+ onClick: () => {
655
+ showPassword.value = !showPassword.value;
656
+ }
657
+ })
658
+ }
659
+ )
660
+ }
661
+ )
662
+ );
663
+ };
664
+ }
665
+ });
666
+
667
+ // src/renderers/controls/NuxtUiStringControl.ts
668
+ import { rendererProps as rendererProps9, useJsonFormsControl as useJsonFormsControl7 } from "@jsonforms/vue";
669
+ import {
670
+ computed as computed10,
671
+ defineComponent as defineComponent9,
672
+ h as h9,
673
+ resolveComponent as resolveComponent8
674
+ } from "vue";
675
+ var NuxtUiStringControl = defineComponent9({
676
+ name: "NuxtUiStringControl",
677
+ props: rendererProps9(),
678
+ setup(props) {
679
+ const { control, handleChange } = useJsonFormsControl7(
680
+ props
681
+ );
682
+ const errorMessage = computed10(() => trimmedOrUndefined(control.value.errors));
683
+ return () => {
684
+ if (!control.value.visible) return null;
685
+ const UFormField = resolveComponent8("UFormField");
686
+ const UInput = resolveComponent8("UInput");
687
+ return h9(
688
+ "div",
689
+ {},
690
+ h9(
691
+ UFormField,
692
+ {
693
+ label: control.value.label,
694
+ description: control.value.description,
695
+ required: control.value.required,
696
+ error: errorMessage.value
697
+ },
698
+ {
699
+ default: () => h9(UInput, {
633
700
  modelValue: control.value.data ?? "",
634
701
  class: "w-full",
635
702
  disabled: !control.value.enabled,
@@ -645,24 +712,24 @@ var NuxtUiStringControl = defineComponent8({
645
712
  });
646
713
 
647
714
  // src/renderers/controls/NuxtUiTextareaControl.ts
648
- import { rendererProps as rendererProps9, useJsonFormsControl as useJsonFormsControl7 } from "@jsonforms/vue";
649
- import { computed as computed10, defineComponent as defineComponent9, h as h9, resolveComponent as resolveComponent8 } from "vue";
650
- var NuxtUiTextareaControl = defineComponent9({
715
+ import { rendererProps as rendererProps10, useJsonFormsControl as useJsonFormsControl8 } from "@jsonforms/vue";
716
+ import { computed as computed11, defineComponent as defineComponent10, h as h10, resolveComponent as resolveComponent9 } from "vue";
717
+ var NuxtUiTextareaControl = defineComponent10({
651
718
  name: "NuxtUiTextareaControl",
652
- props: rendererProps9(),
719
+ props: rendererProps10(),
653
720
  setup(props) {
654
- const { control, handleChange } = useJsonFormsControl7(
721
+ const { control, handleChange } = useJsonFormsControl8(
655
722
  props
656
723
  );
657
- const errorMessage = computed10(() => trimmedOrUndefined(control.value.errors));
724
+ const errorMessage = computed11(() => trimmedOrUndefined(control.value.errors));
658
725
  return () => {
659
726
  if (!control.value.visible) return null;
660
- const UFormField = resolveComponent8("UFormField");
661
- const UTextarea = resolveComponent8("UTextarea");
662
- return h9(
727
+ const UFormField = resolveComponent9("UFormField");
728
+ const UTextarea = resolveComponent9("UTextarea");
729
+ return h10(
663
730
  "div",
664
731
  {},
665
- h9(
732
+ h10(
666
733
  UFormField,
667
734
  {
668
735
  label: control.value.label,
@@ -671,7 +738,7 @@ var NuxtUiTextareaControl = defineComponent9({
671
738
  error: errorMessage.value
672
739
  },
673
740
  {
674
- default: () => h9(UTextarea, {
741
+ default: () => h10(UTextarea, {
675
742
  modelValue: control.value.data ?? "",
676
743
  class: "w-full",
677
744
  disabled: !control.value.enabled,
@@ -688,37 +755,37 @@ var NuxtUiTextareaControl = defineComponent9({
688
755
  });
689
756
 
690
757
  // src/renderers/layouts/NuxtUiCategorizationRenderer.ts
691
- import { DispatchRenderer as DispatchRenderer3, rendererProps as rendererProps10, useJsonFormsCategorization } from "@jsonforms/vue";
692
- import { defineComponent as defineComponent10, h as h10 } from "vue";
693
- var NuxtUiCategorizationRenderer = defineComponent10({
758
+ import { DispatchRenderer as DispatchRenderer3, rendererProps as rendererProps11, useJsonFormsCategorization } from "@jsonforms/vue";
759
+ import { defineComponent as defineComponent11, h as h11 } from "vue";
760
+ var NuxtUiCategorizationRenderer = defineComponent11({
694
761
  name: "NuxtUiCategorizationRenderer",
695
762
  components: { DispatchRenderer: DispatchRenderer3 },
696
- props: rendererProps10(),
763
+ props: rendererProps11(),
697
764
  setup(props) {
698
765
  const { layout, categories } = useJsonFormsCategorization(
699
766
  props
700
767
  );
701
768
  return () => {
702
769
  if (!layout.value.visible) return null;
703
- return h10(
770
+ return h11(
704
771
  "div",
705
772
  { class: "flex flex-col gap-6" },
706
773
  categories.map((categoryRef, catIndex) => {
707
774
  const category = categoryRef.value;
708
775
  const elements = category.uischema.elements ?? [];
709
- return h10(
776
+ return h11(
710
777
  "div",
711
778
  { key: `${layout.value.path}-cat-${catIndex}`, class: "flex flex-col gap-3" },
712
779
  [
713
- category.label ? h10("div", { class: "text-sm font-semibold" }, category.label) : null,
714
- h10(
780
+ category.label ? h11("div", { class: "text-sm font-semibold" }, category.label) : null,
781
+ h11(
715
782
  "div",
716
783
  { class: "flex flex-col gap-3" },
717
784
  elements.map(
718
- (element, index) => h10(
785
+ (element, index) => h11(
719
786
  "div",
720
787
  { key: `${category.path}-${index}` },
721
- h10(DispatchRenderer3, {
788
+ h11(DispatchRenderer3, {
722
789
  schema: category.schema,
723
790
  uischema: element,
724
791
  path: category.path,
@@ -738,12 +805,12 @@ var NuxtUiCategorizationRenderer = defineComponent10({
738
805
  });
739
806
 
740
807
  // src/renderers/layouts/NuxtUiCategoryRenderer.ts
741
- import { DispatchRenderer as DispatchRenderer4, rendererProps as rendererProps11, useJsonFormsLayout } from "@jsonforms/vue";
742
- import { defineComponent as defineComponent11, h as h11 } from "vue";
743
- var NuxtUiCategoryRenderer = defineComponent11({
808
+ import { DispatchRenderer as DispatchRenderer4, rendererProps as rendererProps12, useJsonFormsLayout } from "@jsonforms/vue";
809
+ import { defineComponent as defineComponent12, h as h12 } from "vue";
810
+ var NuxtUiCategoryRenderer = defineComponent12({
744
811
  name: "NuxtUiCategoryRenderer",
745
812
  components: { DispatchRenderer: DispatchRenderer4 },
746
- props: rendererProps11(),
813
+ props: rendererProps12(),
747
814
  setup(props) {
748
815
  const { layout } = useJsonFormsLayout(
749
816
  props
@@ -751,16 +818,16 @@ var NuxtUiCategoryRenderer = defineComponent11({
751
818
  return () => {
752
819
  if (!layout.value.visible) return null;
753
820
  const elements = layout.value.uischema.elements ?? [];
754
- return h11("div", { class: "flex flex-col gap-3" }, [
755
- layout.value.label ? h11("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
756
- h11(
821
+ return h12("div", { class: "flex flex-col gap-3" }, [
822
+ layout.value.label ? h12("div", { class: "text-sm font-semibold" }, layout.value.label) : null,
823
+ h12(
757
824
  "div",
758
825
  { class: "flex flex-col gap-3" },
759
826
  elements.map(
760
- (element, index) => h11(
827
+ (element, index) => h12(
761
828
  "div",
762
829
  { key: `${layout.value.path}-${index}` },
763
- h11(DispatchRenderer4, {
830
+ h12(DispatchRenderer4, {
764
831
  schema: layout.value.schema,
765
832
  uischema: element,
766
833
  path: layout.value.path,
@@ -777,12 +844,12 @@ var NuxtUiCategoryRenderer = defineComponent11({
777
844
  });
778
845
 
779
846
  // src/renderers/layouts/NuxtUiGroupRenderer.ts
780
- import { DispatchRenderer as DispatchRenderer5, rendererProps as rendererProps12, useJsonFormsLayout as useJsonFormsLayout2 } from "@jsonforms/vue";
781
- import { defineComponent as defineComponent12, h as h12 } from "vue";
782
- var NuxtUiGroupRenderer = defineComponent12({
847
+ import { DispatchRenderer as DispatchRenderer5, rendererProps as rendererProps13, useJsonFormsLayout as useJsonFormsLayout2 } from "@jsonforms/vue";
848
+ import { defineComponent as defineComponent13, h as h13 } from "vue";
849
+ var NuxtUiGroupRenderer = defineComponent13({
783
850
  name: "NuxtUiGroupRenderer",
784
851
  components: { DispatchRenderer: DispatchRenderer5 },
785
- props: rendererProps12(),
852
+ props: rendererProps13(),
786
853
  setup(props) {
787
854
  const { layout } = useJsonFormsLayout2(
788
855
  props
@@ -790,16 +857,16 @@ var NuxtUiGroupRenderer = defineComponent12({
790
857
  return () => {
791
858
  if (!layout.value.visible) return null;
792
859
  const elements = layout.value.uischema.elements ?? [];
793
- return h12("div", { class: "rounded border p-3" }, [
794
- layout.value.label ? h12("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
795
- h12(
860
+ return h13("div", { class: "rounded border p-3" }, [
861
+ layout.value.label ? h13("div", { class: "mb-3 text-sm font-semibold" }, layout.value.label) : null,
862
+ h13(
796
863
  "div",
797
864
  { class: "flex flex-col gap-3" },
798
865
  elements.map(
799
- (element, index) => h12(
866
+ (element, index) => h13(
800
867
  "div",
801
868
  { key: `${layout.value.path}-${index}` },
802
- h12(DispatchRenderer5, {
869
+ h13(DispatchRenderer5, {
803
870
  schema: layout.value.schema,
804
871
  uischema: element,
805
872
  path: layout.value.path,
@@ -816,12 +883,12 @@ var NuxtUiGroupRenderer = defineComponent12({
816
883
  });
817
884
 
818
885
  // src/renderers/layouts/NuxtUiHorizontalLayoutRenderer.ts
819
- import { DispatchRenderer as DispatchRenderer6, rendererProps as rendererProps13, useJsonFormsLayout as useJsonFormsLayout3 } from "@jsonforms/vue";
820
- import { defineComponent as defineComponent13, h as h13 } from "vue";
821
- var NuxtUiHorizontalLayoutRenderer = defineComponent13({
886
+ import { DispatchRenderer as DispatchRenderer6, rendererProps as rendererProps14, useJsonFormsLayout as useJsonFormsLayout3 } from "@jsonforms/vue";
887
+ import { defineComponent as defineComponent14, h as h14 } from "vue";
888
+ var NuxtUiHorizontalLayoutRenderer = defineComponent14({
822
889
  name: "NuxtUiHorizontalLayoutRenderer",
823
890
  components: { DispatchRenderer: DispatchRenderer6 },
824
- props: rendererProps13(),
891
+ props: rendererProps14(),
825
892
  setup(props) {
826
893
  const { layout } = useJsonFormsLayout3(
827
894
  props
@@ -829,14 +896,14 @@ var NuxtUiHorizontalLayoutRenderer = defineComponent13({
829
896
  return () => {
830
897
  if (!layout.value.visible) return null;
831
898
  const elements = layout.value.uischema.elements ?? [];
832
- return h13(
899
+ return h14(
833
900
  "div",
834
901
  { class: "flex flex-col gap-3 md:flex-row md:flex-wrap" },
835
902
  elements.map(
836
- (element, index) => h13(
903
+ (element, index) => h14(
837
904
  "div",
838
905
  { key: `${layout.value.path}-${index}`, class: "min-w-0 flex-1" },
839
- h13(DispatchRenderer6, {
906
+ h14(DispatchRenderer6, {
840
907
  schema: layout.value.schema,
841
908
  uischema: element,
842
909
  path: layout.value.path,
@@ -852,18 +919,18 @@ var NuxtUiHorizontalLayoutRenderer = defineComponent13({
852
919
  });
853
920
 
854
921
  // src/renderers/layouts/NuxtUiLabelRenderer.ts
855
- import { rendererProps as rendererProps14, useJsonFormsLabel } from "@jsonforms/vue";
856
- import { defineComponent as defineComponent14, h as h14 } from "vue";
857
- var NuxtUiLabelRenderer = defineComponent14({
922
+ import { rendererProps as rendererProps15, useJsonFormsLabel } from "@jsonforms/vue";
923
+ import { defineComponent as defineComponent15, h as h15 } from "vue";
924
+ var NuxtUiLabelRenderer = defineComponent15({
858
925
  name: "NuxtUiLabelRenderer",
859
- props: rendererProps14(),
926
+ props: rendererProps15(),
860
927
  setup(props) {
861
928
  const { label } = useJsonFormsLabel(
862
929
  props
863
930
  );
864
931
  return () => {
865
932
  if (!label.value.visible) return null;
866
- return h14(
933
+ return h15(
867
934
  "div",
868
935
  { class: "text-sm text-gray-600 dark:text-gray-300" },
869
936
  label.value.text
@@ -873,12 +940,12 @@ var NuxtUiLabelRenderer = defineComponent14({
873
940
  });
874
941
 
875
942
  // src/renderers/layouts/NuxtUiVerticalLayoutRenderer.ts
876
- import { DispatchRenderer as DispatchRenderer7, rendererProps as rendererProps15, useJsonFormsLayout as useJsonFormsLayout4 } from "@jsonforms/vue";
877
- import { defineComponent as defineComponent15, h as h15 } from "vue";
878
- var NuxtUiVerticalLayoutRenderer = defineComponent15({
943
+ import { DispatchRenderer as DispatchRenderer7, rendererProps as rendererProps16, useJsonFormsLayout as useJsonFormsLayout4 } from "@jsonforms/vue";
944
+ import { defineComponent as defineComponent16, h as h16 } from "vue";
945
+ var NuxtUiVerticalLayoutRenderer = defineComponent16({
879
946
  name: "NuxtUiVerticalLayoutRenderer",
880
947
  components: { DispatchRenderer: DispatchRenderer7 },
881
- props: rendererProps15(),
948
+ props: rendererProps16(),
882
949
  setup(props) {
883
950
  const { layout } = useJsonFormsLayout4(
884
951
  props
@@ -886,14 +953,14 @@ var NuxtUiVerticalLayoutRenderer = defineComponent15({
886
953
  return () => {
887
954
  if (!layout.value.visible) return null;
888
955
  const elements = layout.value.uischema.elements ?? [];
889
- return h15(
956
+ return h16(
890
957
  "div",
891
958
  { class: "flex flex-col gap-3" },
892
959
  elements.map(
893
- (element, index) => h15(
960
+ (element, index) => h16(
894
961
  "div",
895
962
  { key: `${layout.value.path}-${index}` },
896
- h15(DispatchRenderer7, {
963
+ h16(DispatchRenderer7, {
897
964
  schema: layout.value.schema,
898
965
  uischema: element,
899
966
  path: layout.value.path,
@@ -911,6 +978,7 @@ var NuxtUiVerticalLayoutRenderer = defineComponent15({
911
978
  // src/nuxtUiRenderers.ts
912
979
  var RANK = 10;
913
980
  var ENUM_RANK = RANK + 1;
981
+ var PASSWORD_RANK = ENUM_RANK + 1;
914
982
  var isMultiEnumControl = (uischema, schema, context) => {
915
983
  if (!uiTypeIs("Control")(uischema, schema, context)) {
916
984
  return false;
@@ -932,6 +1000,27 @@ var isMultiEnumControl = (uischema, schema, context) => {
932
1000
  const resolvedItems = "$ref" in items && typeof items.$ref === "string" ? Resolve2.schema(rootSchema, items.$ref, rootSchema) : items;
933
1001
  return isEnumSchema(resolvedItems);
934
1002
  };
1003
+ var isOneOfEnumControl = (uischema, schema, context) => {
1004
+ if (!uiTypeIs("Control")(uischema, schema, context)) {
1005
+ return false;
1006
+ }
1007
+ const scope = uischema?.scope;
1008
+ if (typeof scope !== "string") return false;
1009
+ const rootSchema = context?.rootSchema ?? schema;
1010
+ let resolved;
1011
+ try {
1012
+ resolved = Resolve2.schema(schema, scope, rootSchema);
1013
+ } catch {
1014
+ return false;
1015
+ }
1016
+ const oneOf = resolved?.oneOf;
1017
+ if (!Array.isArray(oneOf) || oneOf.length === 0) return false;
1018
+ for (const entry of oneOf) {
1019
+ if (typeof entry !== "object" || entry === null) continue;
1020
+ if (!("const" in entry)) return false;
1021
+ }
1022
+ return true;
1023
+ };
935
1024
  var nuxtUiRenderers = [
936
1025
  // Layouts
937
1026
  {
@@ -989,12 +1078,21 @@ var nuxtUiRenderers = [
989
1078
  tester: rankWith(ENUM_RANK, isMultiEnumControl),
990
1079
  renderer: markRaw(NuxtUiMultiEnumControl)
991
1080
  },
1081
+ {
1082
+ // oneOf with const+title (display labels) - same as enum for rendering.
1083
+ tester: rankWith(ENUM_RANK, isOneOfEnumControl),
1084
+ renderer: markRaw(NuxtUiEnumControl)
1085
+ },
992
1086
  {
993
1087
  // Enum must outrank the generic string control, otherwise enums can render
994
1088
  // as freeform text inputs.
995
1089
  tester: rankWith(ENUM_RANK, isEnumControl),
996
1090
  renderer: markRaw(NuxtUiEnumControl)
997
1091
  },
1092
+ {
1093
+ tester: rankWith(PASSWORD_RANK, and(isStringControl, formatIs("password"))),
1094
+ renderer: markRaw(NuxtUiPasswordControl)
1095
+ },
998
1096
  {
999
1097
  tester: rankWith(RANK, isStringControl),
1000
1098
  renderer: markRaw(NuxtUiStringControl)