edvoyui-component-library-test-flight 0.0.184 → 0.0.185

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 (224) hide show
  1. package/README.md +57 -8
  2. package/dist/EUIButton.vue.d.ts.map +1 -0
  3. package/dist/EUIButtonGroup.vue.d.ts.map +1 -0
  4. package/dist/edvoy-ui.cjs.js +1 -1
  5. package/dist/edvoy-ui.es.js +7 -10
  6. package/dist/edvoy-ui.umd.js +1 -1
  7. package/package.json +18 -17
  8. package/dist/button/EUIButton.vue.d.ts.map +0 -1
  9. package/dist/button/EUIButtonGroup.vue.d.ts.map +0 -1
  10. package/src/App.vue +0 -16
  11. package/src/App.vue.js.map +0 -1
  12. package/src/assets/fonts/gilroy/GilroyBold/font.woff +0 -0
  13. package/src/assets/fonts/gilroy/GilroyBold/font.woff2 +0 -0
  14. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff +0 -0
  15. package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff2 +0 -0
  16. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff +0 -0
  17. package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff2 +0 -0
  18. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff +0 -0
  19. package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff2 +0 -0
  20. package/src/assets/fonts/gilroy/GilroyMedium/font.woff +0 -0
  21. package/src/assets/fonts/gilroy/GilroyMedium/font.woff2 +0 -0
  22. package/src/assets/fonts/gilroy/GilroyRegular/font.woff +0 -0
  23. package/src/assets/fonts/gilroy/GilroyRegular/font.woff2 +0 -0
  24. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff +0 -0
  25. package/src/assets/fonts/gilroy/GilroySemiBold/font.woff2 +0 -0
  26. package/src/assets/fonts/inter/Inter-Bold.woff +0 -0
  27. package/src/assets/fonts/inter/Inter-Bold.woff2 +0 -0
  28. package/src/assets/fonts/inter/Inter-Italic.woff +0 -0
  29. package/src/assets/fonts/inter/Inter-Italic.woff2 +0 -0
  30. package/src/assets/fonts/inter/Inter-Medium.woff +0 -0
  31. package/src/assets/fonts/inter/Inter-Medium.woff2 +0 -0
  32. package/src/assets/fonts/inter/Inter-MediumItalic.woff +0 -0
  33. package/src/assets/fonts/inter/Inter-MediumItalic.woff2 +0 -0
  34. package/src/assets/fonts/inter/Inter-Regular.woff +0 -0
  35. package/src/assets/fonts/inter/Inter-Regular.woff2 +0 -0
  36. package/src/assets/fonts/inter/Inter-SemiBold.woff +0 -0
  37. package/src/assets/fonts/inter/Inter-SemiBold.woff2 +0 -0
  38. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
  39. package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
  40. package/src/assets/images/search-nodata.png +0 -0
  41. package/src/assets/scss/body.scss +0 -25
  42. package/src/assets/svg/CheckTick.vue +0 -21
  43. package/src/assets/svg/CheckTick.vue.js.map +0 -1
  44. package/src/assets/svg/ChevronBigDown.vue +0 -22
  45. package/src/assets/svg/ChevronBigDown.vue.js.map +0 -1
  46. package/src/assets/svg/ChevronDownSolid.vue +0 -19
  47. package/src/assets/svg/ChevronDownSolid.vue.js.map +0 -1
  48. package/src/assets/svg/ChevronDownStroke.vue +0 -22
  49. package/src/assets/svg/ChevronDownStroke.vue.js.map +0 -1
  50. package/src/assets/svg/ChevronDownStrokeSolid.vue +0 -19
  51. package/src/assets/svg/ChevronDownStrokeSolid.vue.js.map +0 -1
  52. package/src/assets/svg/SearchBigZoomIn.vue +0 -21
  53. package/src/assets/svg/SearchBigZoomIn.vue.js.map +0 -1
  54. package/src/assets/svg/SortArrow.vue +0 -24
  55. package/src/assets/svg/SortArrow.vue.js.map +0 -1
  56. package/src/assets/svg/Student.vue +0 -30
  57. package/src/assets/svg/Student.vue.js.map +0 -1
  58. package/src/assets/svg/partner.vue +0 -33
  59. package/src/assets/svg/partner.vue.js.map +0 -1
  60. package/src/assets/svg/people.vue +0 -25
  61. package/src/assets/svg/people.vue.js.map +0 -1
  62. package/src/assets/vue.svg +0 -1
  63. package/src/components/HelloWorld.vue +0 -1972
  64. package/src/components/HelloWorld.vue.js.map +0 -1
  65. package/src/components/accordion/EUIAccordion.stories.ts +0 -204
  66. package/src/components/accordion/EUIAccordion.vue +0 -152
  67. package/src/components/accordion/EUIAccordion.vue.js.map +0 -1
  68. package/src/components/alerts/EUIAlerts.stories.ts +0 -217
  69. package/src/components/alerts/EUIAlerts.vue +0 -194
  70. package/src/components/alerts/EUIAlerts.vue.js.map +0 -1
  71. package/src/components/avatar/EUIAvatar.stories.ts +0 -157
  72. package/src/components/avatar/EUIAvatar.vue +0 -96
  73. package/src/components/avatar/EUIAvatar.vue.js.map +0 -1
  74. package/src/components/breadcrumb/EUIBreadcrumb.stories.ts +0 -75
  75. package/src/components/breadcrumb/EUIBreadcrumb.vue +0 -59
  76. package/src/components/breadcrumb/EUIBreadcrumb.vue.js.map +0 -1
  77. package/src/components/button/EUIButton.stories.ts +0 -270
  78. package/src/components/button/EUIButton.vue +0 -154
  79. package/src/components/button/EUIButton.vue.js.map +0 -1
  80. package/src/components/button/EUIButtonGroup.vue +0 -287
  81. package/src/components/button/EUIButtonGroup.vue.js.map +0 -1
  82. package/src/components/button/buttonAnimateTab.vue +0 -74
  83. package/src/components/button/buttonAnimateTab.vue.js.map +0 -1
  84. package/src/components/checkbox/EUICheckbox.stories.ts +0 -58
  85. package/src/components/checkbox/EUICheckbox.vue +0 -110
  86. package/src/components/checkbox/EUICheckbox.vue.js.map +0 -1
  87. package/src/components/datepicker/EUIDatepicker.stories.ts +0 -492
  88. package/src/components/datepicker/EUIDatepicker.vue +0 -295
  89. package/src/components/datepicker/EUIDatepicker.vue.js.map +0 -1
  90. package/src/components/delete.vue +0 -262
  91. package/src/components/delete.vue.js.map +0 -1
  92. package/src/components/dragModal/EUIDrag.vue +0 -179
  93. package/src/components/dragModal/EUIDrag.vue.js.map +0 -1
  94. package/src/components/dropdown/EUIMultiDropdown.stories.ts +0 -294
  95. package/src/components/dropdown/EUIMultiDropdown.vue +0 -187
  96. package/src/components/dropdown/EUIMultiDropdown.vue.js.map +0 -1
  97. package/src/components/errorMessage/EUIErrorMessage.scss +0 -0
  98. package/src/components/errorMessage/EUIErrorMessage.stories.ts +0 -41
  99. package/src/components/errorMessage/EUIErrorMessage.vue +0 -25
  100. package/src/components/errorMessage/EUIErrorMessage.vue.js.map +0 -1
  101. package/src/components/index.js.map +0 -1
  102. package/src/components/index.ts +0 -61
  103. package/src/components/input/EUIInput.stories.ts +0 -387
  104. package/src/components/input/EUIInput.vue +0 -223
  105. package/src/components/input/EUIInput.vue.js.map +0 -1
  106. package/src/components/input/EUINumberInput.vue +0 -250
  107. package/src/components/loader/EUICircleLoader.vue +0 -31
  108. package/src/components/loader/EUICircleLoader.vue.js.map +0 -1
  109. package/src/components/loader/EUICubeLoader.vue +0 -237
  110. package/src/components/loader/EUICubeLoader.vue.js.map +0 -1
  111. package/src/components/loader/EUILoader.stories.ts +0 -99
  112. package/src/components/loader/EUILoader.vue +0 -17
  113. package/src/components/loader/EUILoader.vue.js.map +0 -1
  114. package/src/components/loader/EUISquareLoader.vue +0 -47
  115. package/src/components/loader/EUISquareLoader.vue.js.map +0 -1
  116. package/src/components/modal/EUIModal.stories.ts +0 -412
  117. package/src/components/modal/EUIModal.vue +0 -228
  118. package/src/components/modal/EUIModal.vue.js.map +0 -1
  119. package/src/components/pillSelect/EUIPillSelect.stories.ts +0 -74
  120. package/src/components/pillSelect/EUIPillSelect.vue +0 -149
  121. package/src/components/pillSelect/EUIPillSelect.vue.js.map +0 -1
  122. package/src/components/popover/EUIPopover.stories.ts +0 -306
  123. package/src/components/popover/EUIPopover.vue +0 -297
  124. package/src/components/popover/EUIPopover.vue.js.map +0 -1
  125. package/src/components/radio/EUIRadio.stories.ts +0 -54
  126. package/src/components/radio/EUIRadio.vue +0 -75
  127. package/src/components/radio/EUIRadio.vue.js.map +0 -1
  128. package/src/components/searchInput/EUISearch.stories.ts +0 -24
  129. package/src/components/searchInput/EUISearch.vue +0 -223
  130. package/src/components/searchInput/EUISearch.vue.js.map +0 -1
  131. package/src/components/searchTagSelect/EUISearchTagSelect.stories.ts +0 -217
  132. package/src/components/searchTagSelect/EUISearchTagSelect.vue +0 -642
  133. package/src/components/searchTagSelect/EUISearchTagSelect.vue.js.map +0 -1
  134. package/src/components/searchTagSelect/SearchInput.vue +0 -167
  135. package/src/components/searchTagSelect/SearchInput.vue.js.map +0 -1
  136. package/src/components/searchexpand/EUISearchExpand.vue +0 -148
  137. package/src/components/searchexpand/EUISearchExpand.vue.js.map +0 -1
  138. package/src/components/searchexpand/EUISearchToggle.vue +0 -86
  139. package/src/components/searchexpand/EUISearchToggle.vue.js.map +0 -1
  140. package/src/components/select/EUISelect.stories.ts +0 -101
  141. package/src/components/select/EUISelect.vue +0 -1092
  142. package/src/components/select/EUISelect.vue.js.map +0 -1
  143. package/src/components/slideover/EUISlideover.stories.ts +0 -318
  144. package/src/components/slideover/EUISlideover.vue +0 -212
  145. package/src/components/slideover/EUISlideover.vue.js.map +0 -1
  146. package/src/components/stepperTimeline/EUIStepperHorizontal.vue +0 -242
  147. package/src/components/stepperTimeline/EUIStepperHorizontal.vue.js.map +0 -1
  148. package/src/components/stepperTimeline/EUIStepperTimeline.stories.ts +0 -54
  149. package/src/components/stepperTimeline/EUIStepperTimeline.vue +0 -16
  150. package/src/components/stepperTimeline/EUIStepperTimeline.vue.js.map +0 -1
  151. package/src/components/stepperTimeline/EUIStepperVertical.vue +0 -112
  152. package/src/components/stepperTimeline/EUIStepperVertical.vue.js.map +0 -1
  153. package/src/components/table/ColumnResizeTable.vue +0 -740
  154. package/src/components/table/ColumnResizeTable.vue.js.map +0 -1
  155. package/src/components/table/EUIDashboardTable.vue +0 -514
  156. package/src/components/table/EUIDashboardTable.vue.js.map +0 -1
  157. package/src/components/table/EUIPageLimit.vue +0 -66
  158. package/src/components/table/EUIPageLimit.vue.js.map +0 -1
  159. package/src/components/table/EUIPagination.vue +0 -175
  160. package/src/components/table/EUIPagination.vue.js.map +0 -1
  161. package/src/components/table/EUIStudentPagination.vue +0 -172
  162. package/src/components/table/EUIStudentPagination.vue.js.map +0 -1
  163. package/src/components/table/EUITable.stories.ts +0 -300
  164. package/src/components/table/EUITable.vue +0 -559
  165. package/src/components/table/EUITable.vue.js.map +0 -1
  166. package/src/components/table/EUITableCheckbox.vue +0 -98
  167. package/src/components/table/EUITableCheckbox.vue.js.map +0 -1
  168. package/src/components/table/GrowthTable.vue +0 -575
  169. package/src/components/table/GrowthTable.vue.js.map +0 -1
  170. package/src/components/table/GrowthTableView.vue +0 -108
  171. package/src/components/table/GrowthTableView.vue.js.map +0 -1
  172. package/src/components/table/ResizeTableview.vue +0 -198
  173. package/src/components/table/ResizeTableview.vue.js.map +0 -1
  174. package/src/components/table/UCheckbox.vue +0 -169
  175. package/src/components/table/UCheckbox.vue.js.map +0 -1
  176. package/src/components/table/UTable.scss +0 -69
  177. package/src/components/table/UTable.vue +0 -611
  178. package/src/components/table/UTable.vue.js.map +0 -1
  179. package/src/components/table/UTableview.vue +0 -189
  180. package/src/components/table/UTableview.vue.js.map +0 -1
  181. package/src/components/tabs/EUITabOutline.vue +0 -263
  182. package/src/components/tabs/EUITabOutline.vue.js.map +0 -1
  183. package/src/components/tabs/EUITabs.vue +0 -262
  184. package/src/components/tabs/EUITabs.vue.js.map +0 -1
  185. package/src/components/tabs/EUItabs.stories.ts +0 -137
  186. package/src/components/tag/EUITag.stories.ts +0 -53
  187. package/src/components/tag/EUITag.vue +0 -88
  188. package/src/components/tag/EUITag.vue.js.map +0 -1
  189. package/src/components/telephone/EUITelephone.stories.ts +0 -358
  190. package/src/components/telephone/EUITelephone.vue +0 -291
  191. package/src/components/telephone/EUITelephone.vue.js.map +0 -1
  192. package/src/components/textArea/EUITextArea.stories.ts +0 -134
  193. package/src/components/textArea/EUITextArea.vue +0 -155
  194. package/src/components/textArea/EUITextArea.vue.js.map +0 -1
  195. package/src/components/timeLine/EUITimeLine.stories.ts +0 -247
  196. package/src/components/timeLine/EUITimeLine.vue +0 -148
  197. package/src/components/timeLine/EUITimeLine.vue.js.map +0 -1
  198. package/src/components/toggle/EUIToggle.stories.ts +0 -63
  199. package/src/components/toggle/EUIToggle.vue +0 -101
  200. package/src/components/toggle/EUIToggle.vue.js.map +0 -1
  201. package/src/components/tooltip/EUITooltip.stories.ts +0 -53
  202. package/src/components/tooltip/EUITooltip.vue +0 -111
  203. package/src/components/tooltip/EUITooltip.vue.js.map +0 -1
  204. package/src/components/uidemo/select-com.vue +0 -120
  205. package/src/components/uidemo/select-com.vue.js.map +0 -1
  206. package/src/data/books.js.map +0 -1
  207. package/src/data/books.ts +0 -163
  208. package/src/data/country.ts +0 -56
  209. package/src/data/tab.js.map +0 -1
  210. package/src/data/tab.ts +0 -40
  211. package/src/data/table.js.map +0 -1
  212. package/src/data/table.ts +0 -5654
  213. package/src/main.js.map +0 -1
  214. package/src/main.ts +0 -5
  215. package/src/style.scss +0 -186
  216. package/src/utils/helpers.js.map +0 -1
  217. package/src/utils/helpers.ts +0 -30
  218. package/src/utils/lodash.js.map +0 -1
  219. package/src/utils/lodash.ts +0 -9
  220. package/src/utils/types.js.map +0 -1
  221. package/src/utils/types.ts +0 -9
  222. package/src/vite-env.d.ts +0 -5
  223. /package/dist/{button/EUIButton.vue.d.ts → EUIButton.vue.d.ts} +0 -0
  224. /package/dist/{button/EUIButtonGroup.vue.d.ts → EUIButtonGroup.vue.d.ts} +0 -0
