classcard-ui 0.2.1069 → 0.2.1070

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 (190) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +56 -53
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.umd.js +56 -53
  5. package/dist/classcard-ui.umd.js.map +1 -1
  6. package/dist/classcard-ui.umd.min.js +1 -1
  7. package/dist/classcard-ui.umd.min.js.map +1 -1
  8. package/package.json +82 -82
  9. package/src/App.vue +16 -16
  10. package/src/components/CAlerts/CAlerts.vue +70 -70
  11. package/src/components/CAlerts/index.js +2 -2
  12. package/src/components/CAnchorTabs/CAnchorTabs.vue +96 -96
  13. package/src/components/CAnchorTabs/index.js +2 -2
  14. package/src/components/CAnchorTag/CAnchorTag.vue +62 -62
  15. package/src/components/CAnchorTag/index.js +2 -2
  16. package/src/components/CAvatar/CAvatar.vue +212 -212
  17. package/src/components/CAvatar/index.js +2 -2
  18. package/src/components/CAvatarGroup/CAvatarGroup.vue +145 -145
  19. package/src/components/CAvatarGroup/index.js +2 -2
  20. package/src/components/CBasicTable/CBasicTable.vue +184 -184
  21. package/src/components/CBasicTable/index.js +2 -2
  22. package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
  23. package/src/components/CBreadcrumbs/index.js +2 -2
  24. package/src/components/CButton/CButton.vue +152 -152
  25. package/src/components/CButton/index.js +2 -2
  26. package/src/components/CButtonGroup/CButtonGroup.vue +118 -118
  27. package/src/components/CButtonGroup/index.js +2 -2
  28. package/src/components/CButtonIcon/CButtonIcon.vue +117 -117
  29. package/src/components/CButtonIcon/index.js +2 -2
  30. package/src/components/CButtonLink/CButtonLink.vue +39 -39
  31. package/src/components/CButtonLink/index.js +2 -2
  32. package/src/components/CButtonSelect/CButtonSelect.vue +134 -134
  33. package/src/components/CButtonSelect/index.js +2 -2
  34. package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +135 -135
  35. package/src/components/CButtonSelectBorder/index.js +3 -3
  36. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +135 -135
  37. package/src/components/CButtonWithDropdown/index.js +2 -2
  38. package/src/components/CCalendar/CCalendar.vue +410 -410
  39. package/src/components/CCalendar/index.js +3 -3
  40. package/src/components/CCard/CCard.vue +49 -49
  41. package/src/components/CCard/index.js +2 -2
  42. package/src/components/CCheckbox/CCheckbox.vue +123 -123
  43. package/src/components/CCheckbox/index.js +2 -2
  44. package/src/components/CCircularButton/CCircularButton.vue +53 -53
  45. package/src/components/CCircularButton/index.js +2 -2
  46. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +101 -101
  47. package/src/components/CCollapsibleSection/index.js +2 -2
  48. package/src/components/CColorDots/CColorDots.vue +51 -51
  49. package/src/components/CColorDots/index.js +3 -3
  50. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +180 -180
  51. package/src/components/CConfirmActionModal/index.js +3 -3
  52. package/src/components/CDatepicker/CDatepicker.vue +201 -201
  53. package/src/components/CDatepicker/index.js +2 -2
  54. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  55. package/src/components/CDualSelect/index.js +2 -2
  56. package/src/components/CEditor/CEditor.vue +98 -98
  57. package/src/components/CEditor/index.js +2 -2
  58. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +53 -53
  59. package/src/components/CFormSectionHeading/index.js +2 -2
  60. package/src/components/CGroupedSelect/CGroupedSelect.vue +245 -245
  61. package/src/components/CGroupedSelect/index.js +3 -3
  62. package/src/components/CIcon/CIcon.vue +91 -91
  63. package/src/components/CIcon/index.js +2 -2
  64. package/src/components/CIconDropdown/CIconDropdown.vue +146 -146
  65. package/src/components/CIconDropdown/index.js +2 -2
  66. package/src/components/CInput/CInput.vue +134 -134
  67. package/src/components/CInput/index.js +2 -2
  68. package/src/components/CInputAddon/CInputAddon.vue +228 -228
  69. package/src/components/CInputAddon/index.js +2 -2
  70. package/src/components/CInputEmail/CInputEmail.vue +93 -93
  71. package/src/components/CInputEmail/index.js +2 -2
  72. package/src/components/CInsetTabs/CInsetTabs.vue +88 -88
  73. package/src/components/CInsetTabs/index.js +3 -3
  74. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  75. package/src/components/CModalHeading/index.js +2 -2
  76. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +70 -70
  77. package/src/components/CModuleHelpLinks/index.js +3 -3
  78. package/src/components/CMultiselect/CMultiselect.vue +615 -615
  79. package/src/components/CMultiselect/index.js +2 -2
  80. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  81. package/src/components/CMultiselectr/index.js +2 -2
  82. package/src/components/CPageHeading/CPageHeading.vue +56 -56
  83. package/src/components/CPageHeading/index.js +2 -2
  84. package/src/components/CPagination/CPagination.vue +233 -233
  85. package/src/components/CPagination/index.js +2 -2
  86. package/src/components/CPhoneNumber/CPhoneNumber.vue +114 -114
  87. package/src/components/CPhoneNumber/index.js +2 -2
  88. package/src/components/CProgress/CProgress.vue +57 -57
  89. package/src/components/CProgress/index.js +2 -2
  90. package/src/components/CRadio/CRadio.vue +126 -126
  91. package/src/components/CRadio/index.js +2 -2
  92. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  93. package/src/components/CRangeSlider/index.js +2 -2
  94. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  95. package/src/components/CReorderableStackedList/index.js +2 -2
  96. package/src/components/CSelect/CSelect.vue +539 -539
  97. package/src/components/CSelect/index.js +2 -2
  98. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  99. package/src/components/CSmallTimeline/index.js +2 -2
  100. package/src/components/CStackedList/CStackedList.vue +150 -150
  101. package/src/components/CStackedList/index.js +2 -2
  102. package/src/components/CStats/CStats.vue +116 -116
  103. package/src/components/CStats/index.js +2 -2
  104. package/src/components/CSwitch/CSwitch.vue +176 -176
  105. package/src/components/CSwitch/index.js +2 -2
  106. package/src/components/CTabLazy/CTabLazy.vue +63 -63
  107. package/src/components/CTabLazy/index.js +2 -2
  108. package/src/components/CTable/CTable.vue +671 -671
  109. package/src/components/CTable/index.js +2 -2
  110. package/src/components/CTabs/CTabs.vue +169 -169
  111. package/src/components/CTabs/index.js +2 -2
  112. package/src/components/CTag/CTag.vue +59 -59
  113. package/src/components/CTag/index.js +2 -2
  114. package/src/components/CTextarea/CTextarea.vue +107 -107
  115. package/src/components/CTextarea/index.js +2 -2
  116. package/src/components/CTimeline/CTimeline.vue +237 -237
  117. package/src/components/CTimeline/index.js +2 -2
  118. package/src/components/CUpload/CUpload.vue +267 -267
  119. package/src/components/CUpload/index.js +2 -2
  120. package/src/components/index.js +53 -53
  121. package/src/icons.js +459 -453
  122. package/src/main.js +22 -22
  123. package/src/stories/CAlerts.stories.js +37 -37
  124. package/src/stories/CAnchorTabs.stories.js +29 -29
  125. package/src/stories/CAnchorTag.stories.js +36 -36
  126. package/src/stories/CAvatar.stories.js +38 -38
  127. package/src/stories/CAvatarGroup.stories.js +100 -100
  128. package/src/stories/CBasicTable.stories.js +316 -316
  129. package/src/stories/CBreadcrumbs.stories.js +24 -24
  130. package/src/stories/CButton.stories.js +47 -47
  131. package/src/stories/CButtonGroup.stories.js +33 -33
  132. package/src/stories/CButtonIcon.stories.js +27 -27
  133. package/src/stories/CButtonLink.stories.js +24 -24
  134. package/src/stories/CButtonSelect.stories.js +41 -41
  135. package/src/stories/CButtonSelectBorder.stories.js +48 -48
  136. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  137. package/src/stories/CCalendar.stories.js +16 -16
  138. package/src/stories/CCard.stories.js +30 -30
  139. package/src/stories/CCheckbox.stories.js +29 -29
  140. package/src/stories/CCircularButton.stories.js +29 -29
  141. package/src/stories/CCollapsibleSection.stories.js +28 -28
  142. package/src/stories/CColorDots.stories.js +28 -28
  143. package/src/stories/CConfirmActionModal.stories.js +59 -59
  144. package/src/stories/CDatepicker.stories.js +30 -30
  145. package/src/stories/CDualSelect.stories.js +29 -29
  146. package/src/stories/CEditor.stories.js +30 -30
  147. package/src/stories/CFormSectionHeading.stories.js +34 -34
  148. package/src/stories/CGroupedSelect.stories.js +71 -71
  149. package/src/stories/CIcon.stories.js +28 -28
  150. package/src/stories/CIconDropdown.stories.js +45 -45
  151. package/src/stories/CInput.stories.js +36 -36
  152. package/src/stories/CInputAddon.stories.js +37 -37
  153. package/src/stories/CInputEmail.stories.js +27 -27
  154. package/src/stories/CInsetTabs.stories.js +38 -38
  155. package/src/stories/CModalHeading.stories.js +25 -25
  156. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  157. package/src/stories/CMultiselect.stories.js +167 -167
  158. package/src/stories/CMultiselectr.stories.js +23 -23
  159. package/src/stories/CPageHeading.stories.js +32 -32
  160. package/src/stories/CPagination.stories.js +30 -30
  161. package/src/stories/CPhoneNumber.stories.js +29 -29
  162. package/src/stories/CProgress.stories.js +23 -23
  163. package/src/stories/CRadio.stories.js +36 -36
  164. package/src/stories/CRangeSlider.stories.js +23 -23
  165. package/src/stories/CReorderableStackedList.stories.js +23 -23
  166. package/src/stories/CSelect.stories.js +109 -109
  167. package/src/stories/CSmallTimeline.stories.js +26 -26
  168. package/src/stories/CStackedList.stories.js +37 -37
  169. package/src/stories/CStats.stories.js +33 -33
  170. package/src/stories/CSwitch.stories.js +28 -28
  171. package/src/stories/CTabLazy.stories.js +26 -26
  172. package/src/stories/CTable.stories.js +169 -169
  173. package/src/stories/CTabs.stories.js +36 -36
  174. package/src/stories/CTag.stories.js +34 -34
  175. package/src/stories/CTextarea.stories.js +32 -32
  176. package/src/stories/CTimeline.stories.js +26 -26
  177. package/src/stories/CUpload.stories.js +36 -36
  178. package/src/stories/Introduction.stories.mdx +207 -207
  179. package/src/stories/Page.vue +88 -88
  180. package/src/stories/assets/code-brackets.svg +0 -0
  181. package/src/stories/assets/colors.svg +0 -0
  182. package/src/stories/assets/comments.svg +0 -0
  183. package/src/stories/assets/direction.svg +0 -0
  184. package/src/stories/assets/flow.svg +0 -0
  185. package/src/stories/assets/plugin.svg +0 -0
  186. package/src/stories/assets/repo.svg +0 -0
  187. package/src/stories/assets/stackalt.svg +0 -0
  188. package/src/stories/header.css +26 -26
  189. package/src/stories/page.css +69 -69
  190. package/src/stories/utils.css +17 -17
