@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
@@ -1,14 +1,11 @@
1
1
  <template>
2
2
  <div
3
3
  v-loading="unref(loading) || columnsInit"
4
- class="tw-relative tw-overflow-hidden tw-flex tw-flex-col tw-grow"
4
+ class="tw-relative tw-overflow-hidden tw-flex tw-flex-col tw-grow tw-basis-0 tw-border tw-border-[color:#eef0f2] tw-border-solid tw-border-t-0"
5
5
  >
6
6
  <!-- Header slot with filter and searchbar -->
7
7
  <slot
8
- v-if="
9
- ($slots['header'] || header) &&
10
- ((items && items.length && !columnsInit) || searchValue || searchValue === '' || activeFilterCount)
11
- "
8
+ v-if="($slots['header'] || header) && (!columnsInit || searchValue || searchValue === '' || activeFilterCount)"
12
9
  name="header"
13
10
  >
14
11
  <div class="tw-shrink-0 tw-flex tw-items-center tw-justify-between tw-p-4">
@@ -61,7 +58,6 @@
61
58
  <div class="tw-flex tw-relative tw-overflow-hidden tw-grow">
62
59
  <!-- Table scroll container -->
63
60
  <VcContainer
64
- v-if="items && items.length && !columnsInit"
65
61
  ref="scrollContainer"
66
62
  :no-padding="true"
67
63
  class="tw-grow tw-basis-0 tw-relative"
@@ -96,15 +92,15 @@
96
92
  <table
97
93
  v-else
98
94
  ref="tableRef"
99
- class="[border-spacing:0] tw-border-collapse tw-relative tw-pt-[43px] tw-table-fixed tw-box-border tw-w-full"
95
+ class="[border-spacing:0] tw-border-collapse tw-relative tw-pt-[43px] tw-table-fixed tw-box-border tw-w-full tw-h-full"
100
96
  :class="{
101
97
  'vc-table_empty': !items || !items.length,
102
98
  'vc-table_multiselect': multiselect,
103
99
  }"
104
100
  >
105
101
  <thead
106
- v-if="filteredCols"
107
- class="vc-table__header tw-relative"
102
+ v-if="filteredCols.length"
103
+ class="vc-table__header tw-sticky tw-top-0 tw-bg-[#f9f9f9] tw-z-[1] tw-box-border"
108
104
  @mouseenter="handleHeaderMouseOver(true)"
109
105
  @mouseleave="handleHeaderMouseOver(false)"
110
106
  >
@@ -155,6 +151,11 @@
155
151
  :class="item.align ? tableAlignment[item.align as keyof typeof tableAlignment] : ''"
156
152
  >
157
153
  <div class="tw-truncate">
154
+ <span
155
+ v-if="editing && item.rules?.required"
156
+ class="tw-text-[color:var(--label-required-color)] tw-mr-1"
157
+ >*</span
158
+ >
158
159
  <slot :name="`header_${item.id}`">{{ item.title }}</slot>
159
160
  </div>
160
161
  <div
@@ -201,7 +202,15 @@
201
202
  @on-active="handleColumnSwitcher"
202
203
  ></VcTableColumnSwitcher>
203
204
  </div>
205
+ <th
206
+ v-if="editing && removeRowButton"
207
+ width="90px"
208
+ class="tw-w-[90px] tw-h-[42px] tw-bg-[#f9f9f9] !tw-border-0 tw-shadow-[inset_0px_1px_0px_#eaedf3,_inset_0px_-1px_0px_#eaedf3] tw-box-border tw-sticky tw-top-0 tw-select-none tw-overflow-hidden tw-z-[1]"
209
+ >
210
+ {{ $t("COMPONENTS.ORGANISMS.VC_TABLE.ACTIONS") }}
211
+ </th>
204
212
  </tr>
213
+
205
214
  <div
206
215
  ref="resizer"
207
216
  class="tw-w-px tw-absolute tw-z-10 tw-hidden tw-h-full tw-bg-[#e5e7eb] tw-cursor-col-resize"
@@ -236,8 +245,8 @@
236
245
  </div>
237
246
  </div>
238
247
  <tbody
239
- v-if="items"
240
- class="vc-table__body"
248
+ v-if="items && items.length && !columnsInit"
249
+ class="vc-table__body tw-block tw-overflow-auto"
241
250
  :class="{ 'tw-translate-y-[60px]': selectAll && showSelectionChoice }"
242
251
  >
243
252
  <tr
@@ -342,7 +351,7 @@
342
351
  :class="[
343
352
  cell.class,
