@vc-shell/framework 1.0.57 → 1.0.60

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 (173) hide show
  1. package/core/composables/index.ts +0 -1
  2. package/core/composables/useNotifications/index.ts +2 -2
  3. package/core/composables/usePermissions/index.ts +1 -1
  4. package/core/composables/useSettings/index.ts +2 -2
  5. package/core/composables/useUser/index.ts +2 -2
  6. package/core/plugins/validation/rules.ts +67 -24
  7. package/core/types/index.ts +19 -2
  8. package/dist/framework.mjs +2816 -5023
  9. package/dist/index.css +1 -1
  10. package/dist/types/core/composables/index.d.ts +0 -1
  11. package/dist/types/core/composables/index.d.ts.map +1 -1
  12. package/dist/types/core/composables/useNotifications/index.d.ts +1 -1
  13. package/dist/types/core/composables/useNotifications/index.d.ts.map +1 -1
  14. package/dist/types/core/composables/useUser/index.d.ts +2 -2
  15. package/dist/types/core/composables/useUser/index.d.ts.map +1 -1
  16. package/dist/types/core/plugins/validation/rules.d.ts +8 -30
  17. package/dist/types/core/plugins/validation/rules.d.ts.map +1 -1
  18. package/dist/types/core/types/index.d.ts +17 -2
  19. package/dist/types/core/types/index.d.ts.map +1 -1
  20. package/dist/types/index.d.ts.map +1 -1
  21. package/dist/types/shared/components/app-switcher/components/index.d.ts.map +1 -0
  22. package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.d.ts +5 -5
  23. package/dist/types/shared/components/app-switcher/components/vc-app-switcher/index.d.ts.map +1 -0
  24. package/dist/types/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue.d.ts +1 -1
  25. package/dist/types/shared/components/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +1 -0
  26. package/dist/types/shared/components/app-switcher/composables/index.d.ts.map +1 -0
  27. package/dist/types/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.d.ts +1 -1
  28. package/dist/types/shared/components/app-switcher/composables/useAppSwitcher/index.d.ts.map +1 -0
  29. package/dist/types/shared/components/app-switcher/index.d.ts.map +1 -0
  30. package/dist/types/shared/components/blade-navigation/components/index.d.ts.map +1 -0
  31. package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/index.d.ts.map +1 -0
  32. package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts +1 -1
  33. package/dist/types/shared/components/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +1 -0
  34. package/dist/types/shared/components/blade-navigation/composables/index.d.ts.map +1 -0
  35. package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.d.ts +1 -1
  36. package/dist/types/shared/components/blade-navigation/composables/useBladeNavigation/index.d.ts.map +1 -0
  37. package/dist/types/shared/components/blade-navigation/index.d.ts.map +1 -0
  38. package/dist/types/shared/{blade-navigation → components/blade-navigation}/types/index.d.ts +1 -1
  39. package/dist/types/shared/components/blade-navigation/types/index.d.ts.map +1 -0
  40. package/dist/types/shared/index.d.ts +4 -3
  41. package/dist/types/shared/index.d.ts.map +1 -1
  42. package/dist/types/shared/{assets → modules/assets}/components/assets-details/assets-details.vue.d.ts +5 -13
  43. package/dist/types/shared/modules/assets/components/assets-details/assets-details.vue.d.ts.map +1 -0
  44. package/dist/types/shared/{assets → modules/assets}/components/assets-details/index.d.ts +8 -7
  45. package/dist/types/shared/modules/assets/components/assets-details/index.d.ts.map +1 -0
  46. package/dist/types/shared/modules/assets/components/index.d.ts.map +1 -0
  47. package/dist/types/shared/modules/assets/index.d.ts.map +1 -0
  48. package/dist/types/shared/modules/assets/locales/index.d.ts +3 -0
  49. package/dist/types/shared/modules/assets/locales/index.d.ts.map +1 -0
  50. package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts +58 -0
  51. package/dist/types/shared/modules/assets-manager/components/assets-manager/assets-manager.vue.d.ts.map +1 -0
  52. package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts +59 -0
  53. package/dist/types/shared/modules/assets-manager/components/assets-manager/index.d.ts.map +1 -0
  54. package/dist/types/shared/modules/assets-manager/components/index.d.ts +2 -0
  55. package/dist/types/shared/modules/assets-manager/components/index.d.ts.map +1 -0
  56. package/dist/types/shared/modules/assets-manager/index.d.ts +12 -0
  57. package/dist/types/shared/modules/assets-manager/index.d.ts.map +1 -0
  58. package/dist/types/shared/modules/assets-manager/locales/index.d.ts.map +1 -0
  59. package/dist/types/shared/utilities/assets.d.ts +5 -0
  60. package/dist/types/shared/utilities/assets.d.ts.map +1 -0
  61. package/dist/types/ui/components/atoms/vc-checkbox/vc-checkbox.vue.d.ts.map +1 -1
  62. package/dist/types/ui/components/molecules/vc-editor/vc-editor.vue.d.ts.map +1 -1
  63. package/dist/types/ui/components/molecules/vc-file-upload/index.d.ts +12 -12
  64. package/dist/types/ui/components/molecules/vc-file-upload/vc-file-upload.vue.d.ts.map +1 -1
  65. package/dist/types/ui/components/molecules/vc-input/index.d.ts +0 -4
  66. package/dist/types/ui/components/molecules/vc-input/index.d.ts.map +1 -1
  67. package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts +1 -1
  68. package/dist/types/ui/components/molecules/vc-input/vc-input.vue.d.ts.map +1 -1
  69. package/dist/types/ui/components/molecules/vc-select/index.d.ts +24 -0
  70. package/dist/types/ui/components/molecules/vc-select/index.d.ts.map +1 -1
  71. package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts +20 -0
  72. package/dist/types/ui/components/molecules/vc-select/vc-select.vue.d.ts.map +1 -1
  73. package/dist/types/ui/components/molecules/vc-textarea/index.d.ts +0 -4
  74. package/dist/types/ui/components/molecules/vc-textarea/index.d.ts.map +1 -1
  75. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts +0 -4
  76. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.stories.d.ts.map +1 -1
  77. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts +1 -1
  78. package/dist/types/ui/components/molecules/vc-textarea/vc-textarea.vue.d.ts.map +1 -1
  79. package/dist/types/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue.d.ts.map +1 -1
  80. package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts +2 -19
  81. package/dist/types/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue.d.ts.map +1 -1
  82. package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts +12 -0
  83. package/dist/types/ui/components/organisms/vc-dynamic-property/index.d.ts.map +1 -1
  84. package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts +7 -0
  85. package/dist/types/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue.d.ts.map +1 -1
  86. package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts +2 -20
  87. package/dist/types/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue.d.ts.map +1 -1
  88. package/dist/types/ui/components/organisms/vc-gallery/index.d.ts +28 -31
  89. package/dist/types/ui/components/organisms/vc-gallery/index.d.ts.map +1 -1
  90. package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts +2 -6
  91. package/dist/types/ui/components/organisms/vc-gallery/vc-gallery.vue.d.ts.map +1 -1
  92. package/dist/types/ui/components/organisms/vc-table/index.d.ts +49 -37
  93. package/dist/types/ui/components/organisms/vc-table/index.d.ts.map +1 -1
  94. package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts +49 -37
  95. package/dist/types/ui/components/organisms/vc-table/vc-table.stories.d.ts.map +1 -1
  96. package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts +12 -7
  97. package/dist/types/ui/components/organisms/vc-table/vc-table.vue.d.ts.map +1 -1
  98. package/package.json +5 -6
  99. package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/vc-app-switcher.vue +1 -1
  100. package/shared/{app-switcher → components/app-switcher}/composables/useAppSwitcher/index.ts +2 -2
  101. package/shared/{app-switcher → components/app-switcher}/index.ts +1 -1
  102. package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/vc-blade-navigation.vue +2 -2
  103. package/shared/{blade-navigation → components/blade-navigation}/composables/useBladeNavigation/index.ts +6 -5
  104. package/shared/{blade-navigation → components/blade-navigation}/index.ts +1 -1
  105. package/shared/{blade-navigation → components/blade-navigation}/types/index.ts +1 -1
  106. package/shared/index.ts +10 -7
  107. package/shared/modules/assets/components/assets-details/assets-details.vue +204 -0
  108. package/shared/{assets → modules/assets}/index.ts +1 -1
  109. package/shared/{assets → modules/assets}/locales/en.json +7 -5
  110. package/shared/modules/assets/locales/index.ts +2 -0
  111. package/shared/modules/assets-manager/components/assets-manager/assets-manager.vue +389 -0
  112. package/shared/modules/assets-manager/components/assets-manager/index.ts +3 -0
  113. package/shared/modules/assets-manager/components/index.ts +1 -0
  114. package/shared/modules/assets-manager/index.ts +14 -0
  115. package/shared/modules/assets-manager/locales/en.json +28 -0
  116. package/shared/utilities/assets.ts +40 -0
  117. package/tailwind.config.js +0 -2
  118. package/ui/components/atoms/vc-button/vc-button.vue +0 -1
  119. package/ui/components/atoms/vc-checkbox/vc-checkbox.vue +1 -11
  120. package/ui/components/molecules/vc-editor/vc-editor.vue +21 -0
  121. package/ui/components/molecules/vc-file-upload/vc-file-upload.vue +1 -0
  122. package/ui/components/molecules/vc-input/vc-input.vue +1 -1
  123. package/ui/components/molecules/vc-select/vc-select.vue +40 -9
  124. package/ui/components/molecules/vc-textarea/vc-textarea.vue +1 -1
  125. package/ui/components/organisms/vc-app/_internal/vc-app-bar/vc-app-bar.vue +3 -2
  126. package/ui/components/organisms/vc-app/_internal/vc-app-menu/_internal/vc-app-menu-item/vc-app-menu-item.vue +3 -6
  127. package/ui/components/organisms/vc-blade/_internal/vc-blade-header/vc-blade-header.vue +2 -6
  128. package/ui/components/organisms/vc-dynamic-property/index.ts +0 -1
  129. package/ui/components/organisms/vc-dynamic-property/vc-dynamic-property.vue +18 -1
  130. package/ui/components/organisms/vc-gallery/_internal/vc-gallery-item/vc-gallery-item.vue +5 -11
  131. package/ui/components/organisms/vc-gallery/vc-gallery.vue +164 -49
  132. package/ui/components/organisms/vc-table/vc-table.vue +189 -144
  133. package/core/composables/useAutosave/index.ts +0 -55
  134. package/dist/types/core/composables/useAutosave/index.d.ts +0 -9
  135. package/dist/types/core/composables/useAutosave/index.d.ts.map +0 -1
  136. package/dist/types/shared/app-switcher/components/index.d.ts.map +0 -1
  137. package/dist/types/shared/app-switcher/components/vc-app-switcher/index.d.ts.map +0 -1
  138. package/dist/types/shared/app-switcher/components/vc-app-switcher/vc-app-switcher.vue.d.ts.map +0 -1
  139. package/dist/types/shared/app-switcher/composables/index.d.ts.map +0 -1
  140. package/dist/types/shared/app-switcher/composables/useAppSwitcher/index.d.ts.map +0 -1
  141. package/dist/types/shared/app-switcher/index.d.ts.map +0 -1
  142. package/dist/types/shared/assets/components/assets-details/assets-details.vue.d.ts.map +0 -1
  143. package/dist/types/shared/assets/components/assets-details/index.d.ts.map +0 -1
  144. package/dist/types/shared/assets/components/index.d.ts.map +0 -1
  145. package/dist/types/shared/assets/index.d.ts.map +0 -1
  146. package/dist/types/shared/assets/locales/index.d.ts.map +0 -1
  147. package/dist/types/shared/blade-navigation/components/index.d.ts.map +0 -1
  148. package/dist/types/shared/blade-navigation/components/vc-blade-navigation/index.d.ts.map +0 -1
  149. package/dist/types/shared/blade-navigation/components/vc-blade-navigation/vc-blade-navigation.vue.d.ts.map +0 -1
  150. package/dist/types/shared/blade-navigation/composables/index.d.ts.map +0 -1
  151. package/dist/types/shared/blade-navigation/composables/useBladeNavigation/index.d.ts.map +0 -1
  152. package/dist/types/shared/blade-navigation/index.d.ts.map +0 -1
  153. package/dist/types/shared/blade-navigation/types/index.d.ts.map +0 -1
  154. package/shared/assets/components/assets-details/assets-details.vue +0 -116
  155. /package/dist/types/shared/{app-switcher → components/app-switcher}/components/index.d.ts +0 -0
  156. /package/dist/types/shared/{app-switcher → components/app-switcher}/composables/index.d.ts +0 -0
  157. /package/dist/types/shared/{app-switcher → components/app-switcher}/index.d.ts +0 -0
  158. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/index.d.ts +0 -0
  159. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.d.ts +0 -0
  160. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/composables/index.d.ts +0 -0
  161. /package/dist/types/shared/{blade-navigation → components/blade-navigation}/index.d.ts +0 -0
  162. /package/dist/types/shared/{assets → modules/assets}/components/index.d.ts +0 -0
  163. /package/dist/types/shared/{assets → modules/assets}/index.d.ts +0 -0
  164. /package/dist/types/shared/{assets → modules/assets-manager}/locales/index.d.ts +0 -0
  165. /package/shared/{app-switcher → components/app-switcher}/components/index.ts +0 -0
  166. /package/shared/{app-switcher → components/app-switcher}/components/vc-app-switcher/index.ts +0 -0
  167. /package/shared/{app-switcher → components/app-switcher}/composables/index.ts +0 -0
  168. /package/shared/{blade-navigation → components/blade-navigation}/components/index.ts +0 -0
  169. /package/shared/{blade-navigation → components/blade-navigation}/components/vc-blade-navigation/index.ts +0 -0
  170. /package/shared/{blade-navigation → components/blade-navigation}/composables/index.ts +0 -0
  171. /package/shared/{assets → modules/assets}/components/assets-details/index.ts +0 -0
  172. /package/shared/{assets → modules/assets}/components/index.ts +0 -0
  173. /package/shared/{assets → modules/assets-manager}/locales/index.ts +0 -0
