@vc-shell/framework 1.0.220 → 1.0.222

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 (140) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/core/types/index.ts +1 -0
  3. package/dist/core/types/index.d.ts +1 -0
  4. package/dist/core/types/index.d.ts.map +1 -1
  5. package/dist/framework.js +3562 -3528
  6. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts +6 -3
  7. package/dist/shared/modules/dynamic/components/SchemaRender.d.ts.map +1 -1
  8. package/dist/shared/modules/dynamic/components/fields/Button.d.ts +2 -1
  9. package/dist/shared/modules/dynamic/components/fields/Button.d.ts.map +1 -1
  10. package/dist/shared/modules/dynamic/components/fields/Card.d.ts +2 -1
  11. package/dist/shared/modules/dynamic/components/fields/Card.d.ts.map +1 -1
  12. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts +2 -1
  13. package/dist/shared/modules/dynamic/components/fields/Checkbox.d.ts.map +1 -1
  14. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts +2 -1
  15. package/dist/shared/modules/dynamic/components/fields/ContentField.d.ts.map +1 -1
  16. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts +2 -1
  17. package/dist/shared/modules/dynamic/components/fields/CustomComponent.d.ts.map +1 -1
  18. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts +2 -1
  19. package/dist/shared/modules/dynamic/components/fields/DynamicProperty.d.ts.map +1 -1
  20. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts +2 -1
  21. package/dist/shared/modules/dynamic/components/fields/EditorField.d.ts.map +1 -1
  22. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts +2 -1
  23. package/dist/shared/modules/dynamic/components/fields/Fieldset.d.ts.map +1 -1
  24. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts +2 -1
  25. package/dist/shared/modules/dynamic/components/fields/GalleryField.d.ts.map +1 -1
  26. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts +2 -1
  27. package/dist/shared/modules/dynamic/components/fields/ImageField.d.ts.map +1 -1
  28. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts +2 -1
  29. package/dist/shared/modules/dynamic/components/fields/InputCurrency.d.ts.map +1 -1
  30. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts +2 -1
  31. package/dist/shared/modules/dynamic/components/fields/InputField.d.ts.map +1 -1
  32. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts +2 -1
  33. package/dist/shared/modules/dynamic/components/fields/MultivalueField.d.ts.map +1 -1
  34. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts +2 -1
  35. package/dist/shared/modules/dynamic/components/fields/RadioButtonGroup.d.ts.map +1 -1
  36. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts +2 -1
  37. package/dist/shared/modules/dynamic/components/fields/RatingField.d.ts.map +1 -1
  38. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts +2 -1
  39. package/dist/shared/modules/dynamic/components/fields/SelectField.d.ts.map +1 -1
  40. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts +2 -1
  41. package/dist/shared/modules/dynamic/components/fields/StatusField.d.ts.map +1 -1
  42. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts +2 -1
  43. package/dist/shared/modules/dynamic/components/fields/SwitchField.d.ts.map +1 -1
  44. package/dist/shared/modules/dynamic/components/fields/Table.d.ts +2 -1
  45. package/dist/shared/modules/dynamic/components/fields/Table.d.ts.map +1 -1
  46. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts +2 -1
  47. package/dist/shared/modules/dynamic/components/fields/TextareaField.d.ts.map +1 -1
  48. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts +2 -1
  49. package/dist/shared/modules/dynamic/components/fields/VideoField.d.ts.map +1 -1
  50. package/dist/shared/modules/dynamic/components/fields/props.d.ts +2 -1
  51. package/dist/shared/modules/dynamic/components/fields/props.d.ts.map +1 -1
  52. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts +6 -3
  53. package/dist/shared/modules/dynamic/components/fields/storybook/Button.stories.d.ts.map +1 -1
  54. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts +6 -3
  55. package/dist/shared/modules/dynamic/components/fields/storybook/Card.stories.d.ts.map +1 -1
  56. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts +6 -3
  57. package/dist/shared/modules/dynamic/components/fields/storybook/Checkbox.stories.d.ts.map +1 -1
  58. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts +6 -3
  59. package/dist/shared/modules/dynamic/components/fields/storybook/ContentField.stories.d.ts.map +1 -1
  60. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts +6 -3
  61. package/dist/shared/modules/dynamic/components/fields/storybook/EditorField.stories.d.ts.map +1 -1
  62. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts +6 -3
  63. package/dist/shared/modules/dynamic/components/fields/storybook/Fieldset.stories.d.ts.map +1 -1
  64. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts +6 -3
  65. package/dist/shared/modules/dynamic/components/fields/storybook/GalleryField.stories.d.ts.map +1 -1
  66. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts +6 -3
  67. package/dist/shared/modules/dynamic/components/fields/storybook/ImageField.stories.d.ts.map +1 -1
  68. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts +15 -3
  69. package/dist/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.d.ts.map +1 -1
  70. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts +15 -3
  71. package/dist/shared/modules/dynamic/components/fields/storybook/InputField.stories.d.ts.map +1 -1
  72. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts +15 -3
  73. package/dist/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.d.ts.map +1 -1
  74. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts +6 -3
  75. package/dist/shared/modules/dynamic/components/fields/storybook/RadioButtonGroup.stories.d.ts.map +1 -1
  76. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts +6 -3
  77. package/dist/shared/modules/dynamic/components/fields/storybook/RatingField.stories.d.ts.map +1 -1
  78. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts +15 -3
  79. package/dist/shared/modules/dynamic/components/fields/storybook/SelectField.stories.d.ts.map +1 -1
  80. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts +6 -3
  81. package/dist/shared/modules/dynamic/components/fields/storybook/StatusField.stories.d.ts.map +1 -1
  82. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts +6 -3
  83. package/dist/shared/modules/dynamic/components/fields/storybook/TextareaField.stories.d.ts.map +1 -1
  84. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts +6 -3
  85. package/dist/shared/modules/dynamic/components/fields/storybook/VideoField.stories.d.ts.map +1 -1
  86. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts +6 -3
  87. package/dist/shared/modules/dynamic/components/fields/storybook/pages/DynamicRender.d.ts.map +1 -1
  88. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts +1 -1
  89. package/dist/shared/modules/dynamic/composables/useToolbarReducer/index.d.ts.map +1 -1
  90. package/dist/shared/modules/dynamic/factories/types/index.d.ts +1 -1
  91. package/dist/shared/modules/dynamic/factories/types/index.d.ts.map +1 -1
  92. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts +2 -1
  93. package/dist/shared/modules/dynamic/pages/dynamic-blade-form.vue.d.ts.map +1 -1
  94. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts +2 -1
  95. package/dist/shared/modules/dynamic/pages/dynamic-blade-list.vue.d.ts.map +1 -1
  96. package/dist/shared/modules/dynamic/types/index.d.ts +27 -3
  97. package/dist/shared/modules/dynamic/types/index.d.ts.map +1 -1
  98. package/dist/tsconfig.tsbuildinfo +1 -1
  99. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts +6 -0
  100. package/dist/ui/components/atoms/vc-card/vc-card.stories.d.ts.map +1 -1
  101. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts +6 -0
  102. package/dist/ui/components/molecules/vc-input/vc-input.stories.d.ts.map +1 -1
  103. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts +3 -0
  104. package/dist/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  105. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts +6 -0
  106. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.stories.d.ts.map +1 -1
  107. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts +3 -0
  108. package/dist/ui/components/molecules/vc-input-currency/vc-input-currency.vue.d.ts.map +1 -1
  109. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.stories.d.ts +42 -42
  110. package/dist/ui/components/molecules/vc-multivalue/vc-multivalue.vue.d.ts +6 -6
  111. package/dist/ui/components/molecules/vc-select/vc-select.stories.d.ts +60 -60
  112. package/dist/ui/components/molecules/vc-select/vc-select.vue.d.ts +6 -6
  113. 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
  114. 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
  115. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts +8 -0
  116. package/dist/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue.d.ts.map +1 -1
  117. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts +105 -0
  118. package/dist/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  119. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts +21 -0
  120. package/dist/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  121. package/package.json +4 -4
  122. package/shared/modules/dynamic/components/fields/InputCurrency.ts +4 -1
  123. package/shared/modules/dynamic/components/fields/InputField.ts +5 -1
  124. package/shared/modules/dynamic/components/fields/MultivalueField.ts +4 -1
  125. package/shared/modules/dynamic/components/fields/SelectField.ts +4 -1
  126. package/shared/modules/dynamic/components/fields/Table.ts +21 -4
  127. package/shared/modules/dynamic/components/fields/storybook/InputCurrency.stories.ts +14 -0
  128. package/shared/modules/dynamic/components/fields/storybook/InputField.stories.ts +14 -0
  129. package/shared/modules/dynamic/components/fields/storybook/MultivalueField.stories.ts +14 -0
  130. package/shared/modules/dynamic/components/fields/storybook/SelectField.stories.ts +13 -0
  131. package/shared/modules/dynamic/composables/useToolbarReducer/index.ts +30 -17
  132. package/shared/modules/dynamic/factories/types/index.ts +4 -1
  133. package/shared/modules/dynamic/pages/dynamic-blade-list.vue +3 -1
  134. package/shared/modules/dynamic/types/index.ts +34 -9
  135. package/ui/components/molecules/vc-input/vc-input.vue +7 -3
  136. package/ui/components/molecules/vc-input-currency/vc-input-currency.vue +7 -0
  137. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/_internal/vc-blade-toolbar-button/vc-blade-toolbar-button.vue +5 -1
  138. package/ui/components/organisms/vc-blade/_internal/vc-blade-toolbar/vc-blade-toolbar.vue +1 -0
  139. package/ui/components/organisms/vc-table/_internal/vc-table-cell/vc-table-cell.vue +17 -5
  140. package/ui/components/organisms/vc-table/vc-table.vue +3 -1
