@vc-shell/framework 1.0.219 → 1.0.221

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/types/index.ts +6 -0
  3. package/dist/core/types/index.d.ts +6 -0
  4. package/dist/core/types/index.d.ts.map +1 -1
  5. package/dist/framework.js +14196 -13907
  6. package/dist/index.css +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/locales/en.json +2 -1
  9. package/dist/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -1
  10. package/dist/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -1
  11. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +6 -3
  12. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  13. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +2 -1
  14. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  15. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +2 -1
  16. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  17. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +2 -1
  18. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  19. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +2 -1
  20. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  21. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +2 -1
  22. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -1
  23. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +2 -1
  24. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  25. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +2 -1
  26. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  27. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +2 -1
  28. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  29. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +2 -1
  30. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  31. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +2 -1
  32. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  33. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +2 -1
  34. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  35. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +2 -1
  36. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  37. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +2 -1
  38. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  39. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts +2 -1
  40. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts.map +1 -1
  41. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +2 -1
  42. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -1
  43. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +2 -1
  44. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  45. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +2 -1
  46. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  47. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +2 -1
  48. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -1
  49. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +2 -1
  50. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -1
  51. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +2 -1
  52. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  53. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +2 -1
  54. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  55. package/dist/shared/modules/dynamic/components/fields/props.d.ts +2 -1
  56. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  57. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +6 -3
  58. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  59. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +6 -3
  60. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  61. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +6 -3
  62. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
  63. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +6 -3
  64. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
  65. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +6 -3
  66. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
  67. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +6 -15
  68. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -1
  69. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +6 -3
  70. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -1
  71. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +6 -3
  72. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -1
  73. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +15 -3
  74. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -1
  75. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +15 -3
  76. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
  77. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +15 -3
  78. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -1
  79. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts +6 -3
  80. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts.map +1 -1
  81. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +6 -3
  82. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -1
  83. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +15 -3
  84. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -1
  85. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +6 -3
  86. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -1
  87. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +6 -3
  88. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
  89. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +6 -3
  90. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -1
  91. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +6 -3
  92. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -1
  93. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts +1 -0
  94. package/dist/shared/modules/dynamic/composables/useTableTemplates/index.d.ts.map +1 -1
  95. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts +1 -1
  96. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts.map +1 -1
  97. package/dist/shared/modules/dynamic/factories/types/index.d.ts +2 -2
  98. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  99. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +2 -1
  100. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  101. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -1
  102. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  103. package/dist/shared/modules/dynamic/types/index.d.ts +70 -20
  104. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  105. package/dist/shared/modules/dynamic/types/models.d.ts +1 -1
  106. package/dist/shared/modules/dynamic/types/models.d.ts.map +1 -1
  107. package/dist/tsconfig.tsbuildinfo +1 -1
  108. package/dist/ui/components/atoms/index.d.ts +1 -0
  109. package/dist/ui/components/atoms/index.d.ts.map +1 -1
  110. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +6 -0
  111. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  112. package/dist/ui/components/atoms/vc-label/vc-label.vue.d.ts.map +1 -1
  113. package/dist/ui/components/atoms/vc-status/vc-status.stories.d.ts +7 -7
  114. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts +2 -2
  115. package/dist/ui/components/atoms/vc-status/vc-status.vue.d.ts.map +1 -1
  116. package/dist/ui/components/atoms/vc-tooltip/index.d.ts +2 -0
  117. package/dist/ui/components/atoms/vc-tooltip/index.d.ts.map +1 -0
  118. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts +41 -0
  119. package/dist/ui/components/atoms/vc-tooltip/vc-tooltip.vue.d.ts.map +1 -0
  120. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +6 -0
  121. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
  122. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +3 -0
  123. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  124. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +30 -16
  125. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts.map +1 -1
  126. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts +35 -0
  127. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  128. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts +63 -63
  129. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +9 -9
  130. package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts +90 -90
  131. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +9 -9
  132. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  133. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts +1 -0
  134. package/dist/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue.d.ts.map +1 -1
  135. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts +26 -0
  136. package/dist/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue.d.ts.map +1 -0
  137. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +10 -1
  138. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  139. package/dist/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue.d.ts.map +1 -1
  140. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +315 -15
  141. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  142. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +63 -3
  143. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  144. package/package.json +4 -4
  145. package/shared/components/app-switcher/composables/useAppSwitcher/index.ts +0 -2
  146. package/shared/components/blade-navigation/composables/useBladeNavigation/index.ts +1 -2
  147. package/shared/modules/dynamic/components/fields/Button.ts +5 -3
  148. package/shared/modules/dynamic/components/fields/Fieldset.ts +2 -19
  149. package/shared/modules/dynamic/components/fields/InputCurrency.ts +18 -2
  150. package/shared/modules/dynamic/components/fields/InputField.ts +5 -1
  151. package/shared/modules/dynamic/components/fields/MultivalueField.ts +4 -1
  152. package/shared/modules/dynamic/components/fields/SelectField.ts +4 -1
  153. package/shared/modules/dynamic/components/fields/Table.ts +52 -6
  154. package/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.ts +1 -63
  155. package/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.ts +14 -0
  156. package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +14 -0
  157. package/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.ts +14 -0
  158. package/shared/modules/dynamic/components/fields/storybook/SelectField.stories.ts +13 -0
  159. package/shared/modules/dynamic/composables/useTableTemplates/index.ts +2 -0
  160. package/shared/modules/dynamic/composables/useToolbarReducer/index.ts +30 -17
  161. package/shared/modules/dynamic/factories/types/index.ts +5 -2
  162. package/shared/modules/dynamic/pages/dynamic-blade-form.vue +1 -1
  163. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +3 -1
  164. package/shared/modules/dynamic/types/index.ts +78 -26
  165. package/shared/modules/dynamic/types/models.ts +3 -1
  166. package/ui/components/atoms/index.ts +1 -0
  167. package/ui/components/atoms/vc-label/vc-label.vue +10 -29
  168. package/ui/components/atoms/vc-status/vc-status.vue +6 -3
  169. package/ui/components/atoms/vc-tooltip/index.ts +1 -0
  170. package/ui/components/atoms/vc-tooltip/vc-tooltip.vue +57 -0
  171. package/ui/components/molecules/vc-input/vc-input.vue +7 -3
  172. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +53 -1
  173. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +5 -1
  174. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +1 -0
  175. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +1 -0
  176. package/ui/components/organisms/vc-table/_internal/vc-table-add-new/vc-table-add-new.vue +46 -0
  177. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +108 -23
  178. package/ui/components/organisms/vc-table/_internal/vc-table-column-switcher/vc-table-column-switcher.vue +6 -2
  179. package/ui/components/organisms/vc-table/vc-table.vue +156 -70