@@ -91,7 +91,8 @@
91
91
  <!-- Desktop table view -->
92
92
  <table
93
93
  v-else
94
- class="[border-spacing:0] tw-border-collapse tw-relative tw-pt-[43px] tw-table-fixed tw-box-border tw-w-full tw-relative"
94
+ ref="tableRef"
95
+ class="[border-spacing:0] tw-border-collapse tw-relative tw-pt-[43px] tw-table-fixed tw-box-border tw-w-full"
95
96
  :class="{
96
97
  'vc-table_empty': !items || !items.length,
97
98
  'vc-table_multiselect': multiselect,
@@ -99,17 +100,16 @@
99
100
  >
100
101
  <thead
101
102
  v-if="filteredCols"
102
- class="vc-table__header"
103
+ class="vc-table__header tw-relative"
103
104
  >
104
105
  <tr class="vc-table__header-row">
105
106
  <th
106
107
  v-if="multiselect"
107
- class="tw-h-[42px] tw-w-[50px] tw-max-w-[50px] tw-min-w-[50px] 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]"
108
+ class="tw-h-[42px] tw-w-[50px] tw-max-w-[28px] tw-min-w-[28px] 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]"
108
109
  >
109
110
  <div class="tw-flex tw-justify-center tw-items-center">
110
111
  <VcCheckbox
