classcard-ui 0.2.643 → 0.2.646

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