classcard-ui 0.2.383 → 0.2.387

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