@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
@@ -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
@@ -45,6 +46,10 @@
45
46
  </button>
46
47
  </template>
47
48
  </slot>
49
+ <slot
50
+ v-if="$slots['append-inner']"
51
+ name="append-inner"
52
+ ></slot>
48
53
  </template>
49
54
  <template #control="{ placeholder: holder }">
50
55
  <input
@@ -52,8 +57,27 @@
52
57
  type="text"
53
58
  :disabled="disabled"
54
59
  :placeholder="holder"
60
+ @blur="handleBlur"
55
61
  />
56
62
  </template>
63
+ <template
64
+ v-if="$slots['prepend-inner']"
65
+ #prepend-inner
66
+ >
67
+ <slot name="prepend-inner"></slot>
68
+ </template>
69
+ <template
70
+ v-if="$slots['append']"
71
+ #append
72
+ >
73
+ <slot name="append"></slot>
74
+ </template>
75
+ <template
76
+ v-if="$slots['prepend']"
77
+ #prepend
78
+ >
79
+ <slot name="prepend"></slot>
80
+ </template>
57
81
  </VcInput>
58
82
  </template>
59
83
  </VcSelect>
@@ -170,6 +194,7 @@ export interface Emits {
170
194
  (event: "update:model-value", value: string | number | null): void;
171
195
  (event: "update:option", value: unknown): void;
172
196
  (event: "change", value: string | number | null): void;
197
+ (event: "blur", value: Event): void;
173
198
  }
174
199
 
175
200
  const props = withDefaults(defineProps<Props>(), {
@@ -188,11 +213,27 @@ defineSlots<{
188
213
  toggleHandler: () => void;
189
214
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
215
  }) => any;
216
+ /**
217
+ * Slot for custom append-inner content
218
+ */
219
+ "append-inner": void;
220
+ /**
221
+ * Slot for custom prepend-inner content
222
+ */
223
+ "prepend-inner": void;
224
+ /**
225
+ * Slot for custom append content
226
+ */
227
+ append: void;
228
+ /**
229
+ * Slot for custom prepend content
230
+ */
231
+ prepend: void;
191
232
  }>();
192
233
 
193
234
  const emit = defineEmits<Emits>();
194
235
 
