@vc-shell/framework 1.0.153 → 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 (175) hide show
  1. package/CHANGELOG.md +17 -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 +12655 -12557
  10. package/dist/index.css +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue.d.ts.map +1 -1
  13. package/dist/shared/components/popup-handler/types/index.d.ts +2 -2
  14. package/dist/shared/components/popup-handler/types/index.d.ts.map +1 -1
  15. package/dist/shared/modules/dynamic/components/FIELD_MAP.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +42 -3
  17. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/factories.d.ts +19 -17
  19. package/dist/shared/modules/dynamic/components/factories.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +15 -6
  21. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  22. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +14 -5
  23. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  24. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +15 -6
  25. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  26. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +15 -6
  27. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  28. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +137 -0
  29. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -0
  30. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +14 -5
  31. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  32. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +15 -6
  33. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +15 -6
  35. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  36. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +15 -6
  37. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  38. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +15 -6
  39. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  40. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +15 -6
  41. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  42. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +15 -6
  43. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  44. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +15 -6
  45. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  46. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +137 -0
  47. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -0
  48. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +15 -6
  49. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  50. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +15 -6
  51. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  52. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +137 -0
  53. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -0
  54. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +137 -0
  55. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -0
  56. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +15 -6
  57. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  58. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +15 -6
  59. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  60. package/dist/shared/modules/dynamic/components/fields/props.d.ts +15 -6
  61. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  62. package/dist/shared/modules/dynamic/composables/index.d.ts +2 -0
  63. package/dist/shared/modules/dynamic/composables/index.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts +1 -0
  65. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts +12 -0
  67. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts.map +1 -0
  68. package/dist/shared/modules/dynamic/{helpers/toolbarReducer.d.ts → composables/useToolbarReducer/index.d.ts} +6 -5
  69. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts.map +1 -0
  70. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts +1 -1
  71. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
  72. package/dist/shared/modules/dynamic/factories/types/index.d.ts +2 -2
  73. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  74. package/dist/shared/modules/dynamic/helpers/nodeBuilder.d.ts.map +1 -1
  75. package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts +4 -0
  76. package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts.map +1 -0
  77. package/dist/shared/modules/dynamic/index.d.ts +2 -1
  78. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  79. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +15 -2
  80. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  81. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +14 -1
  82. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  83. package/dist/shared/modules/dynamic/types/index.d.ts +138 -36
  84. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  85. package/dist/shared/modules/dynamic/types/models.d.ts +13 -21
  86. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  87. package/dist/shared/utilities/vueUtils.d.ts +1 -1
  88. package/dist/shared/utilities/vueUtils.d.ts.map +1 -1
  89. package/dist/tsconfig.tsbuildinfo +1 -1
  90. package/dist/ui/components/atoms/index.d.ts +0 -1
  91. package/dist/ui/components/atoms/index.d.ts.map +1 -1
  92. package/dist/ui/components/atoms/vc-col/vc-col.vue.d.ts +4 -4
  93. package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts.map +1 -1
  94. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  95. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts +1 -1
  96. package/dist/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue.d.ts.map +1 -1
  97. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts +16 -2
  98. package/dist/ui/components/molecules/vc-field/vc-field.vue.d.ts.map +1 -1
  99. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +4 -4
  100. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  101. package/dist/ui/components/molecules/vc-rating/index.d.ts +1 -119
  102. package/dist/ui/components/molecules/vc-rating/index.d.ts.map +1 -1
  103. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts +10 -3
  104. package/dist/ui/components/molecules/vc-rating/vc-rating.vue.d.ts.map +1 -1
  105. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  106. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +6 -6
  107. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  108. package/package.json +6 -6
  109. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +11 -11
  110. package/shared/components/popup-handler/components/vc-popup-container/vc-popup-container.vue +4 -1
  111. package/shared/components/popup-handler/types/index.ts +2 -5
  112. package/shared/modules/dynamic/components/FIELD_MAP.ts +8 -0
  113. package/shared/modules/dynamic/components/SchemaRender.ts +15 -5
  114. package/shared/modules/dynamic/components/factories.ts +53 -35
  115. package/shared/modules/dynamic/components/fields/Button.ts +1 -2
  116. package/shared/modules/dynamic/components/fields/Card.ts +15 -6
  117. package/shared/modules/dynamic/components/fields/Checkbox.ts +15 -16
  118. package/shared/modules/dynamic/components/fields/ContentField.ts +2 -2
  119. package/shared/modules/dynamic/components/fields/CustomComponent.ts +19 -0
  120. package/shared/modules/dynamic/components/fields/DynamicProperty.ts +1 -2
  121. package/shared/modules/dynamic/components/fields/EditorField.ts +11 -14
  122. package/shared/modules/dynamic/components/fields/Fieldset.ts +62 -68
  123. package/shared/modules/dynamic/components/fields/GalleryField.ts +1 -2
  124. package/shared/modules/dynamic/components/fields/ImageField.ts +1 -2
  125. package/shared/modules/dynamic/components/fields/InputCurrency.ts +11 -14
  126. package/shared/modules/dynamic/components/fields/InputField.ts +11 -14
  127. package/shared/modules/dynamic/components/fields/MultivalueField.ts +11 -14
  128. package/shared/modules/dynamic/components/fields/RatingField.ts +21 -0
  129. package/shared/modules/dynamic/components/fields/SelectField.ts +11 -14
  130. package/shared/modules/dynamic/components/fields/StatusField.ts +1 -4
  131. package/shared/modules/dynamic/components/fields/SwitchField.ts +22 -0
  132. package/shared/modules/dynamic/components/fields/Table.ts +58 -0
  133. package/shared/modules/dynamic/components/fields/TextareaField.ts +11 -14
  134. package/shared/modules/dynamic/components/fields/VideoField.ts +1 -2
  135. package/shared/modules/dynamic/components/fields/props.ts +1 -5
  136. package/shared/modules/dynamic/composables/index.ts +2 -0
  137. package/shared/modules/dynamic/composables/useFilterBuilder/index.ts +25 -26
  138. package/shared/modules/dynamic/composables/useTableTemplates/index.ts +63 -0
  139. package/shared/modules/dynamic/composables/useToolbarReducer/index.ts +71 -0
  140. package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +2 -2
  141. package/shared/modules/dynamic/factories/types/index.ts +1 -1
  142. package/shared/modules/dynamic/helpers/nodeBuilder.ts +60 -39
  143. package/shared/modules/dynamic/helpers/visibilityHandler.ts +22 -0
  144. package/shared/modules/dynamic/index.ts +2 -1
  145. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +47 -42
  146. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +48 -88
  147. package/shared/modules/dynamic/types/index.ts +159 -34
  148. package/shared/modules/dynamic/types/models.ts +22 -21
  149. package/shared/utilities/vueUtils.ts +5 -1
  150. package/ui/components/atoms/index.ts +0 -1
  151. package/ui/components/atoms/vc-col/vc-col.vue +3 -3
  152. package/ui/components/atoms/vc-label/vc-label.vue +21 -7
  153. package/ui/components/molecules/vc-editor/vc-editor.vue +15 -7
  154. package/ui/components/molecules/vc-field/_internal/vc-field-type/vc-field-type.vue +22 -17
  155. package/ui/components/molecules/vc-field/vc-field.vue +48 -25
  156. package/ui/components/molecules/vc-input/vc-input.vue +7 -9
  157. package/ui/components/molecules/vc-multivalue/vc-multivalue.vue +1 -1
  158. package/ui/components/molecules/vc-rating/index.ts +1 -10
  159. package/ui/components/molecules/vc-rating/vc-rating.stories.ts +1 -1
  160. package/ui/components/molecules/vc-rating/vc-rating.vue +10 -5
  161. package/ui/components/molecules/vc-select/vc-select.vue +4 -5
  162. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +1 -1
  163. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +16 -24
  164. package/ui/components/organisms/vc-table/vc-table.vue +6 -5
  165. package/dist/shared/modules/dynamic/helpers/toolbarReducer.d.ts.map +0 -1
  166. package/dist/ui/components/atoms/vc-info-row/index.d.ts +0 -32
  167. package/dist/ui/components/atoms/vc-info-row/index.d.ts.map +0 -1
  168. package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts +0 -7
  169. package/dist/ui/components/atoms/vc-info-row/vc-info-row.stories.d.ts.map +0 -1
  170. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts +0 -32
  171. package/dist/ui/components/atoms/vc-info-row/vc-info-row.vue.d.ts.map +0 -1
  172. package/shared/modules/dynamic/helpers/toolbarReducer.ts +0 -43
  173. package/ui/components/atoms/vc-info-row/index.ts +0 -3
  174. package/ui/components/atoms/vc-info-row/vc-info-row.stories.ts +0 -25
  175. package/ui/components/atoms/vc-info-row/vc-info-row.vue +0 -40