344
353
  {
345
- 'last:tw-w-full': cell.id === filteredCols[filteredCols.length - 1].id,
354
+ // 'last:tw-w-full': cell.id === filteredCols[filteredCols.length - 1].id,
346
355
  },
347
356
  ]"
348
357
  :style="{ maxWidth: cell.width, width: cell.width }"
@@ -351,69 +360,125 @@
351
360
  :name="`item_${cell.id}`"
352
361
  :item="item"
353
362
  :cell="cell"
363
+ :index="itemIndex"
354
364
  >
355
365
  <VcTableCell
356
366
  v-if="typeof item === 'object'"
357
367
  :cell="cell"
358
368
  :item="item"
359
- :cell-edit-active="cellEditActive"
369
+ :editing="editing"
370
+ :index="itemIndex"
360
371
  :width="
361
372
  calculateElWidth(
362
373
  `${(typeof item === 'object' && 'id' in item && item.id) || itemIndex}_${cell.id}`,
363
374
  )
364
375
  "
365
376
  @update="$emit('onEditComplete', { event: $event, index: itemIndex })"
377
+ @blur="$emit('onCellBlur', $event)"
366
378
  ></VcTableCell>
367
379
  </slot>
368
380
  </td>
381
+ <td
382
+ v-if="editing && removeRowButton"
383
+ class="tw-box-border tw-overflow-hidden tw-px-3 tw-w-[90px]"
384
+ width="90px"
385
+ >
386
+ <div class="tw-w-full tw-flex tw-justify-center tw-items-center">
387
+ <div
388
+ class="tw-h-[26px] tw-w-[26px] tw-inline-flex tw-items-center tw-justify-center tw-outline-none"
389
+ @click="
390
+ $emit('onRowRemove', {
391
+ index: itemIndex,
392
+ })
393
+ "
394
+ >
395
+ <svg
396
+ width="12"
397
+ height="12"
398
+ viewBox="0 0 12 12"
399
+ fill="none"
400
+ xmlns="http://www.w3.org/2000/svg"
401
+ >
402
+ <path
403
+ d="M7.27173 5.99939L11.1499 2.12967C11.3198 1.95981 11.4152 1.72943 11.4152 1.48922C11.4152 1.24901 11.3198 1.01863 11.1499 0.848777C10.9801 0.67892 10.7497 0.583496 10.5096 0.583496C10.2694 0.583496 10.0391 0.67892 9.86922 0.848777L6.00004 4.72752L2.13086 0.848777C1.96103 0.67892 1.73069 0.583496 1.49051 0.583496C1.25033 0.583496 1.01999 0.67892 0.850156 0.848777C0.680324 1.01863 0.584913 1.24901 0.584913 1.48922C0.584913 1.72943 0.680324 1.95981 0.850156 2.12967L4.72835 5.99939L0.850156 9.86912C0.765622 9.95298 0.698526 10.0527 0.652737 10.1627C0.606948 10.2726 0.583374 10.3905 0.583374 10.5096C0.583374 10.6286 0.606948 10.7465 0.652737 10.8565C0.698526 10.9664 0.765622 11.0662 0.850156 11.15C0.934 11.2346 1.03375 11.3017 1.14366 11.3475C1.25356 11.3933 1.37145 11.4168 1.49051 11.4168C1.60957 11.4168 1.72746 11.3933 1.83736 11.3475C1.94727 11.3017 2.04702 11.2346 2.13086 11.15L6.00004 7.27126L9.86922 11.15C9.95306 11.2346 10.0528 11.3017 10.1627 11.3475C10.2726 11.3933 10.3905 11.4168 10.5096 11.4168C10.6286 11.4168 10.7465 11.3933 10.8564 11.3475C10.9663 11.3017 11.0661 11.2346 11.1499 11.15C11.2345 11.0662 11.3016 10.9664 11.3473 10.8565C11.3931 10.7465 11.4167 10.6286 11.4167 10.5096C11.4167 10.3905 11.3931 10.2726 11.3473 10.1627C11.3016 10.0527 11.2345 9.95298 11.1499 9.86912L7.27173 5.99939Z"
404
+ fill="#6E8BA5"
405
+ />
406
+ </svg>
407
+ </div>
408
+ </div>
409
+ </td>
369
410
  </tr>
