@vc-shell/framework 1.0.152 → 1.0.154

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 (179) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/core/composables/useMenuService/index.ts +30 -24
  3. package/core/directives/loading/styles.css +1 -1
  4. package/core/types/index.ts +5 -1
  5. package/dist/core/composables/useMenuService/index.d.ts +2 -2
  6. package/dist/core/composables/useMenuService/index.d.ts.map +1 -1
  7. package/dist/core/types/index.d.ts +5 -1
  8. package/dist/core/types/index.d.ts.map +1 -1
  9. package/dist/framework.js +12620 -12517
  10. package/dist/index.css +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  13. package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
  14. package/dist/shared/components/popup-handler/types/index.d.ts +2 -2
  15. package/dist/shared/components/popup-handler/types/index.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/FIELD_MAP.d.ts.map +1 -1
  17. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +42 -3
  18. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  19. package/dist/shared/modules/dynamic/components/factories.d.ts +19 -17
  20. package/dist/shared/modules/dynamic/components/factories.d.ts.map +1 -1
  21. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +15 -6
  22. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  23. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +14 -5
  24. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  25. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +15 -6
  26. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  27. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +15 -6
  28. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  29. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +137 -0
  30. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -0
  31. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +14 -5
  32. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  33. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +15 -6
  34. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  35. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +15 -6
  36. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  37. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +15 -6
  38. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  39. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +15 -6
  40. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  41. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +15 -6
  42. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  43. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +15 -6
  44. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  45. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +15 -6
  46. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  47. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +137 -0
  48. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -0
  49. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +15 -6
  50. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  51. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +15 -6
  52. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  53. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +137 -0
  54. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -0
  55. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +137 -0
  56. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -0
  57. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +15 -6
  58. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  59. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +15 -6
  60. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  61. package/dist/shared/modules/dynamic/components/fields/props.d.ts +15 -6
  62. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/composables/index.d.ts +2 -0
  64. package/dist/shared/modules/dynamic/composables/index.d.ts.map +1 -1
  65. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts +1 -0
  66. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  67. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts +12 -0
  68. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts.map +1 -0
  69. package/dist/shared/modules/dynamic/{helpers/toolbarReducer.d.ts → composables/useToolbarReducer/index.d.ts} +6 -5
  70. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts.map +1 -0
  71. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts +1 -1
  72. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
  73. package/dist/shared/modules/dynamic/factories/types/index.d.ts +2 -2
  74. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  75. package/dist/shared/modules/dynamic/helpers/nodeBuilder.d.ts.map +1 -1
  76. package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts +4 -0
  77. package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts.map +1 -0
  78. package/dist/shared/modules/dynamic/index.d.ts +2 -1
  79. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  80. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +15 -2
  81. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  82. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +14 -1
  83. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  84. package/dist/shared/modules/dynamic/types/index.d.ts +138 -36
  85. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  86. package/dist/shared/modules/dynamic/types/models.d.ts +13 -21
  87. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  88. package/dist/shared/utilities/vueUtils.d.ts +1 -1
  89. package/dist/shared/utilities/vueUtils.d.ts.map +1 -1
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/dist/ui/components/atoms/index.d.ts +0 -1
  92. package/dist/ui/components/atoms/index.d.ts.map +1 -1
  93. package/dist/ui/components/atoms/vc-col/vc-col.vue.d.ts +4 -4
  94. package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts.map +1 -1
  95. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  96. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts +1 -1
  97. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  98. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts +16 -2
  99. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  100. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +4 -4
  101. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  102. package/dist/ui/components/molecules/vc-rating/index.d.ts +1 -119
  103. package/dist/ui/components/molecules/vc-rating/index.d.ts.map +1 -1
  104. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +10 -3
  105. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  106. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  107. package/dist/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue.d.ts.map +1 -1
  108. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +6 -6
  109. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  110. package/package.json +6 -6
  111. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +11 -11
  112. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +8 -3
  113. package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +4 -1
  114. package/shared/components/popup-handler/types/index.ts +2 -5
  115. package/shared/modules/dynamic/components/FIELD_MAP.ts +8 -0
  116. package/shared/modules/dynamic/components/SchemaRender.ts +15 -5
  117. package/shared/modules/dynamic/components/factories.ts +53 -35
  118. package/shared/modules/dynamic/components/fields/Button.ts +1 -2
  119. package/shared/modules/dynamic/components/fields/Card.ts +15 -6
  120. package/shared/modules/dynamic/components/fields/Checkbox.ts +15 -16
  121. package/shared/modules/dynamic/components/fields/ContentField.ts +2 -2
  122. package/shared/modules/dynamic/components/fields/CustomComponent.ts +19 -0
  123. package/shared/modules/dynamic/components/fields/DynamicProperty.ts +1 -2
  124. package/shared/modules/dynamic/components/fields/EditorField.ts +11 -14
  125. package/shared/modules/dynamic/components/fields/Fieldset.ts +62 -68
  126. package/shared/modules/dynamic/components/fields/GalleryField.ts +1 -2
  127. package/shared/modules/dynamic/components/fields/ImageField.ts +1 -2
  128. package/shared/modules/dynamic/components/fields/InputCurrency.ts +11 -14
  129. package/shared/modules/dynamic/components/fields/InputField.ts +11 -14
  130. package/shared/modules/dynamic/components/fields/MultivalueField.ts +11 -14
  131. package/shared/modules/dynamic/components/fields/RatingField.ts +21 -0
  132. package/shared/modules/dynamic/components/fields/SelectField.ts +11 -14
  133. package/shared/modules/dynamic/components/fields/StatusField.ts +1 -4
  134. package/shared/modules/dynamic/components/fields/SwitchField.ts +22 -0
  135. package/shared/modules/dynamic/components/fields/Table.ts +58 -0
  136. package/shared/modules/dynamic/components/fields/TextareaField.ts +11 -14
  137. package/shared/modules/dynamic/components/fields/VideoField.ts +1 -2
  138. package/shared/modules/dynamic/components/fields/props.ts +1 -5
  139. package/shared/modules/dynamic/composables/index.ts +2 -0
  140. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +25 -26
  141. package/shared/modules/dynamic/composables/useTableTemplates/index.ts +63 -0
  142. package/shared/modules/dynamic/composables/useToolbarReducer/index.ts +71 -0
  143. package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +2 -2
  144. package/shared/modules/dynamic/factories/types/index.ts +1 -1
  145. package/shared/modules/dynamic/helpers/nodeBuilder.ts +60 -39
  146. package/shared/modules/dynamic/helpers/visibilityHandler.ts +22 -0
  147. package/shared/modules/dynamic/index.ts +2 -1
  148. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +47 -42
  149. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +48 -88
  150. package/shared/modules/dynamic/types/index.ts +159 -34
  151. package/shared/modules/dynamic/types/models.ts +22 -21
  152. package/shared/utilities/vueUtils.ts +5 -1
  153. package/ui/components/atoms/index.ts +0 -1
  154. package/ui/components/atoms/vc-col/vc-col.vue +3 -3
  155. package/ui/components/atoms/vc-label/vc-label.vue +21 -7
  156. package/ui/components/molecules/vc-editor/vc-editor.vue +15 -7
  157. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +22 -17
  158. package/ui/components/molecules/vc-field/vc-field.vue +48 -25
  159. package/ui/components/molecules/vc-input/vc-input.vue +7 -9
  160. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +1 -1
  161. package/ui/components/molecules/vc-rating/index.ts +1 -10
  162. package/ui/components/molecules/vc-rating/vc-rating.stories.ts +1 -1
  163. package/ui/components/molecules/vc-rating/vc-rating.vue +10 -5
  164. package/ui/components/molecules/vc-select/vc-select.vue +4 -5
  165. package/ui/components/organisms/vc-app/_internal/vc-app-menu/vc-app-menu.vue +3 -1
  166. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +1 -1
  167. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +16 -24
  168. package/ui/components/organisms/vc-table/vc-table.vue +6 -5
  169. package/dist/shared/modules/dynamic/helpers/toolbarReducer.d.ts.map +0 -1
  170. package/dist/ui/components/atoms/vc-info-row/index.d.ts +0 -32
  171. package/dist/ui/components/atoms/vc-info-row/index.d.ts.map +0 -1
  172. package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts +0 -7
  173. package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts.map +0 -1
  174. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts +0 -32
  175. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts.map +0 -1
  176. package/shared/modules/dynamic/helpers/toolbarReducer.ts +0 -43
  177. package/ui/components/atoms/vc-info-row/index.ts +0 -3
  178. package/ui/components/atoms/vc-info-row/vc-info-row.stories.ts +0 -25
  179. package/ui/components/atoms/vc-info-row/vc-info-row.vue +0 -40