111
- :modelValue="headerCheckbox"
112
- @update:modelValue="processHeaderCheckbox"
112
+ v-model="headerCheckbox"
113
113
  @click.stop
114
114
  ></VcCheckbox>
115
115
  </div>
@@ -118,7 +118,7 @@
118
118
  </div>
119
119
  </th>
120
120
  <th
121
- class="tw-h-[42px] tw-w-[44px] tw-max-w-[44px] tw-min-w-[44px] tw-bg-[#f9f9f9] tw-m-w-[70px] !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-z-[1]"
121
+ class="tw-h-[42px] tw-w-[21px] tw-max-w-[21px] tw-min-w-[21px] tw-bg-[#f9f9f9] tw-m-w-[70px] !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-z-[1]"
122
122
  v-if="itemActionBuilder"
123
123
  >
124
124
  <div class="tw-w-3 tw-top-0 tw-bottom-0 tw-absolute tw-right-0 tw-flex tw-justify-end">
@@ -194,7 +194,11 @@
194
194
  </tr>
195
195
  <div
196
196
  ref="resizer"
197
- class="tw-w-[1px] tw-absolute tw-z-10 tw-hidden tw-h-full tw-bg-[#e5e7eb] tw-cursor-col-resize"
197
+ class="tw-w-px tw-absolute tw-z-10 tw-hidden tw-h-full tw-bg-[#e5e7eb] tw-cursor-col-resize"
198
+ ></div>
199
+ <div
200
+ ref="reorderRef"
201
+ class="tw-w-0.5 tw-bg-[#41afe6] tw-h-full tw-absolute tw-top-0 tw-bottom-0 tw-z-[2] tw-hidden"
198
202
  ></div>
