@antify/ui 2.2.1 → 2.2.4

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 (147) hide show
  1. package/dist/components/AntAccordion.vue +25 -12
  2. package/dist/components/AntAccordionItem.vue +28 -13
  3. package/dist/components/AntAlert.vue +25 -15
  4. package/dist/components/AntCard.vue +26 -14
  5. package/dist/components/AntContent.vue +4 -4
  6. package/dist/components/AntDropdown.vue +41 -23
  7. package/dist/components/AntIcon.vue +18 -6
  8. package/dist/components/AntKeycap.vue +31 -16
  9. package/dist/components/AntListGroup.vue +13 -11
  10. package/dist/components/AntListGroupItem.vue +19 -9
  11. package/dist/components/AntModal.vue +26 -15
  12. package/dist/components/AntPagination.vue +28 -15
  13. package/dist/components/AntPopover.vue +74 -51
  14. package/dist/components/AntSkeleton.vue +8 -4
  15. package/dist/components/AntSpinner.vue +14 -6
  16. package/dist/components/AntTag.vue +25 -13
  17. package/dist/components/AntToast.vue +19 -11
  18. package/dist/components/AntToaster.vue +13 -5
  19. package/dist/components/AntTooltip.vue +78 -54
  20. package/dist/components/__stories/AntAccordion.stories.js +4 -4
  21. package/dist/components/__stories/AntAccordion.stories.mjs +50 -17
  22. package/dist/components/__stories/AntAlert.stories.mjs +18 -5
  23. package/dist/components/__stories/AntCard.stories.mjs +36 -10
  24. package/dist/components/__stories/AntContent.stories.mjs +14 -4
  25. package/dist/components/__stories/AntDropdown.stories.mjs +20 -4
  26. package/dist/components/__stories/AntIcon.stories.mjs +38 -12
  27. package/dist/components/__stories/AntKeycap.stories.mjs +35 -10
  28. package/dist/components/__stories/AntListGroup.stories.d.ts +1 -1
  29. package/dist/components/__stories/AntListGroup.stories.mjs +22 -4
  30. package/dist/components/__stories/AntListGroupItem.stories.mjs +27 -8
  31. package/dist/components/__stories/AntModal.stories.mjs +17 -4
  32. package/dist/components/__stories/AntPagination.stories.mjs +21 -6
  33. package/dist/components/__stories/AntPopover.stories.mjs +20 -4
  34. package/dist/components/__stories/AntSkeleton.stories.mjs +17 -5
  35. package/dist/components/__stories/AntSpinner.stories.mjs +33 -9
  36. package/dist/components/__stories/AntTag.stories.mjs +28 -8
  37. package/dist/components/__stories/AntToast.stories.mjs +19 -5
  38. package/dist/components/__stories/AntToaster.stories.d.ts +1 -1
  39. package/dist/components/__stories/AntToaster.stories.mjs +35 -9
  40. package/dist/components/__stories/AntTooltip.stories.js +1 -1
  41. package/dist/components/__stories/AntTooltip.stories.mjs +44 -13
  42. package/dist/components/buttons/AntActionButton.vue +38 -29
  43. package/dist/components/buttons/AntButton.vue +34 -13
  44. package/dist/components/buttons/AntCreateButton.vue +11 -4
  45. package/dist/components/buttons/AntDeleteButton.vue +11 -4
  46. package/dist/components/buttons/AntDuplicateButton.vue +11 -4
  47. package/dist/components/buttons/AntEditButton.vue +11 -4
  48. package/dist/components/buttons/AntSaveAndNewButton.vue +11 -4
  49. package/dist/components/buttons/AntSaveButton.vue +11 -4
  50. package/dist/components/buttons/__stories/AntActionButton.stories.mjs +35 -10
  51. package/dist/components/buttons/__stories/AntButton.stories.mjs +77 -23
  52. package/dist/components/buttons/__stories/AntCreateButton.stories.mjs +25 -7
  53. package/dist/components/buttons/__stories/AntDeleteButton.stories.mjs +25 -7
  54. package/dist/components/buttons/__stories/AntDuplicateButton.stories.mjs +25 -7
  55. package/dist/components/buttons/__stories/AntEditButton.stories.mjs +25 -7
  56. package/dist/components/buttons/__stories/AntSaveAndNewButton.stories.mjs +25 -7
  57. package/dist/components/buttons/__stories/AntSaveButton.stories.mjs +25 -7
  58. package/dist/components/crud/AntCrud.vue +6 -6
  59. package/dist/components/crud/AntCrudDetail.vue +8 -5
  60. package/dist/components/crud/AntCrudDetailActions.vue +14 -8
  61. package/dist/components/crud/AntCrudDetailNav.vue +21 -13
  62. package/dist/components/crud/AntCrudTableFilter.vue +29 -17
  63. package/dist/components/crud/AntCrudTableNav.vue +36 -22
  64. package/dist/components/crud/__stories/AntCrud.stories.mjs +17 -5
  65. package/dist/components/crud/__stories/AntCrudDetail.stories.mjs +11 -3
  66. package/dist/components/crud/__stories/AntCrudDetailActions.stories.mjs +10 -2
  67. package/dist/components/crud/__stories/AntCrudDetailNav.stories.mjs +11 -3
  68. package/dist/components/crud/__stories/AntCrudTableFilter.stories.mjs +17 -5
  69. package/dist/components/crud/__stories/AntCrudTableNav.stories.mjs +23 -7
  70. package/dist/components/dialogs/AntDeleteDialog.vue +13 -5
  71. package/dist/components/dialogs/AntDialog.vue +23 -13
  72. package/dist/components/dialogs/__stories/AndDeleteDialog.stories.mjs +12 -3
  73. package/dist/components/dialogs/__stories/AntDialog.stories.mjs +28 -7
  74. package/dist/components/forms/AntField.vue +18 -7
  75. package/dist/components/forms/AntFormGroup.vue +9 -5
  76. package/dist/components/forms/AntFormGroupLabel.vue +1 -1
  77. package/dist/components/forms/__stories/AntField.stories.mjs +37 -9
  78. package/dist/components/forms/__stories/AntFormGroup.stories.mjs +20 -5
  79. package/dist/components/forms/__stories/AntFormGroupLabel.stories.mjs +11 -3
  80. package/dist/components/index.d.ts +1 -1
  81. package/dist/components/inputs/AntCheckbox.vue +60 -36
  82. package/dist/components/inputs/AntCheckboxGroup.vue +39 -15
  83. package/dist/components/inputs/AntDateInput.vue +35 -12
  84. package/dist/components/inputs/AntNumberInput.vue +33 -12
  85. package/dist/components/inputs/AntPasswordInput.vue +32 -11
  86. package/dist/components/inputs/AntRadio.vue +57 -34
  87. package/dist/components/inputs/AntRadioGroup.vue +60 -35
  88. package/dist/components/inputs/AntRangeSlider.vue +31 -12
  89. package/dist/components/inputs/AntSearch.vue +19 -7
  90. package/dist/components/inputs/AntSelect.vue +107 -83
  91. package/dist/components/inputs/AntSwitch.vue +35 -18
  92. package/dist/components/inputs/AntSwitcher.vue +30 -15
  93. package/dist/components/inputs/AntTagInput.vue +91 -61
  94. package/dist/components/inputs/AntTextInput.vue +31 -11
  95. package/dist/components/inputs/AntTextarea.vue +53 -25
  96. package/dist/components/inputs/AntUnitInput.vue +33 -12
  97. package/dist/components/inputs/Elements/AntBaseInput.vue +47 -18
  98. package/dist/components/inputs/Elements/AntInputDescription.vue +16 -8
  99. package/dist/components/inputs/Elements/AntInputLabel.vue +13 -5
  100. package/dist/components/inputs/Elements/AntInputLimiter.vue +13 -5
  101. package/dist/components/inputs/Elements/AntSelectMenu.vue +65 -41
  102. package/dist/components/inputs/Elements/__stories/AntBaseInput.stories.mjs +104 -27
  103. package/dist/components/inputs/Elements/__stories/AntInputDescription.stories.mjs +33 -9
  104. package/dist/components/inputs/Elements/__stories/AntInputLabel.stories.mjs +34 -9
  105. package/dist/components/inputs/Elements/__stories/AntInputLimiter.stories.mjs +33 -9
  106. package/dist/components/inputs/Elements/index.d.ts +1 -1
  107. package/dist/components/inputs/__stories/AntCheckbox.stories.mjs +34 -9
  108. package/dist/components/inputs/__stories/AntCheckboxGroup.stories.mjs +45 -21
  109. package/dist/components/inputs/__stories/AntDateInput.stories.mjs +52 -14
  110. package/dist/components/inputs/__stories/AntNumberInput.stories.mjs +66 -17
  111. package/dist/components/inputs/__stories/AntPasswordInput.stories.mjs +51 -13
  112. package/dist/components/inputs/__stories/AntRadioGroup.stories.mjs +45 -12
  113. package/dist/components/inputs/__stories/AntRangeSlider.stories.mjs +16 -5
  114. package/dist/components/inputs/__stories/AntSearch.stories.mjs +41 -10
  115. package/dist/components/inputs/__stories/AntSelect.stories.mjs +59 -15
  116. package/dist/components/inputs/__stories/AntSwitch.stories.js +126 -102
  117. package/dist/components/inputs/__stories/AntSwitch.stories.mjs +162 -112
  118. package/dist/components/inputs/__stories/AntSwitcher.stories.mjs +38 -10
  119. package/dist/components/inputs/__stories/AntTagInput.stories.mjs +46 -12
  120. package/dist/components/inputs/__stories/AntTextInput.stories.mjs +59 -16
  121. package/dist/components/inputs/__stories/AntTextarea.stories.mjs +47 -13
  122. package/dist/components/inputs/__stories/AntUnitInput.stories.mjs +46 -12
  123. package/dist/components/layouts/AntNavLeftLayout.vue +12 -6
  124. package/dist/components/layouts/__stories/AntNavLeftLayout.stories.mjs +10 -2
  125. package/dist/components/navbar/AntNavbar.vue +7 -3
  126. package/dist/components/navbar/AntNavbarItem.vue +12 -6
  127. package/dist/components/navbar/__stories/AntNavbar.stories.mjs +59 -37
  128. package/dist/components/table/AntCollapsibleTableRowContent.vue +7 -5
  129. package/dist/components/table/AntTable.vue +210 -165
  130. package/dist/components/table/AntTableSkeleton.vue +126 -0
  131. package/dist/components/table/AntTableSortButton.vue +22 -13
  132. package/dist/components/table/AntTd.vue +21 -17
  133. package/dist/components/table/AntTh.vue +19 -12
  134. package/dist/components/table/__stories/AntTable.stories.js +1 -1
  135. package/dist/components/table/__stories/AntTable.stories.mjs +190 -62
  136. package/dist/components/tabs/AntTabItem.vue +20 -8
  137. package/dist/components/tabs/AntTabs.vue +35 -21
  138. package/dist/components/tabs/__stories/AntTabItem.stories.mjs +23 -7
  139. package/dist/components/tabs/__stories/AntTabs.stories.mjs +45 -13
  140. package/dist/components/transitions/AntTransitionCollapseHeight.vue +1 -1
  141. package/dist/composables/useToaster.mjs +25 -7
  142. package/dist/index.css +1 -0
  143. package/dist/utils.mjs +3 -1
  144. package/package.json +23 -16
  145. package/dist/tailwind.config.d.ts +0 -3
  146. package/dist/tailwind.config.js +0 -198
  147. package/dist/tailwind.config.mjs +0 -189
