@vc-shell/framework 1.0.157 → 1.0.159

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/core/types/index.ts +1 -2
  3. package/dist/core/types/index.d.ts.map +1 -1
  4. package/dist/framework.js +7145 -7079
  5. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  6. package/dist/shared/components/blade-navigation/types/index.d.ts.map +1 -1
  7. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  8. package/dist/shared/modules/dynamic/components/factories.d.ts +1 -1
  9. package/dist/shared/modules/dynamic/components/factories.d.ts.map +1 -1
  10. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +4 -25
  11. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  12. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +4 -25
  13. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  14. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +4 -25
  15. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +4 -25
  17. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +4 -25
  19. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +4 -25
  21. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  22. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +4 -25
  23. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  24. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +4 -25
  25. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  26. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +4 -25
  27. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  28. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +4 -25
  29. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  30. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +4 -25
  31. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  32. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +4 -25
  33. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +4 -25
  35. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  36. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +4 -25
  37. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -1
  38. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +4 -25
  39. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  40. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +4 -25
  41. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  42. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +4 -25
  43. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -1
  44. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +4 -25
  45. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -1
  46. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +4 -25
  47. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  48. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +4 -25
  49. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  50. package/dist/shared/modules/dynamic/components/fields/props.d.ts +5 -26
  51. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  52. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts +3 -17
  53. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  54. package/dist/shared/modules/dynamic/helpers/getters.d.ts +1 -1
  55. package/dist/shared/modules/dynamic/helpers/getters.d.ts.map +1 -1
  56. package/dist/shared/modules/dynamic/helpers/nodeBuilder.d.ts +5 -4
  57. package/dist/shared/modules/dynamic/helpers/nodeBuilder.d.ts.map +1 -1
  58. package/dist/shared/modules/dynamic/helpers/setters.d.ts.map +1 -1
  59. package/dist/shared/modules/dynamic/helpers/unrefNested.d.ts +2 -1
  60. package/dist/shared/modules/dynamic/helpers/unrefNested.d.ts.map +1 -1
  61. package/dist/shared/modules/dynamic/helpers/unwrapInterpolation.d.ts +1 -1
  62. package/dist/shared/modules/dynamic/helpers/unwrapInterpolation.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  65. package/dist/shared/modules/dynamic/types/index.d.ts +3 -4
  66. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  67. package/dist/shared/modules/dynamic/types/models.d.ts +0 -1
  68. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  69. package/dist/tsconfig.tsbuildinfo +1 -1
  70. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts.map +1 -1
  71. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  72. package/package.json +4 -4
  73. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +1 -6
  74. package/shared/components/blade-navigation/types/index.ts +1 -1
  75. package/shared/modules/dynamic/components/SchemaRender.ts +21 -16
  76. package/shared/modules/dynamic/components/factories.ts +0 -2
  77. package/shared/modules/dynamic/components/fields/Button.ts +13 -9
  78. package/shared/modules/dynamic/components/fields/Card.ts +29 -15
  79. package/shared/modules/dynamic/components/fields/Checkbox.ts +14 -7
  80. package/shared/modules/dynamic/components/fields/ContentField.ts +10 -6
  81. package/shared/modules/dynamic/components/fields/DynamicProperty.ts +2 -2
  82. package/shared/modules/dynamic/components/fields/EditorField.ts +9 -5
  83. package/shared/modules/dynamic/components/fields/GalleryField.ts +16 -13
  84. package/shared/modules/dynamic/components/fields/ImageField.ts +14 -10
  85. package/shared/modules/dynamic/components/fields/InputCurrency.ts +20 -15
  86. package/shared/modules/dynamic/components/fields/InputField.ts +10 -6
  87. package/shared/modules/dynamic/components/fields/MultivalueField.ts +13 -9
  88. package/shared/modules/dynamic/components/fields/RatingField.ts +8 -4
  89. package/shared/modules/dynamic/components/fields/SelectField.ts +14 -10
  90. package/shared/modules/dynamic/components/fields/StatusField.ts +9 -6
  91. package/shared/modules/dynamic/components/fields/SwitchField.ts +9 -5
  92. package/shared/modules/dynamic/components/fields/Table.ts +15 -11
  93. package/shared/modules/dynamic/components/fields/TextareaField.ts +9 -5
  94. package/shared/modules/dynamic/components/fields/VideoField.ts +9 -5
  95. package/shared/modules/dynamic/components/fields/props.ts +5 -13
  96. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +88 -85
  97. package/shared/modules/dynamic/helpers/getters.ts +2 -3
  98. package/shared/modules/dynamic/helpers/nodeBuilder.ts +26 -20
  99. package/shared/modules/dynamic/helpers/setters.ts +2 -1
  100. package/shared/modules/dynamic/helpers/unrefNested.ts +4 -4
  101. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +0 -3
  102. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +1 -0
  103. package/shared/modules/dynamic/types/index.ts +3 -1
  104. package/shared/modules/dynamic/types/models.ts +0 -1
  105. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +0 -1
  106. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +2 -2
  107. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +1 -1
  108. package/ui/components/organisms/vc-table/vc-table.vue +1 -1
