@vc-shell/framework 1.0.223 → 1.0.225

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 (185) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/core/types/index.ts +2 -1
  3. package/dist/core/plugins/modularity/index.d.ts +3 -3
  4. package/dist/core/plugins/modularity/index.d.ts.map +1 -1
  5. package/dist/core/types/index.d.ts +2 -1
  6. package/dist/core/types/index.d.ts.map +1 -1
  7. package/dist/framework.js +20959 -20794
  8. package/dist/index.css +1 -1
  9. package/dist/index.d.ts +0 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/locales/en.json +2 -1
  12. package/dist/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -1
  13. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  14. package/dist/shared/components/error-interceptor/index.d.ts.map +1 -1
  15. package/dist/shared/components/notifications/components/notification-container/index.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +6 -0
  17. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +2 -0
  19. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +2 -0
  21. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  22. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +2 -0
  23. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  24. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +2 -0
  25. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  26. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +2 -0
  27. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -1
  28. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +2 -0
  29. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  30. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +2 -0
  31. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  32. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +2 -0
  33. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +2 -0
  35. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  36. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +2 -0
  37. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  38. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +2 -0
  39. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  40. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +2 -0
  41. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  42. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +2 -0
  43. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  44. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts +2 -0
  45. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts.map +1 -1
  46. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +2 -0
  47. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -1
  48. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +2 -0
  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 +2 -0
  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 +2 -0
  53. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -1
  54. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +10 -8
  55. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -1
  56. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +2 -0
  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 +2 -0
  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 +2 -0
  61. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  62. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +15 -9
  63. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +19 -3
  65. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +6 -0
  67. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
  68. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +10 -4
  69. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
  70. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +7 -1
  71. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
  72. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +9 -3
  73. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -1
  74. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +8 -2
  75. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -1
  76. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +11 -5
  77. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -1
  78. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +6 -0
  79. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -1
  80. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +9 -3
  81. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
  82. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +10 -4
  83. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -1
  84. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts +6 -0
  85. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts.map +1 -1
  86. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +8 -2
  87. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -1
  88. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +13 -7
  89. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -1
  90. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +9 -3
  91. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -1
  92. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +7 -1
  93. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
  94. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +6 -0
  95. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -1
  96. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +6 -0
  97. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -1
  98. package/dist/shared/modules/dynamic/composables/useFilterBuilder/index.d.ts.map +1 -1
  99. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts +3 -1
  100. package/dist/shared/modules/dynamic/factories/base/useDetailsFactory.d.ts.map +1 -1
  101. package/dist/shared/modules/dynamic/factories/base/useListFactory.d.ts +1 -1
  102. package/dist/shared/modules/dynamic/factories/base/useListFactory.d.ts.map +1 -1
  103. package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -0
  104. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  105. package/dist/shared/modules/dynamic/helpers/override.d.ts.map +1 -1
  106. package/dist/shared/modules/dynamic/helpers/visibilityHandler.d.ts.map +1 -1
  107. package/dist/shared/modules/dynamic/index.d.ts +4 -4
  108. package/dist/shared/modules/dynamic/index.d.ts.map +1 -1
  109. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +2 -0
  110. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  111. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  112. package/dist/shared/modules/dynamic/types/index.d.ts +6 -17
  113. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  114. package/dist/tsconfig.tsbuildinfo +1 -1
  115. package/dist/ui/components/atoms/vc-badge/vc-badge.stories.d.ts +4 -4
  116. package/dist/ui/components/atoms/vc-button/vc-button.stories.d.ts +11 -11
  117. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +7 -7
  118. package/dist/ui/components/atoms/vc-container/vc-container.vue.d.ts.map +1 -1
  119. package/dist/ui/components/atoms/vc-hint/vc-hint.stories.d.ts +1 -1
  120. package/dist/ui/components/atoms/vc-icon/vc-icon.stories.d.ts +3 -3
  121. package/dist/ui/components/atoms/vc-image/vc-image.stories.d.ts +3 -3
  122. package/dist/ui/components/atoms/vc-label/vc-label.stories.d.ts +2 -2
  123. package/dist/ui/components/atoms/vc-link/vc-link.stories.d.ts +1 -1
  124. package/dist/ui/components/atoms/vc-progress/vc-progress.stories.d.ts +2 -2
  125. package/dist/ui/components/atoms/vc-status/vc-status.stories.d.ts +4 -4
  126. package/dist/ui/components/atoms/vc-switch/vc-switch.stories.d.ts +1 -1
  127. package/dist/ui/components/molecules/vc-breadcrumbs/vc-breadcrumbs.stories.d.ts +1 -1
  128. package/dist/ui/components/molecules/vc-checkbox/vc-checkbox.stories.d.ts +10 -10
  129. package/dist/ui/components/molecules/vc-editor/vc-editor.stories.d.ts +1 -1
  130. package/dist/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  131. package/dist/ui/components/molecules/vc-field/vc-field.stories.d.ts +95 -2
  132. package/dist/ui/components/molecules/vc-field/vc-field.stories.d.ts.map +1 -1
  133. package/dist/ui/components/molecules/vc-file-upload/vc-file-upload.stories.d.ts +2 -2
  134. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +2 -2
  135. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +2 -2
  136. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts.map +1 -1
  137. package/dist/ui/components/molecules/vc-radio-button/vc-radio-button.stories.d.ts +8 -8
  138. package/dist/ui/components/molecules/vc-rating/vc-rating.stories.d.ts +1 -1
  139. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  140. package/dist/ui/components/molecules/vc-slider/index.d.ts.map +1 -1
  141. package/dist/ui/components/molecules/vc-slider/vc-slider.stories.d.ts +3 -3
  142. package/dist/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  143. package/dist/ui/components/organisms/vc-gallery/vc-gallery.stories.d.ts +1 -1
  144. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts.map +1 -1
  145. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  146. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts +1 -0
  147. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  148. package/dist/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue.d.ts +42 -0
  149. package/dist/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue.d.ts.map +1 -0
  150. package/dist/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue.d.ts.map +1 -1
  151. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +15 -105
  152. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  153. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +3 -21
  154. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  155. package/package.json +4 -4
  156. package/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue +1 -0
  157. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +20 -9
  158. package/shared/modules/dynamic/components/fields/Card.ts +1 -0
  159. package/shared/modules/dynamic/components/fields/GalleryField.ts +3 -2
  160. package/shared/modules/dynamic/components/fields/Table.ts +61 -21
  161. package/shared/modules/dynamic/components/fields/storybook/Card.stories.ts +10 -0
  162. package/shared/modules/dynamic/components/fields/storybook/ContentField.stories.ts +1 -1
  163. package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +1 -1
  164. package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +1 -1
  165. package/shared/modules/dynamic/components/fields/storybook/SelectField.stories.ts +4 -4
  166. package/shared/modules/dynamic/factories/base/useDetailsFactory.ts +17 -3
  167. package/shared/modules/dynamic/factories/types/index.ts +1 -0
  168. package/shared/modules/dynamic/helpers/nodeBuilder.ts +6 -6
  169. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +5 -2
  170. package/shared/modules/dynamic/types/index.ts +6 -16
  171. package/ui/components/atoms/vc-card/vc-card.vue +2 -2
  172. package/ui/components/atoms/vc-container/vc-container.vue +71 -128
  173. package/ui/components/atoms/vc-progress/vc-progress.stories.ts +1 -1
  174. package/ui/components/atoms/vc-status/vc-status.stories.ts +1 -1
  175. package/ui/components/molecules/vc-editor/vc-editor.vue +3 -0
  176. package/ui/components/molecules/vc-field/vc-field.stories.ts +2 -2
  177. package/ui/components/molecules/vc-input/vc-input.stories.ts +1 -1
  178. package/ui/components/molecules/vc-select/vc-select.vue +3 -3
  179. package/ui/components/organisms/vc-app/vc-app.vue +2 -2
  180. package/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue +18 -20
  181. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +23 -16
  182. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +8 -1
  183. package/ui/components/organisms/vc-table/_internal/vc-table-empty/vc-table-empty.vue +76 -0
  184. package/ui/components/organisms/vc-table/_internal/vc-table-mobile-item/vc-table-mobile-item.vue +9 -7
  185. package/ui/components/organisms/vc-table/vc-table.vue +188 -358
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vc-shell/framework",
3
- "version": "1.0.223",
3
+ "version": "1.0.225",
4
4
  "type": "module",