@@ -1,56 +1,70 @@
1
1
  <script lang="ts" setup>
2
- import {AntTableSize, AntTableSortDirection, type TableHeader} from './__types/TableHeader.types';
3
- import {computed, onMounted, ref, type Ref, watch} from 'vue';
4
- import {useVModel} from '@vueuse/core';
5
- import {Size, State} from '../../enums';
2
+ import {
3
+ AntTableSize, AntTableSortDirection, type TableHeader,
4
+ } from './__types/TableHeader.types';
5
+ import {
6
+ computed, onMounted, ref, type Ref, watch,
7
+ } from 'vue';
8
+ import {
9
+ useVModel,
10
+ } from '@vueuse/core';
11
+ import {
12
+ Size, State,
13
+ } from '../../enums';
6
14
  import AntTh from './AntTh.vue';
7
15
  import AntTd from './AntTd.vue';
8
16
  import AntSpinner from '../AntSpinner.vue';
9
- import AntSkeleton from '../AntSkeleton.vue';
10
- import {hasSlotContent} from "../../utils";
11
- import AntCollapsibleTableRowContent from "./AntCollapsibleTableRowContent.vue";
12
- import {CollapseStrategy} from "../../types";
13
- import {faAngleDown, faAngleUp} from "@fortawesome/free-solid-svg-icons";
14
- import AntButton from "../buttons/AntButton.vue";
15
- import AntIcon from "../AntIcon.vue";
17
+ import {
18
+ hasSlotContent,
19
+ } from '../../utils';
20
+ import AntCollapsibleTableRowContent from './AntCollapsibleTableRowContent.vue';
21
+ import {
22
+ CollapseStrategy,
23
+ } from '../../types';
24
+ import {
25
+ faAngleDown, faAngleUp,
26
+ } from '@fortawesome/free-solid-svg-icons';
27
+ import AntButton from '../buttons/AntButton.vue';
28
+ import AntIcon from '../AntIcon.vue';
29
+ import AntTableSkeleton from './AntTableSkeleton.vue';
16
30
 