@@ -1,740 +0,0 @@
1
- <template>
2
- <div>
3
- <Transition name="fade" mode="out-in">
4
- <template v-if="loading">
5
- <slot name="loader" :loading="loading" :height="tableHeight">
6
- <div
7
- :class="[
8
- 'overflow-hidden relative z-0 isolate bg-white backdrop-blur transition-colors duration-150 ease-in-out rounded-xl border border-gray-50',
9
- tableHeight
10
- ? tableHeight
11
- : 'h-[calc(100svh-9rem)] max-h-[calc(100svh-9rem)]',
12
- ]"
13
- >
14
- <div
15
- class="absolute flex items-center z-[calc(infinity)] w-full h-auto pointer-events-none inset-0"
16
- >
17
- <EUICircleLoader />
18
- </div>
19
- </div>
20
- </slot>
21
- </template>
22
-
23
- <div v-else class="relative max-w-full mx-auto">
24
- <article
25
- :class="[
26
- 'table-widget scrollbar--auto rounded-lg',
27
- computedItems.length === 0
28
- ? 'overflow-hidden pointer-events-none'
29
- : 'overflow-scroll',
30
- tableHeight
31
- ? tableHeight
32
- : 'h-[calc(100svh-12rem)] max-h-[calc(100svh-12rem)]',
33
- ]"
34
- ref="tableContainer"
35
- @scroll="handleScroll"
36
- >
37
- <table ref="tableElementRef">
38
- <thead>
39
- <tr>
40
- <th
41
- v-if="checkable"
42
- class="checkable"
43
- style="
44
- width: 45px;
45
- max-width: 45px;
46
- background-color: rgb(243 244 246);
47
- "
48
- scope="col"
49
- >
50
- <UCheckbox
51
- :checked="isAllChecked"
52
- :indeterminate="isIndeterminate"
53
- :disabled="isAllUncheckable"
54
- @change="checkAll"
55
- />
56
- </th>
57
- <th
58
- v-for="(header, headerIndex) in headers"
59
- :key="headerIndex"
60
- scope="col"
61
- :class="[
62
- 'snap-start snap-always py-2',
63
- header?.sortable
64
- ? 'cursor-pointer hover:!text-gray-900 pr-8 pl-3'
65
- : 'px-3 cursor-auto',
66
- isScrolled && headerIndex === 0
67
- ? stickyClass.head
68
- : 'sticky top-0 z-10',
69
- { '!bg-gray-200': currentSort === header.value },
70
- header?.resizable ? 'resizable' : '',
71
- ]"
72
- :style="
73
- headers.length > 6
74
- ? headerStyle(header)
75
- : 'width: 100%;min-width: 250px;background-color: rgb(243 244 246);'
76
- "
77
- @click="sortBy(header, $event)"
78
- >
79
- <div class="relative z-0 w-full">
80
- <div
81
- class="w-full text-sm font-bold text-current truncate font-inter"
82
- >
83
- <slot name="header" :header="header" :index="headerIndex">
84
- {{ capitalizeText(header?.text ?? header?.name ?? "") }}
85
- </slot>
86
- <slot
87
- v-if="headerOptional"
88
- name="headerOptionalItem"
89
- ></slot>
90
- </div>
91
- <div
92
- v-if="header?.sortable"
93
- class="absolute -top-0.5 -right-6 size-6 z-10"
94
- >
95
- <svg
96
- width="24"
97
- height="24"
98
- viewBox="0 0 24 24"
99
- fill="none"
100
- xmlns="http://www.w3.org/2000/svg"
101
- class="size-6"
102
- >
103
- <rect width="24" height="24" fill="none" />
104
- <path
105
- d="M8 10C9.06206 8.5381 10.3071 7.2287 11.7021 6.1058C11.8774 5.9647 12.1226 5.9647 12.2979 6.1058C13.6929 7.2287 14.9379 8.5381 16 10"
106
- :stroke="
107
- currentSortDir === 'asc' &&
108
- currentSort === header?.value
109
- ? '#111827'
110
- : '#9ca3af'
111
- "
112
- stroke-opacity="0.8"
113
- stroke-width="2"
114
- stroke-linecap="round"
115
- stroke-linejoin="round"
116
- />
117
- <path
118
- d="M8 14C9.06206 15.4619 10.3071 16.7713 11.7021 17.8942C11.8774 18.0353 12.1226 18.0353 12.2979 17.8942C13.6929 16.7713 14.9379 15.4619 16 14"
119
- :stroke="
120
- currentSortDir === 'desc' &&
121
- currentSort === header?.value
122
- ? '#111827'
123
- : '#9ca3af'
124
- "
125
- stroke-opacity="0.8"
126
- stroke-width="2"
127
- stroke-linecap="round"
128
- stroke-linejoin="round"
129
- />
130
- </svg>
131
- </div>
132
- </div>
133
- </th>
134
- </tr>
135
- </thead>
136
- <tbody>
137
- <template
138
- v-if="computedItems.length > 0"
139
- v-for="(row, rowIndex) in computedItems"
140
- :key="`table-row-${rowIndex}`"
141
- >
142
- <tr
143
- :id="`row-${rowIndex}`"
144
- @mouseenter="
145
- $attrs.mouseenter
146
- ? $emit('mouseenter', row, rowIndex)
147
- : null
148
- "
149
- @mouseleave="
150
- $attrs.mouseleave
151
- ? $emit('mouseleave', row, rowIndex)
152
- : null
153
- "
154
- class="group"
155
- :class="{ 'bg-purple-100': activeRowIndex == rowIndex }"
156
- >
157
- <td
158
- v-if="checkable"
159
- class="checkable"
160
- style="width: 45px; max-width: 45px"
161
- >
162
- <UCheckbox
163
- :disabled="!isRowCheckable(row)"
164
- :checked="isRowChecked(row)"
165
- @change.prevent.stop="
166
- ($event) => checkRow(row, rowIndex, $event)
167
- "
168
- />
169
- </td>
170
- <td
171
- v-for="(header, headerIndex) in headers"
172
- :key="headerIndex"
173
- :style="bodyStyle(header)"
174
- :class="[
175
- isScrolled && headerIndex === 0 ? stickyClass.body : null,
176
- { '!bg-purple-100': activeRowIndex == rowIndex },
177
- ]"
178
- >
179
- <slot
180
- :name="`item.${header?.value}`"
181
- :row="row"
182
- :rowIndex="rowIndex"
183
- :headerIndex="headerIndex"
184
- >
185
- <span class="block truncate">{{
186
- getValueByPath(row, header?.value)
187
- }}</span>
188
- </slot>
189
- </td>
190
- </tr>
191
- <template v-if="tableExpanded">
192
- <slot
193
- name="expanded"
194
- :row="row"
195
- :rowIndex="rowIndex"
196
- :headerLength="headers.length"
197
- ></slot>
198
- </template>
199
- </template>
200
- <template v-else-if="computedItems.length === 0">
201
- <tr class="norecords">
202
- <td
203
- :colspan="
204
- checkable === true ? headers.length + 1 : headers.length
205
- "
206
- >
207
- <slot name="no-records">
208
- <div
209
- class="flex items-center justify-center w-[calc(100vw-14rem)]"
210
- :class="[
211
- tableHeight
212
- ? tableHeight
213
- : 'h-[calc(100svh-12rem)] max-h-[calc(100svh-12rem)]',
214
- ]"
215
- >
216
- <div class="text-center">
217
- <div
218
- class="mx-auto overflow-hidden rounded-md size-56"
219
- >
220
- <img
221
- src="@/assets/images/search-nodata.png"
222
- alt=""
223
- class="block object-contain object-center h-auto max-w-full opacity-90"
224
- />
225
- </div>
226
- <div class="my-2 text-xl font-medium text-gray-500">
227
- No matching records found
228
- </div>
229
- </div>
230
- </div>
231
- </slot>
232
- </td>
233
- </tr>
234
- </template>
235
- </tbody>
236
- </table>
237
- </article>
238
- <div
239
- v-if="stickyFooter"
240
- class="sticky bottom-0 left-0 z-50 flex items-center justify-between px-2 py-1 bg-white border-t border-gray-300"
241
- >
242
- <slot name="tableCount">
243
- <div class="inline-flex items-center gap-x-2">
244
- <div class="text-sm font-medium text-gray-900">
245
- Total {{ total }}
246
- </div>
247
- <span class="text-gray-300">&vert;</span>
248
- <div class="inline-flex items-center">
249
- <span class="text-sm font-medium text-gray-900">Per page</span>
250
- <EUIPageLimit
251
- :page-limit="limit"
252
- @update-limit="changeLimit($event)"
253
- @refetch="searchData($event)"
254
- :iconStyle="true"
255
- />
256
- </div>
257
- </div>
258
- </slot>
259
- <template v-if="paginated && computedItems.length !== 0">
260
- <slot name="tablepagination">
261
- <EUIStudentPagination
262
- :activePage="newCurrentPage"
263
- :pageLimit="limit"
264
- :totalCount="total"
265
- @change-page="pageChanged($event)"
266
- />
267
- </slot>
268
- </template>
269
- </div>
270
- </div>
271
- </Transition>
272
- </div>
273
- </template>
274
-
275
- <script setup lang="ts">
276
- import {
277
- ref,
278
- nextTick,
279
- computed,
280
- watch,
281
- toRefs,
282
- PropType,
283
- onMounted,
284
- onUnmounted,
285
- } from "vue";
286
- import { getValueByPath, indexOf, defaultFilter } from "../../utils/helpers";
287
- import UCheckbox from "./UCheckbox.vue";
288
- import { capitalizeText } from "../../utils/lodash";
289
- import EUIStudentPagination from "./EUIStudentPagination.vue";
290
- import EUICircleLoader from "../loader/EUICircleLoader.vue";
291
- import EUIPageLimit from "./EUIPageLimit.vue";
292
-
293
- interface Header {
294
- value: string;
295
- text?: string;
296
- name?: string;
297
- sortable?: boolean;
298
- width?: number;
299
- color?: string;
300
- resizable?: boolean;
301
- }
302
-
303
- interface Item {
304
- [key: string]: any;
305
- }
306
-
307
- const props = defineProps({
308
- items: { type: Array as PropType<Item[]>, default: () => [], required: true },
309
- headers: {
310
- type: Array as PropType<Header[]>,
311
- default: () => [],
312
- required: true,
313
- },
314
- stickyFooter: { type: Boolean, default: true },
315
- paginated: { type: Boolean, default: false },
316
- tableExpanded: { type: Boolean, default: false },
317
- search: { type: String, default: "" },
318
- perPage: { type: Number, default: 5 },
319
- total: { type: Number, default: 0 },
320
- currentPage: { type: Number, default: 1 },
321
- defaultSort: { type: String, default: "" },
322
- defaultSortDirection: { type: String, default: "asc" },
323
- headerOptional: { type: Boolean, default: false },
324
- checkedRows: { type: Array as PropType<Item[]>, default: () => [] },
325
- checkable: { type: Boolean, default: false },
326
- isRowCheckable: {
327
- type: Function as PropType<(row: Item) => boolean>,
328
- default: () => true,
329
- },
330
- stickyColumn: { type: Boolean, default: true },
331
- tableHeight: {
332
- type: String,
333
- required: false,
334
- default: "",
335
- },
336
- tableLoading: { type: Boolean, default: false },
337
- backendPagination: Boolean,
338
- activeRowIndex: { type: Number, default: null },
339
- });
340
-
341
- const {
342
- defaultSort,
343
- defaultSortDirection,
344
- checkedRows,
345
- currentPage,
346
- items,
347
- backendPagination,
348
- total,
349
- search,
350
- headers,
351
- paginated,
352
- isRowCheckable,
353
- activeRowIndex,
354
- } = toRefs(props);
355
-
356
- // Emits used
357
- const emit = defineEmits([
358
- "update:currentPage",
359
- "changePage",
360
- "sort",
361
- "check",
362
- "check-all",
363
- "update:checkedRows",
364
- "update:selectedRows",
365
- "changeLimit",
366
- "mouseenter",
367
- "mouseleave",
368
- ]);
369
-
370
- const currentSort = ref(defaultSort.value);
371
- const currentSortDir = ref(defaultSortDirection.value);
372
- const newCheckedRows = ref([...checkedRows.value]);
373
- const newCurrentPage = ref(currentPage.value);
374
- const limit = ref(props.perPage);
375
- const loading = computed(() => props.tableLoading);
376
-
377
- // Computed Property
378
-
379
- const filteredItems = computed(() => {
380
- let filteredItems = items.value.slice();
381
- if (!backendPagination.value && search.value !== "") {
382
- if (search.value.trim() === "") return filteredItems;
383
- const props = headers.value.map((h: any) => h.value);
384
- filteredItems = items.value.filter((row) =>
385
- props.some((prop) =>
386
- defaultFilter(
387
- getValueByPath(row, prop),
388
- search.value.toString().toLowerCase()
389
- )
390
- )
391
- );
392
- }
393
- return filteredItems;
394
- });
395
-
396
- const computedItems = computed(() => {
397
- let items = filteredItems.value;
398
- // Sort items before slicing for pagination
399
- items.sort((a: any, b: any) => {
400
- const modifier = currentSortDir.value === "desc" ? -1 : 1;
401
- if (a[currentSort.value] < b[currentSort.value]) return -1 * modifier;
402
- if (a[currentSort.value] > b[currentSort.value]) return 1 * modifier;
403
- return 0;
404
- });
405
- return items;
406
-
407
- // Apply pagination
408
- // const start = (newCurrentPage.value - 0) * limit.value;
409
- // const end = start + limit.value;
410
- // return items.slice(start, end);
411
- });
412
-
413
- const headerStyle = (header: Header) => ({
414
- width: `${header.width || 300}px`,
415
- maxWidth: `${header.width ? 500 : 300}px`,
416
- backgroundColor: header.color || "rgb(243 244 246)",
417
- // flex: `${header.width || 300} 0 auto`,
418
- });
419
-
420
- const bodyStyle = (header: Header) => ({
421
- width: `${header.width || 300}px`,
422
- maxWidth: `${header.width ? 500 : 300}px`,
423
- // flex: `${header.width || 300} 0 auto`,
424
- });
425
-
426
- const searchData = (_data: any) => {
427
- // console.log(_data);
428
- };
429
-
430
- const changeLimit = (limitData: number) => {
431
- limit.value = limitData;
432
- newCurrentPage.value = 0;
433
- emit("update:currentPage", newCurrentPage.value);
434
- emit("changeLimit", limitData);
435
- };
436
-
437
- const pageChanged = (page: number) => {
438
- newCurrentPage.value = page > 0 ? page : 0;
439
- emit("update:currentPage", newCurrentPage.value);
440
- emit("changePage", page);
441
- };
442
-
443
- const sortBy = (header: any, event: any) => {
444
- if (!header || !header.sortable) return;
445
- if (header.value === currentSort.value) {
446
- currentSortDir.value = currentSortDir.value === "asc" ? "desc" : "asc";
447
- }
448
- currentSort.value = header.value;
449
- emit("sort", currentSort.value, currentSortDir.value, event);
450
- };
451
-
452
- const isAllChecked = computed(() => {
453
- return (
454
- computedItems.value.length > 0 &&
455
- computedItems.value.every((row) => newCheckedRows.value.includes(row))
456
- );
457
- });
458
-
459
- const isAllUncheckable = computed(() => {
460
- const validVisibleData = computedItems.value?.filter((row) =>
461
- isRowCheckable.value!(row)
462
- );
463
- return validVisibleData.length === 0;
464
- });
465
-
466
- const isIndeterminate = computed(() => {
467
- const validVisibleData = computedItems.value.filter((row) =>
468
- isRowCheckable.value(row)
469
- );
470
- return (
471
- newCheckedRows.value.length > 0 &&
472
- newCheckedRows.value.length < validVisibleData.length
473
- );
474
- });
475
-
476
- const isRowChecked = (row: any) => {
477
- return indexOf(newCheckedRows.value, row) >= 0;
478
- };
479
-
480
- const removeCheckedRow = (row: any) => {
481
- const index = indexOf(newCheckedRows.value, row);
482
- if (index >= 0) {
483
- newCheckedRows.value.splice(index, 1);
484
- }
485
- };
486
-
487
- const checkAll = () => {
488
- if (isAllChecked.value) {
489
- // Uncheck all rows
490
- newCheckedRows.value = [];
491
- } else {
492
- // Check all rows
493
- const rowsToCheck = computedItems.value.filter(
494
- (row) => !newCheckedRows.value.includes(row)
495
- );
496
- newCheckedRows.value.push(...rowsToCheck);
497
- }
498
- emit("check", newCheckedRows.value);
499
- emit("check-all", newCheckedRows.value);
500
- emit("update:checkedRows", newCheckedRows.value);
501
- emit("update:selectedRows", newCheckedRows.value);
502
- };
503
-
504
- const checkRow = (row: any, _rowIndex: number, _event: any) => {
505
- const isChecked = newCheckedRows.value.includes(row);
506
- if (_event && isChecked) {
507
- removeCheckedRow(row);
508
- } else {
509
- newCheckedRows.value.push(row);
510
- }
511
- emit("check", newCheckedRows.value, row);
512
- emit("update:checkedRows", newCheckedRows.value);
513
- emit("update:selectedRows", newCheckedRows.value);
514
- };
515
-
516
- // watch
517
- watch(
518
- () => currentPage.value,
519
- (newVal) => {
520
- newCurrentPage.value = newVal;
521
- },
522
- { immediate: true }
523
- );
524
- watch(
525
- () => checkedRows.value,
526
- (rows) => {
527
- newCheckedRows.value = [...rows];
528
- },
529
- { immediate: true }
530
- );
531
-
532
- const stickyClass = computed(() => {
533
- return props.checkable && props.stickyColumn
534
- ? {
535
- head: "bg-gray-100 sticky left-[45px] top-0 z-20",
536
- body: "bg-white !sticky left-[45px] top-0 z-10 !overflow-visible after:absolute after:content-[''] after:bg-inherit after:w-2 after:h-[103%] after:inset-y-0 after:-right-2 after:bg-gradient-to-r after:from-gray-200 after:from-0% after:via-gray-50 after:via-60% after:z-10",
537
- }
538
- : {
539
- head: "bg-gray-100 sticky left-0 top-0 z-20",
540
- body: "bg-white !sticky left-0 top-0 z-10 !overflow-visible after:absolute after:content-[''] after:bg-inherit after:w-2 after:h-[103%] after:inset-y-0 after:-right-2 after:bg-gradient-to-r after:from-gray-200 after:from-0% after:via-gray-50 after:via-60% after:z-0",
541
- };
542
- });
543
-
544
- const isOverflowing = ref(false);
545
- const isScrolled = ref(false);
546
- const tableContainer = ref<HTMLElement | null>(null);
547
-
548
- const handleScroll = () => {
549
- const container = tableContainer.value;
550
- if (container) {
551
- isScrolled.value = container.scrollLeft > 0;
552
- }
553
- };
554
-
555
- const checkOverflow = () => {
556
- const container = tableContainer.value;
557
- if (container) {
558
- isOverflowing.value = container.scrollWidth > container.clientWidth;
559
- }
560
- };
561
-
562
- // table Column Resize
563
- const tableElementRef = ref<HTMLTableElement | null>(null);
564
-
565
- const tableColumnResize = () => {
566
- let isResizing = false;
567
- const table = tableElementRef.value;
568
- if (!table) return;
569
-
570
- const resizableColumns = table.querySelectorAll("th.resizable");
571
- if (!resizableColumns) return;
572
-
573
- resizableColumns.forEach((th) => {
574
- const resizer = document.createElement("div");
575
- resizer.classList.add("col-resize");
576
- // (th as HTMLElement).style.position = "relative";
577
- th.appendChild(resizer);
578
-
579
- let startX: number, startWidth: number;
580
-
581
- const mouseDownHandler = function (e: any) {
582
- startX = e.pageX;
583
- startWidth = parseInt(
584
- document.defaultView?.getComputedStyle(th)?.width || "0px",
585
- 10
586
- );
587
- isResizing = true;
588
-
589
- document.documentElement.addEventListener("mousemove", onMouseMove);
590
- document.documentElement.addEventListener("mouseup", onMouseUp);
591
- table.classList.add("column-resizer");
592
- e.preventDefault();
593
- };
594
-
595
- const onMouseMove = function (e: any) {
596
- if (isResizing) {
597
- const newWidth = startWidth + (e.pageX - startX);
598
- if (newWidth > 100) {
599
- // Minimum width constraint
600
- (th as HTMLElement).style.width = newWidth + "px";
601
- }
602
- }
603
- };
604
-
605
- const onMouseUp = function () {
606
- isResizing = false;
607
- document.documentElement.removeEventListener("mousemove", onMouseMove);
608
- document.documentElement.removeEventListener("mouseup", onMouseUp);
609
- table.classList.remove("column-resizer");
610
- setTimeout(() => (isResizing = false), 100);
611
- };
612
-
613
- resizer.addEventListener("mousedown", mouseDownHandler);
614
- });
615
-
616
- // Add click handlers for sorting
617
- const headers = table.querySelectorAll("th");
618
- if (!headers) return;
619
- };
620
-
621
- onMounted(async () => {
622
- await nextTick();
623
- if (tableElementRef.value) {
624
- tableColumnResize();
625
- }
626
- window.addEventListener("resize", checkOverflow);
627
- });
628
-
629
- onUnmounted(() => {
630
- window.removeEventListener("resize", checkOverflow);
631
- });
632
-
633
- // Watch for changes in the container's width to check for overflow
634
- watch(() => tableContainer.value?.clientWidth, checkOverflow);
635
- </script>
636
-
637
- <style lang="scss">
638
- .table-widget {
639
- @apply bg-white bg-no-repeat max-w-full;
640
- background-image: linear-gradient(to right, white, white),
641
- linear-gradient(to right, white, white),
642
- linear-gradient(to right, rgba(229, 231, 235, 0.5), rgba(255, 255, 255, 0)),
643
- linear-gradient(to left, rgba(229, 231, 235, 0.5), rgba(255, 255, 255, 0)),
644
- linear-gradient(to top, white, rgba(255, 255, 255, 0)),
645
- linear-gradient(to bottom, rgba(255, 255, 255, 0), rgba(229, 231, 235, 0.5));
646
- background-position: left center, right center, left center, right center,
647
- left bottom, left bottom;
648
- background-size: 45px 100%, 32px 100%, 20px 100%, 20px 100%, 100% 100px,
649
- 100% 20px;
650
- background-attachment: local, local, scroll, scroll, local, scroll;
651
-
652
- & > table {
653
- @apply table table-fixed border-separate border-spacing-0 box-border w-full;
654
-
655
- & > thead th {
656
- transition: background-color 0.2s ease, color 0.2s ease;
657
- @apply bg-gray-50 text-sm text-gray-700 text-left first-letter:uppercase border border-b-0 border-l-0 border-solid border-gray-200/50 whitespace-nowrap align-middle last-of-type:rounded-tr-lg first-of-type:rounded-tl-lg first:border-l last:border-r font-bold snap-start snap-always h-10 min-w-16;
658
- transition: all 0.15s ease-out;
659
- &:first-of-type.checkable {
660
- @apply min-h-10 px-2 max-w-[45px] w-[45px] sticky left-0 top-0 z-20 bg-gray-100;
661
- }
662
- }
663
-
664
- tbody {
665
- & > tr:not(.norecords, .row-expanded) {
666
- @apply transition-all duration-100 ease-in-out last:mb-px;
667
- &:hover {
668
- transition: all 0.15s ease-out;
669
- @apply bg-purple-50;
670
- td {
671
- @apply first:rounded-l-sm last:rounded-r-sm transition-colors duration-100 ease-in text-gray-900 bg-purple-50;
672
- &:first-of-type.checkable {
673
- @apply bg-purple-50;
674
- }
675
- }
676
- }
677
- td {
678
- @apply border-0 first:border-l border-r relative text-sm font-medium text-gray-600 border-b border-solid break-words border-gray-100 py-1.5 px-3 h-14 align-middle bg-white;
679
- &:first-of-type.checkable {
680
- @apply flex justify-center w-[45px] text-center sticky left-0 top-0 z-[11] bg-white overflow-visible;
681
- }
682
- }
683
- }
684
-
685
- & > tr.row-expanded {
686
- @apply bg-gray-50;
687
- }
688
-
689
- & > tr {
690
- transition-property: filter, background, opacity;
691
- transition-duration: 0.2s;
692
- transition-timing-function: ease-out;
693
- }
694
- }
695
-
696
- /*
697
- //TODO: table checkbox check highlight
698
- &:focus-within tbody tr:not(:focus-within) {
699
- filter: blur(4px) saturate(0.2);
700
- pointer-events: none;
701
- opacity: 0.6;
702
- }
703
- tr:focus-within td:hover:not(:focus-visible) {
704
- background: color-mix(in oklch, blue, #0000 95%);
705
- }
706
- */
707
-
708
- /*
709
- // TODO: hover tr
710
- & tbody:hover tr:not(:hover) {
711
- filter: blur(4px) saturate(0.2);
712
- pointer-events: none;
713
- opacity: 0.6;
714
- }
715
- */
716
-
717
- // TODO: Hover Row highlight
718
- & tbody:hover tr:not(:hover) td:not(:nth-child(-n + 2)) {
719
- filter: blur(4px) saturate(0.2);
720
- pointer-events: none;
721
- opacity: 0.6;
722
- }
723
- }
724
- }
725
-
726
- /* Column resizer */
727
- .col-resize {
728
- @apply absolute top-1/4 right-0 w-1 h-1/2 bg-gray-600 cursor-col-resize z-10 rounded-lg;
729
- }
730
-
731
- .table-widget.column-resizer {
732
- cursor: col-resize;
733
- user-select: none;
734
- }
735
-
736
- .table-widget.column-resizer th,
737
- .table-widget.column-resizer th:hover {
738
- cursor: col-resize;
739
- }
740
- </style>