@@ -29,25 +29,22 @@ export default {
29
29
  },
30
30
  clearable: props.element.clearable || false,
31
31
  },
32
- options: props.baseOptions,
33
32
  });
34
33
  const render = h(field.component as Component, field.props);
35
34
 
36
35
  if (field.props.rules) {
37
- return props.baseOptions.visibility
38
- ? h(
39
- ValidationField,
40
- {
41
- props: field.props,
42
- index: props.elIndex,
43
- rows: props.rows,
44
- key: `${String(field.props.key)}_validation`,
45
- },
46
- () => render,
47
- )
48
- : null;
36
+ return h(
37
+ ValidationField,
38
+ {
39
+ props: field.props,
40
+ index: props.elIndex,
41
+ rows: props.rows,
42
+ key: `${String(field.props.key)}_validation`,
43
+ },
44
+ () => render,
45
+ );
49
46
  } else {
50
- return props.baseOptions.visibility ? render : null;
47
+ return render;
51
48
  }
52
49
  };
53
50
  },
@@ -24,7 +24,6 @@ export default {
24
24
  currentLanguage: props.currentLocale,
25
25
  clearable: props.element.clearable || false,
26
26
  },
27
- options: props.baseOptions,
28
27
  slots: Object.entries(slotsMap).reduce(
29
28
  (acc, [key, value]) => {
30
29
  if (props.element[key as keyof InputSchema]) {
@@ -47,20 +46,18 @@ export default {
47
46
  const render = h(field.component as Component, field.props, field.slots);
48
47
 
49
48
  if (field.props.rules) {
50
- return props.baseOptions.visibility
51
- ? h(
52
- ValidationField,
53
- {
54
- props: field.props,
55
- index: props.elIndex,
56
- rows: props.rows,
57
- key: `${String(field.props.key)}_validation`,
58
- },
59
- () => render,
60
- )
61
- : null;
49
+ return h(
50
+ ValidationField,
51
+ {
52
+ props: field.props,
53
+ index: props.elIndex,
54
+ rows: props.rows,
55
+ key: `${String(field.props.key)}_validation`,
56
+ },
57
+ () => render,
58
+ );
62
59
  } else {
63
- return props.baseOptions.visibility ? render : null;
60
+ return render;
64
61
  }
65
62
  };
66
63
  },
@@ -23,7 +23,6 @@ export default {
23
23
  options: props.element.options ? props.bladeContext.scope?.[props.element.options] : undefined,
24
24
  currentLanguage: props.currentLocale,
25
25
  },
26
- options: props.baseOptions,
27
26
 
28
27
  slots:
29
28
  props.element.customTemplate &&
@@ -43,20 +42,18 @@ export default {
43
42
  const render = h(field.component as unknown as Component, field.props, field.slots);
44
43
 
45
44
  if (field.props.rules) {
46
- return props.baseOptions.visibility
47
- ? h(
48
- ValidationField,
49
- {
50
- props: field.props,
51
- index: props.elIndex,
52
- rows: props.rows,
53
- key: `${String(field.props.key)}_validation`,
54
- },
55
- () => render,
56
- )
57
- : null;
45
+ return h(
46
+ ValidationField,
47
+ {
48
+ props: field.props,
49
+ index: props.elIndex,
50
+ rows: props.rows,
51
+ key: `${String(field.props.key)}_validation`,
52
+ },
53
+ () => render,
54
+ );
58
55
  } else {
59
- return props.baseOptions.visibility ? render : null;
56
+ return render;
60
57
  }
61
58
  };
62
59
  },
@@ -0,0 +1,21 @@
1
+ import { Component, ExtractPropTypes, h } from "vue";
2
+ import { Rating } from "../factories";
3
+ import componentProps from "./props";
4
+ import { RatingSchema } from "../../types";
5
+
6
+ export default {
7
+ name: "RatingEl",
8
+ props: componentProps,
9
+ setup(props: ExtractPropTypes<typeof componentProps> & { element: RatingSchema }) {
10
+ return () => {
11
+ const field = Rating({
12
+ props: {
13
+ ...props.baseProps,
14
+ variant: props.element.type,
15
+ },
16
+ });
17
+
18
+ return h(field.component as Component, field.props);
19
+ };
20
+ },
21
+ };
@@ -26,7 +26,6 @@ export default {
26
26
  clearable: props.element.clearable || false,
27
27
  searchable: props.element.searchable || false,
28
28
  },
29
- options: props.baseOptions,
30
29
 
31
30
  slots:
32
31
  props.element.customTemplate &&
@@ -46,20 +45,18 @@ export default {
46
45
  const render = h(field.component as unknown as Component, field.props, field.slots);
47
46
 
48
47
  if (field.props.rules) {
49
- return props.baseOptions.visibility
50
- ? h(
51
- ValidationField,
52
- {
53
- props: field.props,
54
- index: props.elIndex,
55
- rows: props.rows,
56
- key: `${String(field.props.key)}_validation`,
57
- },
58
- () => render,
59
- )
60
- : null;
48
+ return h(
49
+ ValidationField,
50
+ {
51
+ props: field.props,
52
+ index: props.elIndex,
53
+ rows: props.rows,
54
+ key: `${String(field.props.key)}_validation`,
55
+ },
56
+ () => render,
57
+ );
61
58
  } else {
62
- return props.baseOptions.visibility ? render : null;
59
+ return render;
63
60
  }
64
61
  };
65
62
  },