@@ -3,6 +3,7 @@ import componentProps from "./props";
3
3
  import { StatusSchema } from "../../types";
4
4
  import { StatusField } from "../factories";
5
5
  import { VcIcon } from "../../../../../ui/components";
6
+ import { unrefNested } from "../../helpers/unrefNested";
6
7
 
7
8
  export default {
8
9
  name: "StatusField",
@@ -25,12 +26,14 @@ export default {
25
26
  });
26
27
 
27
28
  const field = StatusField({
28
- props: {
29
- ...props.baseProps,
30
- variant: props.element.variant,
31
- outline: props.element.outline,
32
- extend: props.element.extend,
33
- },
29
+ props: Object.assign(
30
+ {
31
+ variant: props.element.variant,
32
+ outline: props.element.outline,
33
+ extend: props.element.extend,
34
+ },
35
+ unrefNested(props.baseProps),
36
+ ),
34
37
  slots: {
35
38
  default: () => {
36
39
  return h("div", { class: "tw-flex tw-flex-row tw-items-center" }, [
@@ -2,6 +2,7 @@ import { Component, ExtractPropTypes, h } from "vue";
2
2
  import { Switch } from "../factories";
3
3
  import componentProps from "./props";
4
4
  import { SwitchSchema } from "../../types";
5
+ import { unrefNested } from "../../helpers/unrefNested";
5
6
 
6
7
  export default {
7
8
  name: "SwitchEl",
@@ -9,11 +10,14 @@ export default {
9
10
  setup(props: ExtractPropTypes<typeof componentProps> & { element: SwitchSchema }) {
10
11
  return () => {
11
12
  const field = Switch({
12
- props: {
13
- ...props.baseProps,
14
- trueValue: props.element.trueValue,
15
- falseValue: props.element.falseValue,
16
- },
13
+ props: Object.assign(
14
+ {},
15
+ {
16
+ trueValue: props.element.trueValue,
17
+ falseValue: props.element.falseValue,
18
+ },
19
+ unrefNested(props.baseProps),
20
+ ),
17
21
  });
18
22
 
19
23
  return h(field.component as Component, field.props);
@@ -5,6 +5,7 @@ import { Table } from "../factories";
5
5
  import componentProps from "./props";
6
6
  import { TableSchema } from "../../types";
7
7
  import { useI18n } from "vue-i18n";
8
+ import { unrefNested } from "../../helpers/unrefNested";
8
9
 
9
10
  type TableItemData = Record<string, any>;
10
11
 
@@ -17,18 +18,21 @@ export default {
17
18
 
18
19
  return () => {
19
20
  const field = Table({
20
- props: {
21
- ...props.baseProps,
22
- header: !!props.element.header,
23
- footer: !!props.element.footer,
24
- multiselect: !!props.element.multiselect,
25
- columns: props.element.columns?.map((col) => ({ ...col, title: computed(() => t(col.title)) })),
26
- items: props.baseProps.modelValue ?? [],
27
- stateKey: props.element.id,
28
- class: {
29
- "!tw-flex-auto": true,
21
+ props: Object.assign(
22
+ {},
23
+ {
24
+ header: !!props.element.header,
25
+ footer: !!props.element.footer,
26
+ multiselect: !!props.element.multiselect,
27
+ columns: props.element.columns?.map((col) => ({ ...col, title: computed(() => t(col.title)) })),
28
+ items: unrefNested(props.baseProps).modelValue ?? [],
29
+ stateKey: props.element.id,
30
+ class: {
31
+ "!tw-flex-auto": true,
32
+ },
30
33
  },
31
- },
34
+ unrefNested(props.baseProps),
35
+ ),
32
36
  slots: {
33
37
  ...Object.entries(tableTemplates.templateOverrideComponents).reduce(
34
38
  (obj, [key, value], index) => {
@@ -3,6 +3,7 @@ import { TextareaSchema } from "./../../types/index";
3
3
  import { ExtractPropTypes, h, Component } from "vue";
4
4
  import componentProps from "./props";
5
5
  import ValidationField from "./ValidationField";
6
+ import { unrefNested } from "../../helpers/unrefNested";
6
7
 
7
8
  export default {
8
9
  name: "TextareaField",
@@ -10,11 +11,14 @@ export default {
10
11
  setup(props: ExtractPropTypes<typeof componentProps> & { element: TextareaSchema }) {
11
12
  return () => {
12
13
  const field = TextareaField({
13
- props: {
14
- ...props.baseProps,
15
- currentLanguage: props.currentLocale,
16
- clearable: props.element.clearable || false,
17
- },
14
+ props: Object.assign(
15
+ {},
16
+ {
17
+ currentLanguage: props.currentLocale,
18
+ clearable: props.element.clearable || false,
19
+ },
20
+ unrefNested(props.baseProps),
21
+ ),
18
22
  });
19
23
 
20
24
  const render = h(field.component as Component, field.props);
@@ -2,6 +2,7 @@ import { Component, ExtractPropTypes, h } from "vue";
2
2
  import { VideoField } from "../factories";
3
3
  import componentProps from "./props";
4
4
  import { VideoSchema } from "../../types";
5
+ import { unrefNested } from "../../helpers/unrefNested";
5
6
 
6
7
  export default {
7
8
  name: "VideoField",
@@ -9,11 +10,14 @@ export default {
9
10
  setup(props: ExtractPropTypes<typeof componentProps> & { element: VideoSchema }) {
10
11
  return () => {
11
12
  const field = VideoField({
12
- props: {
13
- ...props.baseProps,
14
- source: props.baseProps.modelValue,
15
- size: props.element.size,
16
- },
13
+ props: Object.assign(
14
+ {},
15
+ {
16
+ source: props.baseProps.modelValue,
17
+ size: props.element.size,
18
+ },
19
+ unrefNested(props.baseProps),
20
+ ),
17
21
  });
18
22
 
19
23
  const render = h(field.component as Component, field.props);
@@ -1,12 +1,12 @@
1
- import { ComputedRef, MaybeRef, PropType, UnwrapNestedRefs, VNode } from "vue";
1
+ import { ComputedRef, PropType, ToRefs, UnwrapNestedRefs, VNode } from "vue";
2
2
  import { DetailsBladeContext } from "../../factories";
3
3
  import { IControlBaseProps } from "../../types/models";
4
4
  import { ControlSchema } from "../../types";
5
5
 
6
6
  export default {
7
7
  baseProps: {
8
- type: Object as PropType<UnwrapNestedRefs<IControlBaseProps>>,
9
- default: () => ({}) as IControlBaseProps,
8
+ type: Object as PropType<ToRefs<IControlBaseProps>>,
9
+ default: () => ({}) as ToRefs<IControlBaseProps>,
10
10
  },
11
11
  element: {
12
12
  type: Object as PropType<ControlSchema>,
@@ -21,16 +21,12 @@ export default {
21
21
  default: () => ({}) as ComputedRef<VNode[][]>,
22
22
  },
23
23
  formData: {
24
- type: Object as PropType<MaybeRef<Record<string, unknown>>>,
25
- default: () => ({}) as MaybeRef<Record<string, unknown>>,
24
+ type: Object as PropType<ToRefs<Record<string, unknown>>>,
25
+ default: () => ({}) as ToRefs<Record<string, unknown>>,
26
26
  },
27
27
  fieldContext: {
28
28
  type: Object,
29
29
  },
30
- nodeBuilder: {
31
- type: Function,
32
- default: () => ({}),
33
- },
34
30
  currentLocale: {
35
31
  type: String,
36
32
  },
@@ -40,8 +36,4 @@ export default {
40
36
  rows: {
41
37
  type: Number,
42
38
  },
43
- onSetModelData: {
44
- type: Function,
45
- default: () => ({}),
46
- },
47
39
  };
@@ -1,3 +1,4 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import {
2
3
  h,
3
4
  ref,
@@ -13,6 +14,7 @@ import {
13
14
  ComputedRef,
14
15
  readonly,
15
16
  toValue,
17
+ Ref,
16
18
  } from "vue";
17
19
  import * as _ from "lodash-es";
18
20
  import { Checkbox, InputField } from "../../components/factories";
@@ -20,14 +22,8 @@ import { AsyncAction } from "../../../../../core/composables";
20
22
  import { VcButton, VcCol, VcContainer, VcRow } from "../../../../../ui/components";
21
23
  import { createUnrefFn } from "@vueuse/core";
22
24
  import { useI18n } from "vue-i18n";
23
-
24
- interface RawControl {
25
- field: string;
26
- component: string;
27
- label?: string;
28
- multiple?: boolean;
29
- data?: { value: string; displayName: string }[];
30
- }
25
+ import { FilterBase, FilterCheckbox, FilterDateInput } from "../../types";
26
+ import { onBeforeUnmount } from "vue";
31
27
 
32
28
  interface Control {
33
29
  title: string;
@@ -36,13 +32,6 @@ interface Control {
36
32
  };
37
33
  }
38
34
 
39
- interface Data {
40
- columns: {
41
- title: string;
42
- controls: RawControl[];
43
- }[];
44
- }
45
-
46
35
  export interface UseFilterBuilder {
47
36
  filterComponent: (slotMethods: { close: () => void }) =>
48
37
  | VNode<
@@ -62,15 +51,16 @@ export interface UseFilterBuilder {
62
51
  }
63
52
 
64
53
  export default <Query>(args: {
65
- data: Data | undefined;
54
+ data: FilterBase | undefined;
66
55
  query: MaybeRef<Query>;
67
56
  load: AsyncAction<Query>;
57
+ scope: ComputedRef<Record<string, any>> | undefined;
68
58
  }): UseFilterBuilder => {
69
59
  const _search = args.load;
70
60
  const _data = args.data;
71
61
 
72
62
  const isFilterVisible = ref(true);
73
- const filter: Record<string, unknown> = reactive({});
63
+ const filter: Ref<Record<string, unknown>> = ref({});
74
64
  const { t } = useI18n({ useScope: "global" });
75
65
 
76
66
  const controls = ref<Control[]>([]);
@@ -86,7 +76,7 @@ export default <Query>(args: {
86
76
  onMounted(() => createFilterControls());
87
77
 
88
78
  function isItemSelected(value: string, field: string) {
89
- const item = filter[field];
79
+ const item = filter.value[field];
90
80
  if (Array.isArray(item) && typeof item !== "string") {
91
81
  return item.some((x) => x === value);
92
82
  } else {
@@ -96,13 +86,13 @@ export default <Query>(args: {
96
86
 
97
87
  function selectFilterItem(e: boolean, value: string, field: string, multiple = true) {
98
88
  if (multiple) {
99
- filter[field] = e
100
- ? [...((filter[field] as string[]) || []), value]
101
- : ((filter[field] as string[]) || []).filter((x) => x !== value);
89
+ filter.value[field] = e
90
+ ? [...((filter.value[field] as string[]) || []), value]
91
+ : ((filter.value[field] as string[]) || []).filter((x) => x !== value);
102
92
 
103
- if (!(filter[field] as string[]).length) filter[field] = undefined;
93
+ if (!(filter.value[field] as string[]).length) filter.value[field] = undefined;
104
94
  } else {
105
- filter[field] = e ? value : undefined;
95
+ filter.value[field] = e ? value : undefined;
106
96
  }
107
97
  }
108
98
 
@@ -116,7 +106,8 @@ export default <Query>(args: {
116
106
  (obj, control) => {
117
107
  if (control.component === "vc-checkbox") {
118
108
  const filterData = control.data;
119
- const fields = createCheckboxFromData(filterData, control);
109
+ const filterDataFromScope = unref(args.scope)?.[filterData] ?? [];
110
+ const fields = createCheckboxFromData(filterDataFromScope, control);
120
111
 
121
112
  if (fields) {
122
113
  obj = fields;
@@ -138,18 +129,20 @@ export default <Query>(args: {
138
129
  });
139
130
  }
140
131
 
141
- function createCheckboxFromData(data: RawControl["data"], control: RawControl) {
142
- if (!(data && data.length)) return;
143
- return data.reduce(
132
+ // TODO add to documentation support of dynamic data for filter
133
+ function createCheckboxFromData(data: MaybeRef<Record<string, string>[]>, control: FilterCheckbox) {
134
+ if (!(toValue(data) && toValue(data).length)) return;
135
+ return toValue(data).reduce(
144
136
  (obj, currC) => {
145
- obj[currC.value] = Checkbox({
137
+ obj[currC[control.optionValue]] = Checkbox({
146
138
  props: {
147
- classNames: "tw-mb-2",
148
- modelValue: computed(() => isItemSelected(currC.value, control.field)),
149
- "onUpdate:modelValue": (e: boolean) => selectFilterItem(e, currC.value, control.field, control.multiple),
139
+ class: "tw-mb-2",
140
+ modelValue: computed(() => isItemSelected(currC[control.optionValue], control.field)),
141
+ "onUpdate:modelValue": (e: boolean) =>
142
+ selectFilterItem(e, currC[control.optionValue], control.field, control.multiple),
150
143
  },
151
144
  slots: {
152
- default: () => unref(computed(() => t(currC.displayName))),
145
+ default: () => toValue(currC[control.optionLabel]),
153
146
  },
154
147
  });
155
148
 
@@ -159,14 +152,14 @@ export default <Query>(args: {
159
152
  );
160
153
  }
161
154
 
162
- function createInput(control: RawControl) {
155
+ function createInput(control: FilterDateInput) {
163
156
  return InputField({
164
157
  props: {
165
158
  type: "date",
166
- classNames: "tw-mb-3",
159
+ class: "tw-mb-3",
167
160
  label: toValue(computed(() => t(control.label ?? ""))),
168
- modelValue: computed(() => filter[control.field]),
169
- "onUpdate:modelValue": (e: unknown) => (filter[control.field] = e),
161
+ modelValue: computed(() => filter.value[control.field]),
162
+ "onUpdate:modelValue": (e: unknown) => (filter.value[control.field] = e),
170
163
  },
171
164
  });
172
165
  }
@@ -175,10 +168,10 @@ export default <Query>(args: {
175
168
  filterHandlerFn();
176
169
  await _search({
177
170
  ...unref(args.query),
178
- ...filter,
171
+ ...filter.value,
179
172
  });
180
173
  appliedFilter.value = {
181
- ...filter,
174
+ ...filter.value,
182
175
  };
183
176
  }
184
177
 
@@ -189,62 +182,72 @@ export default <Query>(args: {
189
182
 
190
183
  await _search({
191
184
  ...unref(args.query),
192
- ...filter,
185
+ ...filter.value,
193
186
  });
194
187
  }
195
188
 
196
189
  function render(slotMethods: { close: () => void }) {
197
190
  if (_.isEmpty(controls.value)) return;
198
- return h(VcContainer, () => [
199
- h(VcRow, () =>
200
- Object.values(controls.value).map(({ title, fields }) =>
201
- h(VcCol, { class: "tw-p-2" }, () => [
202
- h(
203
- "div",
204
- { class: "tw-mb-4 tw-text-[#a1c0d4] tw-font-bold tw-text-[17px]" },
205
- unref(computed(() => t(title))),
206
- ),
207
- Object.values(fields).map((item) => {
208
- if ("component" in item && item.component) {
209
- return h(
210
- item.component as Component,
211
- { ...item.props, class: item.props.classNames },
212
- "slots" in item && item.slots ? { ...item.slots } : {},
213
- );
214
- }
215
- }),
216
- ]),
191
+ return h(
192
+ VcContainer,
193
+ {
194
+ onVnodeBeforeMount: () => {
195
+ if (Object.keys(appliedFilter.value).length) {
196
+ filter.value = _.cloneDeep(appliedFilter.value);
197
+ }
198
+ },
199
+ },
200
+ () => [
201
+ h(VcRow, () =>
202
+ Object.values(controls.value).map(({ title, fields }) =>
203
+ h(VcCol, { class: "tw-p-2" }, () => [
204
+ h(
205
+ "div",
206
+ { class: "tw-mb-4 tw-text-[#a1c0d4] tw-font-bold tw-text-[17px]" },
207
+ unref(computed(() => t(title))),
208
+ ),
209
+ Object.values(fields).map((item) => {
210
+ if ("component" in item && item.component) {
211
+ return h(
212
+ item.component as Component,
213
+ { ...item.props, class: item.props.class },
214
+ "slots" in item && item.slots ? { ...item.slots } : {},
215
+ );
216
+ }
217
+ }),
218
+ ]),
219
+ ),
217
220
  ),
218
- ),
219
- h(VcRow, () =>
220
- h(VcCol, { class: "tw-p-2" }, () =>
221
- h("div", { class: "tw-flex tw-justify-end" }, [
222
- h(
223
- VcButton,
224
- {
225
- outline: true,
226
- class: "tw-mr-4",
227
- disabled: isDisabled(appliedFilter),
228
- onClick: () => resetFilters(slotMethods.close),
229
- },
230
- () => t("COMPONENTS.FILTERS.RESET"),
231
- ),
232
- h(
233
- VcButton,
234
- {
235
- disabled: isDisabled(filter),
236
- onClick: () => applyFilters(slotMethods.close),
237
- },
238
- () => t("COMPONENTS.FILTERS.APPLY"),
239
- ),
240
- ]),
221
+ h(VcRow, () =>
222
+ h(VcCol, { class: "tw-p-2" }, () =>
223
+ h("div", { class: "tw-flex tw-justify-end" }, [
224
+ h(
225
+ VcButton,
226
+ {
227
+ outline: true,
228
+ class: "tw-mr-4",
229
+ disabled: isDisabled(appliedFilter),
230
+ onClick: () => resetFilters(slotMethods.close),
231
+ },
232
+ () => t("COMPONENTS.FILTERS.RESET"),
233
+ ),
234
+ h(
235
+ VcButton,
236
+ {
237
+ disabled: isDisabled(filter),
238
+ onClick: () => applyFilters(slotMethods.close),
239
+ },
240
+ () => t("COMPONENTS.FILTERS.APPLY"),
241
+ ),
242
+ ]),
243
+ ),
241
244
  ),
242
- ),
243
- ]);
245
+ ],
246
+ );
244
247
  }
245
248
 
246
249
  async function reset() {
247
- Object.keys(filter).forEach((key: string) => (filter[key] = undefined));
250
+ Object.keys(filter).forEach((key: string) => (filter.value[key] = undefined));
248
251
 
249
252
  appliedFilter.value = {};
250
253
  }
@@ -252,7 +255,7 @@ export default <Query>(args: {
252
255
  return {
253
256
  filterComponent: render,
254
257
  activeFilterCount,
255
- filter: readonly(filter),
258
+ filter: readonly(filter.value),
256
259
  isFilterVisible: computed(() => isFilterVisible.value),
257
260
  reset,
258
261
  };
@@ -1,10 +1,9 @@
1
- import { reactify } from "@vueuse/core";
2
1
  import * as _ from "lodash-es";
3
2
 
4
3
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
- export const getModel = reactify((property: string, context: Record<string, any>) => {
4
+ export const getModel = (property: string, context: Record<string, any>) => {
6
5
  if (property && context) {
7
6
  return _.get(context, property);
8
7
  }
9
8
  return null;
10
- });
9
+ };
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
- import { unref, computed, toValue, h, UnwrapNestedRefs, MaybeRef, reactive, VNode } from "vue";
2
+ import { unref, computed, toValue, h, UnwrapNestedRefs, MaybeRef, reactive, VNode, ToRefs } from "vue";
3
3
  import FIELD_MAP from "../components/FIELD_MAP";
4
4
  import { ControlSchema } from "../types";
5
5
  import { IControlBaseProps } from "../types/models";
@@ -10,6 +10,8 @@ import { DetailsBladeContext } from "../factories";
10
10
  import { safeIn } from "./safeIn";
11
11
  import { i18n } from "./../../../../core/plugins/i18n";
12
12
  import { visibilityHandler } from "./visibilityHandler";
13
+ import { toRefs } from "@vueuse/core";
14
+ import { unrefNested } from "./unrefNested";
13
15
 
14
16
  function disabledHandler(
15
17
  disabled: { method?: string } | boolean,
@@ -34,13 +36,15 @@ function nodeBuilder<
34
36
  bladeContext,
35
37
  currentLocale,
36
38
  formData,
39
+ updateFormData,
37
40
  }: {
38
41
  controlSchema: ControlSchema;
39
42
  parentId: string | number;
40
- internalContext: MaybeRef<Context>;
43
+ internalContext: ToRefs<Context>;
41
44
  bladeContext: BContext;
42
45
  currentLocale: MaybeRef<string>;
43
- formData: FormData;
46
+ formData: ToRefs<FormData>;
47
+ updateFormData?: (newVal: ToRefs<unknown>) => void;
44
48
  }): VNode {
45
49
  if (!controlSchema) throw new Error("There is no controlSchema provided");
46
50
 
@@ -60,14 +64,14 @@ function nodeBuilder<
60
64
  bladeContext.scope &&
61
65
  bladeContext.scope[controlSchema.property];
62
66
 
63
- const modelValue = scopedProperty || contextProperty || undefined;
67
+ const modelValue = scopedProperty ?? contextProperty ?? undefined;
64
68
 
65
69
  const tooltip = (safeIn("tooltip", controlSchema) && controlSchema.tooltip) || undefined;
66
70
  const multilanguage = safeIn("multilanguage", controlSchema) && controlSchema.multilanguage;
67
71
 
68
72
  const label =
69
73
  safeIn("label", controlSchema) && controlSchema.label
70
- ? unref(unwrapInterpolation(controlSchema.label, toValue(internalContext)))
74
+ ? unref(unwrapInterpolation(controlSchema.label, internalContext))
71
75
  : undefined;
72
76
 
73
77
  const disabled =
@@ -82,10 +86,12 @@ function nodeBuilder<
82
86
  setModel({
83
87
  property: controlSchema.property,
84
88
  value: e,
85
- context: toValue(internalContext),
89
+ context: internalContext,
86
90
  scope: bladeContext.scope,
87
91
  });
88
92
 
93
+ updateFormData?.(formData);
94
+
89
95
  if (
90
96
  safeIn("update", controlSchema) &&
91
97
  controlSchema.update &&
@@ -94,7 +100,7 @@ function nodeBuilder<
94
100
  ) {
95
101
  const updateMethod = controlSchema.update.method;
96
102
  if (safeIn(updateMethod, bladeContext.scope) && typeof bladeContext.scope[updateMethod] === "function") {
97
- await bladeContext.scope[updateMethod](e, controlSchema.property, toValue(internalContext));
103
+ await bladeContext.scope[updateMethod](e, controlSchema.property, unrefNested(internalContext));
98
104
  }
99
105
  }
100
106
  }
@@ -124,24 +130,22 @@ function nodeBuilder<
124
130
  if (!("fields" in controlSchema)) return null;
125
131
 
126
132
  const contextFieldModel =
127
- safeIn("property", controlSchema) &&
128
- controlSchema.property &&
129
- getModel(controlSchema.property, toValue(internalContext));
133
+ safeIn("property", controlSchema) && controlSchema.property && getModel(controlSchema.property, internalContext);
130
134
 
131
135
  const scopedFieldModel =
132
136
  safeIn("property", controlSchema) &&
133
137
  controlSchema.property &&
134
138
  getModel(controlSchema.property, toValue(bladeContext.scope ?? {}));
135
139
 
136
- const model = toValue(scopedFieldModel) || toValue(contextFieldModel);
140
+ const model = scopedFieldModel || contextFieldModel;
137
141
 
138
- if (model && Array.isArray(model)) {
139
- return model.map((modelItem: { [x: string]: unknown; id: string }) =>
140
- controlSchema.fields.reduce((arr, fieldItem) => {
142
+ if (toValue(model) && Array.isArray(toValue(model))) {
143
+ return toValue(model).map((modelItem: ToRefs<{ [x: string]: unknown; id: string }>) => {
144
+ return controlSchema.fields.reduce((arr, fieldItem) => {
141
145
  if (
142
146
  safeIn("visibility", fieldItem) &&
143
147
  fieldItem.visibility?.method &&
144
- !visibilityHandler(bladeContext.scope?.[fieldItem.visibility?.method], toValue(modelItem), fieldItem)
148
+ !visibilityHandler(bladeContext.scope?.[fieldItem.visibility?.method], modelItem, fieldItem)
145
149
  ) {
146
150
  return arr;
147
151
  }
@@ -154,10 +158,11 @@ function nodeBuilder<
154
158
  bladeContext,
155
159
  currentLocale,
156
160
  formData,
161
+ updateFormData,
157
162
  }),
158
163
  ];
159
- }, [] as VNode[]),
160
- );
164
+ }, [] as VNode[]);
165
+ });
161
166
  }
162
167
 
163
168
  return [
@@ -165,7 +170,7 @@ function nodeBuilder<
165
170
  if (
166
171
  safeIn("visibility", field) &&
167
172
  field.visibility?.method &&
168
- !visibilityHandler(bladeContext.scope?.[field.visibility?.method], toValue(internalContext), field)
173
+ !visibilityHandler(bladeContext.scope?.[field.visibility?.method], internalContext, field)
169
174
  ) {
170
175
  return arr;
171
176
  }
@@ -179,6 +184,7 @@ function nodeBuilder<
179
184
  bladeContext,
180
185
  currentLocale,
181
186
  formData,
187
+ updateFormData,
182
188
  }),
183
189
  ];
184
190
  }, [] as VNode[]),
@@ -186,13 +192,13 @@ function nodeBuilder<
186
192
  });
187
193
 
188
194
  const elProps = {
189
- baseProps,
195
+ baseProps: toRefs(baseProps),
190
196
  bladeContext,
191
197
  element: controlSchema,
192
198
  currentLocale: unref(currentLocale),
193
199
  fields: fieldsHandler,
194
200
  formData,
195
- fieldContext: reactive(unref(internalContext)),
201
+ fieldContext: internalContext,
196
202
  };
197
203
 
198
204
  return h(component, elProps);
@@ -1,5 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import * as _ from "lodash-es";
3
+ import { unrefNested } from "./unrefNested";
3
4
 
4
5
  function setModel(args: {
5
6
  property: string;
@@ -10,7 +11,7 @@ function setModel(args: {
10
11
  }) {
11
12
  const { property, value, option, context, scope } = args;
12
13
 
13
- if (_.has(context, property)) {
14
+ if (_.has(unrefNested(context), property)) {
14
15
  _.set(context, property, option ? value[option as keyof typeof value] : value);
15
16
  } else if (scope && _.has(scope, property)) {
16
17
  if (typeof scope[property] === "function") {