@@ -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() {
@@ -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 {
@@ -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
 
@@ -156,6 +156,14 @@ export interface ListContentSchema {
156
156
  alwaysVisible?: boolean;
157
157
  type?: string;
158
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
+ };
159
167
  visible?:
160
168
  | boolean
161
169
  | {
@@ -166,14 +174,15 @@ export interface ListContentSchema {
166
174
  // TODO Add to documentation
167
175
  selectAll?: boolean;
168
176
  // TODO Add to documentation
169
- actions?: (ToolbarSchema & {
170
- position: "right" | "left";
171
- type: "danger" | "success";
172
- 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
+ };
173
184
  method: string;
174
- };
175
- method: string;
176
- })[];
185
+ })[];
177
186
  mobileTemplate?: {
178
187
  component: string;
179
188
  };
@@ -332,6 +341,10 @@ export interface SelectSchema extends SchemaBase {
332
341
  * @type {boolean}
333
342
  */
334
343
  multiple?: boolean;
344
+ /**
345
+ * Text below control.
346
+ */
347
+ hint?: string;
335
348
  }
336
349
 
337
350
  export interface MultivalueSchema extends SchemaBase {
@@ -376,6 +389,10 @@ export interface MultivalueSchema extends SchemaBase {
376
389
  customTemplate?: {
377
390
  component: string;
378
391
  };
392
+ /**
393
+ * Text below control.
394
+ */
395
+ hint?: string;
379
396
  }
380
397
 
381
398
  export interface TextareaSchema extends SchemaBase {
@@ -441,6 +458,10 @@ export interface InputSchema extends SchemaBase {
441
458
  * @type {number}
442
459
  */
443
460
  maxlength?: number;
461
+ /**
462
+ * Text below control.
463
+ */
464
+ hint?: string;
444
465
  }
445
466
 
446
467
  /**
@@ -623,6 +644,10 @@ export interface InputCurrencySchema extends Omit<SchemaBase, "multilanguage"> {
623
644
  * @type {boolean}
624
645
  */
625
646
  clearable?: boolean;
647
+ /**
648
+ * Text below control.
649
+ */
650
+ hint?: string;
626
651
  }
627
652
 
628
653
  /**
@@ -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">
@@ -30,6 +30,7 @@
30
30
  class="tw-w-full"
31
31
  type="number"
32
32
  @update:model-value="updateModel"
33
+ @blur="handleBlur"
33
34
  >
34
35
  <template #append-inner>
35
36
  <slot
@@ -56,6 +57,7 @@
56
57
  type="text"
57
58
  :disabled="disabled"
58
59
  :placeholder="holder"
60
+ @blur="handleBlur"
59
61
  />
60
62
  </template>
61
63
  <template
@@ -192,6 +194,7 @@ export interface Emits {
192
194
  (event: "update:model-value", value: string | number | null): void;
193
195
  (event: "update:option", value: unknown): void;
194
196
  (event: "change", value: string | number | null): void;
197
+ (event: "blur", value: Event): void;
195
198
  }
196
199
 
197
200
  const props = withDefaults(defineProps<Props>(), {
@@ -270,4 +273,8 @@ function updateModel(value: string | number | Date | null | undefined) {
270
273
  numberValue.value = value as number | null;
271
274
  emit("update:model-value", value as number);
272
275
  }
276
+
277
+ function handleBlur(event: Event) {
278
+ emit("blur", event);
279
+ }
273
280
  </script>
@@ -1,7 +1,10 @@
1
1
  <template>
2
2
  <div
3
3
  class="vc-blade-toolbar-button"
4
- :class="{ 'vc-blade-toolbar-button_disabled': disabled || isWaiting }"
4
+ :class="{
5
+ 'vc-blade-toolbar-button_disabled': disabled || isWaiting,
6
+ 'tw-border-l tw-border-solid tw-border-[color:#eef0f2]': separator === 'left',
7
+ }"
5
8
  :title="title"
6
9
  @click="onClick"
7
10
  >
@@ -60,6 +63,7 @@ export interface Props {
60
63
  disabled?: boolean;
61
64
  dropdownItems?: IBladeDropdownItem[];
62
65
  clickHandler?(): void;
66
+ separator?: "left" | "right" | "both";
63
67
  }
64
68
 
65
69
  export interface Emits {
@@ -15,6 +15,7 @@
15
15
  :icon="item.icon"
16
16
  :title="unref(item.title)"
17
17
  :disabled="item.disabled as boolean"
18
+ :separator="item.separator"
18
19
  :dropdown-items="item.dropdownItems"
19
20
  :click-handler="item.clickHandler"
20
21
  />
@@ -23,13 +23,14 @@
23
23
  class="tw-w-full"
24
24
  :error="errors.length > 0"
25
25
  @update:model-value="$emit('update', { field: cell.id, value: $event })"
26
+ @blur="onBlur({ row: index, field: cell.id, errors })"
26
27
  >
27
28
  <template
28
29
  v-if="errors.length > 0"
29
30
  #append-inner
30
31
  >
31
32
  <VcTooltip placement="bottom-end">
32
- <VcIcon icon="fa fa-info-circle tw-text-[color:var(--error-color)]"></VcIcon>
33
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
33
34
  <template #tooltip>
34
35
  <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
35
36
  </template>
@@ -160,13 +161,14 @@
160
161
  type="number"
161
162
  :error="errors.length > 0"
162
163
  @update:model-value="$emit('update', { field: cell.id, value: $event })"
164
+ @blur="onBlur({ row: index, field: cell.id, errors })"
163
165
  >
164
166
  <template
165
167
  v-if="errors.length > 0"
166
168
  #append-inner
167
169
  >
168
170
  <VcTooltip placement="bottom-end">
169
- <VcIcon icon="fa fa-info-circle tw-text-[color:var(--error-color)]"></VcIcon>
171
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
170
172
  <template #tooltip>
171
173
  <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
172
174
  </template>
@@ -217,13 +219,14 @@
217
219
  class="tw-w-full"
218
220
  :error="errors.length > 0"
219
221
  @update:model-value="$emit('update', { field: cell.id, value: $event })"
222
+ @blur="onBlur({ row: index, field: cell.id, errors })"
220
223
  >
221
224
  <template
222
225
  v-if="errors.length > 0"
223
226
  #append-inner
224
227
  >
225
228
  <VcTooltip placement="bottom-end">
226
- <VcIcon icon="fa fa-info-circle tw-text-[color:var(--error-color)]"></VcIcon>
229
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
227
230
  <template #tooltip>
228
231
  <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
229
232
  </template>
@@ -239,6 +242,7 @@
239
242
  </div>
240
243
  </template>
241
244
 
245
+ <!-- eslint-disable @typescript-eslint/no-explicit-any -->
242
246
  <script lang="ts" setup>
243
247
  import { computed } from "vue";
244
248
  import moment from "moment";
@@ -259,9 +263,10 @@ export interface Props {
259
263
  }
260
264
 
261
265
  const props = defineProps<Props>();
262
- defineEmits<{
263
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
266
+
267
+ const emit = defineEmits<{
264
268
  (event: "update", payload: { field: string; value: any }): void;
269
+ (event: "blur", payload: { row: number | undefined; field: string }): void;
265
270
  }>();
266
271
 
267
272
  const locale = window.navigator.language;
@@ -292,6 +297,13 @@ function intlMoney(value: number) {
292
297
  currency: (props.item[currencyProp] as string) || "USD",
293
298
  }).format(value);
294
299
  }
300
+
301
+ function onBlur(args: { row: number | undefined; field: string; errors?: string[] }) {
302
+ if (args.errors && args.errors.length > 0) {
303
+ return;
304
+ }
305
+ emit("blur", { row: args.row, field: args.field });
306
+ }
295
307
  </script>
296
308
 
297
309
  <style lang="scss">
@@ -374,6 +374,7 @@
374
374
  )
375
375
  "
376
376
  @update="$emit('onEditComplete', { event: $event, index: itemIndex })"
377
+ @blur="$emit('onCellBlur', $event)"
377
378
  ></VcTableCell>
378
379
  </slot>
379
380
  </td>
@@ -625,6 +626,7 @@ const emit = defineEmits<{
625
626
  onEditComplete: [args: { event: { field: string; value: string | number }; index: number }];
626
627
  onAddNewRow: [];
627
628
  onRowRemove: [args: { index: number }];
629
+ onCellBlur: [args: { row: number | undefined; field: string }];
628
630
  }>();
629
631
 
630
632
  const { t } = useI18n({ useScope: "global" });
@@ -1188,7 +1190,7 @@ function restoreState() {
1188
1190
  if (state.value && state.value.length) {
1189
1191
  // Iterate over the state value and update corresponding columns in allColumns
1190
1192
  for (const item of state.value) {
1191
- const matchingColumn = allColumns.value.find((col) => col.id === item.id);
1193
+ const matchingColumn = _.cloneDeep(allColumns.value.find((col) => col.id === item.id));
1192
1194
  if (matchingColumn) {
1193
1195
  matchingColumn.width = item.width || matchingColumn.width;
1194
1196
  matchingColumn.visible = item.visible;