17
- defineOptions({inheritAttrs: false});
31
+ defineOptions({
32
+ inheritAttrs: false,
33
+ });
18
34
 
19
35
  const emits = defineEmits([
20
36
  'update:modelValue',
21
37
  'update:skeleton',
22
38
  'update:selectedRow',
23
39
  'rowClick',
24
- 'updateSort'
40
+ 'updateSort',
25
41
  ]);
26
42
  // TODO:: add pagination prop and pagination to table
27
- const props = withDefaults(
28
- defineProps<{
29
- selectedRow?: Record<string, unknown> | undefined,
30
- headers: TableHeader[];
31
- data: Record<string, unknown>[];
32
- rowKey?: string;
33
- loading?: boolean;
34
- selectableRows?: boolean;
35
- showLightVersion?: boolean;
36
- size?: AntTableSize;
37
- headerColor?: string;
38
- emptyStateText?: string;
39
- collapseStrategy?: CollapseStrategy;
40
- rowsCollapsed?: boolean;
41
- }>(), {
42
- rowKey: 'id',
43
- loading: false,
44
- selectableRows: false,
45
- showLightVersion: false,
46
- size: AntTableSize.md,
47
- headerColor: 'bg-base-200',
48
- emptyStateText: 'We couldn\'t find any entry',
49
- collapseStrategy: CollapseStrategy.single,
50
- rowsCollapsed: true,
51
- });
43
+ const props = withDefaults(defineProps<{
44
+ selectedRow?: Record<string, unknown> | undefined;
45
+ headers: TableHeader[];
46
+ data: Record<string, unknown>[];
47
+ rowKey?: string;
48
+ loading?: boolean;
49
+ selectableRows?: boolean;
50
+ showLightVersion?: boolean;
51
+ size?: AntTableSize;
52
+ headerColor?: string;
53
+ emptyStateText?: string;
54
+ collapseStrategy?: CollapseStrategy;
55
+ expandedRows?: boolean;
56
+ }>(), {
57
+ rowKey: 'id',
58
+ loading: false,
59
+ selectableRows: false,
60
+ showLightVersion: false,
61
+ size: AntTableSize.md,
62
+ headerColor: 'bg-base-200',
63
+ emptyStateText: 'We couldn\'t find any entry',
64
+ collapseStrategy: CollapseStrategy.single,
65
+ expandedRows: false,
66
+ });
52
67
  const slots = defineSlots();