@@ -1,13 +1,15 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
1
2
  import { unref, computed, toValue, h, UnwrapNestedRefs, MaybeRef, reactive, VNode } from "vue";
2
3
  import FIELD_MAP from "../components/FIELD_MAP";
3
4
  import { ControlSchema } from "../types";
4
- import { IControlBaseProps, IControlBaseOptions } from "../types/models";
5
+ import { IControlBaseProps } from "../types/models";
5
6
  import { getModel } from "./getters";
6
7
  import { setModel } from "./setters";
7
8
  import { unwrapInterpolation } from "./unwrapInterpolation";
8
9
  import { DetailsBladeContext } from "../factories";
9
10
  import { safeIn } from "./safeIn";
10
11
  import { i18n } from "./../../../../core/plugins/i18n";
12
+ import { visibilityHandler } from "./visibilityHandler";
11
13
 
12
14
  function disabledHandler(
13
15
  disabled: { method?: string } | boolean,
@@ -50,9 +52,7 @@ function nodeBuilder<
50
52
  const required = safeIn("rules", controlSchema) && controlSchema.rules?.required;
51
53
 
52
54
  const contextProperty =
53
- safeIn("property", controlSchema) &&
54
- controlSchema.property &&
55
- getModel(controlSchema.property, toValue(internalContext));
55
+ safeIn("property", controlSchema) && controlSchema.property && getModel(controlSchema.property, internalContext);
56
56
 
57
57
  const scopedProperty =
58
58
  safeIn("property", controlSchema) &&
@@ -77,7 +77,7 @@ function nodeBuilder<
77
77
  disabledHandler(controlSchema.disabled, bladeContext));