411
+ <VcTableAddNew
412
+ :editing="editing"
413
+ :add-new-row-button="addNewRowButton"
414
+ @on-add-new-row="$emit('onAddNewRow')"
415
+ />
416
+ </tbody>
417
+ <tbody
418
+ v-else
419
+ class="tw-table tw-overflow-auto tw-h-[calc(100%-42px)]"
420
+ >
421
+ <tr class="tw-h-full">
422
+ <th :colspan="colspan">
423
+ <!-- Empty table view -->
424
+ <template v-if="!(items && items.length && !columnsInit)">
425
+ <div>
426
+ <slot
427
+ v-if="searchValue || searchValue === '' || activeFilterCount"
428
+ name="notfound"
429
+ >
430
+ <div
431
+ class="tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center"
432
+ >
433
+ <img
434
+ v-if="notfound?.image"
435
+ :src="notfound.image"
436
+ />
437
+ <div class="tw-m-4 vc-table__empty-text">
438
+ {{ notfound?.text || t("COMPONENTS.ORGANISMS.VC_TABLE.NOT_FOUND") }}
439
+ </div>
440
+ <VcButton
441
+ v-if="notfound?.action"
442
+ @click="notfound?.clickHandler"
443
+ >
444
+ {{ notfound.action }}
445
+ </VcButton>
446
+ </div>
447
+ </slot>
448
+ <slot
449
+ v-else
450
+ name="empty"
451
+ >
452
+ <div
453
+ class="tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center"
454
+ >
455
+ <img
456
+ v-if="empty?.image"
457
+ :src="empty.image"
458
+ />
459
+ <div class="tw-m-4 tw-text-xl tw-font-medium">
460
+ {{ empty?.text || t("COMPONENTS.ORGANISMS.VC_TABLE.EMPTY") }}
461
+ </div>
462
+ <VcButton
463
+ v-if="empty?.action"
464
+ @click="empty?.clickHandler"
465
+ >
466
+ {{ empty.action }}
467
+ </VcButton>
468
+ </div>
469
+ </slot>
470
+ </div>
471
+ </template>
472
+ </th>
473
+ </tr>
474
+ <VcTableAddNew
475
+ :editing="editing"
476
+ :add-new-row-button="addNewRowButton"
477
+ @on-add-new-row="$emit('onAddNewRow')"
478
+ />
370
479
  </tbody>
371
480
  </table>
372
481
  </VcContainer>
373
-
374
- <!-- Empty table view -->
375
- <template v-else>
376
- <slot
377
- v-if="searchValue || searchValue === '' || activeFilterCount"
378
- name="notfound"
379
- >
380
- <div class="tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center">
381
- <img
382
- v-if="notfound?.image"
383
- :src="notfound.image"
384
- />
385
- <div class="tw-m-4 vc-table__empty-text">
386
- {{ notfound?.text || t("COMPONENTS.ORGANISMS.VC_TABLE.NOT_FOUND") }}
387
- </div>
388
- <VcButton
389
- v-if="notfound?.action"
390
- @click="notfound?.clickHandler"
391
- >
392
- {{ notfound.action }}
393
- </VcButton>
394
- </div>
395
- </slot>
396
- <slot
397
- v-else
398
- name="empty"
399
- >
400
- <div class="tw-w-full tw-h-full tw-box-border tw-flex tw-flex-col tw-items-center tw-justify-center">
401
- <img
402
- v-if="empty?.image"
403
- :src="empty.image"
404
- />
405
- <div class="tw-m-4 tw-text-xl tw-font-medium">
406
- {{ empty?.text || t("COMPONENTS.ORGANISMS.VC_TABLE.EMPTY") }}
407
- </div>
408
- <VcButton
409
- v-if="empty?.action"
410
- @click="empty?.clickHandler"
411
- >
412
- {{ empty.action }}
413
- </VcButton>
414
- </div>
415
- </slot>
416
- </template>
417
482
  </div>
418
483
 
419
484
  <!-- Table footer -->
@@ -470,6 +535,7 @@ import VcTableMobileItem from "./_internal/vc-table-mobile-item/vc-table-mobile-
470
535
  import * as _ from "lodash-es";
471
536
  import "core-js/actual/array/to-spliced";
472
537
  import "core-js/actual/array/to-sorted";
538
+ import VcTableAddNew from "./_internal/vc-table-add-new/vc-table-add-new.vue";
473
539
 