53
-
54
68
  const openItems = ref<number[]>([]);
55
69
  const selected: Ref<Record<string, unknown> | undefined> = useVModel(props, 'selectedRow', emits);
56
70
  const _loading: Ref<boolean> = useVModel(props, 'loading', emits);
@@ -65,11 +79,8 @@ const _headers = computed(() => {
65
79
  return props.headers;
66
80
  });
67
81
 
68
- const maxColSpan = computed(() => _headers.value.length + (hasSlotContent(slots['rowFirstCell']) ? 1 : 0) + (hasSlotContent(slots['rowLastCell']) ? 1 : 0))
69
-
70
- watch(() => props.showLightVersion, (val) => {
71
- setTimeout(() => _showLightVersion.value = val, val ? 200 : 400);
72
- });
82
+ const maxColSpan = computed(() => _headers.value.length + (hasSlotContent(slots['rowFirstCell']) ? 1 : 0) + (hasSlotContent(slots['rowLastCell']) ? 1 : 0));
83
+ const skeleton = computed(() => !props.data || props.data.length === 0 && _loading.value);
73
84
 
74
85
  function sortTable(header: TableHeader, newDirection: AntTableSortDirection) {
75
86
  // TODO:: Sorting is always done externally, here should only be a emit sort with header and direction.
@@ -96,6 +107,16 @@ function sortTable(header: TableHeader, newDirection: AntTableSortDirection) {
96
107
  emits('updateSort', header, newDirection);
97
108
  }
98
109
 
110
+ function getRowClasses(element: Record<string, unknown>, rowIndex: number) {
111
+ return {
112
+ 'bg-primary-200 text-primary-200-font transition-colors': element === selected.value,
113
+ 'bg-white text-for-white-bg-font': element !== selected.value && rowIndex % 2 === 0,
114
+ 'bg-base-100 text-base-100-font': element !== selected.value && rowIndex % 2 !== 0,
115
+ 'cursor-pointer': props.selectableRows,
116
+ 'hover:bg-base-200': props.selectableRows && element !== selected.value,
117
+ };
118
+ }
119
+
99
120
  function rowClick(elem: Record<string, unknown>): void {
100
121
  selected.value = elem;
101
122
 
@@ -111,28 +132,42 @@ function toggleRowContent(index: number) {
111
132
  : openItems.value.filter(item => item !== index);
112
133
  } else {
113
134
  openItems.value = props.collapseStrategy === CollapseStrategy.single
114
- ? [index]
115
- : [...openItems.value, index];
135
+ ? [
136
+ index,
137
+ ]
138
+ : [
139
+ ...openItems.value,
140
+ index,
141
+ ];
116
142
  }
117
143
  }
118
144
 
119
145
  function openRowsByDefault() {
120
- if (!props.rowsCollapsed && props.data.length > 0) {
146
+ if (props.expandedRows && props.data.length > 0) {
121
147
  openItems.value = props.data.map((_, index) => index);
122
148
  }
123
149
  }
124
150
 
151
+ watch(() => props.showLightVersion, (val) => {
152
+ setTimeout(() => _showLightVersion.value = val, val ? 200 : 400);
153
+ });
154
+
125
155
  watch(() => props.data, (currVal, prevVal) => {
126
156
  if (currVal.length > prevVal.length) {
127
157
  // Add newest element to the list of open items so it is open by default
128
158
  // Necessary when table content is changed dynamically
129
159
  if (props.collapseStrategy === CollapseStrategy.single) {
130
- openItems.value = [currVal.length - 1];
160
+ openItems.value = [
161
+ currVal.length - 1,
162
+ ];
131
163
  } else {
132
- openItems.value = [...openItems.value, currVal.length - 1];
164
+ openItems.value = [
165
+ ...openItems.value,
166
+ currVal.length - 1,
167
+ ];
133
168
  }
134
169
  }
135
- })
170
+ });
136
171
 
