classcard-ui 0.2.618 → 0.2.623

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