474
540
  export interface StatusImage {
475
541
  image?: string;
@@ -488,7 +554,7 @@ defineSlots<{
488
554
  filters: (args: { closePanel: () => void }) => any;
489
555
  "mobile-item": (args: { item: T }) => any;
490
556
  [key: `header_${string}`]: (props: any) => any;
491
- [key: `item_${string}`]: (args: { item: T; cell: ITableColumns }) => any;
557
+ [key: `item_${string}`]: (args: { item: T; cell: ITableColumns; index: number }) => any;
492
558
  notfound: (props: any) => any;
493
559
  empty: (props: any) => any;
494
560
  footer: (props: any) => any;
@@ -522,7 +588,12 @@ const props = withDefaults(
522
588
  stateKey: string;
523
589
  selectAll?: boolean;
524
590
  enableItemActions?: boolean;
525
- cellEditActive?: boolean;
591
+ editing?: boolean;
592
+ addNewRowButton?: {
593
+ show: boolean;
594
+ title: string;
595
+ };
596
+ removeRowButton?: boolean;
526
597
  }>(),
527
598
  {
528
599
  items: () => [],
@@ -553,6 +624,9 @@ const emit = defineEmits<{
553
624
  "row:reorder": [args: { dragIndex: number; dropIndex: number; value: T[] }];
554
625
  "select:all": [values: boolean];
555
626
  onEditComplete: [args: { event: { field: string; value: string | number }; index: number }];
627
+ onAddNewRow: [];
628
+ onRowRemove: [args: { index: number }];
629
+ onCellBlur: [args: { row: number | undefined; field: string }];
556
630
  }>();
557
631
 
558
632
  const { t } = useI18n({ useScope: "global" });
@@ -610,6 +684,10 @@ onBeforeUpdate(() => {
610
684
  tooltipRefs.value = [];
611
685
  });
612
686
 
687
+ const colspan = computed(() => {
688
+ return filteredCols.value.length + (props.multiselect ? 1 : 0) + (props.enableItemActions ? 1 : 0);
689
+ });
690
+
613
691
  const sortDirection = computed(() => {
614
692
  const entry = props.sort?.split(":");
615
693
  return entry && entry.length === 2 && entry[1];
@@ -645,8 +723,9 @@ const mobileTemplateRenderer = ({ item }: { item: TableItem }) => {
645
723
  watch(
646
724
  () => props.items,
647
725
  (newVal) => {
726
+ let cols: ITableColumns[] = [];
648
727
  if (newVal && newVal.length) {
649
- const cols = Object.keys(newVal[0]).map((key) => {
728
+ cols = Object.keys(newVal[0]).map((key) => {
650
729
  return {
651
730
  id: key,
652
731
  // From camelCase to human readable with first letter capitalized
@@ -655,16 +734,16 @@ watch(
655
734
  predefined: false,
656
735
  };
657
736
  });
737
+ }
658
738
 
659
- const predefined = props.columns.map((item) => ({
660
- ...item,
661
- predefined: true,
662
- visible: typeof item.visible !== "undefined" ? item.visible : true,
663
- }));
664
- allColumns.value = _.unionBy(predefined, cols, "id");
739
+ const predefined = props.columns.map((item) => ({
740
+ ...item,
741
+ predefined: true,
742
+ visible: typeof item.visible !== "undefined" ? item.visible : true,
743
+ }));
744
+ allColumns.value = _.unionBy(predefined, cols, "id");
665
745
 
666
- restoreState();
667
- }
746
+ restoreState();
668
747
  columnsInit.value = false;
669
748
  },
670
749
  { deep: true, immediate: true },
@@ -692,7 +771,7 @@ const tableAlignment = {
692
771
 
693
772
  const headerCheckbox = computed({
694
773
  get() {
695
- return props.items ? selection.value.length === props.items.length : false;
774
+ return props.items && props.items.length ? selection.value.length === props.items.length : false;
696
775
  },
697
776
  set(checked: boolean) {
698
777
  let _selected: T[] = [];
@@ -1111,7 +1190,7 @@ function restoreState() {
1111
1190
  if (state.value && state.value.length) {
1112
1191
  // Iterate over the state value and update corresponding columns in allColumns
1113
1192
  for (const item of state.value) {
1114
- const matchingColumn = allColumns.value.find((col) => col.id === item.id);
1193
+ const matchingColumn = _.cloneDeep(allColumns.value.find((col) => col.id === item.id));
1115
1194
  if (matchingColumn) {
1116
1195
  matchingColumn.width = item.width || matchingColumn.width;
1117
1196
  matchingColumn.visible = item.visible;
@@ -1315,4 +1394,11 @@ $variants: (
1315
1394
  @apply tw-shadow-[inset_0_2px_0_0_var(--row-drag-color)];
1316
1395
  }
1317
1396
  }
1397
+
1398
+ thead,
1399
+ tbody tr {
1400
+ display: table;
1401
+ width: 100%;
1402
+ table-layout: fixed;
1403
+ }
1318
1404
  </style>