199
203
  </thead>
200
204
 
@@ -203,11 +207,11 @@
203
207
  class="vc-table__body"
204
208
  >
205
209
  <tr
206
- v-for="(item, i) in calculatedItems"
207
- :key="(typeof item === 'object' && 'id' in item && item.id) || i"
210
+ v-for="(item, itemIndex) in items"
211
+ :key="(typeof item === 'object' && 'id' in item && item.id) || itemIndex"
208
212
  class="vc-table__body-row tw-h-[60px] tw-bg-white hover:tw-bg-[#dfeef9] tw-cursor-pointer"
209
213
  :class="{
210
- 'tw-bg-[#f8f8f8]': i % 2 === 1,
214
+ '!tw-bg-[#F9F9F9]': itemIndex % 2 === 1,
211
215
  '!tw-bg-[#dfeef9] hover:tw-bg-[#dfeef9]':
212
216
  typeof item === 'object' && 'id' in item && item.id ? selectedItemId === item.id : false,
213
217
  }"
@@ -222,27 +226,31 @@
222
226
  >
223
227
  <td
224
228
  v-if="multiselect && typeof item === 'object'"
225
- class="tw-w-[50px] tw-max-w-[50px] tw-min-w-[50px]"
229
+ class="tw-w-[50px] tw-max-w-[28px] tw-min-w-[28px] tw-relative"
230
+ @click.stop
226
231
  >
227
232
  <div class="tw-flex tw-justify-center tw-items-center">
228
233
  <VcCheckbox
229
- :modelValue="checkboxes[item.id]"
230
- @update:modelValue="processCheckbox(item.id, $event)"
231
- @click.stop
234
+ @update:model-value="rowCheckbox(item)"
235
+ :model-value="isSelected(item)"
232
236
  ></VcCheckbox>
233
237
  </div>
238
+ <div class="tw-w-px tw-top-0 tw-bottom-0 tw-absolute tw-right-0 tw-bg-[#e5e7eb]"></div>
234
239
  </td>
235
240
  <td
236
- class="tw-box-border tw-overflow-visible tw-px-3 tw-w-[44px] tw-max-w-[44px] tw-min-w-[44px]"
241
+ class="tw-box-border tw-overflow-visible tw-w-[21px] tw-max-w-[21px] tw-min-w-[21px] tw-relative"
237
242
  v-if="itemActionBuilder && typeof item === 'object'"
243
+ @click.stop
238
244
  >
239
- <div class="vc-table__body-actions-container tw-relative tw-flex tw-justify-center tw-items-center">
245
+ <div
246
+ class="vc-table__body-actions-container tw-relative tw-flex tw-justify-center tw-items-center tw-group"
247
+ >
240
248
  <button
241
- class="tw-text-[#41afe6] tw-cursor-pointer tw-border-none tw-bg-transparent disabled:tw-text-[gray] tw-w-5 hover:tw-text-[#319ed4]"
249
+ class="tw-text-[#41afe6] tw-cursor-pointer tw-border-none tw-bg-transparent disabled:tw-text-[gray] tw-w-full group-hover:tw-text-[#319ed4]"
242
250
  @click.stop="showActions(item, item.id)"
243
251
  :ref="(el: Element) => setActionToggleRefs(el, item.id)"
244
252
  aria-describedby="tooltip"
245
- :disabled="!(item.actions && item.actions.length)"
253
+ :disabled="!(itemActions[itemIndex] && itemActions[itemIndex].length)"
246
254
  >
247
255
  <VcIcon
248
256
  icon="fas fa-ellipsis-v"
@@ -257,10 +265,10 @@
257
265
  role="tooltip"
258
266
  >
259
267
  <div
260
- class="tw-flex tw-items-center tw-flex-row tw-text-[#3f3f3f] tw-font-normal not-italic tw-text-base tw-leading-[20px] tw-gap-[25px]"
268
+ class="tw-flex tw-items-start tw-flex-col tw-text-[#3f3f3f] tw-font-normal not-italic tw-text-base tw-leading-[20px] tw-gap-[25px]"
261
269
  >
262
270
  <div
263
- v-for="(itemAction, i) in item.actions"
271
+ v-for="(itemAction, i) in itemActions[itemIndex]"
264
272
  :key="i"
265
273
  :class="[
266
274
  'tw-flex tw-flex-row tw-items-center tw-text-[#319ed4] tw-cursor-pointer',
@@ -285,11 +293,12 @@
285
293
  ></div>
286
294
  </div>
287
295
  </div>
296
+ <div class="tw-w-px tw-top-0 tw-bottom-0 tw-absolute tw-right-0 tw-bg-[#e5e7eb]"></div>
288
297
  </td>
289
298
  <td
290
299
  v-for="cell in filteredCols"