137
172
  onMounted(() => {
138
173
  openRowsByDefault();
@@ -141,145 +176,156 @@ onMounted(() => {
141
176
 
142
177
  <template>
143
178
  <div
144
- class="relative inline-block min-w-full align-middle h-full"
179
+ class="relative inline-block w-full align-middle h-full"
145
180
  data-e2e="table"
146
181
  >
147
- <div class="overflow-hidden h-full overflow-x-auto overflow-y-auto">
182
+ <div
183
+ v-if="!skeleton"
184
+ class="overflow-hidden h-full overflow-x-auto overflow-y-auto"
185
+ >
148
186
  <table
149
187
  v-bind="$attrs"
150
188
  class="min-w-full max-h-full relative"
151
189
  :class="{'h-full': data.length === 0 && !_loading}"
152
190
  >
153
- <thead class="sticky top-0 z-10" :class="headerColor">
154
- <tr>
155
- <slot name="headerFirstCell"/>
156
-
157
- <template v-for="(header, index) in _headers">
158
- <AntTh
159
- v-if="!_showLightVersion || (_showLightVersion && header.lightVersion)"
160
- :key="`table-header-${header.identifier}-${index}`"
161
- :header="header"
162
- :size="size"
163
- @sort="sortTable"
164
- >
165
- <template #headerContent>
166
- <slot
167
- name="headerContent"
168
- v-bind="header"
169
- />
170
- </template>
171
- </AntTh>
172
- </template>
173
-
174
- <template v-if="!!$slots.afterRowContent">
175
- <td/>
176
- </template>
177
-
178
- <slot name="headerLastCell"></slot>
179
- </tr>
180
- </thead>
181
-
182
- <tbody class="bg-white relative">
183
- <!-- TODO:: Add some kind of virtual list for very large tree data (or required pagination??) -->
184
- <template
185
- v-for="(elem, rowIndex) in data" :key="`table-row-${elem[rowKey]}-${rowIndex}`"
191
+ <thead
192
+ class="sticky top-0 z-10"
193
+ :class="headerColor"
186
194
  >
187
- <tr
188
- data-e2e="table-row"
189
- :id="elem[rowKey] as string"
190
- :class="{
191
- 'bg-primary-200 text-primary-200-font transition-colors': elem === selected,
192
- 'bg-white text-for-white-bg-font': elem !== selected && rowIndex % 2 === 0,
193
- 'bg-base-100 text-base-100-font': elem !== selected && rowIndex % 2 !== 0,
194
- 'cursor-pointer': selectableRows,
195
- 'hover:bg-base-200': selectableRows && elem !== selected,
196
- }"
197
- >
198
- <slot
199
- name="rowFirstCell"
200
- v-bind="{ elem }"
201
- />
195
+ <tr>
196
+ <slot name="headerFirstCell" />
202
197
 
203
- <template v-for="(header, colIndex) in _headers">
204
- <AntTd
198
+ <template v-for="(header, index) in _headers">
199
+ <AntTh
205
200
  v-if="!_showLightVersion || (_showLightVersion && header.lightVersion)"
206
- :key="`table-cell-${header.identifier}-${rowIndex}-${colIndex}`"
207
- :data-e2e="`table-cell-${header.identifier}`"
201
+ :key="`table-header-${header.identifier}-${index}`"
208
202
  :header="header"
209
- :element="elem"
210
- :align="header.align"
211
203
  :size="size"
212
- @click="rowClick(elem)"
204
+ @sort="sortTable"
213
205
  >
214
- <template #beforeCellContent="props">
215
- <slot
216
- name="beforeCellContent"
217
- v-bind="{...props, colIndex, rowIndex}"
218
- />
219
- </template>
220
-
221
- <template #cellContent="props">
222
- <slot
223
- name="cellContent"
224
- v-bind="{...props, colIndex, rowIndex}"
225
- />
226
- </template>
227
-
228
- <template #afterCellContent="props">
206
+ <template #headerContent>
229
207
  <slot
230
- name="afterCellContent"
231
- v-bind="{...props, colIndex, rowIndex}"
208
+ name="headerContent"
209
+ v-bind="header"
232
210
  />
233
211
  </template>
234
- </AntTd>
212
+ </AntTh>
235
213
  </template>
236
214
 
237
215
  <template v-if="!!$slots.afterRowContent">
238
- <td class="whitespace-nowrap text-sm font-medium relative px-2 py-0 h-9 text-right"
239
- @click="rowClick(elem)">
240
- <AntButton @click="toggleRowContent(rowIndex)" :size="Size.xs2">
241
- <AntIcon :icon="openItems.includes(rowIndex) ? faAngleUp : faAngleDown"/>
242
- </AntButton>
243
- </td>
216
+ <td />
244
217
  </template>
245
218
 
246
- <slot
247
- name="rowLastCell"
248
- v-bind="{ elem }"
249
- />
219
+ <slot name="headerLastCell" />
250
220
  </tr>
221
+ </thead>
251
222
 
252
- <template v-if="!!$slots.afterRowContent">
253
- <tr data-e2e="table-after-row-content">
254
- <td :colspan="maxColSpan + 1" class="p-0">
255
- <AntCollapsibleTableRowContent :is-open="openItems.includes(rowIndex)"
223
+ <tbody class="bg-white relative">
224
+ <!-- TODO:: Add some kind of virtual list for very large tree data (or required pagination??) -->
225
+ <template
226
+ v-for="(elem, rowIndex) in data"
227
+ :key="`table-row-${elem[rowKey]}-${rowIndex}`"
228
+ >
229
+ <tr
230
+ :id="elem[rowKey] as string"
231
+ data-e2e="table-row"
232
+ :class="getRowClasses(elem, rowIndex)"
233
+ >
234
+ <slot
235
+ name="rowFirstCell"
236
+ v-bind="{ elem }"
237
+ />
238
+
239
+ <template v-for="(header, colIndex) in _headers">
240
+ <AntTd
241
+ v-if="!_showLightVersion || (_showLightVersion && header.lightVersion)"
242
+ :key="`table-cell-${header.identifier}-${rowIndex}-${colIndex}`"
243
+ :data-e2e="`table-cell-${header.identifier}`"
244
+ :header="header"
245
+ :element="elem"
246
+ :align="header.align"
247
+ :size="size"
248
+ @click="rowClick(elem)"
256
249
  >
257
- <slot name="afterRowContent" v-bind="{ element: elem, rowIndex }"/>
258
- </AntCollapsibleTableRowContent>
259
- </td>
250
+ <template #beforeCellContent="props">
251
+ <slot
252
+ name="beforeCellContent"
253
+ v-bind="{...props, colIndex, rowIndex}"
254
+ />
255
+ </template>
256
+
257
+ <template #cellContent="props">
258
+ <slot
259
+ name="cellContent"
260
+ v-bind="{...props, colIndex, rowIndex}"
261
+ />
262
+ </template>
263
+
264
+ <template #afterCellContent="props">
265
+ <slot
266
+ name="afterCellContent"
267
+ v-bind="{...props, colIndex, rowIndex}"
268
+ />
269
+ </template>
270
+ </AntTd>
271
+ </template>
272
+
273
+ <template v-if="!!$slots.afterRowContent">
274
+ <td
275
+ class="whitespace-nowrap text-sm font-medium relative px-2 py-0 h-9 text-right"
276
+ @click="rowClick(elem)"
277
+ >
278
+ <AntButton
279
+ :size="Size.xs2"
280
+ @click="toggleRowContent(rowIndex)"
281
+ >
282
+ <AntIcon :icon="openItems.includes(rowIndex) ? faAngleUp : faAngleDown" />
283
+ </AntButton>
284
+ </td>
285
+ </template>
286
+
287
+ <slot
288
+ name="rowLastCell"
289
+ v-bind="{ elem }"
290
+ />
260
291
  </tr>
292
+
293
+ <template v-if="!!$slots.afterRowContent">
294
+ <tr data-e2e="table-after-row-content">
295
+ <td
296
+ :colspan="maxColSpan + 1"
297
+ class="p-0"
298
+ >
299
+ <AntCollapsibleTableRowContent :is-open="openItems.includes(rowIndex)">
300
+ <slot
301
+ name="afterRowContent"
302
+ v-bind="{ element: elem, rowIndex }"
303
+ />
304
+ </AntCollapsibleTableRowContent>
305
+ </td>
306
+ </tr>
307
+ </template>
261
308
  </template>
262
- </template>
263
309
 
264
- <tr v-if="data.length <= 0 && !_loading">
265
- <td
266
- colspan="100"
267
- class="w-full h-full py-2 text-center text-for-white-bg-font text-lg"
268
- >
269
- <slot name="emptyState">
270
- <div class="flex items-center flex-col">
271
- <span class="font-semibold">{{ emptyStateText }}</span>
272
- </div>
273
- </slot>
274
- </td>
275
- </tr>
310
+ <tr v-if="data.length === 0 && !_loading">
311
+ <td
312
+ colspan="100"
313
+ class="w-full h-full py-2 text-center text-for-white-bg-font text-lg"
314
+ >
315
+ <slot name="emptyState">
316
+ <div class="flex items-center flex-col">
317
+ <span class="font-semibold">{{ emptyStateText }}</span>
318
+ </div>
319
+ </slot>
320
+ </td>
321
+ </tr>
276
322
  </tbody>
277
323
  </table>
278
324
  </div>
279
325
 
280
326
  <div
281
327
  v-if="data.length > 0 && _loading"
282
- class="absolute bg-opacity-50 w-full top-0 bottom-0 bg-base-300 flex items-center justify-center"
328
+ class="absolute w-full top-0 bottom-0 bg-base-300/50 flex items-center justify-center z-10"
283
329
  >
284
330
  <AntSpinner
285
331
  class="!w-24 !h-24"
@@ -287,14 +333,13 @@ onMounted(() => {
287
333
  />
288
334
  </div>
289
335
 
290
- <div
291
- v-if="!data || data.length <= 0 && _loading"
292
- class="absolute bg-opacity-50 w-full top-[40px] bottom-0 bg-base-300 flex items-center justify-center"
293
- >
294
- <AntSkeleton
295
- v-model="_loading"
296
- absolute
297
- />
298
- </div>
336
+ <AntTableSkeleton
337
+ v-if="skeleton"
338
+ :headers="_headers"
339
+ :size="size"
340
+ :get-row-classes="getRowClasses"
341
+ :header-color="headerColor"
342
+ :show-light-version="_showLightVersion"
343
+ />
299
344
  </div>
300
345
  </template>
@@ -0,0 +1,126 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ AntTableRowTypes, AntTableSize, type TableHeader,
4
+ } from './__types';
5
+ import AntTd from './AntTd.vue';
6
+ import AntTh from './AntTh.vue';
7
+ import AntSkeleton from '../AntSkeleton.vue';
8
+
9
+ withDefaults(defineProps<{
10
+ headers: TableHeader[];
11
+ getRowClasses: (element: Record<string, unknown>, rowIndex: number) => {};
12
+ size?: AntTableSize;
13
+ headerColor?: string;
14
+ showLightVersion?: boolean;
15
+ }>(), {
16
+ size: AntTableSize.md,
17
+ headerColor: 'bg-base-200',
18
+ showLightVersion: false,
19
+ });
20
+ </script>
21
+
22
+ <template>
23
+ <div class="overflow-hidden h-full overflow-x-auto overflow-y-auto">
24
+ <table
25
+ class="min-w-full max-h-full relative"
26
+ >
27
+ <thead
28
+ class="sticky top-0 z-10"
29
+ :class="headerColor"
30
+ >
31
+ <tr>
32
+ <AntTh
33
+ v-for="colNum in [0,1,2]"
34
+ v-if="!showLightVersion || (showLightVersion && headers[0].lightVersion)"
35
+ :key="`table-header-col-0`"
36
+ :header="{
37
+ identifier: `th-${colNum}`,
38
+ type: AntTableRowTypes.slot
39
+ }"
40
+ :size="size"
41
+ >
42
+ <template #headerContent>
43
+ <span class="relative h-4 w-full max-w-24 rounded overflow-hidden">
44
+ <AntSkeleton
45
+ absolute
46
+ />
47
+ </span>
48
+ </template>
49
+ </AntTh>
50
+ </tr>
51
+ </thead>
52
+
53
+ <tbody class="bg-white relative">
54
+ <tr
55
+ data-e2e="table-row"
56
+ :class="getRowClasses({'foo': 'bar'}, 0)"
57
+ >
58
+ <AntTd
59
+ v-for="colNum in [0,1,2]"
60
+ v-if="!showLightVersion || (showLightVersion && headers[0].lightVersion)"
61
+ :header="{
62
+ identifier: `th-${colNum}`,
63
+ type: AntTableRowTypes.slot
64
+ }"
65
+ :element="{'foo': 'bar'}"
66
+ :size="size"
67
+ >
68
+ <template #cellContent>
69
+ <span class="flex relative h-4 w-full max-w-36 rounded overflow-hidden">
70
+ <AntSkeleton
71
+ absolute
72
+ />
73
+ </span>
74
+ </template>
75
+ </AntTd>
76
+ </tr>
77
+ <tr
78
+ data-e2e="table-row"
79
+ :class="getRowClasses({'foo': 'bar'}, 1)"
80
+ >
81
+ <AntTd
82
+ v-for="colNum in [0,1,2]"
83
+ v-if="!showLightVersion || (showLightVersion && headers[0].lightVersion)"
84
+ :header="{
85
+ identifier: `th-${colNum}`,
86
+ type: AntTableRowTypes.slot
87
+ }"
88
+ :element="{'foo': 'bar'}"
89
+ :size="size"
90
+ >
91
+ <template #cellContent>
92
+ <span class="flex relative h-4 w-full max-w-48 rounded overflow-hidden">
93
+ <AntSkeleton
94
+ absolute
95
+ />
96
+ </span>
97
+ </template>
98
+ </AntTd>
99
+ </tr>
100
+ <tr
101
+ data-e2e="table-row"
102
+ :class="getRowClasses({'foo': 'bar'}, 2)"
103
+ >
104
+ <AntTd
105
+ v-for="colNum in [0,1,2]"
106
+ v-if="!showLightVersion || (showLightVersion && headers[0].lightVersion)"
107
+ :header="{
108
+ identifier: `th-${colNum}`,
109
+ type: AntTableRowTypes.slot
110
+ }"
111
+ :element="{'foo': 'bar'}"
112
+ :size="size"
113
+ >
114
+ <template #cellContent>
115
+ <span class="flex relative h-4 w-full max-w-28 rounded overflow-hidden">
116
+ <AntSkeleton
117
+ absolute
118
+ />
119
+ </span>
120
+ </template>
121
+ </AntTd>
122
+ </tr>
123
+ </tbody>
124
+ </table>
125
+ </div>
126
+ </template>
@@ -1,20 +1,29 @@
1
1
  <script setup lang="ts">
