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