@@ -31,7 +31,6 @@ export default {
31
31
  outline: props.element.outline,
32
32
  extend: props.element.extend,
33
33
  },
34
- options: props.baseOptions,
35
34
  slots: {
36
35
  default: () => {
37
36
  return h("div", { class: "tw-flex tw-flex-row tw-items-center" }, [
@@ -47,9 +46,7 @@ export default {
47
46
  },
48
47
  });
49
48
 
50
- return props.baseOptions.visibility
51
- ? h(field.component as Component, { ...field.props, class: "tw-w-full tw-box-border" }, field.slots)
52
- : null;
49
+ return h(field.component as Component, { ...field.props, class: "tw-w-full tw-box-border" }, field.slots);
53
50
  };
54
51
  },
55
52
  };
@@ -0,0 +1,22 @@
1
+ import { Component, ExtractPropTypes, h } from "vue";
2
+ import { Switch } from "../factories";
3
+ import componentProps from "./props";
4
+ import { SwitchSchema } from "../../types";
5
+
6
+ export default {
7
+ name: "SwitchEl",
8
+ props: componentProps,
9
+ setup(props: ExtractPropTypes<typeof componentProps> & { element: SwitchSchema }) {
10
+ return () => {
11
+ const field = Switch({
12
+ props: {
13
+ ...props.baseProps,
14
+ trueValue: props.element.trueValue,
15
+ falseValue: props.element.falseValue,
16
+ },
17
+ });
18
+
19
+ return h(field.component as Component, field.props);
20
+ };
21
+ },
22
+ };
@@ -0,0 +1,58 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { useTableTemplates } from "./../../composables";
3
+ import { Component, ExtractPropTypes, computed, h, unref } from "vue";
4
+ import { Table } from "../factories";
5
+ import componentProps from "./props";
6
+ import { TableSchema } from "../../types";
7
+ import { useI18n } from "vue-i18n";
8
+
9
+ type TableItemData = Record<string, any>;
10
+
11
+ export default {
12
+ name: "TableEl",
13
+ props: componentProps,
14
+ setup(props: ExtractPropTypes<typeof componentProps> & { element: TableSchema }) {
15
+ const { tableTemplates } = useTableTemplates(props.element);
16
+ const { t } = useI18n({ useScope: "global" });
17
+
18
+ return () => {
19
+ 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,
30
+ },
31
+ },
32
+ slots: {
33
+ ...Object.entries(tableTemplates.templateOverrideComponents).reduce(
34
+ (obj, [key, value], index) => {
35
+ obj[`item_${key}`] = (itemData: TableItemData) => {
36
+ return h(unref(value), { context: itemData, key: `template_override_${props.element.id}_${index}` });
37
+ };
38
+
39
+ return obj;
40
+ },
41
+ {} as Record<`item_${string}`, any>,
42
+ ),
43
+ notfound: tableTemplates?.notFound
44
+ ? (itemData: TableItemData) => h(tableTemplates.notFound as Component, { context: itemData })
45
+ : () => undefined,
46
+ "mobile-item": tableTemplates?.mobileView
47
+ ? (itemData: TableItemData) => h(tableTemplates.mobileView as Component, { context: itemData })
48
+ : () => undefined,
49
+ empty: tableTemplates?.empty
50
+ ? (itemData: TableItemData) => h(tableTemplates.empty as Component, { context: itemData })
51
+ : () => undefined,
52
+ },
53
+ });
54
+
55
+ return h(field.component as Component, field.props, field.slots);
56
+ };
57
+ },
58
+ };
@@ -15,26 +15,23 @@ export default {
15
15
  currentLanguage: props.currentLocale,
16
16
  clearable: props.element.clearable || false,
17
17
  },
