classcard-ui 0.2.487 → 0.2.488

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