195
- const { inputRef, setOptions, numberValue } = useCurrencyInput(
236
+ const { inputRef, setOptions, numberValue, setValue } = useCurrencyInput(
196
237
  {
197
238
  locale: navigator.language,
198
239
  currency: props.option || "USD",
@@ -216,6 +257,13 @@ watch(
216
257
  },
217
258
  );
218
259
 
260
+ watch(
261
+ () => props.modelValue,
262
+ (value) => {
263
+ setValue(value as number | null);
264
+ },
265
+ );
266
+
219
267
  watch(numberValue, (value) => {
220
268
  emit("update:model-value", value);
221
269
  });
@@ -225,4 +273,8 @@ function updateModel(value: string | number | Date | null | undefined) {
225
273
  numberValue.value = value as number | null;
226
274
  emit("update:model-value", value as number);
227
275
  }
276
+
277
+ function handleBlur(event: Event) {
278
+ emit("blur", event);
279
+ }
228
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
  />
@@ -162,6 +162,7 @@
162
162
  :placeholder="computedProperty.placeholder"
163
163
  :disabled="disabled"
164
164
  :loading="loading"
165
+ clearable
165
166
  ></VcInput
166
167
  ></template>
167
168
  <template v-else-if="computedProperty.valueType === 'LongText'">
@@ -0,0 +1,46 @@
1
+ o
2
+ <template>
3
+ <tr v-if="editing && addNewRowButton">
4
+ <td>
5
+ <div class="tw-p-3">
6
+ <VcButton
7
+ v-if="addNewRowButton.show"
8
+ text
9
+ @click="$emit('onAddNewRow')"
10
+ >
11
+ <div class="tw-flex tw-flex-row tw-gap-2 tw-items-center">
12
+ <VcIcon
13
+ icon="fas fa-plus"
14
+ size="m"
15
+ class="tw-text-[#41afe6]"
16
+ />
17
+ {{ unref(addNewRowButton.title) }}
18
+ </div>
19
+ </VcButton>
20
+ </div>
21
+ </td>
22
+ </tr>
23
+ </template>
24
+
25
+ <script lang="ts" setup>
26
+ import { unref } from "vue";
27
+ export interface Props {
28
+ editing: boolean | undefined;
29
+ addNewRowButton:
30
+ | {
31
+ show: boolean;
32
+ title: string;
33
+ }
34
+ | undefined;
35
+ }
36
+
37
+ export interface Emits {
38
+ (event: "onAddNewRow"): void;
39
+ }
40
+
41
+ defineProps<Props>();
42
+
43
+ defineEmits<Emits>();
44
+ </script>
45
+
46
+ <style lang="scss" scoped></style>
@@ -7,21 +7,43 @@
7
7
  class="tw-truncate"
8
8
  :class="cell.class"
9
9
  >
10
- <template v-if="cellEditActive">
11
- <VcInputCurrency
10
+ <template v-if="isEditable">
11
+ <Field
12
+ v-slot="{ errors, errorMessage }"
13
+ :label="cell.title as string"
14
+ :name="`${cell.id}_${index}`"
12
15
  :model-value="value"
13
- :options="[]"
14
- :option="(item[cell.currencyField || 'currency'] as string) || 'USD'"
15
- currency-display="symbol"
16
- class="tw-w-full"
17
- @update:model-value="$emit('update', { field: cell.id, value: $event })"
18
- />
16
+ :rules="cell.rules"
17
+ >
18
+ <VcInputCurrency
19
+ :model-value="value"
20
+ :options="[]"
21
+ :option="(item[cell.currencyField || 'currency'] as string) || 'USD'"
22
+ currency-display="symbol"
23
+ class="tw-w-full"
24
+ :error="errors.length > 0"
25
+ @update:model-value="$emit('update', { field: cell.id, value: $event })"
26
+ @blur="onBlur({ row: index, field: cell.id, errors })"
27
+ >
28
+ <template
29
+ v-if="errors.length > 0"
30
+ #append-inner
31
+ >
32
+ <VcTooltip placement="bottom-end">
33
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
34
+ <template #tooltip>
35
+ <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
36
+ </template>
37
+ </VcTooltip>
38
+ </template>
39
+ </VcInputCurrency>
40
+ </Field>
19
41
  </template>
20
42
  <template v-else>
21
43
  <span class="tw-truncate">{{ intlMoney(Number(value)) }}</span>
22
44
  </template>
23
45
  </div>
24
- <template v-else-if="!cellEditActive">
46
+ <template v-else-if="!isEditable">
25
47
  <div
26
48
  class="tw-truncate"
27
49
  :class="cell.class"
@@ -125,13 +147,35 @@
125
147
  class="tw-text-right tw-truncate"
126
148
  :class="cell.class"
127
149
  >
128
- <template v-if="cellEditActive">
129
- <VcInput
150
+ <template v-if="isEditable">
151
+ <Field
152
+ v-slot="{ errors, errorMessage }"
153
+ :label="cell.title as string"
154
+ :name="`${cell.id}_${index}`"
130
155
  :model-value="value"
131
- class="tw-w-full"
132
- type="number"
133
- @update:model-value="$emit('update', { field: cell.id, value: $event })"
134
- ></VcInput>
156
+ :rules="cell.rules"
157
+ >
158
+ <VcInput
159
+ :model-value="value"
160
+ class="tw-w-full"
161
+ type="number"
162
+ :error="errors.length > 0"
163
+ @update:model-value="$emit('update', { field: cell.id, value: $event })"
164
+ @blur="onBlur({ row: index, field: cell.id, errors })"
165
+ >
166
+ <template
167
+ v-if="errors.length > 0"
168
+ #append-inner
169
+ >
170
+ <VcTooltip placement="bottom-end">
171
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
172
+ <template #tooltip>
173
+ <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
174
+ </template>
175
+ </VcTooltip>
176
+ </template>
177
+ </VcInput>
178
+ </Field>
135
179
  </template>
136
180
  <template v-else>
137
181
  {{ typeof Number(value) === "number" && Number(value) >= 0 ? Number(value).toFixed(0) : "N/A" }}
@@ -162,12 +206,34 @@
162
206
  class="tw-truncate"
163
207
  :class="cell.class"
164
208
  >
165
- <template v-if="cellEditActive">
166
- <VcInput
209
+ <template v-if="isEditable">
210
+ <Field
211
+ v-slot="{ errors, errorMessage }"
212
+ :label="cell.title as string"
213
+ :name="`${cell.id}_${index}`"
167
214
  :model-value="value"
168
- class="tw-w-full"
169
- @update:model-value="$emit('update', { field: cell.id, value: $event })"
170
- ></VcInput>
215
+ :rules="cell.rules"
216
+ >
217
+ <VcInput
218
+ :model-value="value"
219
+ class="tw-w-full"
220
+ :error="errors.length > 0"
221
+ @update:model-value="$emit('update', { field: cell.id, value: $event })"
222
+ @blur="onBlur({ row: index, field: cell.id, errors })"
223
+ >
224
+ <template
225
+ v-if="errors.length > 0"
226
+ #append-inner
227
+ >
228
+ <VcTooltip placement="bottom-end">
229
+ <VcIcon icon="fas fa-exclamation-circle tw-text-[color:var(--error-color)]"></VcIcon>
230
+ <template #tooltip>
231
+ <div class="tw-text-[color:var(--error-color)]">{{ errorMessage }}</div>
232
+ </template>
233
+ </VcTooltip>
234
+ </template></VcInput
235
+ >
236
+ </Field>
171
237
  </template>
172
238
  <template v-else>
173
239
  {{ value }}
@@ -176,6 +242,7 @@
176
242
  </div>
177
243
  </template>
178
244
 
245
+ <!-- eslint-disable @typescript-eslint/no-explicit-any -->
179
246
  <script lang="ts" setup>
180
247
  import { computed } from "vue";
181
248
  import moment from "moment";
@@ -185,18 +252,21 @@ import htmlTruncate from "truncate-html";
185
252
  import * as DOMPurify from "dompurify";
186
253
  import VcInputCurrency from "../../../../molecules/vc-input-currency/vc-input-currency.vue";
187
254
  import VcInput from "../../../../molecules/vc-input/vc-input.vue";
255
+ import { Field } from "vee-validate";
188
256
 
189
257
  export interface Props {
190
258
  cell: ITableColumns;
191
259
  item: Record<string, unknown>;
192
260
  width?: number;
193
- cellEditActive?: boolean;
261
+ editing?: boolean;
262
+ index?: number;
194
263
  }
195
264
 
196
265
  const props = defineProps<Props>();
197
- defineEmits<{
198
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
266
+
267
+ const emit = defineEmits<{
199
268
  (event: "update", payload: { field: string; value: any }): void;
269
+ (event: "blur", payload: { row: number | undefined; field: string }): void;
200
270
  }>();
201
271
 
202
272
  const locale = window.navigator.language;
@@ -204,6 +274,8 @@ const locale = window.navigator.language;
204
274
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
205
275
  const value = computed((): any => _.get(props.item, props.cell.field || props.cell.id));
206
276
 
277
+ const isEditable = computed(() => props.cell.editable && props.editing);
278
+
207
279
  const sanitizedHtml = computed(() => {
208
280
  if (props.cell.type === "html") {
209
281
  return DOMPurify.default.sanitize(value.value as string, { USE_PROFILES: { html: true } });
@@ -225,4 +297,17 @@ function intlMoney(value: number) {
225
297
  currency: (props.item[currencyProp] as string) || "USD",
226
298
  }).format(value);
227
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
+ }
228
307
  </script>
308
+
309
+ <style lang="scss">
310
+ :root {
311
+ --error-color: #f14e4e;
312
+ }
313
+ </style>
@@ -41,7 +41,7 @@
41
41
  </template>
42
42
 
43
43
  <script lang="ts" setup>
44
- import { ref, computed, toRefs, watch } from "vue";
44
+ import { ref, computed, watch } from "vue";
45
45
  import { ITableColumns } from "./../../../../../../core/types";
46
46
  import { vOnClickOutside } from "@vueuse/components";
47
47
  import { useFloating, flip, shift, autoUpdate } from "@floating-ui/vue";
@@ -91,7 +91,11 @@ watch(
91
91
  );
92
92
 
93
93
  function selectItem(item: ITableColumns) {
94
- emit("change", toggleVisibility(item));
94
+ const numberVisible = internalItems.value.filter((i: ITableColumns) => i.visible).length;
95
+
96
+ if (numberVisible > 1 || !item.visible) {
97
+ emit("change", toggleVisibility(item));
98
+ }
95
99
  }
96
100
 
97
101
  function toggleVisibility(item: ITableColumns) {