291
- :key="`${(typeof item === 'object' && 'id' in item && item.id) || i}_${cell.id}`"
292
- class="tw-box-border tw-overflow-hidden tw-px-3"
300
+ :key="`${(typeof item === 'object' && 'id' in item && item.id) || itemIndex}_${cell.id}`"
301
+ class="tw-box-border tw-overflow-hidden tw-px-3 tw-truncate"
293
302
  :class="cell.class"
294
303
  :style="{ maxWidth: cell.width, width: cell.width }"
295
304
  >
@@ -387,7 +396,7 @@
387
396
  </template>
388
397
 
389
398
  <script lang="ts" setup>
390
- import { computed, nextTick, ref, watch, onBeforeUpdate, onBeforeUnmount, Ref } from "vue";
399
+ import { computed, nextTick, ref, watch, onBeforeUpdate, onBeforeUnmount, Ref, onUpdated, onBeforeMount } from "vue";
391
400
  import VcTableCounter from "./_internal/vc-table-counter/vc-table-counter.vue";
392
401
  import VcTableFilter from "./_internal/vc-table-filter/vc-table-filter.vue";
393
402
  import VcTableMobileItem from "./_internal/vc-table-mobile-item/vc-table-mobile-item.vue";
@@ -395,7 +404,7 @@ import VcTableCell from "./_internal/vc-table-cell/vc-table-cell.vue";
395
404
  import VcTableColumnSwitcher from "./_internal/vc-table-column-switcher/vc-table-column-switcher.vue";
396
405
  import { createPopper, Instance } from "@popperjs/core";
397
406
  import { IActionBuilderResult, ITableColumns } from "./../../../../core/types";
398
- import { useLocalStorage, computedAsync, useCurrentElement } from "@vueuse/core";
407
+ import { useLocalStorage, useCurrentElement } from "@vueuse/core";
399
408
  import VcContainer from "./../../atoms/vc-container/vc-container.vue";
400
409
 