2
2
 
3
- import {faAngleDown, faAngleUp, faMinus} from '@fortawesome/free-solid-svg-icons';
4
- import {AntTableSize, AntTableSortDirection} from './__types/TableHeader.types';
3
+ import {
4
+ faAngleDown, faAngleUp, faMinus,
5
+ } from '@fortawesome/free-solid-svg-icons';
6
+ import {
7
+ AntTableSize, AntTableSortDirection,
8
+ } from './__types/TableHeader.types';
5
9
  import AntButton from '../buttons/AntButton.vue';
6
- import {computed} from 'vue';
7
- import {Size} from '../../enums/Size.enum';
10
+ import {
11
+ computed,
12
+ } from 'vue';
13
+ import {
14
+ Size,
15
+ } from '../../enums/Size.enum';
8
16
 
9
- defineEmits(['sortClick']);
10
- const props = withDefaults(
11
- defineProps<{
12
- sortDirection?: AntTableSortDirection
13
- size?: AntTableSize
14
- }>(), {
15
- sortDirection: AntTableSortDirection.neutral,
16
- size: AntTableSize.md
17
- });
17
+ defineEmits([
18
+ 'sortClick',
19
+ ]);
20
+ const props = withDefaults(defineProps<{
21
+ sortDirection?: AntTableSortDirection;
22
+ size?: AntTableSize;
23
+ }>(), {
24
+ sortDirection: AntTableSortDirection.neutral,
25
+ size: AntTableSize.md,
26
+ });
18
27
 
19
28
  const buttonSize = computed(() => {
20
29
  if (props.size === AntTableSize.lg) {