78
78
 
79
79
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
80
- const onUpdateModelValue = (e: any) => {
80
+ const onUpdateModelValue = async (e: any) => {
81
81
  if (safeIn("property", controlSchema) && controlSchema.property) {
82
82
  setModel({
83
83
  property: controlSchema.property,
@@ -94,7 +94,7 @@ function nodeBuilder<
94
94
  ) {
95
95
  const updateMethod = controlSchema.update.method;
96
96
  if (safeIn(updateMethod, bladeContext.scope) && typeof bladeContext.scope[updateMethod] === "function") {
97
- bladeContext.scope[updateMethod](e, controlSchema.property, toValue(internalContext));
97
+ await bladeContext.scope[updateMethod](e, controlSchema.property, toValue(internalContext));
98
98
  }
99
99
  }
100
100
  }
@@ -102,24 +102,20 @@ function nodeBuilder<
102
102
 
103
103
  const baseProps: IControlBaseProps = reactive({
104
104
  key: `${parentId}`,
105
- label: unref(computed(() => (label ? t(label) : undefined))),
105
+ label: computed(() => (label ? t(label) : undefined)),
106
106
  disabled,
107
107
  name,
108
108
  rules,
109
- placeholder: unref(computed(() => (placeholder ? t(placeholder) : undefined))),
109
+ placeholder: computed(() => (placeholder ? t(placeholder) : undefined)),
110
110
  required,
111
111
  modelValue,
112
112
  "onUpdate:modelValue": onUpdateModelValue,
113
- tooltip: unref(computed(() => (tooltip ? t(tooltip) : undefined))),
113
+ tooltip: computed(() => (tooltip ? t(tooltip) : undefined)),
114
114
  multilanguage,
115
- });
116
-
117
- const baseOptions: IControlBaseOptions = reactive({
118
- visibility: computed(() =>
119
- safeIn("visibility", controlSchema) && controlSchema.visibility?.method
120
- ? bladeContext.scope?.[controlSchema.visibility?.method]
121
- : true,
122
- ),
115
+ class:
116
+ "horizontalSeparator" in controlSchema && controlSchema.horizontalSeparator
117
+ ? "tw-border-b tw-border-solid tw-border-b-[#e5e5e5] tw-mb-[5px] tw-pb-[21px]"
118
+ : "",
123
119
  });
124
120
 
125
121
  const component = FIELD_MAP[controlSchema.component as keyof typeof FIELD_MAP];
@@ -127,45 +123,70 @@ function nodeBuilder<
127
123
  const fieldsHandler = computed(() => {
128
124
  if (!("fields" in controlSchema)) return null;
129
125
 
130
- const fieldsModel =
126
+ const contextFieldModel =
131
127
  safeIn("property", controlSchema) &&
132
128
  controlSchema.property &&
133
129
  getModel(controlSchema.property, toValue(internalContext));
134
130
 
135
- const model = toValue(fieldsModel);
131
+ const scopedFieldModel =
132
+ safeIn("property", controlSchema) &&
133
+ controlSchema.property &&
134
+ getModel(controlSchema.property, toValue(bladeContext.scope ?? {}));
135
+
136
+ const model = toValue(scopedFieldModel) || toValue(contextFieldModel);
136
137
 
137
138
  if (model && Array.isArray(model)) {
138
139
  return model.map((modelItem: { [x: string]: unknown; id: string }) =>
139
- controlSchema.fields.map((fieldItem) =>
140
+ controlSchema.fields.reduce((arr, fieldItem) => {
141
+ if (
142
+ safeIn("visibility", fieldItem) &&
143
+ fieldItem.visibility?.method &&
144
+ !visibilityHandler(bladeContext.scope?.[fieldItem.visibility?.method], toValue(modelItem), fieldItem)
145
+ ) {
146
+ return arr;
147
+ }
148
+ return [
149
+ ...arr,
150
+ nodeBuilder({
151
+ controlSchema: fieldItem,
152
+ parentId: `fieldset-${fieldItem.id}-${modelItem.id}`,
153
+ internalContext: modelItem,
154
+ bladeContext,
155
+ currentLocale,
156
+ formData,
157
+ }),
158
+ ];
159
+ }, [] as VNode[]),
160
+ );
161
+ }
162
+
163
+ return [
164
+ controlSchema.fields.reduce((arr, field) => {
165
+ if (
166
+ safeIn("visibility", field) &&
167
+ field.visibility?.method &&
168
+ !visibilityHandler(bladeContext.scope?.[field.visibility?.method], toValue(internalContext), field)
169
+ ) {
170
+ return arr;
171
+ }
172
+
173
+ return [
174
+ ...arr,
140
175
  nodeBuilder({
141
- controlSchema: fieldItem,
142
- parentId: `fieldset-${fieldItem.id}-${modelItem.id}`,
143
- internalContext: modelItem,
176
+ controlSchema: field,
177
+ parentId: `fieldset-${parentId}-${field.id}`,
178
+ internalContext,
144
179
  bladeContext,
145
180
  currentLocale,
146
181
  formData,
147
182
  }),
148
- ),
149
- );
150
- }
151
-
152
- return [
153
- controlSchema.fields.map((field) =>
154
- nodeBuilder({
155
- controlSchema: field,
156
- parentId: `fieldset-${parentId}-${field.id}`,
157
- internalContext,
158
- bladeContext,
159
- currentLocale,
160
- formData,
161
- }),
162
- ),
183
+ ];
184
+ }, [] as VNode[]),
163
185
  ];
164
186
  });
165
187
 
166
188
  const elProps = {
167
189
  baseProps,
168
- baseOptions,
169
190
  bladeContext,
170
191
  element: controlSchema,
171
192
  currentLocale: unref(currentLocale),
@@ -0,0 +1,22 @@
1
+ import { ControlSchema } from "./../types/index";
2
+ /* eslint-disable @typescript-eslint/no-explicit-any */
3
+ import { ComputedRef, toValue } from "vue";
4
+
5
+ export const visibilityHandler = (
6
+ visibility:
7
+ | ComputedRef<boolean | undefined>
8
+ | ((schema: ControlSchema, fieldContext: Record<string, any> | undefined) => boolean)
9
+ | undefined,
10
+ fieldContext: Record<string, any> | undefined,
11
+ schema: ControlSchema,
12
+ ) => {
13
+ if (visibility === undefined) {
14
+ return true;
15
+ }
16
+
17
+ if (typeof visibility === "function") {
18
+ return visibility(schema, fieldContext);
19
+ }
20
+
21
+ return toValue(visibility);
22
+ };
@@ -9,6 +9,7 @@ import { kebabToPascal } from "../../../core/utilities";
9
9
  import { BladeInstanceConstructor } from "../../index";
10
10
  import { createAppModule } from "../../../core/plugins";
11
11
  import { ComponentProps } from "./../../utilities/vueUtils";
12
+ import { Router } from "vue-router";
12
13
 
13
14
  interface Registered {
14
15
  component: BladeInstanceConstructor;
@@ -138,7 +139,7 @@ export const createDynamicAppModule = (args: {
138
139
  }
139
140
 
140
141
  return {
141
- install(app: App, options: { router: any }) {
142
+ install(app: App, options: { router: Router }) {
142
143
  const bladePages = { ...pages };
143
144
  const appModuleContent = {
144
145
  locales: args?.locales,
@@ -4,7 +4,7 @@
4
4
  v-loading="loading"
5
5
  :expanded="expanded"
6
6
  :closable="closable"
7
- width="50%"
7
+ :width="settings?.width || '50%'"
8
8
  :toolbar-items="toolbarComputed"
9
9
  :title="title"
10
10
  @close="$emit('close:blade')"
@@ -33,6 +33,7 @@
33
33
  <div class="item-details__content">
34
34
  <VcForm class="tw-grow tw-p-4">
35
35
  <SchemaRender
36
+ :key="`${loading}`"
36
37
  v-model="item"
37
38
  :ui-schema="form.children"
38
39
  :context="bladeContext"
@@ -78,6 +79,7 @@ import {
78
79
  ComputedRef,
79
80
  type Component,
80
81
  ConcreteComponent,
82
+ toRefs,
81
83
  } from "vue";
82
84
  import { DynamicDetailsSchema, FormContentSchema, SettingsSchema } from "../types";
83
85
  import { reactiveComputed, useMounted, useTemplateRefsList } from "@vueuse/core";
@@ -92,10 +94,11 @@ import {
92
94
  } from "../../../index";
93
95
  import SchemaRender from "../components/SchemaRender";
94
96
  import { VcSelect } from "../../../../ui/components";
95
- import { toolbarReducer } from "../helpers/toolbarReducer";
97
+ import { useToolbarReducer } from "../composables/useToolbarReducer";
96
98
  import { useBeforeUnload } from "../../../../core/composables/useBeforeUnload";
97
99
  import * as _ from "lodash-es";
98
100
  import { IBladeToolbar } from "../../../../core/types";
101
+ import { toRef } from "vue";
99
102
 
100
103
  interface Props {
101
104
  expanded?: boolean;
@@ -239,56 +242,58 @@ const bladeOptions = reactive({
239
242
  });
240
243
 
241
244
  const toolbarComputed =
242
- props.composables &&
243
- toolbarReducer({
244
- defaultToolbarSchema: settings.value?.toolbar ?? [],
245
- defaultToolbarBindings: {
246
- saveChanges: {
247
- async clickHandler() {
248
- if (item.value) {
249
- await saveChanges(item.value);
250
-
251
- emit("parent:call", {
252
- method: "reload",
253
- });
254
-
255
- emit("parent:call", {
256
- method: "updateActiveWidgetCount",
257
- });
258
-
259
- if (!props.param) {
260
- emit("close:blade");
261
- }
262
- }
263
- },
264
- disabled: computed(() => !validationState.value.modified),
265
- },
266
- remove: {
267
- async clickHandler() {
268
- if (
269
- await showConfirmation(
270
- computed(() => t(`${settings.value?.localizationPrefix.trim().toUpperCase()}.PAGES.ALERTS.DELETE`)),
271
- )
272
- ) {
273
- if (props.param) {
274
- await remove?.({ id: props.param });
245
+ (props.composables &&
246
+ useToolbarReducer({
247
+ defaultToolbarSchema: settings.value?.toolbar ?? [],
248
+ defaultToolbarBindings: {
249
+ saveChanges: {
250
+ async clickHandler() {
251
+ if (item.value) {
252
+ await saveChanges(item.value);
253
+
275
254
  emit("parent:call", {
276
255
  method: "reload",
277
256
  });
257
+
278
258
  emit("parent:call", {
279
259
  method: "updateActiveWidgetCount",
280
260
  });
281
261
 
282
- emit("close:blade");
262
+ if (!props.param) {
263
+ emit("close:blade");
264
+ }
283
265
  }
284
- }
266
+ },
267
+ disabled: computed(() => !validationState.value.modified),
268
+ },
269
+ remove: {
270
+ async clickHandler() {
271
+ if (
272
+ await showConfirmation(
273
+ computed(() => t(`${settings.value?.localizationPrefix.trim().toUpperCase()}.PAGES.ALERTS.DELETE`)),
274
+ )
275
+ ) {
276
+ if (props.param) {
277
+ await remove?.({ id: props.param });
278
+ emit("parent:call", {
279
+ method: "reload",
280
+ });
281
+ emit("parent:call", {
282
+ method: "updateActiveWidgetCount",
283
+ });
284
+
285
+ emit("close:blade");
286
+ }
287
+ }
288
+ },
289
+ disabled: computed(() => toValue(scope)?.disabled),
285
290
  },
286
- disabled: computed(() => toValue(scope)?.disabled),
287
291
  },
288
- },
289
- customToolbarConfig: toValue(scope)?.toolbarOverrides,
290
- context: bladeContext.value,
291
- });
292
+ customToolbarConfig: toValue(scope)?.toolbarOverrides,
293
+ context: bladeContext.value,
294
+ scope,
295
+ })) ??
296
+ [];
292
297
 
293
298
  async function setActiveWidget(widget: string | ConcreteComponent) {
294
299
  const component = typeof widget === "string" ? resolveComponent(widget) : widget;
@@ -4,7 +4,7 @@
4
4
  v-if="!composables"
5
5
  :expanded="expanded"
6
6
  :closable="closable"
7
- width="50%"
7
+ :width="settings?.width || '50%'"
8
8
  :toolbar-items="toolbarComputed"
9
9
  :title="title"
10
10
  :class="{
@@ -62,9 +62,9 @@
62
62
 
63
63
  <!-- Not found template -->
64
64
  <template #notfound>
65
- <template v-if="bladeOptions?.notFound">
65
+ <template v-if="tableTemplates?.notFound">
66
66
  <component
67
- :is="bladeOptions.notFound"
67
+ :is="tableTemplates.notFound"
68
68
  @reset="resetSearch"
69
69
  ></component>
70
70
  </template>
@@ -84,9 +84,9 @@
84
84
 
85
85
  <!-- Empty template -->
86
86
  <template #empty>
87
- <template v-if="bladeOptions?.empty">
87
+ <template v-if="tableTemplates?.empty">
88
88
  <component
89
- :is="bladeOptions.empty"
89
+ :is="tableTemplates.empty"
90
90
  :class="{
91
91
  'tw-py-6': isWidgetView,
92
92
  }"
@@ -104,7 +104,7 @@
104
104
 
105
105
  <!-- Override table templates-->
106
106
  <template
107
- v-for="(component, key, index) in bladeOptions?.templateOverrideComponents"
107
+ v-for="(component, key, index) in tableTemplates?.templateOverrideComponents"
108
108
  #[`item_${key}`]="itemData"
109
109
  :key="`template_override_${index}`"
110
110
  >
@@ -117,11 +117,11 @@
117
117
  <!-- Override table mobile view -->
118
118
 
119
119
  <template
120
- v-if="bladeOptions?.mobileView"
120
+ v-if="tableTemplates?.mobileView"
121
121
  #mobile-item="itemData"
122
122
  >
123
123
  <component
124
- :is="bladeOptions.mobileView"
124
+ :is="tableTemplates.mobileView"
125
125
  :context="itemData"
126
126
  ></component>
127
127
  </template>
@@ -137,23 +137,20 @@ import {
137
137
  inject,
138
138
  reactive,
139
139
  ref,
140
- resolveComponent,
141
140
  shallowRef,
142
141
  toValue,
143
142
  unref,
144
143
  watch,
145
144
  UnwrapRef,
146
- ShallowRef,
147
- ConcreteComponent,
148
145
  ComputedRef,
149
146
  onBeforeMount,
150
147
  } from "vue";
151
148
  import { useI18n } from "vue-i18n";
152
149
  import { DynamicGridSchema, ListContentSchema, SettingsSchema } from "../types";
153
- import { useFilterBuilder } from "../composables";
150
+ import { useFilterBuilder, useTableTemplates } from "../composables";
154
151
  import { useFunctions, useNotifications } from "../../../../core/composables";
155
152
  import { ITableColumns } from "../../../../core/types";
156
- import { toolbarReducer } from "../helpers/toolbarReducer";
153
+ import { useToolbarReducer } from "../composables/useToolbarReducer";
157
154
  import { notification, usePopup } from "../../../components";
158
155
  import { ListBaseBladeScope, ListBladeContext, UseList } from "../factories/types";
159
156
  import { IParentCallArgs } from "../../../index";
@@ -231,7 +228,7 @@ const stateKey =
231
228
  props.composables &&
232
229
  computed(() => {
233
230
  if (tableData?.value?.id) {
234
- return tableData.value?.id + props.isWidgetView ? "_dashboard" : "";
231
+ return tableData.value?.id && props.isWidgetView ? tableData.value?.id + "_dashboard" : tableData.value?.id;
235
232
  }
236
233
 
237
234
  throw new Error('Table id is not defined. Please provide "id" property in table schema');
@@ -257,6 +254,8 @@ if (props.isWidgetView) {
257
254
  query.value.take = 5;
258
255
  }
259
256
 
257
+ const { tableTemplates } = useTableTemplates(tableData);
258
+
260
259
  const calculateColumns = (columns: ListContentSchema["columns"]) => {
261
260
  const result = columns?.map((column) => {
262
261
  if (typeof column.visible !== "boolean" && column.visible?.method) {
@@ -286,10 +285,6 @@ const table =
286
285
  const bladeOptions = reactive({
287
286
  tableData,
288
287
  table,
289
- templateOverrideComponents: templateOverrideComponents(),
290
- mobileView: resolveTemplateComponent("mobileTemplate"),
291
- notFound: resolveTemplateComponent("notFoundTemplate"),
292
- empty: resolveTemplateComponent("emptyTemplate"),
293
288
  });
294
289
 
295
290
  const {
@@ -316,44 +311,46 @@ const bladeContext = ref<ListBladeContext>({
316
311
  });
317
312
 
318
313
  const toolbarComputed =
319
- props.composables &&
320
- toolbarReducer({
321
- defaultToolbarSchema: settings.value?.toolbar ?? [],
322
- defaultToolbarBindings: {
323
- save: {
324
- clickHandler() {
325
- emit("close:blade");
314
+ (props.composables &&
315
+ useToolbarReducer({
316
+ defaultToolbarSchema: settings.value?.toolbar ?? [],
317
+ defaultToolbarBindings: {
318
+ save: {
319
+ clickHandler() {
320
+ emit("close:blade");
321
+ },
322
+ disabled: computed(() => !modified.value),
326
323
  },
327
- disabled: computed(() => !modified.value),
328
- },
329
- openAddBlade: {
330
- async clickHandler() {
331
- if (
332
- scope &&
333
- "openDetailsBlade" in toValue(scope) &&
334
- toValue(scope).openDetailsBlade &&
335
- typeof toValue(scope).openDetailsBlade === "function"
336
- ) {
337
- toValue(scope).openDetailsBlade();
338
- } else throw new Error("openDetailsBlade method is not defined in scope");
324
+ openAddBlade: {
325
+ async clickHandler() {
326
+ if (
327
+ scope &&
328
+ "openDetailsBlade" in toValue(scope) &&
329
+ toValue(scope).openDetailsBlade &&
330
+ typeof toValue(scope).openDetailsBlade === "function"
331
+ ) {
332
+ toValue(scope).openDetailsBlade();
333
+ } else throw new Error("openDetailsBlade method is not defined in scope");
334
+ },
339
335
  },
340
- },
341
- refresh: {
342
- async clickHandler() {
343
- await reload();
336
+ refresh: {
337
+ async clickHandler() {
338
+ await reload();
339
+ },
344
340
  },
345
- },
346
- removeItems: {
347
- async clickHandler() {
348
- await removeItems();
341
+ removeItems: {
342
+ async clickHandler() {
343
+ await removeItems();
344
+ },
345
+ disabled: computed(() => !selectedIds.value?.length),
346
+ isVisible: isDesktop.value,
349
347
  },
350
- disabled: computed(() => !selectedIds.value?.length),
351
- isVisible: isDesktop.value,
352
348
  },
353
- },
354
- customToolbarConfig: toValue(scope)?.toolbarOverrides,
355
- context: bladeContext.value,
356
- });
349
+ customToolbarConfig: toValue(scope)?.toolbarOverrides,
350
+ context: bladeContext.value,
351
+ scope,
352
+ })) ??
353
+ [];
357
354
 
358
355
  onBeforeMount(async () => {
359
356
  if (props.composables) await load({ ...query.value, sort: sort.value });
@@ -545,43 +542,6 @@ async function resetSearch() {
545
542
  });
546
543
  }
547
544
 
548
- function templateOverrideComponents(): Record<string, ShallowRef<ConcreteComponent>> {
549
- return {
550
- ...table?.value.columns?.reduce(
551
- (acc, curr) => {
552
- if ("customTemplate" in curr && curr.customTemplate) {
553
- if (!("component" in curr.customTemplate)) {
554
- throw new Error(
555
- `Component name must be provided in 'customTemplate' property, column: ${JSON.stringify(curr)}`,
556
- );
557
- } else if ("component" in curr.customTemplate && curr.customTemplate.component) {
558
- const component = resolveComponent(curr.customTemplate.component);
559
-
560
- if (typeof component !== "string") {
561
- acc[curr.id] = shallowRef(component);
562
- }
563
- }
564
- }
565
- return acc;
566
- },
567
- {} as Record<string, ShallowRef<ConcreteComponent>>,
568
- ),
569
- };
570
- }
571
-
572
- function resolveTemplateComponent(name: keyof ListContentSchema) {
573
- if (!tableData?.value) return;
574
- const value = tableData.value[name];
575
- if (value && typeof value === "object" && "component" in value) {
576
- const componentName = value.component;
577
- if (componentName) {
578
- const component = resolveComponent(componentName);
579
-
580
- if (component && typeof component !== "string") return shallowRef(component);
581
- }
582
- }
583
- }
584
-
585
545
  function sortRows(event: { dragIndex: number; dropIndex: number; value: any[] }) {
586
546
  if (event.dragIndex !== event.dropIndex) {
587
547
  const sorted = event.value.map((item, index) => {