401
410
  export interface StatusImage {
@@ -420,6 +429,11 @@ export interface Props {
420
429
  itemActionBuilder?: (item: TableItem) => IActionBuilderResult[];
421
430
  sort?: string;
422
431
  multiselect?: boolean;
432
+ /**
433
+ * Emit whole item instead of {id: boolean} while prop multiselect = true
434
+ * @default false
435
+ */
436
+ multiselectEmitItem?: boolean;
423
437
  expanded?: boolean;
424
438
  totalLabel?: string;
425
439
  totalCount?: number;
@@ -443,10 +457,10 @@ export interface Props {
443
457
 
444
458
  export interface Emits {
445
459
  (event: "paginationClick", page: number): void;
446
- (event: "selectionChanged", values: Record<string, boolean>): void;
460
+ (event: "selectionChanged", values: TableItemType[]): void;
447
461
  (event: "search:change", value: string): void;
448
462
  (event: "headerClick", value: Record<string, unknown>): void;
449
- (event: "itemClick", item: TableItem): void;
463
+ (event: "itemClick", item: TableItemType): void;
450
464
  (event: "scroll:ptr"): void;
451
465
  (event: "row:reorder", args: { dragIndex: number; dropIndex: number; value: TableItemType[] }): void;
452
466
  }
@@ -479,26 +493,35 @@ interface ITableItemRef {
479
493
 
480
494
  const emit = defineEmits<Emits>();
481
495
 
482
- const checkboxes = ref<Record<string, boolean>>({});
496
+ // template refs
497
+ const tooltipRefs = ref<ITableItemRef[]>([]);
498
+ const reorderRef = ref<HTMLElement | null>();
499
+ const tableRef = ref<HTMLElement | null>();
500
+
501
+ // event listeners
502
+ let columnResizeListener = null;
503
+ let columnResizeEndListener = null;
504
+
505
+ const selection = ref<TableItemType[]>([]);
506
+
483
507
  const selectedRow = ref<string>();
484
508
  const tooltip = ref<Instance>();
485
509
  const scrollContainer = ref<typeof VcContainer>();
486
510
  const actionToggleRefs = ref<ITableItemRef[]>([]);
487
- const tooltipRefs = ref<ITableItemRef[]>([]);
511
+
512
+ const itemActions = ref<IActionBuilderResult[][]>([]);
488
513
  const mobileSwipeItem = ref<string>();
489
514
  const columnResizing = ref(false);
490
515
  const resizeColumnElement = ref<ITableColumns>();
491
516
  const nextColumn = ref<ITableColumns>();
492
517
  const lastResize = ref<number>();
493
518
  const table = useCurrentElement();
494
- const columnResizeListener = ref(null);
495
- const columnResizeEndListener = ref(null);
496
519
  const resizer = ref();
497
- const state = useLocalStorage(props.stateKey, []);
520
+ const state = useLocalStorage("VC_TABLE_STATE_" + props.stateKey.toUpperCase(), []);
498
521
  const defaultColumns: Ref<ITableColumns[]> = ref([]);
499
522
  const draggedColumn = ref();
523
+ const draggedElement = ref<HTMLElement>();
500
524
  const dropPosition = ref();
501
- const calculatedItems = computedAsync(async () => await populateWithActions(props.items), []);
502
525
 
503
526
  // row reordering variables
504
527
  const draggedRow = ref<TableItemType>();
@@ -506,13 +529,25 @@ const rowDragged = ref(false);
506
529
  const droppedRowIndex = ref<number>();
507
530
  const draggedRowIndex = ref<number>();
508
531
 
532
+ onBeforeMount(() => {
533
+ if (isStateful()) {
534
+ restoreState();
535
+ }
536
+ });
537
+
538
+ onBeforeUnmount(() => {
539
+ unbindColumnResizeEvents();
540
+ });
541
+
509
542
  onBeforeUpdate(() => {
510
543
  actionToggleRefs.value = [];
511
544
  tooltipRefs.value = [];
512
545
  });
513
546
 
514
- onBeforeUnmount(() => {
515
- unbindColumnResizeEvents();
547
+ onUpdated(() => {
548
+ if (isStateful()) {
549
+ saveState();
550
+ }
516
551
  });
517
552
 
518
553
  const sortDirection = computed(() => {
@@ -540,12 +575,19 @@ const tableAlignment = {
540
575
  evenly: "tw-justify-evenly",
541
576
  };
542
577
 
543
- const headerCheckbox = computed(() => {
544
- const checkboxList = Object.values(checkboxes.value);
578
+ const headerCheckbox = computed({
579
+ get() {
580
+ return props.items ? selection.value.length === props.items.length : false;
581
+ },
582
+ set(checked: boolean) {
583
+ let _selected = [];
584
+
585
+ if (checked) {
586
+ _selected = props.items;
587
+ }
545
588
 
546
- if (checkboxList.length) {
547
- return checkboxList.every((value) => value);
548
- } else return false;
589
+ selection.value = _selected;
590
+ },
549
591
  });
550
592
 
551
593
  const filteredCols = computed(() => {
@@ -558,25 +600,27 @@ const filteredCols = computed(() => {
558
600
 
559
601
  watch(
560
602
  () => props.items,
561
- async (value: TableItemType[]) => {
562
- checkboxes.value = {};
563
- value?.forEach((item) => {
564
- if (typeof item === "object" && "id" in item) {
565
- checkboxes.value[item.id] = false;
566
- }
567
- });
603
+ (newVal) => {
568
604
  scrollContainer.value?.scrollTop();
605
+
606
+ calculateActions(newVal);
607
+
608
+ selection.value = selection.value.filter((selection) => newVal.includes(selection));
569
609
  },
570
610
  { deep: true, immediate: true }
571
611
  );
572
612
 
573
613
  watch(
574
- () => props.columns,
614
+ () => selection.value,
575
615
  (newVal) => {
576
- if (isStateful()) {
577
- nextTick(() => restoreState());
578
- }
616
+ emit("selectionChanged", newVal);
617
+ },
618
+ { deep: true }
619
+ );
579
620
 
621
+ watch(
622
+ () => props.columns,
623
+ (newVal) => {
580
624
  if (!defaultColumns.value.length) {
581
625
  defaultColumns.value = newVal;
582
626
  }
@@ -584,27 +628,17 @@ watch(
584
628
  { deep: true, immediate: true }
585
629
  );
586
630
 
587
- async function populateWithActions(value: TableItemType[]): Promise<TableItemType[]> {
588
- const populatedItems = [];
589
-
590
- if (value && typeof value === "object") {
591
- if (props.itemActionBuilder && typeof props.itemActionBuilder === "function") {
592
- for (let index = 0; index < value.length; index++) {
593
- const element = value[index] as Record<string, unknown>;
594
-
595
- if (!("actions" in element && element.actions))
596
- populatedItems.push({
597
- actions: await calculateActions(element),
598
- ...element,
599
- });
600
- }
631
+ function isSelected(item: TableItemType) {
632
+ return selection.value.indexOf(item) > -1;
633
+ }
601
634
 
602
- return populatedItems;
603
- } else {
604
- return props.items;
605
- }
635
+ function rowCheckbox(item: TableItemType) {
636
+ const clear = item;
637
+ const index = selection.value.indexOf(clear);
638
+ if (index > -1) {
639
+ selection.value = selection.value.filter((x) => x !== clear);
606
640
  } else {
607
- return props.items;
641
+ selection.value.push(clear);
608
642
  }
609
643
  }
610
644
 
@@ -626,17 +660,6 @@ function setActionToggleRefs(el: Element, id: string) {
626
660
  }
627
661
  }
628
662
 
629
- function processHeaderCheckbox() {
630
- const currentState = Object.values(checkboxes.value).every((value) => value);
631
- Object.keys(checkboxes.value).forEach((key) => (checkboxes.value[key] = !currentState));
632
- emit("selectionChanged", checkboxes.value);
633
- }
634
-
635
- function processCheckbox(id: string, state: boolean) {
636
- checkboxes.value[id] = state;
637
- emit("selectionChanged", checkboxes.value);
638
- }
639
-
640
663
  function showActions(item: TableItem, index: string) {
641
664
  selectedRow.value = item.id;
642
665
 
@@ -661,9 +684,16 @@ function showActions(item: TableItem, index: string) {
661
684
  }
662
685
  }
663
686
 
664
- async function calculateActions(item: TableItem) {
687
+ async function calculateActions(items: TableItemType[]) {
665
688
  if (typeof props.itemActionBuilder === "function") {
666
- return await props.itemActionBuilder(item);
689
+ let populatedItems = [];
690
+ for (let index = 0; index < items.length; index++) {
691
+ if (typeof items[index] === "object") {
692
+ const elementWithActions = await props.itemActionBuilder(items[index] as TableItem);
693
+ populatedItems.push(elementWithActions);
694
+ }
695
+ }
696
+ itemActions.value = populatedItems;
667
697
  }
668
698
  }
669
699
 
@@ -690,15 +720,15 @@ function handleMouseDown(e: MouseEvent, item: ITableColumns) {
690
720
  }
691
721
 
692
722
  function bindColumnResizeEvents() {
693
- if (!columnResizeListener.value) {
694
- columnResizeListener.value = document.addEventListener("mousemove", (event: MouseEvent) => {
723
+ if (!columnResizeListener) {
724
+ columnResizeListener = document.addEventListener("mousemove", (event: MouseEvent) => {
695
725
  if (columnResizing.value) {
696
726
  onColumnResize(event);
697
727
  }
698
728
  });
699
729
  }
700
- if (!columnResizeEndListener.value) {
701
- columnResizeEndListener.value = document.addEventListener("mouseup", () => {
730
+ if (!columnResizeEndListener) {
731
+ columnResizeEndListener = document.addEventListener("mouseup", () => {
702
732
  if (columnResizing.value) {
703
733
  columnResizing.value = false;
704
734
  onColumnResizeEnd();
@@ -708,13 +738,13 @@ function bindColumnResizeEvents() {
708
738
  }
709
739
 
710
740
  function unbindColumnResizeEvents() {
711
- if (columnResizeListener.value) {
712
- document.removeEventListener("document", columnResizeListener.value);
713
- columnResizeListener.value = null;
741
+ if (columnResizeListener) {
742
+ document.removeEventListener("document", columnResizeListener);
743
+ columnResizeListener = null;
714
744
  }
715
- if (columnResizeEndListener.value) {
716
- document.removeEventListener("document", columnResizeEndListener.value);
717
- columnResizeEndListener.value = null;
745
+ if (columnResizeEndListener) {
746
+ document.removeEventListener("document", columnResizeEndListener);
747
+ columnResizeEndListener = null;
718
748
  }
719
749
  }
720
750
 
@@ -784,6 +814,7 @@ function onColumnHeaderDragStart(event: DragEvent, item: ITableColumns) {
784
814
  }
785
815
 
786
816
  draggedColumn.value = item;
817
+ draggedElement.value = event.target as HTMLElement;
787
818
  event.dataTransfer.setData("text", "reorder");
788
819
  }
789
820
 
@@ -807,16 +838,25 @@ function onColumnHeaderDragOver(event: DragEvent) {
807
838
 
808
839
  if (props.reorderableColumns && draggedColumn.value && dropHeader) {
809
840
  event.preventDefault();
841
+ let containerOffset = getOffset(table.value as HTMLElement);
810
842
  let dropHeaderOffset = getOffset(dropHeader);
811
843
 
812
- if (draggedColumn.value !== dropHeader) {
844
+ if (draggedElement.value !== dropHeader) {
845
+ let targetLeft = dropHeaderOffset.left - containerOffset.left;
813
846
  let columnCenter = dropHeaderOffset.left + dropHeader.offsetWidth / 2;
814
847
 
848
+ reorderRef.value.style.top = dropHeaderOffset.top - getOffset(tableRef.value).top + "px";
849
+
815
850
  if (event.pageX > columnCenter) {
851
+ reorderRef.value.style.left = targetLeft + dropHeader.offsetWidth + "px";
852
+
816
853
  dropPosition.value = 1;
817
854
  } else {
855
+ reorderRef.value.style.left = targetLeft + "px";
818
856
  dropPosition.value = -1;
819
857
  }
858
+
859
+ reorderRef.value.style.display = "block";
820
860
  }
821
861
  }
822
862
  }
@@ -824,6 +864,8 @@ function onColumnHeaderDragOver(event: DragEvent) {
824
864
  function onColumnHeaderDragLeave(event: DragEvent) {
825
865
  if (props.reorderableColumns && draggedColumn.value) {
826
866
  event.preventDefault();
867
+
868
+ reorderRef.value.style.display = "none";
827
869
  }
828
870
  }
829
871
 
@@ -852,7 +894,8 @@ function onColumnHeaderDrop(event: DragEvent, item: ITableColumns) {
852
894
  }
853
895
  }
854
896
 
855
- draggedColumn.value.draggable = false;
897
+ reorderRef.value.style.display = "none";
898
+ draggedElement.value.draggable = false;
856
899
  draggedColumn.value = null;
857
900
  dropPosition.value = null;
858
901
  }
@@ -914,25 +957,45 @@ function onRowMouseDown(event: MouseEvent & { currentTarget?: { draggable: boole
914
957
  }
915
958
 
916
959
  function onRowDragStart(event: DragEvent, item: TableItem | string) {
960
+ if (!props.reorderableRows) {
961
+ return;
962
+ }
917
963
  rowDragged.value = true;
918
964
  draggedRow.value = item;
919
- draggedRowIndex.value = calculatedItems.value.indexOf(item);
965
+ draggedRowIndex.value = props.items.indexOf(item);
920
966
  event.dataTransfer.setData("text", "row-reorder");
921
967
  }
922
968
 
923
969
  function onRowDragOver(event: DragEvent, item: TableItem | string) {
924
- const index = calculatedItems.value.indexOf(item);
970
+ if (!props.reorderableRows) {
971
+ return;
972
+ }
973
+ const index = props.items.indexOf(item);
925
974
 
926
975
  if (rowDragged.value && draggedRow.value !== item) {
927
- let rowElement = event.currentTarget;
928
- let rowY = getOffset(rowElement as HTMLElement).top;
976
+ let rowElement = event.currentTarget as HTMLElement;
977
+ let rowY = getOffset(rowElement).top;
929
978
  let pageY = event.pageY;
930
- let rowMidY = rowY + (rowElement as HTMLElement).offsetHeight / 2;
979
+ let rowMidY = rowY + rowElement.offsetHeight / 2;
980
+ let previousRowElement = rowElement.previousElementSibling;
931
981
 
932
982
  if (pageY < rowMidY) {
983
+ rowElement.classList.remove("vc-table__drag-row-bottom");
933
984
  droppedRowIndex.value = index;
985
+
986
+ if (previousRowElement) {
987
+ previousRowElement.classList.add("vc-table__drag-row-bottom");
988
+ } else {
989
+ rowElement.classList.add("vc-table__drag-row-top");
990
+ }
934
991
  } else {
992
+ if (previousRowElement) {
993
+ previousRowElement.classList.remove("vc-table__drag-row-bottom");
994
+ } else {
995
+ rowElement.classList.add("vc-table__drag-row-top");
996
+ }
935
997
  droppedRowIndex.value = index + 1;
998
+ rowElement.classList.add("vc-table__drag-row-bottom");
936
999
  }
937
1000
 
938
1001
  event.preventDefault();
@@ -941,6 +1004,16 @@ function onRowDragOver(event: DragEvent, item: TableItem | string) {
941
1004
 
942
1005
  function onRowDragLeave(event: DragEvent) {
943
1006
  event.preventDefault();
1007
+
1008
+ let rowElement = event.currentTarget as HTMLElement;
1009
+ let previousRowElement = rowElement.previousElementSibling;
1010
+
1011
+ if (previousRowElement) {
1012
+ previousRowElement.classList.remove("vc-table__drag-row-bottom");
1013
+ }
1014
+
1015
+ rowElement.classList.remove("vc-table__drag-row-top");
1016
+ rowElement.classList.remove("vc-table__drag-row-bottom");
944
1017
  }
945
1018
 
946
1019
  function onRowDragEnd(event: DragEvent & { currentTarget?: { draggable: boolean } }) {
@@ -950,7 +1023,7 @@ function onRowDragEnd(event: DragEvent & { currentTarget?: { draggable: boolean
950
1023
  event.currentTarget.draggable = false;
951
1024
  }
952
1025
 
953
- function onRowDrop(event) {
1026
+ function onRowDrop(event: DragEvent) {
954
1027
  if (droppedRowIndex.value != null) {
955
1028
  let dropIndex =
956
1029
  draggedRowIndex.value > droppedRowIndex.value
@@ -959,7 +1032,7 @@ function onRowDrop(event) {
959
1032
  ? 0
960
1033
  : droppedRowIndex.value - 1;
961
1034
 
962
- let processedItems = [...calculatedItems.value];
1035
+ let processedItems = [...props.items];
963
1036
 
964
1037
  reorderArray(processedItems, draggedRowIndex.value, dropIndex);
965
1038
 
@@ -972,12 +1045,16 @@ function onRowDrop(event) {
972
1045
 
973
1046
  // cleanup
974
1047
  onRowDragLeave(event);
975
- onRowDragEnd(event);
1048
+ onRowDragEnd(event as DragEvent & { currentTarget?: { draggable: boolean } });
976
1049
  event.preventDefault();
977
1050
  }
978
1051
  </script>
979
1052
 
980
1053
  <style lang="scss">
1054
+ :root {
1055
+ --row-drag-color: #41afe6;
1056
+ }
1057
+
981
1058
  $variants: (
982
1059
  danger: #ff4a4a,
983
1060
  success: #87b563,
@@ -985,46 +1062,6 @@ $variants: (
985
1062
 
986
1063
  .vc-table {
987
1064
  &__body {
988
- &-tooltip {
989
- background: #ffffff;
990
- border-radius: 4px 0 0 4px;
991
- padding: 15px;
992
- z-index: 0;
993
- position: absolute;
994
- right: 0;
995
- filter: drop-shadow(1px 3px 14px rgba(111, 122, 131, 0.25));
996
- }
997
-
998
- &-tooltip-arrow,
999
- &-tooltip-arrow:before {
1000
- position: absolute;
1001
- width: 8px;
1002
- height: 8px;
1003
- background: inherit;
1004
- }
1005
-
1006
- &-tooltip-arrow {
1007
- visibility: hidden;
1008
- }
1009
-
1010
- &-tooltip-arrow:before {
1011
- visibility: visible;
1012
- content: "";
1013
- transform: rotate(45deg);
1014
- }
1015
-
1016
- &-tooltip[data-popper-placement^="top"] > .vc-table__body-tooltip-arrow {
1017
- bottom: -5px;
1018
- }
1019
-
1020
- &-tooltip[data-popper-placement^="bottom"] > .vc-table__body-tooltip-arrow {
1021
- top: -5px;
1022
- }
1023
-
1024
- // &-row:hover .vc-table__body-actions-container {
1025
- // @apply tw-flex #{!important};
1026
- // }
1027
-
1028
1065
  &-actions-item {
1029
1066
  @each $name, $variant in $variants {
1030
1067
  &_#{$name} {
@@ -1043,12 +1080,20 @@ $variants: (
1043
1080
  }
1044
1081
 
1045
1082
  &-tooltip[data-popper-placement^="top"] > .vc-table__body-tooltip-arrow {
1046
- @apply tw-bottom-[-5px];
1083
+ @apply tw-bottom-[-4px];
1047
1084
  }
1048
1085
 
1049
1086
  &-tooltip[data-popper-placement^="bottom"] > .vc-table__body-tooltip-arrow {
1050
- @apply tw-top-[-5px];
1087
+ @apply tw-top-[-4px];
1051
1088
  }
1052
1089
  }
1090
+
1091
+ &__drag-row-bottom {
1092
+ @apply tw-shadow-[inset_0_-2px_0_0_var(--row-drag-color)];
1093
+ }
1094
+
1095
+ &__drag-row-top {
1096
+ @apply tw-shadow-[inset_0_2px_0_0_var(--row-drag-color)];
1097
+ }
1053
1098
  }
1054
1099
  </style>