classcard-ui 0.2.782 → 0.2.783

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