classcard-ui 0.2.985 → 0.2.986

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 (188) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +70 -58
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.umd.js +70 -58
  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/.DS_Store +0 -0
  10. package/src/App.vue +16 -16
  11. package/src/components/CAlerts/CAlerts.vue +70 -70
  12. package/src/components/CAlerts/index.js +2 -2
  13. package/src/components/CAnchorTabs/CAnchorTabs.vue +96 -96
  14. package/src/components/CAnchorTabs/index.js +2 -2
  15. package/src/components/CAnchorTag/CAnchorTag.vue +62 -62
  16. package/src/components/CAnchorTag/index.js +2 -2
  17. package/src/components/CAvatar/CAvatar.vue +136 -136
  18. package/src/components/CAvatar/index.js +2 -2
  19. package/src/components/CAvatarGroup/CAvatarGroup.vue +145 -145
  20. package/src/components/CAvatarGroup/index.js +2 -2
  21. package/src/components/CBasicTable/CBasicTable.vue +184 -184
  22. package/src/components/CBasicTable/index.js +2 -2
  23. package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
  24. package/src/components/CBreadcrumbs/index.js +2 -2
  25. package/src/components/CButton/CButton.vue +152 -152
  26. package/src/components/CButton/index.js +2 -2
  27. package/src/components/CButtonGroup/CButtonGroup.vue +118 -118
  28. package/src/components/CButtonGroup/index.js +2 -2
  29. package/src/components/CButtonIcon/CButtonIcon.vue +117 -117
  30. package/src/components/CButtonIcon/index.js +2 -2
  31. package/src/components/CButtonLink/CButtonLink.vue +39 -39
  32. package/src/components/CButtonLink/index.js +2 -2
  33. package/src/components/CButtonSelect/CButtonSelect.vue +124 -124
  34. package/src/components/CButtonSelect/index.js +2 -2
  35. package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +135 -135
  36. package/src/components/CButtonSelectBorder/index.js +3 -3
  37. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +135 -135
  38. package/src/components/CButtonWithDropdown/index.js +2 -2
  39. package/src/components/CCalendar/CCalendar.vue +410 -410
  40. package/src/components/CCalendar/index.js +3 -3
  41. package/src/components/CCard/CCard.vue +49 -49
  42. package/src/components/CCard/index.js +2 -2
  43. package/src/components/CCheckbox/CCheckbox.vue +85 -85
  44. package/src/components/CCheckbox/index.js +2 -2
  45. package/src/components/CCircularButton/CCircularButton.vue +52 -52
  46. package/src/components/CCircularButton/index.js +2 -2
  47. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +101 -101
  48. package/src/components/CCollapsibleSection/index.js +2 -2
  49. package/src/components/CColorDots/CColorDots.vue +46 -46
  50. package/src/components/CColorDots/index.js +3 -3
  51. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +171 -171
  52. package/src/components/CConfirmActionModal/index.js +3 -3
  53. package/src/components/CDatepicker/CDatepicker.vue +158 -158
  54. package/src/components/CDatepicker/index.js +2 -2
  55. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  56. package/src/components/CDualSelect/index.js +2 -2
  57. package/src/components/CEditor/CEditor.vue +98 -98
  58. package/src/components/CEditor/index.js +2 -2
  59. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +53 -53
  60. package/src/components/CFormSectionHeading/index.js +2 -2
  61. package/src/components/CGroupedSelect/CGroupedSelect.vue +245 -245
  62. package/src/components/CGroupedSelect/index.js +3 -3
  63. package/src/components/CIcon/CIcon.vue +77 -77
  64. package/src/components/CIcon/index.js +2 -2
  65. package/src/components/CIconDropdown/CIconDropdown.vue +131 -120
  66. package/src/components/CIconDropdown/index.js +2 -2
  67. package/src/components/CInput/CInput.vue +134 -134
  68. package/src/components/CInput/index.js +2 -2
  69. package/src/components/CInputAddon/CInputAddon.vue +228 -228
  70. package/src/components/CInputAddon/index.js +2 -2
  71. package/src/components/CInputEmail/CInputEmail.vue +93 -93
  72. package/src/components/CInputEmail/index.js +2 -2
  73. package/src/components/CInsetTabs/CInsetTabs.vue +88 -88
  74. package/src/components/CInsetTabs/index.js +3 -3
  75. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  76. package/src/components/CModalHeading/index.js +2 -2
  77. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +70 -70
  78. package/src/components/CModuleHelpLinks/index.js +3 -3
  79. package/src/components/CMultiselect/CMultiselect.vue +479 -479
  80. package/src/components/CMultiselect/index.js +2 -2
  81. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  82. package/src/components/CMultiselectr/index.js +2 -2
  83. package/src/components/CPageHeading/CPageHeading.vue +56 -56
  84. package/src/components/CPageHeading/index.js +2 -2
  85. package/src/components/CPagination/CPagination.vue +233 -233
  86. package/src/components/CPagination/index.js +2 -2
  87. package/src/components/CPhoneNumber/CPhoneNumber.vue +114 -114
  88. package/src/components/CPhoneNumber/index.js +2 -2
  89. package/src/components/CRadio/CRadio.vue +124 -124
  90. package/src/components/CRadio/index.js +2 -2
  91. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  92. package/src/components/CRangeSlider/index.js +2 -2
  93. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  94. package/src/components/CReorderableStackedList/index.js +2 -2
  95. package/src/components/CSelect/CSelect.vue +417 -417
  96. package/src/components/CSelect/index.js +2 -2
  97. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  98. package/src/components/CSmallTimeline/index.js +2 -2
  99. package/src/components/CStackedList/CStackedList.vue +150 -150
  100. package/src/components/CStackedList/index.js +2 -2
  101. package/src/components/CStats/CStats.vue +116 -116
  102. package/src/components/CStats/index.js +2 -2
  103. package/src/components/CSwitch/CSwitch.vue +171 -171
  104. package/src/components/CSwitch/index.js +2 -2
  105. package/src/components/CTabLazy/CTabLazy.vue +58 -58
  106. package/src/components/CTabLazy/index.js +2 -2
  107. package/src/components/CTable/CTable.vue +671 -671
  108. package/src/components/CTable/index.js +2 -2
  109. package/src/components/CTabs/CTabs.vue +125 -125
  110. package/src/components/CTabs/index.js +2 -2
  111. package/src/components/CTag/CTag.vue +59 -59
  112. package/src/components/CTag/index.js +2 -2
  113. package/src/components/CTextarea/CTextarea.vue +107 -107
  114. package/src/components/CTextarea/index.js +2 -2
  115. package/src/components/CTimeline/CTimeline.vue +237 -237
  116. package/src/components/CTimeline/index.js +2 -2
  117. package/src/components/CUpload/CUpload.vue +267 -267
  118. package/src/components/CUpload/index.js +2 -2
  119. package/src/components/index.js +52 -52
  120. package/src/icons.js +364 -364
  121. package/src/main.js +22 -22
  122. package/src/stories/CAlerts.stories.js +37 -37
  123. package/src/stories/CAnchorTabs.stories.js +29 -29
  124. package/src/stories/CAnchorTag.stories.js +36 -36
  125. package/src/stories/CAvatar.stories.js +38 -38
  126. package/src/stories/CAvatarGroup.stories.js +100 -100
  127. package/src/stories/CBasicTable.stories.js +316 -316
  128. package/src/stories/CBreadcrumbs.stories.js +24 -24
  129. package/src/stories/CButton.stories.js +47 -47
  130. package/src/stories/CButtonGroup.stories.js +33 -33
  131. package/src/stories/CButtonIcon.stories.js +27 -27
  132. package/src/stories/CButtonLink.stories.js +24 -24
  133. package/src/stories/CButtonSelect.stories.js +41 -41
  134. package/src/stories/CButtonSelectBorder.stories.js +48 -48
  135. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  136. package/src/stories/CCalendar.stories.js +16 -16
  137. package/src/stories/CCard.stories.js +30 -30
  138. package/src/stories/CCheckbox.stories.js +29 -29
  139. package/src/stories/CCircularButton.stories.js +29 -29
  140. package/src/stories/CCollapsibleSection.stories.js +28 -28
  141. package/src/stories/CColorDots.stories.js +28 -28
  142. package/src/stories/CConfirmActionModal.stories.js +59 -59
  143. package/src/stories/CDatepicker.stories.js +30 -30
  144. package/src/stories/CDualSelect.stories.js +29 -29
  145. package/src/stories/CEditor.stories.js +30 -30
  146. package/src/stories/CFormSectionHeading.stories.js +34 -34
  147. package/src/stories/CGroupedSelect.stories.js +71 -71
  148. package/src/stories/CIcon.stories.js +26 -26
  149. package/src/stories/CIconDropdown.stories.js +45 -45
  150. package/src/stories/CInput.stories.js +36 -36
  151. package/src/stories/CInputAddon.stories.js +37 -37
  152. package/src/stories/CInputEmail.stories.js +27 -27
  153. package/src/stories/CInsetTabs.stories.js +38 -38
  154. package/src/stories/CModalHeading.stories.js +25 -25
  155. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  156. package/src/stories/CMultiselect.stories.js +157 -157
  157. package/src/stories/CMultiselectr.stories.js +23 -23
  158. package/src/stories/CPageHeading.stories.js +32 -32
  159. package/src/stories/CPagination.stories.js +30 -30
  160. package/src/stories/CPhoneNumber.stories.js +29 -29
  161. package/src/stories/CRadio.stories.js +36 -36
  162. package/src/stories/CRangeSlider.stories.js +23 -23
  163. package/src/stories/CReorderableStackedList.stories.js +23 -23
  164. package/src/stories/CSelect.stories.js +96 -96
  165. package/src/stories/CSmallTimeline.stories.js +26 -26
  166. package/src/stories/CStackedList.stories.js +37 -37
  167. package/src/stories/CStats.stories.js +33 -33
  168. package/src/stories/CSwitch.stories.js +28 -28
  169. package/src/stories/CTabLazy.stories.js +24 -24
  170. package/src/stories/CTable.stories.js +169 -169
  171. package/src/stories/CTabs.stories.js +33 -33
  172. package/src/stories/CTag.stories.js +34 -34
  173. package/src/stories/CTextarea.stories.js +32 -32
  174. package/src/stories/CTimeline.stories.js +26 -26
  175. package/src/stories/CUpload.stories.js +36 -36
  176. package/src/stories/Introduction.stories.mdx +207 -207
  177. package/src/stories/Page.vue +88 -88
  178. package/src/stories/assets/code-brackets.svg +0 -0
  179. package/src/stories/assets/colors.svg +0 -0
  180. package/src/stories/assets/comments.svg +0 -0
  181. package/src/stories/assets/direction.svg +0 -0
  182. package/src/stories/assets/flow.svg +0 -0
  183. package/src/stories/assets/plugin.svg +0 -0
  184. package/src/stories/assets/repo.svg +0 -0
  185. package/src/stories/assets/stackalt.svg +0 -0
  186. package/src/stories/header.css +26 -26
  187. package/src/stories/page.css +69 -69
  188. 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>