18
- options: props.baseOptions,
19
18
  });
20
19
 
21
20
  const render = h(field.component as Component, field.props);
22
21
 
23
22
  if (field.props.rules) {
24
- return props.baseOptions.visibility
25
- ? h(
26
- ValidationField,
27
- {
28
- props: field.props,
29
- index: props.elIndex,
30
- rows: props.rows,
31
- key: `${String(field.props.key)}_validation`,
32
- },
33
- () => render,
34
- )
35
- : null;
23
+ return h(
24
+ ValidationField,
25
+ {
26
+ props: field.props,
27
+ index: props.elIndex,
28
+ rows: props.rows,
29
+ key: `${String(field.props.key)}_validation`,
30
+ },
31
+ () => render,
32
+ );
36
33
  } else {
37
- return props.baseOptions.visibility ? render : null;
34
+ return render;
38
35
  }
39
36
  };
40
37
  },
@@ -14,12 +14,11 @@ export default {
14
14
  source: props.baseProps.modelValue,
15
15
  size: props.element.size,
16
16
  },
17
- options: props.baseOptions,
18
17
  });
19
18
 
20
19
  const render = h(field.component as Component, field.props);
21
20
 
22
- return props.baseOptions.visibility ? render : null;
21
+ return render;
23
22
  };