@@ -99,6 +99,14 @@ export default {
99
99
  },
100
100
  },
101
101
  },
102
+ hint: {
103
+ description: "Hint text to be displayed below the input.",
104
+ table: {
105
+ type: {
106
+ summary: "string",
107
+ },
108
+ },
109
+ },
102
110
  },
103
111
  parameters: {
104
112
  docs: {
@@ -139,6 +147,12 @@ WithPlaceholder.args = {
139
147
  placeholder: "Input placeholder",
140
148
  };
141
149
 
150
+ export const WithHint = Template.bind({});
151
+ WithHint.args = {
152
+ label: "Input label",
153
+ hint: "Input hint",
154
+ };
155
+
142
156
  export const WithPrepend: StoryFn<InputSchema> = (args) => ({
143
157
  components: { page },
144
158
  setup() {
@@ -134,6 +134,14 @@ export default {
134
134
  },
135
135
  },
136
136
  },
137
+ hint: {
138
+ description: "Hint text to be displayed below the input.",
139
+ table: {
140
+ type: {
141
+ summary: "string",
142
+ },
143
+ },
144
+ },
137
145
  },
138
146
  parameters: {
139
147
  docs: {
@@ -161,6 +169,12 @@ Template.args = {
161
169
  placeholder: "Write something and press Enter",
162
170
  };
163
171
 
172
+ export const WithHint = Template.bind({});
173
+ WithHint.args = {
174
+ placeholder: "Write something and press Enter",
175
+ hint: "I am a hint",
176
+ };
177
+
164
178
  export const NumberInput: StoryFn<MultivalueSchema> = (args) => ({
165
179
  components: { page },
166
180
  setup() {
@@ -183,6 +183,14 @@ export default {
183
183
  },
184
184
  },
185
185
  },
186
+ hint: {
187
+ description: "Hint text to be displayed below the input.",
188
+ table: {
189
+ type: {
190
+ summary: "string",
191
+ },
192
+ },
193
+ },
186
194
  },
187
195
  parameters: {
188
196
  docs: {
@@ -225,6 +233,11 @@ WithTooltip.args = {
225
233
  tooltip: "Select tooltip",
226
234
  };
227
235
 
236
+ export const WithHint = WithLabel.bind({});
237
+ WithHint.args = {
238
+ hint: "Select hint",
239
+ };
240
+
228
241
  export const WithPlaceholder: StoryFn<SelectSchema> = (args) => ({
229
242
  components: { page },
230
243
  setup() {
@@ -7,6 +7,7 @@ export interface IUseTableTemplates {
7
7
  mobileView: ConcreteComponent | undefined;
8
8
  notFound: ConcreteComponent | undefined;
9
9
  empty: ConcreteComponent | undefined;
10
+ footer: ConcreteComponent | undefined;
10
11
  };
11
12
  }
12
13
 
@@ -18,6 +19,7 @@ export const useTableTemplates = (
18
19
  mobileView: resolveTemplateComponent("mobileTemplate"),
19
20
  notFound: resolveTemplateComponent("notFoundTemplate"),
20
21
  empty: resolveTemplateComponent("emptyTemplate"),
22
+ footer: resolveTemplateComponent("footerTemplate"),
21
23
  });
22
24
 
23
25
  function resolveTemplateComponent(name: keyof ListContentSchema): ShallowRef<ConcreteComponent> | undefined {
@@ -5,7 +5,7 @@ import { SettingsSchema, ToolbarSchema } from "../../types";
5
5
  import { BaseBladeScope, DetailsBladeContext, ListBladeContext } from "../../factories/types";
6
6
  import { useI18n } from "vue-i18n";
7
7
  import { toValue } from "@vueuse/core";
8
- import { UnwrapNestedRefs, computed, ref, ComputedRef } from "vue";
8
+ import { UnwrapNestedRefs, computed, ref, ComputedRef, unref } from "vue";
9
9
 
10
10
  export const useToolbarReducer = (args: {
11
11
  defaultToolbarSchema: SettingsSchema["toolbar"];
@@ -13,7 +13,7 @@ export const useToolbarReducer = (args: {
13
13
  customToolbarConfig: BaseBladeScope["toolbarOverrides"];
14
14
  context: UnwrapNestedRefs<DetailsBladeContext> | UnwrapNestedRefs<ListBladeContext>;
15
15
  scope: ComputedRef<BaseBladeScope> | undefined;
16
- }): UnwrapNestedRefs<ComputedRef<(IBladeToolbar & ToolbarSchema)[]>> | undefined => {
16
+ }): UnwrapNestedRefs<ComputedRef<(IBladeToolbar & ToolbarSchema)[] | IBladeToolbar[] | undefined>> | undefined => {
17
17
  if (!args) return;
18
18
 
19
19
  const { t } = useI18n({ useScope: "global" });
@@ -27,10 +27,21 @@ export const useToolbarReducer = (args: {
27
27
  return computed(() => {
28
28
  if (args.defaultToolbarSchema?.length !== 0) {
29
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) {
30
+ const toolbarItemCtx = toolbarMethodsMerge.value[curr.method as keyof typeof toolbarMethodsMerge.value] as
31
+ | IBladeToolbar
32
+ | IBladeToolbar[];
33
+ if (toolbarItemCtx && Array.isArray(toolbarItemCtx)) {
34
+ return acc.concat(
35
+ toolbarItemCtx.map((item) => {
36
+ return {
37
+ ...curr,
38
+ ...item,
39
+ title: t(curr.title || unref<string>(item.title ?? "")) as string,
40
+ };
41
+ }),
42
+ );
43
+ }
44
+ if (toolbarItemCtx && typeof toolbarItemCtx === "object") {
34
45
  const context =
35
46
  typeof toolbarItemCtx === "function"
36
47
  ? {
@@ -46,7 +57,8 @@ export const useToolbarReducer = (args: {
46
57
  acc.push({
47
58
  ...curr,
48
59
  ...context,
49
- title: t(curr.title) as string,
60
+ icon: curr.icon || toolbarItemCtx.icon,
61
+ title: t(curr.title || unref<string>(toolbarItemCtx.title ?? "")) as string,
50
62
  });
51
63
  }
52
64
 
@@ -54,17 +66,18 @@ export const useToolbarReducer = (args: {
54
66
  }, [] as IBladeToolbar[]);
55
67
  }
56
68
 
57
- if (args.scope && toValue(toValue(args.scope)?.toolbarOverrides)) {
58
- const toolbarOverrides: BaseBladeScope["toolbarOverrides"] = toValue(toValue(args.scope)?.toolbarOverrides);
69
+ // TODO remove redundant code if not needed
70
+ // if (args.scope && toValue(toValue(args.scope)?.toolbarOverrides)) {
71
+ // const toolbarOverrides: BaseBladeScope["toolbarOverrides"] = toValue(toValue(args.scope)?.toolbarOverrides);
59
72
 
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
- }
73
+ // if (Array.isArray(toolbarOverrides)) {
74
+ // return toolbarOverrides;
75
+ // } else if (typeof toolbarOverrides === "function") {
76
+ // return toolbarOverrides(args.context);
77
+ // } else if (typeof toolbarOverrides === "object") {
78
+ // return Object.values(toolbarOverrides);
79
+ // }
80
+ // }
68
81
 
69
82
  return [];
70
83
  });
@@ -69,7 +69,10 @@ export interface UseList<
69
69
 
70
70
  export interface BaseBladeScope {
71
71
  [x: string]: any;
72
- toolbarOverrides?: MaybeRef<{ [x: string]: IBladeToolbar }> | ((...args: any[]) => any) | MaybeRef<IBladeToolbar[]>;
72
+ toolbarOverrides?:
73
+ | MaybeRef<{ [x: string]: IBladeToolbar | IBladeToolbar[] | MaybeRef<IBladeToolbar> | MaybeRef<IBladeToolbar[]> }>
74
+ | ((...args: any[]) => any)
75
+ | MaybeRef<IBladeToolbar[]>;
73
76
  }
74
77
 
75
78
  export interface ListBaseBladeScope<Item = Record<string, any>, Query = Record<string, any>> extends BaseBladeScope {
@@ -94,7 +97,7 @@ export type TListItemClickArgs<Item extends Record<string, any> = Record<string,
94
97
  > & { item?: Item | undefined };
95
98
 
96
99
  export interface DetailsBaseBladeScope extends BaseBladeScope {
97
- disabled?: ComputedRef<boolean | undefined> | Ref<boolean | undefined>;
100
+ disabled?: ComputedRef<boolean | undefined> | Ref<boolean | undefined> | boolean;
98
101
  multilanguage?: {
99
102
  loading: ComputedRef<boolean>;
100
103
  currentLocale: Ref<string>;
@@ -7,7 +7,7 @@
7
7
  :width="settings?.width || '50%'"
8
8
  :toolbar-items="toolbarComputed"
9
9
  :title="title"
10
- :modified="!toValue(scope)?.disabled ? isFormModified : undefined"
10
+ :modified="isBladeEditable ? isFormModified : undefined"
11
11
  @close="$emit('close:blade')"
12
12
  @expand="$emit('expand:blade')"
13
13
  @collapse="$emit('collapse:blade')"
@@ -620,7 +620,9 @@ function actionBuilder(item: (typeof items.value)[number]): IActionBuilderResult
620
620
  clickHandler: async (itemVal: (typeof items.value)[number]) => {
621
621
  try {
622
622
  if (isRef(toolbarComputed) && toolbarComputed.value && toolbarComputed.value.length > 0) {
623
- const toolbarItem = toolbarComputed.value.find((x) => x.method === action.method);
623
+ const toolbarItem = toolbarComputed.value.find(
624
+ (x) => ("method" in x && x.method === action.method) ?? false,
625
+ );
624
626
  selectedIds.value = [itemVal.id];
625
627
  if (toolbarItem) {
626
628
  await toolbarItem.clickHandler?.();
@@ -61,8 +61,8 @@ export type IViewComponentName = "DynamicBladeForm" | "DynamicBladeList";
61
61
 
62
62
  export type ToolbarSchema = {
63
63
  id: string;
64
- title: string;
65
- icon: string;
64
+ title?: string;
65
+ icon?: string;
66
66
  method: string;
67
67
  };
68
68
 
@@ -149,7 +149,6 @@ export interface ListContentSchema {
149
149
  multiselect?: boolean;
150
150
  header?: boolean;
151
151
  footer?: boolean;
152
- editable?: boolean;
153
152
  columns?: (Omit<ITableColumns, "visible"> & {
154
153
  id: string;
155
154
  title: string;
@@ -157,6 +156,14 @@ export interface ListContentSchema {
157
156
  alwaysVisible?: boolean;
158
157
  type?: string;
159
158
  customTemplate?: GridTemplateOverride;
159
+ /** Additional method that is called when the focus is lost from the cell when editing.
160
+ * @description Method should be defined in the blade `scope`.
161
+ * @argument ({ row: number, field: string })
162
+ * @type {{ method: string }}
163
+ */
164
+ onCellBlur?: {
165
+ method: string;
166
+ };
160
167
  visible?:
161
168
  | boolean
162
169
  | {
@@ -167,14 +174,15 @@ export interface ListContentSchema {
167
174
  // TODO Add to documentation
168
175
  selectAll?: boolean;
169
176
  // TODO Add to documentation
170
- actions?: (ToolbarSchema & {
171
- position: "right" | "left";
172
- type: "danger" | "success";
173
- disabled?: {
177
+ actions?: (Partial<TableSchema> &
178
+ Required<Pick<ToolbarSchema, "title" | "icon">> & {
179
+ position: "right" | "left";
180
+ type: "danger" | "success";
181
+ disabled?: {
182
+ method: string;
183
+ };
174
184
  method: string;
175
- };
176
- method: string;
177
- })[];
185
+ })[];
178
186
  mobileTemplate?: {
179
187
  component: string;
180
188
  };
@@ -184,6 +192,9 @@ export interface ListContentSchema {
184
192
  emptyTemplate?: {
185
193
  component: string;
186
194
  };
195
+ footerTemplate?: {
196
+ component: string;
197
+ };
187
198
  }
188
199
  export interface FormContentSchema {
189
200
  id: string;
@@ -330,6 +341,10 @@ export interface SelectSchema extends SchemaBase {
330
341
  * @type {boolean}
331
342
  */
332
343
  multiple?: boolean;
344
+ /**
345
+ * Text below control.
346
+ */
347
+ hint?: string;
333
348
  }
334
349
 
335
350
  export interface MultivalueSchema extends SchemaBase {
@@ -374,6 +389,10 @@ export interface MultivalueSchema extends SchemaBase {
374
389
  customTemplate?: {
375
390
  component: string;
376
391
  };
392
+ /**
393
+ * Text below control.
394
+ */
395
+ hint?: string;
377
396
  }
378
397
 
379
398
  export interface TextareaSchema extends SchemaBase {
@@ -439,6 +458,10 @@ export interface InputSchema extends SchemaBase {
439
458
  * @type {number}
440
459
  */
441
460
  maxlength?: number;
461
+ /**
462
+ * Text below control.
463
+ */
464
+ hint?: string;
442
465
  }
443
466
 
444
467
  /**
@@ -548,7 +571,7 @@ export interface StatusSchema extends Pick<SchemaBase, "id" | "visibility" | "ho
548
571
  extend?: boolean;
549
572
  /**
550
573
  * Status variant.
551
- * @type {"info" | "warning" | "danger" | "success" | "light-danger"}
574
+ * @type {"info" | "info-dark" | "warning" | "danger" | "success" | "light-danger"}
552
575
  */
553
576
  variant?: ComponentProps<typeof VcStatus>["variant"];
554
577
  /**
@@ -621,6 +644,10 @@ export interface InputCurrencySchema extends Omit<SchemaBase, "multilanguage"> {
621
644
  * @type {boolean}
622
645
  */
623
646
  clearable?: boolean;
647
+ /**
648
+ * Text below control.
649
+ */
650
+ hint?: string;
624
651
  }
625
652
 
626
653
  /**
@@ -830,19 +857,6 @@ export interface FieldsetSchema extends Pick<SchemaBase, "id" | "visibility" | "
830
857
  * @type {ControlSchema[]}
831
858
  */
832
859
  fields: ControlSchema[];
833
- /**
834
- * Method to call to remove field from the fieldset. When set - activates remove button.
835
- *
836
- * Used for property-based fieldsets.
837
- *
838
- * Allows to remove selected fieldset.
839
- * @description Method should be defined in the blade `scope`.
840
- * @argument {number} id - id of the field to remove
841
- * @type {{ method: string }}
842
- */
843
- remove?: {
844
- method: string;
845
- };
846
860
  }
847
861
 
848
862
  /**
@@ -867,7 +881,45 @@ export interface SwitchSchema extends Omit<SchemaBase, "placeholder" | "multilan
867
881
  falseValue?: boolean;
868
882
  }
869
883
 
870
- export type TableSchema = Omit<ListContentSchema, "filter"> & Pick<SchemaBase, "id" | "property" | "visibility">;
884
+ export type TableSchema = Omit<ListContentSchema, "filter"> &
885
+ 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
+ /**
903
+ * Configuration for the add new row button in the table.
904
+ * Used when table is in editing mode.
905
+ */
906
+ addNewRowButton?: {
907
+ /**
908
+ * The title of the button.
909
+ */
910
+ title: string;
911
+ /**
912
+ * Determines whether the button should be shown or hidden.
913
+ */
914
+ show: boolean;
915
+ /**
916
+ * Method to be called when the button is clicked.
917
+ * @description Method should be defined in the blade `scope`.
918
+ * @type {string}
919
+ */
920
+ method: string;
921
+ };
922
+ };
871
923
 
872
924
  /**
873
925
  * Button schema interface.
@@ -883,7 +935,7 @@ export interface ButtonSchema extends Pick<SchemaBase, "id" | "disabled" | "visi
883
935
  * Button inner text.
884
936
  * @type {string}
885
937
  */
886
- content: string;
938
+ content?: string;
887
939
  /**
888
940
  * Small sized button.
889
941
  * @type {boolean}
@@ -177,7 +177,9 @@ export type ISwitch = {
177
177
 
178
178
  export type ITable = {
179
179
  props: ComponentProps<typeof VcTable> | IControlBaseProps;
180
- slots: Partial<Pick<ComponentSlots<typeof VcTable>, `item_${string}` | "notfound" | "mobile-item" | "empty">>;
180
+ slots: Partial<
181
+ Pick<ComponentSlots<typeof VcTable>, `item_${string}` | "notfound" | "mobile-item" | "empty" | "footer">
182
+ >;
181
183
  } & FieldOpts<typeof VcTable>;
182
184
 
183
185
  export type IRating = {
@@ -16,3 +16,4 @@ export * from "./vc-status-icon";
16
16
  export * from "./vc-switch";
17
17
  export * from "./vc-video";
18
18
  export * from "./vc-widget";
19
+ export * from "./vc-tooltip";
@@ -14,24 +14,16 @@
14
14
  v-if="$slots['tooltip']"
15
15
  class="tw-grow tw-basis-0 tw-ml-1 tw-relative"
16
16
  >
17
- <VcIcon
18
- ref="tooltipIconRef"
19
- class="tw-text-[color:var(--label-tooltip-color)]"
20
- :icon="tooltipIcon"
21
- size="s"
22
- @mouseenter="tooltipVisible = true"
23
- @mouseleave="tooltipVisible = false"
24
- ></VcIcon>
25
- <teleport to="body">
26
- <span
27
- v-if="tooltipVisible"
28
- ref="tooltipRef"
29
- :style="floatingStyles"
30
- class="tw-absolute tw-z-[101] tw-bg-white tw-border tw-border-solid tw-border-[color:#eef0f2] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:#8e9daa] tw-font-normal tw-py-1 tw-px-2 tw-ml-4"
31
- >
17
+ <VcTooltip placement="top-start">
18
+ <VcIcon
19
+ class="tw-text-[color:var(--label-tooltip-color)]"
20
+ :icon="tooltipIcon"
21
+ size="s"
22
+ ></VcIcon>
23
+ <template #tooltip>
32
24
  <slot name="tooltip"></slot>
33
- </span>
34
- </teleport>
25
+ </template>
26
+ </VcTooltip>
35
27
  </span>
36
28
 
37
29
  <div
@@ -44,9 +36,7 @@
44
36
  </template>
45
37
 
46
38
  <script lang="ts" setup>
47
- import { VcIcon } from "./../../../components";
48
- import { ref } from "vue";
49
- import { useFloating, shift } from "@floating-ui/vue";
39
+ import { VcIcon, VcTooltip } from "./../../../components";
50
40
 
51
41
  export interface Props {
52
42
  required?: boolean;
@@ -63,15 +53,6 @@ defineSlots<{
63
53
  default: void;
64
54
  tooltip?: void;
65
55
  }>();
66
-
67
- const tooltipVisible = ref(false);
68
- const tooltipIconRef = ref<HTMLElement | null>(null);
69
- const tooltipRef = ref<HTMLElement | null>(null);
70
-
71
- const { floatingStyles } = useFloating(tooltipIconRef, tooltipRef, {
72
- placement: "top-start",
73
- middleware: [shift()],
74
- });
75
56
  </script>
76
57
 
77
58
  <style lang="scss">
@@ -9,7 +9,7 @@
9
9
  <!-- eslint-disable @typescript-eslint/no-explicit-any -->
10
10
  <script lang="ts" setup>
11
11
  export interface Props {
12
- variant?: "info" | "warning" | "danger" | "success" | "light-danger";
12
+ variant?: "info" | "warning" | "danger" | "success" | "light-danger" | "info-dark";
13
13
  outline?: boolean;
14
14
  extend?: boolean;
15
15
  }
@@ -27,7 +27,7 @@ defineSlots<{
27
27
  <style lang="scss">
28
28
  :root {
29
29
  --status-padding: 4px 14px;
30
- --status-padding-extended: 12px;
30
+ --status-padding-extended: 8px;
31
31
 
32
32
  --status-border-radius: 2px;
33
33
  --status-border-radius-extended: 4px;
@@ -47,9 +47,12 @@ defineSlots<{
47
47
 
48
48
  --status-light-danger-color: #333333;
49
49
  --status-light-danger-main-color: #ffefef;
50
+
51
+ --status-info-dark-color: #ffffff;
52
+ --status-info-dark-main-color: #82a6bd;
50
53
  }
51
54
 
52
- $variants: info, warning, danger, success, light-danger;
55
+ $variants: info, warning, danger, success, light-danger, info-dark;
53
56
 
54
57
  .vc-status {
55
58
  @apply tw-inline-block tw-rounded-[var(--status-border-radius)] tw-py-1 tw-px-3.5 tw-text-base tw-font-normal tw-whitespace-nowrap;
@@ -0,0 +1 @@
1
+ export { default as VcTooltip } from "./vc-tooltip.vue";
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div>
3
+ <div
4
+ ref="tooltipCompRef"
5
+ class="tw-inline-flex"
6
+ @mouseenter="tooltipVisible = true"
7
+ @mouseleave="tooltipVisible = false"
8
+ >
9
+ <slot></slot>
10
+ </div>
11
+
12
+ <teleport to="body">
13
+ <span
14
+ v-if="tooltipVisible"
15
+ ref="tooltipRef"
16
+ :style="floatingStyles"
17
+ class="tw-absolute tw-z-[101] tw-bg-white tw-border tw-border-solid tw-border-[color:#eef0f2] tw-shadow-[1px_1px_8px_rgba(126,142,157,0.25)] tw-rounded-[3px] tw-text-[color:#8e9daa] tw-font-normal tw-py-1 tw-px-2 tw-ml-4"
18
+ >
19
+ <slot name="tooltip"></slot>
20
+ </span>
21
+ </teleport>
22
+ </div>
23
+ </template>
24
+
25
+ <script lang="ts" setup>
26
+ import { useFloating, shift, Placement, offset } from "@floating-ui/vue";
27
+ import { ref } from "vue";
28
+ export interface Props {
29
+ placement?: Placement;
30
+ }
31
+
32
+ const props = withDefaults(defineProps<Props>(), {
33
+ placement: "bottom-end",
34
+ });
35
+
36
+ defineSlots<{
37
+ default: void;
38
+ tooltip?: void;
39
+ }>();
40
+
41
+ const tooltipVisible = ref(false);
42
+ const tooltipCompRef = ref<HTMLElement | null>(null);
43
+ const tooltipRef = ref<HTMLElement | null>(null);
44
+
45
+ const { floatingStyles } = useFloating(tooltipCompRef, tooltipRef, {
46
+ placement: props.placement,
47
+ middleware: [
48
+ offset({
49
+ crossAxis: 5,
50
+ mainAxis: 5,
51
+ }),
52
+ shift(),
53
+ ],
54
+ });
55
+ </script>
56
+
57
+ <style lang="scss" scoped></style>
@@ -90,6 +90,7 @@
90
90
  :teleport="$isDesktop.value ? 'body' : undefined"
91
91
  class="vc-input__input"
92
92
  @keydown="onKeyDown"
93
+ @blur="handleBlur"
93
94
  ></VueDatePicker>
94
95
  </template>
95
96
  <template v-else>
@@ -105,6 +106,7 @@
105
106
  :max="maxDate"
106
107
  class="vc-input__input"
107
108
  @keydown="onKeyDown"
109
+ @blur="handleBlur"
108
110
  />
109
111
  </template>
110
112
  </slot>
@@ -208,11 +210,8 @@
208
210
  <script lang="ts" setup>
209
211
  import { computed, ref, unref, watch } from "vue";
210
212
  import { VcLabel, VcIcon, VcHint } from "./../../";
211
- import moment from "moment";
212
213
  import VueDatePicker, { VueDatePickerProps } from "@vuepic/vue-datepicker";
213
214
  import "@vuepic/vue-datepicker/dist/main.css";
214
- import * as Locales from "date-fns/locale";
215
- import { Locale } from "date-fns";
216
215
 
217
216
  export interface Props {
218
217
  /**
@@ -317,6 +316,7 @@ export interface Emits {
317
316
  * Emitted when the component needs to change the model; Is also used by v-model
318
317
  */
319
318
  (event: "update:modelValue", value: string | number | Date | null | undefined): void;
319
+ (event: "blur", value: Event): void;
320
320
  }
321
321
 
322
322
  const props = withDefaults(defineProps<Props>(), {
@@ -500,6 +500,10 @@ function onReset() {
500
500
  temp.value = null;
501
501
  emit("update:modelValue", null);
502
502
  }
503
+
504
+ function handleBlur(e: Event) {
505
+ emit("blur", e);
506
+ }
503
507
  </script>
504
508
 
505
509
  <style lang="scss">