5
5
  "main": "./dist/framework.js",
6
6
  "types": "./dist/index.d.ts",
@@ -60,9 +60,9 @@
60
60
  "devDependencies": {
61
61
  "@types/dompurify": "^3.0.5",
62
62
  "@types/quill": "^2.0.14",
63
- "@vc-shell/api-client-generator": "^1.0.223",
64
- "@vc-shell/config-generator": "^1.0.223",
65
- "@vc-shell/ts-config": "^1.0.223",
63
+ "@vc-shell/api-client-generator": "^1.0.225",
64
+ "@vc-shell/config-generator": "^1.0.225",
65
+ "@vc-shell/ts-config": "^1.0.225",
66
66
  "@vitejs/plugin-vue": "^5.0.3",
67
67
  "sass": "^1.69.6",
68
68
  "shx": "^0.3.4",
@@ -103,6 +103,7 @@ const render = () => {
103
103
  expandable: quantity.value > 1,
104
104
  expanded: index - hiddenQuantity === quantity.value - 1,
105
105
  "onClose:blade": () => {
106
+ if (index === 0) return;
106
107
  closeBlade(index);
107
108
  },
108
109
  "onParent:call": async (args: IParentCallArgs) => {
@@ -167,7 +167,7 @@ const useBladeNavigationSingleton = createSharedComposable(() => {
167
167
  navigationInstance.blades.value = [];
168
168
  activeWorkspace.value = undefined;
169
169
  } else {
170
- if (oldVal) router.replace({ path: oldVal });
170
+ if (oldVal) router.push({ path: oldVal });
171
171
  }
172
172
  }
173
173
 
@@ -175,6 +175,7 @@ const useBladeNavigationSingleton = createSharedComposable(() => {
175
175
  wsRouteComponent.props.navigation.idx = 0;
176
176
  navigationInstance.blades.value[0] = wsRouteComponent;
177
177
  activeWorkspace.value = wsRouteComponent;
178
+ closeBlade(1);
178
179
  }
179
180
 
180
181
  function getWorkspaceRouteComponent(workspaceUrl: string) {
@@ -290,6 +291,7 @@ export function useBladeNavigation(): IUseBladeNavigation {
290
291
  { blade, param, options }: IBladeEvent<Blade>,
291
292
  query: LocationQuery | undefined = undefined,
292
293
  params: RouteParams = {},
294
+ replace = false,
293
295
  ) {
294
296
  const createdComponent = h(
295
297
  blade,
@@ -327,7 +329,7 @@ export function useBladeNavigation(): IUseBladeNavigation {
327
329
  if (wsroute && wsroute.components) {
328
330
  wsroute.components.default = createdComponent;
329
331
  }
330
- return await router.replace({ name: wsroute?.name, params: { ...params, ...route.params }, query });
332
+ return await router.push({ name: wsroute?.name, params: { ...params, ...route.params }, query, replace });
331
333
  } else
332
334
  notification.error(i18n.global.t("PERMISSION_MESSAGES.ACCESS_RESTRICTED"), {
333
335
  timeout: 3000,
@@ -502,9 +504,14 @@ export function useBladeNavigation(): IUseBladeNavigation {
502
504
 
503
505
  // Open the workspace component or workspace route.
504
506
  if (registeredRouteComponent?.type.isWorkspace) {
505
- await openWorkspace({
506
- blade: registeredRouteComponent as unknown as BladeInstanceConstructor,
507
- });
507
+ await openWorkspace(
508
+ {
509
+ blade: registeredRouteComponent as unknown as BladeInstanceConstructor,
510
+ },
511
+ undefined,
512
+ undefined,
513
+ true,
514
+ );
508
515
  return { name: registeredRouteComponent?.type.name, params };
509
516
  }
510
517
 
@@ -525,10 +532,14 @@ export function useBladeNavigation(): IUseBladeNavigation {
525
532
  }),
526
533
  getURLQuery().obj,
527
534
  params,
535
+ true,
528
536
  );
529
537
 
530
538
  // Open the route if it's routable.
531
- if (registeredRouteComponent?.type.routable) {
539
+ if (
540
+ registeredRouteComponent?.type.routable &&
541
+ registeredWorkspaceComponent.type.moduleUid === registeredRouteComponent.type.moduleUid
542
+ ) {
532
543
  await openBlade({
533
544
  blade: registeredRouteComponent as unknown as BladeInstanceConstructor,
534
545
  param: param,
@@ -565,7 +576,7 @@ export function useBladeNavigation(): IUseBladeNavigation {
565
576
  // add blade name to query keys
566
577
  const namedQuery = _.mapKeys(
567
578
  _.mapValues(query, (value) => value?.toString()),
568
- (value, key) => instance.vnode.type.name.toLowerCase() + "_" + key,
579
+ (value, key) => instance.vnode.type.name?.toLowerCase() + "_" + key,
569
580
  );
570
581
  const cleanQuery = _.omitBy(namedQuery, _.isNil);
571
582
 
@@ -580,10 +591,10 @@ export function useBladeNavigation(): IUseBladeNavigation {
580
591
  function getNavigationQuery() {
581
592
  if (instance.vnode.props.navigation.idx === 0) {
582
593
  const queryKeys = Array.from(Object.keys(route.query));
583
- const bladeQueryKeys = queryKeys.filter((key) => key.startsWith(instance.vnode.type.name.toLowerCase()));
594
+ const bladeQueryKeys = queryKeys.filter((key) => key.startsWith(instance.vnode.type.name?.toLowerCase() ?? ""));
584
595
 
585
596
  const namedQuery = _.mapKeys(_.pick(route.query, bladeQueryKeys), (value, key) =>
586
- key.replace(instance.vnode.type.name.toLowerCase() + "_", ""),
597
+ key.replace(instance.vnode.type.name?.toLowerCase() + "_", ""),
587
598
  ) as Record<string, string | number>;
588
599
 
589
600
  const obj: typeof namedQuery = {};
@@ -63,6 +63,7 @@ export default {
63
63
  props: Object.assign(
64
64
  {},
65
65
  {
66
+ variant: props.element.variant,
66
67
  header: toValue(props.baseProps.label),
67
68
  isCollapsable: props.element.collapsible,
68
69
  isCollapsed: restoreCollapsed(props.element.id) || props.element.collapsed,
@@ -78,7 +78,8 @@ export default {
78
78
  async remove(image: ICommonAsset) {
79
79
  if (!imagesHandler.remove?.value) throw new Error("Remove handler is not provided");
80
80
  if (
81
- await showConfirmation(
81
+ imagesHandler.noRemoveConfirmation ||
82
+ (await showConfirmation(
82
83
  computed(() =>
83
84
  t(
84
85
  `${props.bladeContext?.settings?.localizationPrefix
@@ -86,7 +87,7 @@ export default {
86
87
  .toUpperCase()}.PAGES.ALERTS.IMAGE_DELETE_CONFIRMATION`,
87
88
  ),
88
89
  ),
89
- )
90
+ ))
90
91
  ) {
91
92
  const edited = await imagesHandler.remove?.value?.([image]);
92
93
  await editImages(edited);
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/no-explicit-any */
2
2
  import { useTableTemplates } from "./../../composables";
3
- import { Component, ExtractPropTypes, computed, h, inject, unref } from "vue";
3
+ import { Component, ExtractPropTypes, computed, h, inject, isRef, nextTick, toValue, unref } from "vue";
4
4
  import { Table } from "../factories";
5
5
  import componentProps from "./props";
6
6
  import { TableSchema } from "../../types";
@@ -8,8 +8,14 @@ import { useI18n } from "vue-i18n";
8
8
  import { unrefNested } from "../../helpers/unrefNested";
9
9
  import { setModel } from "../../helpers/setters";
10
10
  import { safeIn } from "../../helpers/safeIn";
11
+ import { IActionBuilderResult, ITableColumns } from "../../../../../core/types";
11
12
 
12
- type TableItemData = Record<string, any>;
13
+ type TableItemData<T> = {
14
+ name: string;
15
+ item: T;
16
+ cell: ITableColumns;
17
+ index: number;
18
+ };
13
19
 
14
20
  export default {
15
21
  name: "TableEl",
@@ -19,13 +25,48 @@ export default {
19
25
  const { t } = useI18n({ useScope: "global" });
20
26
  const enableEdit = inject("isBladeEditable", false);
21
27
  const enableEditComputed = computed(() => unref(enableEdit));
28
+ const items = (unrefNested(props.baseProps).modelValue ?? []) as any[];
29
+
30
+ function disabledActionHandler(disabled: { method?: string } | boolean, item: (typeof items)[number]): boolean {
31
+ if (!disabled) return false;
32
+ if (typeof disabled === "boolean") return disabled;
33
+ else if (disabled.method && typeof toValue(props.bladeContext.scope)?.[disabled.method] === "function")
34
+ return toValue(props.bladeContext.scope)?.[disabled.method]({ item });
35
+ else if (disabled.method && toValue(props.bladeContext.scope)?.[disabled.method])
36
+ return toValue(props.bladeContext.scope)?.[disabled.method];
37
+ return false;
38
+ }
39
+
40
+ function actionBuilder(item: (typeof items)[number]): IActionBuilderResult[] | undefined {
41
+ const result = props.element?.actions?.reduce((arr, action) => {
42
+ const isDisabled = disabledActionHandler(action?.disabled ?? false, item);
43
+
44
+ if (!toValue(isDisabled)) {
45
+ arr.push({
46
+ icon: action.icon,
47
+ title: computed(() => t(action.title)),
48
+ type: action.type,
49
+ position: action.position,
50
+ clickHandler: async (itemVal: (typeof items)[number], index: number) => {
51
+ try {
52
+ await toValue(props.bladeContext.scope)?.[action.method]?.(itemVal, index);
53
+ } catch (error) {
54
+ throw new Error(`Method ${action.method} is not defined in scope or toolbarOverrides`);
55
+ }
56
+ },
57
+ });
58
+ }
59
+ return arr;
60
+ }, [] as IActionBuilderResult[]);
61
+
62
+ return result;
63
+ }
22
64
 
23
65
  return () => {
24
66
  const field = Table({
25
67
  props: Object.assign(
26
68
  {},
27
69
  {
28
- removeRowButton: props.element.removeRowButton?.show,
29
70
  addNewRowButton: props.element.addNewRowButton
30
71
  ? {
31
72
  title: computed(() => t(props.element.addNewRowButton?.title ?? "")),
@@ -40,7 +81,9 @@ export default {
40
81
  stateKey: props.element.id,
41
82
  class: `!tw-flex-auto ${unrefNested(props.baseProps).classNames ?? ""}`,
42
83
  editing: enableEditComputed.value,
43
- onOnEditComplete: (data: any) => {
84
+ enableItemActions: !!props.element.actions,
85
+ itemActionBuilder: actionBuilder,
86
+ onOnEditComplete: (data: { event: { field: string; value: any }; index: number }) => {
44
87
  if (props.fieldContext) {
45
88
  setModel({
46
89
  context: props.fieldContext,
@@ -49,15 +92,6 @@ export default {
49
92
  });
50
93
  }
51
94
  },
52
- onOnRowRemove: (data: { index: number }) => {
53
- if (
54
- props.element.removeRowButton?.method &&
55
- props.bladeContext.scope?.[props.element.removeRowButton?.method] &&
56
- typeof props.bladeContext.scope?.[props.element.removeRowButton?.method] === "function"
57
- ) {
58
- props.bladeContext.scope?.[props.element.removeRowButton?.method]?.(data.index);
59
- }
60
- },
61
95
  onOnAddNewRow: () => {
62
96
  if (
63
97
  props.element.addNewRowButton?.method &&
@@ -86,12 +120,21 @@ export default {
86
120
  slots: {
87
121
  ...Object.entries(tableTemplates.templateOverrideComponents).reduce(
88
122
  (obj, [key, value], index) => {
89
- obj[`item_${key}`] = (itemData: TableItemData) => {
123
+ obj[`item_${key}`] = (itemData: TableItemData<(typeof items)[number]>) => {
90
124
  return h(unref(value), {
91
125
  index: itemData.index,
92
126
  context: itemData,
93
127
  key: `template_override_${props.element.id}_${index}`,
94
128
  bladeContext: props.bladeContext,
129
+ onEditComplete: (data: any) => {
130
+ if (props.fieldContext) {
131
+ setModel({
132
+ context: props.fieldContext,
133
+ property: `${props.element.property}.${itemData.index}.${key}`,
134
+ value: data,
135
+ });
136
+ }
137
+ },
95
138
  });
96
139
  };
97
140
 
@@ -100,20 +143,17 @@ export default {
100
143
  {} as Record<`item_${string}`, any>,
101
144
  ),
102
145
  notfound: tableTemplates?.notFound
103
- ? (itemData: TableItemData) =>
104
- h(tableTemplates.notFound as Component, { context: itemData, bladeContext: props.bladeContext })
146
+ ? () => h(tableTemplates.notFound as Component, { context: props.bladeContext })
105
147
  : undefined,
106
148
  "mobile-item": tableTemplates?.mobileView
107
- ? (itemData: TableItemData) =>
149
+ ? (itemData: (typeof items)[number]) =>
108
150
  h(tableTemplates.mobileView as Component, { context: itemData, bladeContext: props.bladeContext })
109
151
  : undefined,
110
152
  empty: tableTemplates?.empty
111
- ? (itemData: TableItemData) =>
112
- h(tableTemplates.empty as Component, { context: itemData, bladeContext: props.bladeContext })
153
+ ? () => h(tableTemplates.empty as Component, { context: props.bladeContext })
113
154
  : undefined,
114
155
  footer: tableTemplates?.footer
115
- ? (itemData: TableItemData) =>
116
- h(tableTemplates.footer as Component, { context: itemData, bladeContext: props.bladeContext })
156
+ ? () => h(tableTemplates.footer as Component, { context: props.bladeContext })
117
157
  : undefined,
118
158
  },
119
159
  });
@@ -87,6 +87,16 @@ export default {
87
87
  },
88
88
  },
89
89
  },
90
+ variant: {
91
+ description: "Card variant.",
92
+ control: "radio",
93
+ options: ["default", "success", "danger"],
94
+ table: {
95
+ type: {
96
+ summary: "default | success | danger",
97
+ },
98
+ },
99
+ },
90
100
  },
91
101
  parameters: {
92
102
  docs: {
@@ -73,7 +73,7 @@ export default {
73
73
  aspectRatio: {
74
74
  description: `Field columns aspect ratio.
75
75
  Uses CSS flex-grow property.`,
76
- control: "array",
76
+ control: "object",
77
77
  table: {
78
78
  type: {
79
79
  summary: "[number, number]",
@@ -65,7 +65,7 @@ export default {
65
65
  summary: "number",
66
66
  },
67
67
  defaultValue: {
68
- summary: 1,
68
+ summary: "1",
69
69
  },
70
70
  },
71
71
  },
@@ -95,7 +95,7 @@ export default {
95
95
  summary: "number",
96
96
  },
97
97
  defaultValue: {
98
- summary: 1024,
98
+ summary: "1024",
99
99
  },
100
100
  },
101
101
  },
@@ -131,7 +131,7 @@ export default {
131
131
  summary: "boolean",
132
132
  },
133
133
  defaultValue: {
134
- summary: false,
134
+ summary: "false",
135
135
  },
136
136
  },
137
137
  },
@@ -156,7 +156,7 @@ export default {
156
156
  summary: "boolean",
157
157
  },
158
158
  defaultValue: {
159
- summary: false,
159
+ summary: "false",
160
160
  },
161
161
  },
162
162
  },
@@ -167,7 +167,7 @@ export default {
167
167
  summary: "boolean",
168
168
  },
169
169
  defaultValue: {
170
- summary: false,
170
+ summary: "false",
171
171
  },
172
172
  },
173
173
  },
@@ -179,7 +179,7 @@ export default {
179
179
  summary: "boolean",
180
180
  },
181
181
  defaultValue: {
182
- summary: true,
182
+ summary: "true",
183
183
  },
184
184
  },
185
185
  },
@@ -11,7 +11,7 @@ export interface UseDetailsFactoryParams<Item> {
11
11
  remove?: (args: ItemId) => Promise<void> | void;
12
12
  }
13
13
 
14
- export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<Item>) => {
14
+ export const useDetailsFactory = <Item extends { id?: string }>(factoryParams: UseDetailsFactoryParams<Item>) => {
15
15
  return function useDetails(): UseDetails<Item> {
16
16
  const { setFieldError, setErrors, validate, setFieldValue, setValues, errorBag } = useForm({
17
17
  validateOnMount: false,
@@ -34,6 +34,12 @@ export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<I
34
34
  isModified.value = false;
35
35
  isDirty = ref(false);
36
36
 
37
+ const id = item?.id ?? res?.id;
38
+
39
+ if (id) {
40
+ await load({ id });
41
+ }
42
+
37
43
  if (res) return res;
38
44
  } else throw new Error("Form is not valid");
39
45
  });
@@ -46,10 +52,10 @@ export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<I
46
52
 
47
53
  const validationState = computed(
48
54
  (): IValidationState<Item> => ({
49
- dirty: isDirty.value,
55
+ dirty: isDirty.value || isModified.value,
50
56
  valid: isFormValid.value,
51
57
  modified: isModified.value,
52
- disabled: isDisabled.value,
58
+ disabled: isDisabled.value || !isModified.value,
53
59
  validated: !isDisabled.value && isModified.value,
54
60
  cachedValue: itemTemp.value,
55
61
  errorBag: errorBag.value,
@@ -58,6 +64,7 @@ export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<I
58
64
  setFieldValue,
59
65
  setValues,
60
66
  resetModified,
67
+ resetValidationState,
61
68
  validate,
62
69
  }),
63
70
  );
@@ -76,8 +83,15 @@ export const useDetailsFactory = <Item>(factoryParams: UseDetailsFactoryParams<I
76
83
  }
77
84
 
78
85
  itemTemp.value = _.cloneDeep(data);
86
+
87
+ resetValidationState();
79
88
  }) as (data: MaybeRef<Item | undefined> | ComputedRef<Item | undefined>, updateInitial?: MaybeRef<boolean>) => void;
80
89
 
90
+ const resetValidationState = () => {
91
+ isModified.value = false;
92
+ isDirty = ref(false);
93
+ };
94
+
81
95
  return {
82
96
  load,
83
97
  saveChanges,
@@ -32,6 +32,7 @@ export interface IValidationState<Item> {
32
32
  data: MaybeRef<Item | undefined> | ComputedRef<Item | undefined>,
33
33
  updateInitial?: MaybeRef<boolean>,
34
34
  ) => void;
35
+ resetValidationState: () => void;
35
36
  validate: FormContext["validate"];
36
37
  errorBag: Partial<Record<string, string[]>>;
37
38
  }
@@ -76,8 +76,8 @@ function nodeBuilder<
76
76
 
77
77
  const hint =
78
78
  safeIn("hint", controlSchema) && controlSchema.hint
79
- ? unref(unwrapInterpolation(controlSchema.hint, internalContext)) ??
80
- (bladeContext.scope && unref(unwrapInterpolation(controlSchema.hint, bladeContext.scope))) ??
79
+ ? (bladeContext.scope && unref(unwrapInterpolation(controlSchema.hint, bladeContext.scope))) ??
80
+ unref(unwrapInterpolation(controlSchema.hint, internalContext)) ??
81
81
  undefined
82
82
  : undefined;
83
83
 
@@ -115,16 +115,16 @@ function nodeBuilder<
115
115
 
116
116
  const baseProps: IControlBaseProps = reactive({
117
117
  key: `${parentId}`,
118
- label: computed(() => (label ? t(label) : undefined)),
119
- hint: computed(() => (hint ? t(hint) : undefined)),
118
+ label: computed(() => (typeof label !== "undefined" ? t(label) : undefined)),
119
+ hint: computed(() => (typeof hint !== "undefined" ? t(hint) : undefined)),
120
120
  disabled,
121
121
  name,
122
122
  rules,
123
- placeholder: computed(() => (placeholder ? t(placeholder) : undefined)),
123
+ placeholder: computed(() => (typeof placeholder !== "undefined" ? t(placeholder) : undefined)),
124
124
  required,
125
125
  modelValue,
126
126
  "onUpdate:modelValue": onUpdateModelValue,
127
- tooltip: computed(() => (tooltip ? t(tooltip) : undefined)),
127
+ tooltip: computed(() => (typeof tooltip !== "undefined" ? t(tooltip) : undefined)),
128
128
  multilanguage,
129
129
  classNames:
130
130
  "horizontalSeparator" in controlSchema && controlSchema.horizontalSeparator
@@ -63,7 +63,6 @@
63
63
  @pagination-click="onPaginationClick"
64
64
  @selection-changed="onSelectionChanged"
65
65
  @header-click="onHeaderClick"
66
- @load:change="onSearchList"
67
66
  @scroll:ptr="reload"
68
67
  @search:change="onSearchList"
69
68
  @row:reorder="sortRows"
@@ -129,6 +128,7 @@
129
128
  <component
130
129
  :is="component"
131
130
  :context="itemData"
131
+ :blade-context="bladeContext"
132
132
  />
133
133
  </template>
134
134
 
@@ -141,6 +141,7 @@
141
141
  <component
142
142
  :is="tableTemplates.mobileView"
143
143
  :context="itemData"
144
+ :blade-context="bladeContext"
144
145
  ></component>
145
146
  </template>
146
147
  </VcTable>
@@ -215,7 +216,7 @@ const title = computed(() => t(settings.value?.titleTemplate as string));
215
216
  const allSelected = ref(false);
216
217
  const searchValue = ref();
217
218
  const selectedItemId = shallowRef();
218
- const sort = shallowRef("createdDate:DESC");
219
+ const sort = shallowRef();
219
220
  const selectedIds = shallowRef<string[]>([]);
220
221
  const itemsProxy = ref<Record<string, any>[]>();
221
222
 
@@ -288,6 +289,8 @@ if (props.isWidgetView) {
288
289
  query.value.take = 5;
289
290
  }
290
291
 
292
+ sort.value = query.value.sort ?? "createdDate:DESC";
293
+
291
294
  const unreffedScope = reactiveComputed(() => toValue(scope) ?? {});
292
295
 
293
296
  const { tableTemplates } = useTableTemplates(tableData);
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  VcButton,
3
+ VcCard,
3
4
  VcField,
4
5
  VcGallery,
5
6
  VcIcon,
@@ -768,6 +769,11 @@ export interface CardSchema extends RequiredBy<Pick<SchemaBase, "id" | "label" |
768
769
  * @default false
769
770
  */
770
771
  removePadding?: boolean;
772
+ /**
773
+ * Card variant.
774
+ * @type {default | success | danger}
775
+ */
776
+ variant?: ComponentProps<typeof VcCard>["variant"];
771
777
  }
772
778
 
773
779
  export interface WidgetsSchema extends Pick<SchemaBase, "id" | "horizontalSeparator"> {
@@ -883,22 +889,6 @@ export interface SwitchSchema extends Omit<SchemaBase, "placeholder" | "multilan
883
889
 
884
890
  export type TableSchema = Omit<ListContentSchema, "filter"> &
885
891
  Pick<SchemaBase, "id" | "property" | "visibility"> & {
886
- /**
887
- * Shows button to remove table row.
888
- * Used when table is in editing mode.
889
- */
890
- removeRowButton?: {
891
- /**
892
- * Determines whether the button should be shown or hidden.
893
- */
894
- show: boolean;
895
- /**
896
- * Method to be called when the button is clicked.
897
- * @description Method should be defined in the blade `scope`.
898
- * @type {string}
899
- */
900
- method: string;
901
- };
902
892
  /**
903
893
  * Configuration for the add new row button in the table.
904
894
  * Used when table is in editing mode.
@@ -127,7 +127,7 @@ $variants: success, danger;
127
127
  &__title {
128
128
  @apply tw-uppercase tw-flex-grow
129
129
  tw-text-[color:var(--card-header-color)]
130
- tw-text-base tw-font-bold tw-uppercase;
130
+ tw-text-base tw-font-bold;
131
131
  }
132
132
 
133
133
  &__icon {
@@ -139,7 +139,7 @@ $variants: success, danger;
139
139
  }
140
140
 
141
141
  &__body {
142
- @apply tw-flex-grow tw-box-border;
142
+ @apply tw-flex-grow tw-box-border tw-flex-col;
143
143
  }
144
144
 
145
145
  @each $variant in $variants {