@@ -1,671 +1,671 @@
1
- <template>
2
- <div>
3
- <div
4
- slot="table-actions"
5
- v-if="tableActions"
6
- class="mb-4 rounded-lg bg-gray-50 p-3"
7
- >
8
- <div class="flex items-center justify-between">
9
- <slot name="customTableFilterActions"></slot>
10
- <div v-if="searching" class="flex items-center">
11
- <c-input
12
- v-model="searchTerm"
13
- :isValidate="searching"
14
- :placeholder="searchPlaceholder"
15
- class="-mt-1 mr-3 w-auto sm:w-56"
16
- type="text"
17
- ></c-input>
18
- <slot name="tableInfo"></slot>
19
- </div>
20
- <div class="flex flex-1 justify-end">
21
- <!-- dropdown icon on top right of table -->
22
- <slot name="customTableActions"></slot>
23
- <div class="relative inline-block text-left" v-if="enableVisibility">
24
- <!-- button to show list of columns to show hide in table -->
25
- <div>
26
- <button
27
- @click="handleToggle"
28
- class="inline-flex w-full justify-center rounded-md border border-gray-200 bg-white px-2 py-2 text-sm font-medium shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
29
- aria-haspopup="true"
30
- aria-expanded="true"
31
- >
32
- <c-icon
33
- name="view-board"
34
- type="solid"
35
- class="h-5 w-5 text-gray-400"
36
- ></c-icon>
37
- <c-icon
38
- name="chevron-down"
39
- type="solid"
40
- class="ml-1 h-5 w-5 text-gray-400"
41
- ></c-icon>
42
- </button>
43
- </div>
44
- <!-- dropdown having list of all columns to show hide -->
45
- <div
46
- v-if="toggleDropdown"
47
- @click="handleToggle"
48
- class="fixed inset-0 z-20"
49
- ></div>
50
- <div
51
- v-if="toggleDropdown"
52
- class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-56 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
53
- tabindex="0"
54
- >
55
- <div
56
- class="py-1"
57
- role="menu"
58
- aria-orientation="vertical"
59
- aria-labelledby="option-menu"
60
- >
61
- <a
62
- href="#"
63
- v-for="column in showHideColumnList"
64
- v-bind:key="column.field"
65
- class="block flex px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900"
66
- role="menuitem"
67
- >
68
- <c-checkbox
69
- :label="column.label"
70
- @onChange="showHideColumn($event, column.field)"
71
- :value="!column.hidden"
72
- ></c-checkbox>
73
- </a>
74
- </div>
75
- </div>
76
- </div>
77
- <slot name="customDatePicker"></slot>
78
-
79
- <!-- simple download button -->
80
- <div
81
- v-if="enableDownload && !downloadDropdown"
82
- @click="startDownload"
83
- >
84
- <c-button-icon
85
- type="white"
86
- :icon="
87
- downloadLoader
88
- ? null
89
- : {
90
- name: 'download-solid',
91
- type: 'solid',
92
- class: 'h-5 w-5 text-gray-400',
93
- }
94
- "
95
- class="ml-3"
96
- loaderClasses="ml-2"
97
- :isLoading="downloadLoader"
98
- ></c-button-icon>
99
- </div>
100
- <!-- no download buttons -->
101
- <div v-if="!enableDownload && !downloadDropdown"></div>
102
- <!-- download button with download options -->
103
- <div v-if="enableDownload && downloadDropdown" class="relative ml-3">
104
- <div>
105
- <button
106
- @click="handleDownloadToggle"
107
- class="inline-flex w-full justify-center rounded-md border border-gray-200 bg-white px-2 py-2 text-sm font-medium shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
108
- aria-haspopup="true"
109
- aria-expanded="true"
110
- >
111
- <c-icon
112
- v-if="downloadOptionLoader"
113
- cursorType="cursor-pointer"
114
- class="mr-2 h-5 w-5 text-gray-400"
115
- name="loader"
116
- ></c-icon>
117
- <c-icon
118
- v-else
119
- name="download-solid"
120
- type="solid"
121
- class="h-5 w-5 text-gray-400"
122
- ></c-icon>
123
- <c-icon
124
- name="chevron-down"
125
- type="solid"
126
- class="ml-1 h-5 w-5 text-gray-400"
127
- ></c-icon>
128
- </button>
129
- </div>
130
- <!-- download options dropdown -->
131
- <div
132
- v-if="toggleDownloadDropdown"
133
- @click="handleDownloadToggle"
134
- class="fixed inset-0 z-20"
135
- ></div>
136
- <div
137
- v-if="toggleDownloadDropdown"
138
- class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-64 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
139
- tabindex="0"
140
- >
141
- <div
142
- class="py-1"
143
- role="menu"
144
- aria-orientation="vertical"
145
- aria-labelledby="option-menu"
146
- >
147
- <div
148
- v-for="(item, index) in showDownloadDropdownList"
149
- :key="index"
150
- class="cursor-pointer px-4 py-2 text-sm text-gray-900 hover:bg-gray-100 hover:text-gray-900"
151
- role="menuitem"
152
- @click="downloadFromOption(item.value)"
153
- >
154
- <p>{{ item.title }}</p>
155
- <p class="text-sm text-gray-400">{{ item.description }}</p>
156
- </div>
157
- </div>
158
- </div>
159
- </div>
160
- <slot name="customTableExtraActions"></slot>
161
- </div>
162
- </div>
163
- </div>
164
- <vue-good-table
165
- :class="`rounded-lg ${
166
- hideBorder ? ' border-none' : 'border-2 border-solid border-gray-100'
167
- }`"
168
- mode="remote"
169
- ref="my-table"
170
- :styleClass="
171
- isLoading ? 'vgt-table opacity-50 pointer-events-none' : 'vgt-table'
172
- "
173
- :row-style-class="rowStyleClassFn"
174
- min-height="400px"
175
- :globalSearch="true"
176
- :totalRows="totalRecords"
177
- :columns="cols"
178
- :rows="rows"
179
- :search-options="{
180
- enabled: searching,
181
- externalQuery: searchTerm,
182
- placeholder: searchPlaceholder,
183
- trigger: 'enter',
184
- }"
185
- :select-options="{
186
- enabled: enableSelection,
187
- selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row
188
- selectionInfoClass: 'custom-class',
189
- selectionText: 'rows selected',
190
- clearSelectionText: 'clear',
191
- disableSelectInfo: true, // disable the select info panel on top
192
- selectAllByGroup: true, // when used in combination with a grouped table, add a checkbox in the header row to check/uncheck the entire group
193
- }"
194
- :sort-options="{
195
- enabled: sorting,
196
- initialSortBy: initialSortField,
197
- }"
198
- :pagination-options="{ enabled: pagination }"
199
- :fixed-header="fixedHeader"
200
- :group-options="{
201
- enabled: enableGrouping,
202
- collapsable: enableGrouping,
203
- maintainExpanded: enableGrouping,
204
- }"
205
- @on-selected-rows-change="selectionChanged"
206
- @on-sort-change="sortChange"
207
- @on-search="onSearching"
208
- @on-row-click="onRowClick"
209
- >
210
- >
211
- <template slot="table-column" slot-scope="props">
212
- <!-- custom sorting icon -->
213
- <span v-if="props.column.sortable || sorting" class="flex">
214
- <div>
215
- {{ props.column.label }}
216
- </div>
217
- <!-- render if there is no sorting order, appears on hover -->
218
- <c-icon
219
- v-if="props.column.direction == null"
220
- name="sort-ascending-solid"
221
- class="sortingIcon invisible ml-3 h-5 w-5"
222
- type="solid"
223
- ></c-icon>
224
- <!-- renders when direction is asc -->
225
- <c-icon
226
- v-else-if="props.column.direction == 'asc'"
227
- name="sort-ascending-solid"
228
- class="ml-3 h-5 w-5"
229
- type="solid"
230
- ></c-icon>
231
- <!-- renders when direction is desc -->
232
- <c-icon
233
- v-else-if="props.column.direction == 'desc'"
234
- name="sort-descending-solid"
235
- class="ml-3 h-5 w-5"
236
- type="solid"
237
- ></c-icon>
238
- </span>
239
- <span class="font-medium text-gray-500" v-else-if="fontHeader">
240
- {{ props.column.label }}
241
- </span>
242
- <span v-else>
243
- {{ props.column.label }}
244
- </span>
245
- </template>
246
- <div slot="emptystate" v-if="isLoading">
247
- <vue-skeleton-loader
248
- v-for="(item, index) in 10"
249
- :key="index"
250
- type="table-tbody: table-row-divider@6"
251
- animation="fade"
252
- :width="1220"
253
- :rounded="true"
254
- :radius="50"
255
- :class="`skeleton ${index === 0 ? '' : 'mt-2'}`"
256
- :height="50"
257
- ></vue-skeleton-loader>
258
- </div>
259
- <template slot="table-row" slot-scope="props">
260
- <!-- renders if drag and drop is present in table -->
261
- <span v-if="props.column.field == 'drag'">
262
- <c-icon
263
- name="menu-solid"
264
- type="solid"
265
- :class="`handle h-5 w-5 ${
266
- props.row.status && props.row.status === 2
267
- ? 'pointer-events-none cursor-default opacity-50'
268
- : 'text-gray-500'
269
- }`"
270
- :cursorType="'cursor-grab'"
271
- ></c-icon>
272
- </span>
273
- <!-- if customization or adding another form element is required -->
274
- <span v-else-if="props.column.customizeColumn">
275
- <slot :records="props"> </slot>
276
- </span>
277
- <!-- renders records as per column name -->
278
- <span v-else>
279
- {{ props.formattedRow[props.column.field] }}
280
- </span>
281
- </template>
282
- <!-- Custom pagination component -->
283
- <template v-if="pagination" slot="pagination-bottom">
284
- <c-pagination
285
- v-if="paginationRecords.totalRecords > 0"
286
- :setPaginationRecords="paginationRecords"
287
- :totalRecordsOnPage="recordsToDisplay"
288
- :showEntryPicker="showEntryPicker"
289
- @setCurrentPage="setCurrentPageRecords"
290
- @setPreviousPage="setPreviousPageRecords"
291
- @setNextPage="setNextPageRecords"
292
- @handle-Row-Count-Change="handleChangeRowCount"
293
- ></c-pagination>
294
- </template>
295
- </vue-good-table>
296
- </div>
297
- </template>
298
- <script>
299
- import CIcon from "../CIcon/CIcon.vue";
300
- import CCheckbox from "../CCheckbox/CCheckbox.vue";
301
- import CPagination from "../CPagination/CPagination.vue";
302
- import CButtonIcon from "../CButtonIcon/CButtonIcon.vue";
303
-
304
- import "vue-good-table/dist/vue-good-table.css";
305
- import { VueGoodTable } from "vue-good-table";
306
- import Sortable from "@shopify/draggable/lib/es5/sortable.js";
307
- import CInput from "../CInput/CInput.vue";
308
- import { debounce, isEqual } from "lodash-es";
309
- import VueSkeletonLoader from "skeleton-loader-vue";
310
-
311
- export default {
312
- name: "CTable",
313
- components: {
314
- CCheckbox,
315
- CIcon,
316
- VueGoodTable,
317
- CPagination,
318
- CButtonIcon,
319
- CInput,
320
- VueSkeletonLoader,
321
- },
322
- props: {
323
- fontHeader: {
324
- type: Boolean,
325
- default: false,
326
- },
327
- // To show or hide pagination section
328
- pagination: {
329
- type: Boolean,
330
- },
331
- // To enable or disable sorting
332
- sorting: {
333
- type: Boolean,
334
- },
335
- // To show or hide search input
336
- searching: {
337
- type: Boolean,
338
- },
339
- // To add checkbox to select rows
340
- enableSelection: {
341
- type: Boolean,
342
- },
343
- enableVisibility: {
344
- type: Boolean,
345
- default: true,
346
- },
347
- enableDownload: {
348
- type: Boolean,
349
- default: true,
350
- },
351
- // All the buttons displayed on top right side of table
352
- tableActions: {
353
- type: Boolean,
354
- },
355
- // Placeholder text for search
356
- searchPlaceholder: {
357
- type: String,
358
- },
359
- // Existing text for search
360
- searchQuery: {
361
- type: String,
362
- },
363
- isLoading: {
364
- type: Boolean,
365
- },
366
- // Total number of rows in a table to calculate page numbers
367
- totalRecords: {
368
- type: String,
369
- },
370
- // Shows current selected page and records on per page
371
- paginationData: {
372
- type: Object,
373
- },
374
- // Pass a column on which initial sorting will be applied
375
- initialSortField: {
376
- type: Object,
377
- },
378
- // all columns of the table
379
- cols: {
380
- type: Array,
381
- required: true,
382
- },
383
- // row records of the table
384
- rows: {
385
- type: Array,
386
- required: true,
387
- },
388
- // List of columns to show hide
389
- showHideColumnList: {
390
- type: Array,
391
- },
392
- // List of items to show download options
393
- showDownloadDropdownList: {
394
- type: Array,
395
- },
396
- // Function on changing page number
397
- onPageChange: {
398
- type: Function,
399
- },
400
- // Function on changing sorting on column
401
- onSortChange: {
402
- type: Function,
403
- },
404
- // Function to fetch results on search query
405
- onSearch: {
406
- type: Function,
407
- },
408
- // Emit action on clicking the row
409
- onRowClickAction: {
410
- type: Function,
411
- },
412
- // Start the loader
413
- downloadLoader: {
414
- type: Boolean,
415
- },
416
- // Start the loader
417
- downloadOptionLoader: {
418
- type: Boolean,
419
- },
420
- downloadDropdown: {
421
- type: Boolean,
422
- },
423
- rowStyleClassFn: {
424
- type: Function,
425
- default: () => "",
426
- },
427
- fixedHeader: {
428
- type: Boolean,
429
- default: false,
430
- },
431
- hideBorder: {
432
- type: Boolean,
433
- default: false,
434
- },
435
- showEntryPicker: {
436
- type: Boolean,
437
- default: false,
438
- },
439
- enableGrouping: {
440
- type: Boolean,
441
- default: false,
442
- },
443
- },
444
- mounted() {
445
- // to add drag and drop in table
446
- this.reorderedArray = this.rows;
447
- let sortable = new Sortable(document.querySelectorAll("tbody"), {
448
- draggable: "tr",
449
- handle: ".handle",
450
- classes: {
451
- mirror: ["bg-white"],
452
- },
453
- mirror: {
454
- constrainDimensions: true,
455
- },
456
- });
457
- sortable.on("sortable:stop", (e) => this.rearrange(e.oldIndex, e.newIndex));
458
- document.addEventListener("keydown", this.handleControlClick, true);
459
- document.addEventListener("keyup", this.handleControlRelease, true);
460
- },
461
- destroyed() {
462
- //to remove the event listener
463
- document.removeEventListener("keydown", this.handleControlClick, true);
464
- document.removeEventListener("keyup", this.handleControlRelease, true);
465
- },
466
- data() {
467
- return {
468
- toggleDropdown: false,
469
- toggleDownloadDropdown: false,
470
- searchTerm: this.searchQuery ? this.searchQuery : "",
471
- paginationRecords: this.paginationData,
472
- reorderedArray: [],
473
- controlClick: false,
474
- attrs: {
475
- boilerplate: true,
476
- elevation: 2,
477
- },
478
- recordsToDisplay: {
479
- option: 10,
480
- value: 10,
481
- },
482
- };
483
- },
484
- methods: {
485
- handleChangeRowCount(value) {
486
- this.recordsToDisplay = value;
487
- this.$emit("change-row-count", value.value);
488
- },
489
- handleControlClick(event) {
490
- if (event.keyCode === 17 || event.keyCode === 91) {
491
- event.preventDefault();
492
- this.controlClick = true;
493
- }
494
- },
495
- handleControlRelease(event) {
496
- if (event.keyCode === 17 || event.keyCode === 91) {
497
- event.preventDefault();
498
- this.controlClick = false;
499
- }
500
- },
501
- handleToggle() {
502
- this.toggleDropdown = !this.toggleDropdown;
503
- },
504
- handleDownloadToggle() {
505
- this.toggleDownloadDropdown = !this.toggleDownloadDropdown;
506
- },
507
- showHideColumn(value, name) {
508
- this.$emit("hideCols", value, name);
509
- },
510
- // Function to get selected rows on checking the checkbox
511
- selectionChanged() {
512
- this.$emit(
513
- "selectRows",
514
- this.$refs["my-table"].selectedRows,
515
- this.$refs["my-table"].allSelected
516
- );
517
- },
518
- // array of rows after drag and drop
519
- rearrange(oldIndex, newIndex) {
520
- const movedItem = this.reorderedArray.find(
521
- (item, index) => index === oldIndex
522
- );
523
- const remainingItems = this.reorderedArray.filter(
524
- (item, index) => index !== oldIndex
525
- );
526
- const reorderedItems = [
527
- ...remainingItems.slice(0, newIndex),
528
- movedItem,
529
- ...remainingItems.slice(newIndex),
530
- ];
531
- this.reorderedArray = [...reorderedItems];
532
- this.$emit(
533
- "reordered",
534
- this.reorderedArray,
535
- movedItem,
536
- oldIndex,
537
- newIndex
538
- );
539
- },
540
- // listing functions
541
- sortChange(params) {
542
- if (params[0].type == "none") {
543
- params[0].type = "asc";
544
- }
545
- this.$emit("onSortChange", params);
546
- },
547
- onSearching: debounce(function (params) {
548
- this.$emit("onSearch", params);
549
- }, 500),
550
- setCurrentPageRecords(page) {
551
- this.paginationRecords.currentPage = page;
552
- this.$emit("pageChange", page);
553
- },
554
- setPreviousPageRecords(page) {
555
- this.paginationRecords.currentPage = page;
556
- this.$emit("pageChange", page);
557
- },
558
- setNextPageRecords(page) {
559
- this.paginationRecords.currentPage = page;
560
- this.$emit("pageChange", page);
561
- },
562
- onRowClick(params) {
563
- if (params.event.target.type === undefined) {
564
- if (this.controlClick) {
565
- this.$emit("onRowControlClickAction", params);
566
- } else {
567
- this.$emit("onRowClickAction", params);
568
- }
569
- } else {
570
- return false;
571
- }
572
- },
573
- startDownload() {
574
- this.$emit("handleDownloadButton");
575
- },
576
- downloadFromOption(value) {
577
- this.toggleDownloadDropdown = false;
578
- this.$emit("handleDownloadOptionButton", value);
579
- },
580
-
581
- handleRowExpand() {
582
- this.$refs["my-table"].expandAll();
583
- },
584
- },
585
- watch: {
586
- paginationData(newValue, oldValue) {
587
- if (!isEqual(newValue, oldValue)) {
588
- this.paginationRecords = newValue;
589
- }
590
- },
591
- rows(newValue, oldValue) {
592
- if (!isEqual(newValue, oldValue)) {
593
- this.reorderedArray = newValue;
594
- }
595
- },
596
- },
597
- };
598
- </script>
599
- <style>
600
- .vgt-table {
601
- border-spacing: 0;
602
- border: none !important;
603
- font-family: "Inter";
604
- font-size: 14px !important;
605
- }
606
- table.vgt-table td {
607
- vertical-align: middle;
608
- }
609
- .vgt-table thead th {
610
- background: linear-gradient(#fff, #fff);
611
- }
612
- .vgt-table th.vgt-checkbox-col {
613
- border-right: 0;
614
- border-bottom: 1px solid #dcdfe6;
615
- background: linear-gradient(#fff, #fff);
616
- }
617
- table.vgt-table tr.clickable:hover > th.vgt-checkbox-col {
618
- background: #f1f5fd;
619
- border-bottom: 1px solid #dcdfe6 !important;
620
- }
621
- .vgt-table th.sortable button::before,
622
- .vgt-table th.sortable button::after {
623
- border-right: 0;
624
- border-left: 0;
625
- }
626
- [type="checkbox"],
627
- [type="checkbox"]:focus {
628
- border-radius: 4px;
629
- border-color: #d1d5db;
630
- cursor: pointer;
631
- color: #0284c7;
632
- --tw-ring-color: #0284c7;
633
- }
634
-
635
- /* tbody > tr > th.vgt-checkbox-col {
636
- background: linear-gradient(#fff, #fff);
637
- border-bottom: 1px solid #dcdfe6;
638
- } */
639
- .vgt-global-search {
640
- background: none;
641
- border: none;
642
- padding: 0 0 12px 0;
643
- }
644
- .vgt-global-search__input {
645
- padding-left: 0;
646
- }
647
- .input__icon {
648
- display: none;
649
- }
650
- .vgt-global-search__input .vgt-input {
651
- height: 38px;
652
- width: 250px;
653
- }
654
- .vgt-inner-wrap {
655
- box-shadow: none;
656
- }
657
- .vgt-inner-wrap.is-loading {
658
- opacity: 1;
659
- pointer-events: auto;
660
- }
661
- .vgt-table th.sortable:hover .sortingIcon {
662
- visibility: visible;
663
- }
664
- .vgt-responsive {
665
- position: static;
666
- border-radius: 8px;
667
- }
668
- .vgt-wrap {
669
- position: static;
670
- }
671
- </style>
1
+ <template>
2
+ <div>
3
+ <div
4
+ slot="table-actions"
5
+ v-if="tableActions"
6
+ class="mb-4 rounded-lg bg-gray-50 p-3"
7
+ >
8
+ <div class="flex items-center justify-between">
9
+ <slot name="customTableFilterActions"></slot>
10
+ <div v-if="searching" class="flex items-center">
11
+ <c-input
12
+ v-model="searchTerm"
13
+ :isValidate="searching"
14
+ :placeholder="searchPlaceholder"
15
+ class="-mt-1 mr-3 w-auto sm:w-56"
16
+ type="text"
17
+ ></c-input>
18
+ <slot name="tableInfo"></slot>
19
+ </div>
20
+ <div class="flex flex-1 justify-end">
21
+ <!-- dropdown icon on top right of table -->
22
+ <slot name="customTableActions"></slot>
23
+ <div class="relative inline-block text-left" v-if="enableVisibility">
24
+ <!-- button to show list of columns to show hide in table -->
25
+ <div>
26
+ <button
27
+ @click="handleToggle"
28
+ class="inline-flex w-full justify-center rounded-md border border-gray-200 bg-white px-2 py-2 text-sm font-medium shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
29
+ aria-haspopup="true"
30
+ aria-expanded="true"
31
+ >
32
+ <c-icon
33
+ name="view-board"
34
+ type="solid"
35
+ class="h-5 w-5 text-gray-400"
36
+ ></c-icon>
37
+ <c-icon
38
+ name="chevron-down"
39
+ type="solid"
40
+ class="ml-1 h-5 w-5 text-gray-400"
41
+ ></c-icon>
42
+ </button>
43
+ </div>
44
+ <!-- dropdown having list of all columns to show hide -->
45
+ <div
46
+ v-if="toggleDropdown"
47
+ @click="handleToggle"
48
+ class="fixed inset-0 z-20"
49
+ ></div>
50
+ <div
51
+ v-if="toggleDropdown"
52
+ class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-56 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
53
+ tabindex="0"
54
+ >
55
+ <div
56
+ class="py-1"
57
+ role="menu"
58
+ aria-orientation="vertical"
59
+ aria-labelledby="option-menu"
60
+ >
61
+ <a
62
+ href="#"
63
+ v-for="column in showHideColumnList"
64
+ v-bind:key="column.field"
65
+ class="block flex px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900"
66
+ role="menuitem"
67
+ >
68
+ <c-checkbox
69
+ :label="column.label"
70
+ @onChange="showHideColumn($event, column.field)"
71
+ :value="!column.hidden"
72
+ ></c-checkbox>
73
+ </a>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ <slot name="customDatePicker"></slot>
78
+
79
+ <!-- simple download button -->
80
+ <div
81
+ v-if="enableDownload && !downloadDropdown"
82
+ @click="startDownload"
83
+ >
84
+ <c-button-icon
85
+ type="white"
86
+ :icon="
87
+ downloadLoader
88
+ ? null
89
+ : {
90
+ name: 'download-solid',
91
+ type: 'solid',
92
+ class: 'h-5 w-5 text-gray-400',
93
+ }
94
+ "
95
+ class="ml-3"
96
+ loaderClasses="ml-2"
97
+ :isLoading="downloadLoader"
98
+ ></c-button-icon>
99
+ </div>
100
+ <!-- no download buttons -->
101
+ <div v-if="!enableDownload && !downloadDropdown"></div>
102
+ <!-- download button with download options -->
103
+ <div v-if="enableDownload && downloadDropdown" class="relative ml-3">
104
+ <div>
105
+ <button
106
+ @click="handleDownloadToggle"
107
+ class="inline-flex w-full justify-center rounded-md border border-gray-200 bg-white px-2 py-2 text-sm font-medium shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-600 focus:ring-offset-2"
108
+ aria-haspopup="true"
109
+ aria-expanded="true"
110
+ >
111
+ <c-icon
112
+ v-if="downloadOptionLoader"
113
+ cursorType="cursor-pointer"
114
+ class="mr-2 h-5 w-5 text-gray-400"
115
+ name="loader"
116
+ ></c-icon>
117
+ <c-icon
118
+ v-else
119
+ name="download-solid"
120
+ type="solid"
121
+ class="h-5 w-5 text-gray-400"
122
+ ></c-icon>
123
+ <c-icon
124
+ name="chevron-down"
125
+ type="solid"
126
+ class="ml-1 h-5 w-5 text-gray-400"
127
+ ></c-icon>
128
+ </button>
129
+ </div>
130
+ <!-- download options dropdown -->
131
+ <div
132
+ v-if="toggleDownloadDropdown"
133
+ @click="handleDownloadToggle"
134
+ class="fixed inset-0 z-20"
135
+ ></div>
136
+ <div
137
+ v-if="toggleDownloadDropdown"
138
+ class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-64 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
139
+ tabindex="0"
140
+ >
141
+ <div
142
+ class="py-1"
143
+ role="menu"
144
+ aria-orientation="vertical"
145
+ aria-labelledby="option-menu"
146
+ >
147
+ <div
148
+ v-for="(item, index) in showDownloadDropdownList"
149
+ :key="index"
150
+ class="cursor-pointer px-4 py-2 text-sm text-gray-900 hover:bg-gray-100 hover:text-gray-900"
151
+ role="menuitem"
152
+ @click="downloadFromOption(item.value)"
153
+ >
154
+ <p>{{ item.title }}</p>
155
+ <p class="text-sm text-gray-400">{{ item.description }}</p>
156
+ </div>
157
+ </div>
158
+ </div>
159
+ </div>
160
+ <slot name="customTableExtraActions"></slot>
161
+ </div>
162
+ </div>
163
+ </div>
164
+ <vue-good-table
165
+ :class="`rounded-lg ${
166
+ hideBorder ? ' border-none' : 'border-2 border-solid border-gray-100'
167
+ }`"
168
+ mode="remote"
169
+ ref="my-table"
170
+ :styleClass="
171
+ isLoading ? 'vgt-table opacity-50 pointer-events-none' : 'vgt-table'
172
+ "
173
+ :row-style-class="rowStyleClassFn"
174
+ min-height="400px"
175
+ :globalSearch="true"
176
+ :totalRows="totalRecords"
177
+ :columns="cols"
178
+ :rows="rows"
179
+ :search-options="{
180
+ enabled: searching,
181
+ externalQuery: searchTerm,
182
+ placeholder: searchPlaceholder,
183
+ trigger: 'enter',
184
+ }"
185
+ :select-options="{
186
+ enabled: enableSelection,
187
+ selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row
188
+ selectionInfoClass: 'custom-class',
189
+ selectionText: 'rows selected',
190
+ clearSelectionText: 'clear',
191
+ disableSelectInfo: true, // disable the select info panel on top
192
+ selectAllByGroup: true, // when used in combination with a grouped table, add a checkbox in the header row to check/uncheck the entire group
193
+ }"
194
+ :sort-options="{
195
+ enabled: sorting,
196
+ initialSortBy: initialSortField,
197
+ }"
198
+ :pagination-options="{ enabled: pagination }"
199
+ :fixed-header="fixedHeader"
200
+ :group-options="{
201
+ enabled: enableGrouping,
202
+ collapsable: enableGrouping,
203
+ maintainExpanded: enableGrouping,
204
+ }"
205
+ @on-selected-rows-change="selectionChanged"
206
+ @on-sort-change="sortChange"
207
+ @on-search="onSearching"
208
+ @on-row-click="onRowClick"
209
+ >
210
+ >
211
+ <template slot="table-column" slot-scope="props">
212
+ <!-- custom sorting icon -->
213
+ <span v-if="props.column.sortable || sorting" class="flex">
214
+ <div>
215
+ {{ props.column.label }}
216
+ </div>
217
+ <!-- render if there is no sorting order, appears on hover -->
218
+ <c-icon
219
+ v-if="props.column.direction == null"
220
+ name="sort-ascending-solid"
221
+ class="sortingIcon invisible ml-3 h-5 w-5"
222
+ type="solid"
223
+ ></c-icon>
224
+ <!-- renders when direction is asc -->
225
+ <c-icon
226
+ v-else-if="props.column.direction == 'asc'"
227
+ name="sort-ascending-solid"
228
+ class="ml-3 h-5 w-5"
229
+ type="solid"
230
+ ></c-icon>
231
+ <!-- renders when direction is desc -->
232
+ <c-icon
233
+ v-else-if="props.column.direction == 'desc'"
234
+ name="sort-descending-solid"
235
+ class="ml-3 h-5 w-5"
236
+ type="solid"
237
+ ></c-icon>
238
+ </span>
239
+ <span class="font-medium text-gray-500" v-else-if="fontHeader">
240
+ {{ props.column.label }}
241
+ </span>
242
+ <span v-else>
243
+ {{ props.column.label }}
244
+ </span>
245
+ </template>
246
+ <div slot="emptystate" v-if="isLoading">
247
+ <vue-skeleton-loader
248
+ v-for="(item, index) in 10"
249
+ :key="index"
250
+ type="table-tbody: table-row-divider@6"
251
+ animation="fade"
252
+ :width="1220"
253
+ :rounded="true"
254
+ :radius="50"
255
+ :class="`skeleton ${index === 0 ? '' : 'mt-2'}`"
256
+ :height="50"
257
+ ></vue-skeleton-loader>
258
+ </div>
259
+ <template slot="table-row" slot-scope="props">
260
+ <!-- renders if drag and drop is present in table -->
261
+ <span v-if="props.column.field == 'drag'">
262
+ <c-icon
263
+ name="menu-solid"
264
+ type="solid"
265
+ :class="`handle h-5 w-5 ${
266
+ props.row.status && props.row.status === 2
267
+ ? 'pointer-events-none cursor-default opacity-50'
268
+ : 'text-gray-500'
269
+ }`"
270
+ :cursorType="'cursor-grab'"
271
+ ></c-icon>
272
+ </span>
273
+ <!-- if customization or adding another form element is required -->
274
+ <span v-else-if="props.column.customizeColumn">
275
+ <slot :records="props"> </slot>
276
+ </span>
277
+ <!-- renders records as per column name -->
278
+ <span v-else>
279
+ {{ props.formattedRow[props.column.field] }}
280
+ </span>
281
+ </template>
282
+ <!-- Custom pagination component -->
283
+ <template v-if="pagination" slot="pagination-bottom">
284
+ <c-pagination
285
+ v-if="paginationRecords.totalRecords > 0"
286
+ :setPaginationRecords="paginationRecords"
287
+ :totalRecordsOnPage="recordsToDisplay"
288
+ :showEntryPicker="showEntryPicker"
289
+ @setCurrentPage="setCurrentPageRecords"
290
+ @setPreviousPage="setPreviousPageRecords"
291
+ @setNextPage="setNextPageRecords"
292
+ @handle-Row-Count-Change="handleChangeRowCount"
293
+ ></c-pagination>
294
+ </template>
295
+ </vue-good-table>
296
+ </div>
297
+ </template>
298
+ <script>
299
+ import CIcon from "../CIcon/CIcon.vue";
300
+ import CCheckbox from "../CCheckbox/CCheckbox.vue";
301
+ import CPagination from "../CPagination/CPagination.vue";
302
+ import CButtonIcon from "../CButtonIcon/CButtonIcon.vue";
303
+
304
+ import "vue-good-table/dist/vue-good-table.css";
305
+ import { VueGoodTable } from "vue-good-table";
306
+ import Sortable from "@shopify/draggable/lib/es5/sortable.js";
307
+ import CInput from "../CInput/CInput.vue";
308
+ import { debounce, isEqual } from "lodash-es";
309
+ import VueSkeletonLoader from "skeleton-loader-vue";
310
+
311
+ export default {
312
+ name: "CTable",
313
+ components: {
314
+ CCheckbox,
315
+ CIcon,
316
+ VueGoodTable,
317
+ CPagination,
318
+ CButtonIcon,
319
+ CInput,
320
+ VueSkeletonLoader,
321
+ },
322
+ props: {
323
+ fontHeader: {
324
+ type: Boolean,
325
+ default: false,
326
+ },
327
+ // To show or hide pagination section
328
+ pagination: {
329
+ type: Boolean,
330
+ },
331
+ // To enable or disable sorting
332
+ sorting: {
333
+ type: Boolean,
334
+ },
335
+ // To show or hide search input
336
+ searching: {
337
+ type: Boolean,
338
+ },
339
+ // To add checkbox to select rows
340
+ enableSelection: {
341
+ type: Boolean,
342
+ },
343
+ enableVisibility: {
344
+ type: Boolean,
345
+ default: true,
346
+ },
347
+ enableDownload: {
348
+ type: Boolean,
349
+ default: true,
350
+ },
351
+ // All the buttons displayed on top right side of table
352
+ tableActions: {
353
+ type: Boolean,
354
+ },
355
+ // Placeholder text for search
356
+ searchPlaceholder: {
357
+ type: String,
358
+ },
359
+ // Existing text for search
360
+ searchQuery: {
361
+ type: String,
362
+ },
363
+ isLoading: {
364
+ type: Boolean,
365
+ },
366
+ // Total number of rows in a table to calculate page numbers
367
+ totalRecords: {
368
+ type: String,
369
+ },
370
+ // Shows current selected page and records on per page
371
+ paginationData: {
372
+ type: Object,
373
+ },
374
+ // Pass a column on which initial sorting will be applied
375
+ initialSortField: {
376
+ type: Object,
377
+ },
378
+ // all columns of the table
379
+ cols: {
380
+ type: Array,
381
+ required: true,
382
+ },
383
+ // row records of the table
384
+ rows: {
385
+ type: Array,
386
+ required: true,
387
+ },
388
+ // List of columns to show hide
389
+ showHideColumnList: {
390
+ type: Array,
391
+ },
392
+ // List of items to show download options
393
+ showDownloadDropdownList: {
394
+ type: Array,
395
+ },
396
+ // Function on changing page number
397
+ onPageChange: {
398
+ type: Function,
399
+ },
400
+ // Function on changing sorting on column
401
+ onSortChange: {
402
+ type: Function,
403
+ },
404
+ // Function to fetch results on search query
405
+ onSearch: {
406
+ type: Function,
407
+ },
408
+ // Emit action on clicking the row
409
+ onRowClickAction: {
410
+ type: Function,
411
+ },
412
+ // Start the loader
413
+ downloadLoader: {
414
+ type: Boolean,
415
+ },
416
+ // Start the loader
417
+ downloadOptionLoader: {
418
+ type: Boolean,
419
+ },
420
+ downloadDropdown: {
421
+ type: Boolean,
422
+ },
423
+ rowStyleClassFn: {
424
+ type: Function,
425
+ default: () => "",
426
+ },
427
+ fixedHeader: {
428
+ type: Boolean,
429
+ default: false,
430
+ },
431
+ hideBorder: {
432
+ type: Boolean,
433
+ default: false,
434
+ },
435
+ showEntryPicker: {
436
+ type: Boolean,
437
+ default: false,
438
+ },
439
+ enableGrouping: {
440
+ type: Boolean,
441
+ default: false,
442
+ },
443
+ },
444
+ mounted() {
445
+ // to add drag and drop in table
446
+ this.reorderedArray = this.rows;
447
+ let sortable = new Sortable(document.querySelectorAll("tbody"), {
448
+ draggable: "tr",
449
+ handle: ".handle",
450
+ classes: {
451
+ mirror: ["bg-white"],
452
+ },
453
+ mirror: {
454
+ constrainDimensions: true,
455
+ },
456
+ });
457
+ sortable.on("sortable:stop", (e) => this.rearrange(e.oldIndex, e.newIndex));
458
+ document.addEventListener("keydown", this.handleControlClick, true);
459
+ document.addEventListener("keyup", this.handleControlRelease, true);
460
+ },
461
+ destroyed() {
462
+ //to remove the event listener
463
+ document.removeEventListener("keydown", this.handleControlClick, true);
464
+ document.removeEventListener("keyup", this.handleControlRelease, true);
465
+ },
466
+ data() {
467
+ return {
468
+ toggleDropdown: false,
469
+ toggleDownloadDropdown: false,
470
+ searchTerm: this.searchQuery ? this.searchQuery : "",
471
+ paginationRecords: this.paginationData,
472
+ reorderedArray: [],
473
+ controlClick: false,
474
+ attrs: {
475
+ boilerplate: true,
476
+ elevation: 2,
477
+ },
478
+ recordsToDisplay: {
479
+ option: 10,
480
+ value: 10,
481
+ },
482
+ };
483
+ },
484
+ methods: {
485
+ handleChangeRowCount(value) {
486
+ this.recordsToDisplay = value;
487
+ this.$emit("change-row-count", value.value);
488
+ },
489
+ handleControlClick(event) {
490
+ if (event.keyCode === 17 || event.keyCode === 91) {
491
+ event.preventDefault();
492
+ this.controlClick = true;
493
+ }
494
+ },
495
+ handleControlRelease(event) {
496
+ if (event.keyCode === 17 || event.keyCode === 91) {
497
+ event.preventDefault();
498
+ this.controlClick = false;
499
+ }
500
+ },
501
+ handleToggle() {
502
+ this.toggleDropdown = !this.toggleDropdown;
503
+ },
504
+ handleDownloadToggle() {
505
+ this.toggleDownloadDropdown = !this.toggleDownloadDropdown;
506
+ },
507
+ showHideColumn(value, name) {
508
+ this.$emit("hideCols", value, name);
509
+ },
510
+ // Function to get selected rows on checking the checkbox
511
+ selectionChanged() {
512
+ this.$emit(
513
+ "selectRows",
514
+ this.$refs["my-table"].selectedRows,
515
+ this.$refs["my-table"].allSelected
516
+ );
517
+ },
518
+ // array of rows after drag and drop
519
+ rearrange(oldIndex, newIndex) {
520
+ const movedItem = this.reorderedArray.find(
521
+ (item, index) => index === oldIndex
522
+ );
523
+ const remainingItems = this.reorderedArray.filter(
524
+ (item, index) => index !== oldIndex
525
+ );
526
+ const reorderedItems = [
527
+ ...remainingItems.slice(0, newIndex),
528
+ movedItem,
529
+ ...remainingItems.slice(newIndex),
530
+ ];
531
+ this.reorderedArray = [...reorderedItems];
532
+ this.$emit(
533
+ "reordered",
534
+ this.reorderedArray,
535
+ movedItem,
536
+ oldIndex,
537
+ newIndex
538
+ );
539
+ },
540
+ // listing functions
541
+ sortChange(params) {
542
+ if (params[0].type == "none") {
543
+ params[0].type = "asc";
544
+ }
545
+ this.$emit("onSortChange", params);
546
+ },
547
+ onSearching: debounce(function (params) {
548
+ this.$emit("onSearch", params);
549
+ }, 500),
550
+ setCurrentPageRecords(page) {
551
+ this.paginationRecords.currentPage = page;
552
+ this.$emit("pageChange", page);
553
+ },
554
+ setPreviousPageRecords(page) {
555
+ this.paginationRecords.currentPage = page;
556
+ this.$emit("pageChange", page);
557
+ },
558
+ setNextPageRecords(page) {
559
+ this.paginationRecords.currentPage = page;
560
+ this.$emit("pageChange", page);
561
+ },
562
+ onRowClick(params) {
563
+ if (params.event.target.type === undefined) {
564
+ if (this.controlClick) {
565
+ this.$emit("onRowControlClickAction", params);
566
+ } else {
567
+ this.$emit("onRowClickAction", params);
568
+ }
569
+ } else {
570
+ return false;
571
+ }
572
+ },
573
+ startDownload() {
574
+ this.$emit("handleDownloadButton");
575
+ },
576
+ downloadFromOption(value) {
577
+ this.toggleDownloadDropdown = false;
578
+ this.$emit("handleDownloadOptionButton", value);
579
+ },
580
+
581
+ handleRowExpand() {
582
+ this.$refs["my-table"].expandAll();
583
+ },
584
+ },
585
+ watch: {
586
+ paginationData(newValue, oldValue) {
587
+ if (!isEqual(newValue, oldValue)) {
588
+ this.paginationRecords = newValue;
589
+ }
590
+ },
591
+ rows(newValue, oldValue) {
592
+ if (!isEqual(newValue, oldValue)) {
593
+ this.reorderedArray = newValue;
594
+ }
595
+ },
596
+ },
597
+ };
598
+ </script>
599
+ <style>
600
+ .vgt-table {
601
+ border-spacing: 0;
602
+ border: none !important;
603
+ font-family: "Inter";
604
+ font-size: 14px !important;
605
+ }
606
+ table.vgt-table td {
607
+ vertical-align: middle;
608
+ }
609
+ .vgt-table thead th {
610
+ background: linear-gradient(#fff, #fff);
611
+ }
612
+ .vgt-table th.vgt-checkbox-col {
613
+ border-right: 0;
614
+ border-bottom: 1px solid #dcdfe6;
615
+ background: linear-gradient(#fff, #fff);
616
+ }
617
+ table.vgt-table tr.clickable:hover > th.vgt-checkbox-col {
618
+ background: #f1f5fd;
619
+ border-bottom: 1px solid #dcdfe6 !important;
620
+ }
621
+ .vgt-table th.sortable button::before,
622
+ .vgt-table th.sortable button::after {
623
+ border-right: 0;
624
+ border-left: 0;
625
+ }
626
+ [type="checkbox"],
627
+ [type="checkbox"]:focus {
628
+ border-radius: 4px;
629
+ border-color: #d1d5db;
630
+ cursor: pointer;
631
+ color: #0284c7;
632
+ --tw-ring-color: #0284c7;
633
+ }
634
+
635
+ /* tbody > tr > th.vgt-checkbox-col {
636
+ background: linear-gradient(#fff, #fff);
637
+ border-bottom: 1px solid #dcdfe6;
638
+ } */
639
+ .vgt-global-search {
640
+ background: none;
641
+ border: none;
642
+ padding: 0 0 12px 0;
643
+ }
644
+ .vgt-global-search__input {
645
+ padding-left: 0;
646
+ }
647
+ .input__icon {
648
+ display: none;
649
+ }
650
+ .vgt-global-search__input .vgt-input {
651
+ height: 38px;
652
+ width: 250px;
653
+ }
654
+ .vgt-inner-wrap {
655
+ box-shadow: none;
656
+ }
657
+ .vgt-inner-wrap.is-loading {
658
+ opacity: 1;
659
+ pointer-events: auto;
660
+ }
661
+ .vgt-table th.sortable:hover .sortingIcon {
662
+ visibility: visible;
663
+ }
664
+ .vgt-responsive {
665
+ position: static;
666
+ border-radius: 8px;
667
+ }
668
+ .vgt-wrap {
669
+ position: static;
670
+ }
671
+ </style>