24
23
  },
25
24
  };
@@ -1,6 +1,6 @@
1
1
  import { ComputedRef, MaybeRef, PropType, UnwrapNestedRefs, VNode } from "vue";
2
2
  import { DetailsBladeContext } from "../../factories";
3
- import { IControlBaseOptions, IControlBaseProps } from "../../types/models";
3
+ import { IControlBaseProps } from "../../types/models";
4
4
  import { ControlSchema } from "../../types";
5
5
 
6
6
  export default {
@@ -8,10 +8,6 @@ export default {
8
8
  type: Object as PropType<UnwrapNestedRefs<IControlBaseProps>>,
9
9
  default: () => ({}) as IControlBaseProps,
10
10
  },
11
- baseOptions: {
12
- type: Object as PropType<IControlBaseOptions>,
13
- default: () => ({}) as IControlBaseOptions,
14
- },
15
11
  element: {
16
12
  type: Object as PropType<ControlSchema>,
17
13
  default: () => ({}) as ControlSchema,
@@ -1 +1,3 @@
1
1
  export { default as useFilterBuilder } from "./useFilterBuilder";
2
+ export { useTableTemplates } from "./useTableTemplates";
3
+ export { useToolbarReducer } from "./useToolbarReducer";
@@ -17,11 +17,14 @@ import * as _ from "lodash-es";
17
17
  import { Checkbox, InputField } from "../../components/factories";
18
18
  import { AsyncAction } from "../../../../../core/composables";
19
19
  import { VcButton, VcCol, VcContainer, VcRow } from "../../../../../ui/components";
20
+ import { createUnrefFn } from "@vueuse/core";
21
+ import { useI18n } from "vue-i18n";
20
22
 
21
23
  interface RawControl {
22
24
  field: string;
23
25
  component: string;
24
26
  label?: string;
27
+ multiple?: boolean;
25
28
  data?: { value: string; displayName: string }[];
26
29
  }
27
30
 
@@ -67,15 +70,17 @@ export default <Query>(args: {
67
70
 
68
71
  const isFilterVisible = ref(true);
69
72
  const filter: Record<string, unknown> = reactive({});
73
+ const { t } = useI18n({ useScope: "global" });
70
74
 
71
75
  const controls = ref<Control[]>([]);
72
76
 
73
77
  const appliedFilter = ref({});
74
78
  const activeFilterCount = computed(() => Object.values(appliedFilter.value).filter((item) => !!item).length);
75
79
 
76
- const disable = computed(() => !Object.keys(filter).length || _.some(filter, _.isEmpty));
77
-
78
- const disabled = computed(() => !Object.keys(appliedFilter.value).length || _.some(appliedFilter.value, _.isEmpty));
80
+ const isDisabled = createUnrefFn((filterObj: Record<string, unknown>) => {
81
+ const filterKeys = Object.keys(filterObj);
82
+ return filterKeys.length === 0 || filterKeys.every((key) => !filterObj[key]);
83
+ });
79
84
 
80
85
  onMounted(() => createFilterControls());
81
86
 
@@ -83,23 +88,20 @@ export default <Query>(args: {
83
88
  const item = filter[field];
84
89
  if (Array.isArray(item) && typeof item !== "string") {
85
90
  return item.some((x) => x === value);
91
+ } else {
92
+ return item === value;
86
93
  }
87
94
  }
88
95
 
89
- function selectFilterItem(e: boolean, value: string, field: string) {
90
- const item = filter[field];
91
- let isSelected = false;
92
-
93
- if (Array.isArray(item)) {
94
- isSelected = item.includes(value);
96
+ function selectFilterItem(e: boolean, value: string, field: string, multiple = true) {
97
+ if (multiple) {
98
+ filter[field] = e
99
+ ? [...((filter[field] as string[]) || []), value]
100
+ : ((filter[field] as string[]) || []).filter((x) => x !== value);
95
101
 
96
- if (e && !isSelected) {
97
- item.push(value);
98
- } else if (!e && isSelected) {
99
- filter[field] = item.filter((x) => x !== value);
100
- }
102
+ if (!(filter[field] as string[]).length) filter[field] = undefined;
101
103
  } else {
102
- filter[field] = [];
104
+ filter[field] = e ? value : undefined;
103
105
  }
104
106
  }
105
107
 
@@ -143,14 +145,11 @@ export default <Query>(args: {
143
145
  props: {
144
146
  classNames: "tw-mb-2",
145
147
  modelValue: computed(() => isItemSelected(currC.value, control.field)),
146
- "onUpdate:modelValue": (e: boolean) => selectFilterItem(e, currC.value, control.field),
148
+ "onUpdate:modelValue": (e: boolean) => selectFilterItem(e, currC.value, control.field, control.multiple),
147
149
  },
148
150
  slots: {
149
151
  default: () => currC.displayName,
150
152
  },
151
- options: {
152
- visibility: computed(() => true),
153
- },
154
153
  });
155
154
 
156
155
  return obj;
@@ -168,9 +167,6 @@ export default <Query>(args: {
168
167
  modelValue: computed(() => filter[control.field]),
169
168
  "onUpdate:modelValue": (e: unknown) => (filter[control.field] = e),
170
169
  },
171
- options: {
172
- visibility: computed(() => true),
173
- },
174
170
  });
175
171
  }
176
172
 
@@ -223,15 +219,18 @@ export default <Query>(args: {
223
219
  {
224
220
  outline: true,
225
221
  class: "tw-mr-4",
226
- disabled: disabled.value,
222
+ disabled: isDisabled(appliedFilter),
227
223
  onClick: () => resetFilters(slotMethods.close),
228
224
  },
229
- () => "Reset",
225
+ () => t("COMPONENTS.FILTERS.RESET"),
230
226
  ),
231
227
  h(
232
228
  VcButton,
233
- { disabled: disable.value, onClick: () => applyFilters(slotMethods.close) },
234
- () => "Apply filters",
229
+ {
230
+ disabled: isDisabled(filter),
231
+ onClick: () => applyFilters(slotMethods.close),
232
+ },
233
+ () => t("COMPONENTS.FILTERS.APPLY"),
235
234
  ),
236
235
  ]),
237
236
  ),
@@ -0,0 +1,63 @@
1
+ import { ConcreteComponent, MaybeRef, ShallowRef, reactive, resolveComponent, shallowRef, toValue } from "vue";
2
+ import { ListContentSchema } from "../..";
3
+
4
+ export interface IUseTableTemplates {
5
+ tableTemplates: {
6
+ templateOverrideComponents: Record<string, ShallowRef<ConcreteComponent>>;
7
+ mobileView: ConcreteComponent | undefined;
8
+ notFound: ConcreteComponent | undefined;
9
+ empty: ConcreteComponent | undefined;
10
+ };
11
+ }
12
+
13
+ export const useTableTemplates = (
14
+ tableSchema: MaybeRef<ListContentSchema | undefined> | undefined,
15
+ ): IUseTableTemplates => {
16
+ const tableTemplates = reactive({
17
+ templateOverrideComponents: templateOverrideComponents(),
18
+ mobileView: resolveTemplateComponent("mobileTemplate"),
19
+ notFound: resolveTemplateComponent("notFoundTemplate"),
20
+ empty: resolveTemplateComponent("emptyTemplate"),
21
+ });
22
+
23
+ function resolveTemplateComponent(name: keyof ListContentSchema): ShallowRef<ConcreteComponent> | undefined {
24
+ if (!toValue(tableSchema)) return;
25
+ const value = toValue(tableSchema)?.[name];
26
+ if (value && typeof value === "object" && "component" in value) {
27
+ const componentName = value.component;
28
+ if (componentName) {
29
+ const component = resolveComponent(componentName);
30
+
31
+ if (component && typeof component !== "string") return shallowRef(component);
32
+ }
33
+ }
34
+ }
35
+
36
+ function templateOverrideComponents(): Record<string, ShallowRef<ConcreteComponent>> {
37
+ return {
38
+ ...toValue(tableSchema)?.columns?.reduce(
39
+ (acc, curr) => {
40
+ if ("customTemplate" in curr && curr.customTemplate) {
41
+ if (!("component" in curr.customTemplate)) {
42
+ throw new Error(
43
+ `Component name must be provided in 'customTemplate' property, column: ${JSON.stringify(curr)}`,
44
+ );
45
+ } else if ("component" in curr.customTemplate && curr.customTemplate.component) {
46
+ const component = resolveComponent(curr.customTemplate.component);
47
+
48
+ if (typeof component !== "string") {
49
+ acc[curr.id] = shallowRef(component);
50
+ }
51
+ }
52
+ }
53
+ return acc;
54
+ },
55
+ {} as Record<string, ShallowRef<ConcreteComponent>>,
56
+ ),
57
+ };
58
+ }
59
+
60
+ return {
61
+ tableTemplates,
62
+ };
63
+ };
@@ -0,0 +1,71 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { IBladeToolbar } from "../../../../../core/types";
3
+ import * as _ from "lodash-es";
4
+ import { SettingsSchema } from "../../types";
5
+ import { BaseBladeScope, DetailsBladeContext, ListBladeContext } from "../../factories/types";
6
+ import { useI18n } from "vue-i18n";
7
+ import { toValue } from "@vueuse/core";
8
+ import { UnwrapNestedRefs, computed, ref, ComputedRef } from "vue";
9
+
10
+ export const useToolbarReducer = (args: {
11
+ defaultToolbarSchema: SettingsSchema["toolbar"];
12
+ defaultToolbarBindings: BaseBladeScope["toolbarOverrides"];
13
+ customToolbarConfig: BaseBladeScope["toolbarOverrides"];
14
+ context: UnwrapNestedRefs<DetailsBladeContext> | UnwrapNestedRefs<ListBladeContext>;
15
+ scope: ComputedRef<BaseBladeScope> | undefined;
16
+ }): UnwrapNestedRefs<ComputedRef<IBladeToolbar[]>> | undefined => {
17
+ if (!args) return;
18
+
19
+ const { t } = useI18n({ useScope: "global" });
20
+
21
+ const toolbarMethodsMerge = _.merge(
22
+ ref({}),
23
+ ref(args.defaultToolbarBindings),
24
+ ref(toValue(args.customToolbarConfig)),
25
+ );
26
+
27
+ return computed(() => {
28
+ if (args.defaultToolbarSchema?.length !== 0) {
29
+ return args.defaultToolbarSchema?.reduce((acc, curr) => {
30
+ const toolbarItemCtx = toolbarMethodsMerge.value[
31
+ curr.method as keyof typeof toolbarMethodsMerge.value
32
+ ] as IBladeToolbar;
33
+ if (toolbarItemCtx) {
34
+ const context =
35
+ typeof toolbarItemCtx === "function"
36
+ ? {
37
+ clickHandler: async () => await (toolbarItemCtx as (ctx: typeof args.context) => any)(args.context),
38
+ }
39
+ : {
40
+ ...toolbarItemCtx,
41
+ clickHandler() {
42
+ return toolbarItemCtx.clickHandler?.call(null, args.context);
43
+ },
44
+ };
45
+
46
+ acc.push({
47
+ ...curr,
48
+ ...context,
49
+ title: t(curr.title) as string,
50
+ });
51
+ }
52
+
53
+ return acc;
54
+ }, [] as IBladeToolbar[]);
55
+ }
56
+
57
+ if (args.scope && toValue(toValue(args.scope).toolbarOverrides)) {
58
+ const toolbarOverrides: BaseBladeScope["toolbarOverrides"] = toValue(toValue(args.scope).toolbarOverrides);
59
+
60
+ if (Array.isArray(toolbarOverrides)) {
61
+ return toolbarOverrides;
62
+ } else if (typeof toolbarOverrides === "function") {
63
+ return toolbarOverrides(args.context);
64
+ } else if (typeof toolbarOverrides === "object") {
65
+ return Object.values(toolbarOverrides);
66
+ }
67
+ }
68
+
69
+ return [];
70
+ });
71
+ };
@@ -7,7 +7,7 @@ import { createUnrefFn } from "@vueuse/core";
7
7
 
8
8
  export interface UseDetailsFactoryParams<Item> {
9
9
  load: (args?: ItemId) => Promise<Item | undefined>;
10
- saveChanges: (details: Item) => Promise<Item | void>;
10
+ saveChanges?: (details: Item) => Promise<Item | void>;
11
11
  remove?: (args: ItemId) => Promise<void>;
12
12
  }
13
13
 
@@ -30,7 +30,7 @@ export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<I
30
30
 
31
31
  const { loading: manageLoading, action: saveChanges } = useAsync<Item>(async (item) => {
32
32
  if (validationState.value.valid) {
33
- await factoryParams.saveChanges(item as Item);
33
+ await factoryParams.saveChanges?.(item as Item);
34
34
  isModified.value = false;
35
35
  } else throw new Error("Form is not valid");
36
36
  });
@@ -63,7 +63,7 @@ export interface UseList<Items, Query, Scope extends ListBaseBladeScope = ListBa
63
63
 
64
64
  export interface BaseBladeScope {
65
65
  [x: string]: any;
66
- toolbarOverrides?: { [x: string]: IBladeToolbar } | ((...args: any[]) => any);
66
+ toolbarOverrides?: MaybeRef<{ [x: string]: IBladeToolbar }> | ((...args: any[]) => any) | MaybeRef<IBladeToolbar[]>;
67
67
  }
68
68
 
69
69
  export interface ListBaseBladeScope extends BaseBladeScope {