classcard-ui 0.2.749 → 0.2.751

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