classcard-ui 0.2.1069 → 0.2.1070
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 +56 -53
- package/dist/classcard-ui.common.js.map +1 -1
- package/dist/classcard-ui.umd.js +56 -53
- 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 +82 -82
- 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 +212 -212
- 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 +152 -152
- package/src/components/CButton/index.js +2 -2
- package/src/components/CButtonGroup/CButtonGroup.vue +118 -118
- package/src/components/CButtonGroup/index.js +2 -2
- package/src/components/CButtonIcon/CButtonIcon.vue +117 -117
- 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 +134 -134
- package/src/components/CButtonSelect/index.js +2 -2
- package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +135 -135
- package/src/components/CButtonSelectBorder/index.js +3 -3
- package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +135 -135
- package/src/components/CButtonWithDropdown/index.js +2 -2
- package/src/components/CCalendar/CCalendar.vue +410 -410
- 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 +123 -123
- package/src/components/CCheckbox/index.js +2 -2
- package/src/components/CCircularButton/CCircularButton.vue +53 -53
- package/src/components/CCircularButton/index.js +2 -2
- package/src/components/CCollapsibleSection/CCollapsibleSection.vue +101 -101
- package/src/components/CCollapsibleSection/index.js +2 -2
- package/src/components/CColorDots/CColorDots.vue +51 -51
- package/src/components/CColorDots/index.js +3 -3
- package/src/components/CConfirmActionModal/CConfirmActionModal.vue +180 -180
- package/src/components/CConfirmActionModal/index.js +3 -3
- package/src/components/CDatepicker/CDatepicker.vue +201 -201
- 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 +98 -98
- 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 +245 -245
- package/src/components/CGroupedSelect/index.js +3 -3
- package/src/components/CIcon/CIcon.vue +91 -91
- package/src/components/CIcon/index.js +2 -2
- package/src/components/CIconDropdown/CIconDropdown.vue +146 -146
- package/src/components/CIconDropdown/index.js +2 -2
- package/src/components/CInput/CInput.vue +134 -134
- package/src/components/CInput/index.js +2 -2
- package/src/components/CInputAddon/CInputAddon.vue +228 -228
- 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/CInsetTabs/CInsetTabs.vue +88 -88
- package/src/components/CInsetTabs/index.js +3 -3
- package/src/components/CModalHeading/CModalHeading.vue +22 -22
- package/src/components/CModalHeading/index.js +2 -2
- package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +70 -70
- package/src/components/CModuleHelpLinks/index.js +3 -3
- package/src/components/CMultiselect/CMultiselect.vue +615 -615
- 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 +233 -233
- package/src/components/CPagination/index.js +2 -2
- package/src/components/CPhoneNumber/CPhoneNumber.vue +114 -114
- package/src/components/CPhoneNumber/index.js +2 -2
- package/src/components/CProgress/CProgress.vue +57 -57
- package/src/components/CProgress/index.js +2 -2
- package/src/components/CRadio/CRadio.vue +126 -126
- 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 +539 -539
- 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 +150 -150
- package/src/components/CStackedList/index.js +2 -2
- package/src/components/CStats/CStats.vue +116 -116
- package/src/components/CStats/index.js +2 -2
- package/src/components/CSwitch/CSwitch.vue +176 -176
- package/src/components/CSwitch/index.js +2 -2
- package/src/components/CTabLazy/CTabLazy.vue +63 -63
- package/src/components/CTabLazy/index.js +2 -2
- package/src/components/CTable/CTable.vue +671 -671
- package/src/components/CTable/index.js +2 -2
- package/src/components/CTabs/CTabs.vue +169 -169
- package/src/components/CTabs/index.js +2 -2
- package/src/components/CTag/CTag.vue +59 -59
- package/src/components/CTag/index.js +2 -2
- package/src/components/CTextarea/CTextarea.vue +107 -107
- 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 +267 -267
- package/src/components/CUpload/index.js +2 -2
- package/src/components/index.js +53 -53
- package/src/icons.js +459 -453
- 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 +47 -47
- 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 +41 -41
- package/src/stories/CButtonSelectBorder.stories.js +48 -48
- 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/CCircularButton.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 +71 -71
- package/src/stories/CIcon.stories.js +28 -28
- package/src/stories/CIconDropdown.stories.js +45 -45
- 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/CInsetTabs.stories.js +38 -38
- package/src/stories/CModalHeading.stories.js +25 -25
- package/src/stories/CModuleHelpLinks.stories.js +25 -25
- package/src/stories/CMultiselect.stories.js +167 -167
- 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/CProgress.stories.js +23 -23
- 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 +109 -109
- 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/CTabLazy.stories.js +26 -26
- package/src/stories/CTable.stories.js +169 -169
- package/src/stories/CTabs.stories.js +36 -36
- package/src/stories/CTag.stories.js +34 -34
- 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,671 +1,671 @@
|
|
|
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
|
-
<slot name="customTableFilterActions"></slot>
|
|
10
|
-
<div v-if="searching" class="flex items-center">
|
|
11
|
-
<c-input
|
|
12
|
-
v-model="searchTerm"
|
|
13
|
-
:isValidate="searching"
|
|
14
|
-
:placeholder="searchPlaceholder"
|
|
15
|
-
class="-mt-1 mr-3 w-auto sm:w-56"
|
|
16
|
-
type="text"
|
|
17
|
-
></c-input>
|
|
18
|
-
<slot name="tableInfo"></slot>
|
|
19
|
-
</div>
|
|
20
|
-
<div class="flex flex-1 justify-end">
|
|
21
|
-
<!-- dropdown icon on top right of table -->
|
|
22
|
-
<slot name="customTableActions"></slot>
|
|
23
|
-
<div class="relative inline-block text-left" v-if="enableVisibility">
|
|
24
|
-
<!-- button to show list of columns to show hide in table -->
|
|
25
|
-
<div>
|
|
26
|
-
<button
|
|
27
|
-
@click="handleToggle"
|
|
28
|
-
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"
|
|
29
|
-
aria-haspopup="true"
|
|
30
|
-
aria-expanded="true"
|
|
31
|
-
>
|
|
32
|
-
<c-icon
|
|
33
|
-
name="view-board"
|
|
34
|
-
type="solid"
|
|
35
|
-
class="h-5 w-5 text-gray-400"
|
|
36
|
-
></c-icon>
|
|
37
|
-
<c-icon
|
|
38
|
-
name="chevron-down"
|
|
39
|
-
type="solid"
|
|
40
|
-
class="ml-1 h-5 w-5 text-gray-400"
|
|
41
|
-
></c-icon>
|
|
42
|
-
</button>
|
|
43
|
-
</div>
|
|
44
|
-
<!-- dropdown having list of all columns to show hide -->
|
|
45
|
-
<div
|
|
46
|
-
v-if="toggleDropdown"
|
|
47
|
-
@click="handleToggle"
|
|
48
|
-
class="fixed inset-0 z-20"
|
|
49
|
-
></div>
|
|
50
|
-
<div
|
|
51
|
-
v-if="toggleDropdown"
|
|
52
|
-
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"
|
|
53
|
-
tabindex="0"
|
|
54
|
-
>
|
|
55
|
-
<div
|
|
56
|
-
class="py-1"
|
|
57
|
-
role="menu"
|
|
58
|
-
aria-orientation="vertical"
|
|
59
|
-
aria-labelledby="option-menu"
|
|
60
|
-
>
|
|
61
|
-
<a
|
|
62
|
-
href="#"
|
|
63
|
-
v-for="column in showHideColumnList"
|
|
64
|
-
v-bind:key="column.field"
|
|
65
|
-
class="block flex px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900"
|
|
66
|
-
role="menuitem"
|
|
67
|
-
>
|
|
68
|
-
<c-checkbox
|
|
69
|
-
:label="column.label"
|
|
70
|
-
@onChange="showHideColumn($event, column.field)"
|
|
71
|
-
:value="!column.hidden"
|
|
72
|
-
></c-checkbox>
|
|
73
|
-
</a>
|
|
74
|
-
</div>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
<slot name="customDatePicker"></slot>
|
|
78
|
-
|
|
79
|
-
<!-- simple download button -->
|
|
80
|
-
<div
|
|
81
|
-
v-if="enableDownload && !downloadDropdown"
|
|
82
|
-
@click="startDownload"
|
|
83
|
-
>
|
|
84
|
-
<c-button-icon
|
|
85
|
-
type="white"
|
|
86
|
-
:icon="
|
|
87
|
-
downloadLoader
|
|
88
|
-
? null
|
|
89
|
-
: {
|
|
90
|
-
name: 'download-solid',
|
|
91
|
-
type: 'solid',
|
|
92
|
-
class: 'h-5 w-5 text-gray-400',
|
|
93
|
-
}
|
|
94
|
-
"
|
|
95
|
-
class="ml-3"
|
|
96
|
-
loaderClasses="ml-2"
|
|
97
|
-
:isLoading="downloadLoader"
|
|
98
|
-
></c-button-icon>
|
|
99
|
-
</div>
|
|
100
|
-
<!-- no download buttons -->
|
|
101
|
-
<div v-if="!enableDownload && !downloadDropdown"></div>
|
|
102
|
-
<!-- download button with download options -->
|
|
103
|
-
<div v-if="enableDownload && downloadDropdown" class="relative ml-3">
|
|
104
|
-
<div>
|
|
105
|
-
<button
|
|
106
|
-
@click="handleDownloadToggle"
|
|
107
|
-
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"
|
|
108
|
-
aria-haspopup="true"
|
|
109
|
-
aria-expanded="true"
|
|
110
|
-
>
|
|
111
|
-
<c-icon
|
|
112
|
-
v-if="downloadOptionLoader"
|
|
113
|
-
cursorType="cursor-pointer"
|
|
114
|
-
class="mr-2 h-5 w-5 text-gray-400"
|
|
115
|
-
name="loader"
|
|
116
|
-
></c-icon>
|
|
117
|
-
<c-icon
|
|
118
|
-
v-else
|
|
119
|
-
name="download-solid"
|
|
120
|
-
type="solid"
|
|
121
|
-
class="h-5 w-5 text-gray-400"
|
|
122
|
-
></c-icon>
|
|
123
|
-
<c-icon
|
|
124
|
-
name="chevron-down"
|
|
125
|
-
type="solid"
|
|
126
|
-
class="ml-1 h-5 w-5 text-gray-400"
|
|
127
|
-
></c-icon>
|
|
128
|
-
</button>
|
|
129
|
-
</div>
|
|
130
|
-
<!-- download options dropdown -->
|
|
131
|
-
<div
|
|
132
|
-
v-if="toggleDownloadDropdown"
|
|
133
|
-
@click="handleDownloadToggle"
|
|
134
|
-
class="fixed inset-0 z-20"
|
|
135
|
-
></div>
|
|
136
|
-
<div
|
|
137
|
-
v-if="toggleDownloadDropdown"
|
|
138
|
-
class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-64 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
|
|
139
|
-
tabindex="0"
|
|
140
|
-
>
|
|
141
|
-
<div
|
|
142
|
-
class="py-1"
|
|
143
|
-
role="menu"
|
|
144
|
-
aria-orientation="vertical"
|
|
145
|
-
aria-labelledby="option-menu"
|
|
146
|
-
>
|
|
147
|
-
<div
|
|
148
|
-
v-for="(item, index) in showDownloadDropdownList"
|
|
149
|
-
:key="index"
|
|
150
|
-
class="cursor-pointer px-4 py-2 text-sm text-gray-900 hover:bg-gray-100 hover:text-gray-900"
|
|
151
|
-
role="menuitem"
|
|
152
|
-
@click="downloadFromOption(item.value)"
|
|
153
|
-
>
|
|
154
|
-
<p>{{ item.title }}</p>
|
|
155
|
-
<p class="text-sm text-gray-400">{{ item.description }}</p>
|
|
156
|
-
</div>
|
|
157
|
-
</div>
|
|
158
|
-
</div>
|
|
159
|
-
</div>
|
|
160
|
-
<slot name="customTableExtraActions"></slot>
|
|
161
|
-
</div>
|
|
162
|
-
</div>
|
|
163
|
-
</div>
|
|
164
|
-
<vue-good-table
|
|
165
|
-
:class="`rounded-lg ${
|
|
166
|
-
hideBorder ? ' border-none' : 'border-2 border-solid border-gray-100'
|
|
167
|
-
}`"
|
|
168
|
-
mode="remote"
|
|
169
|
-
ref="my-table"
|
|
170
|
-
:styleClass="
|
|
171
|
-
isLoading ? 'vgt-table opacity-50 pointer-events-none' : 'vgt-table'
|
|
172
|
-
"
|
|
173
|
-
:row-style-class="rowStyleClassFn"
|
|
174
|
-
min-height="400px"
|
|
175
|
-
:globalSearch="true"
|
|
176
|
-
:totalRows="totalRecords"
|
|
177
|
-
:columns="cols"
|
|
178
|
-
:rows="rows"
|
|
179
|
-
:search-options="{
|
|
180
|
-
enabled: searching,
|
|
181
|
-
externalQuery: searchTerm,
|
|
182
|
-
placeholder: searchPlaceholder,
|
|
183
|
-
trigger: 'enter',
|
|
184
|
-
}"
|
|
185
|
-
:select-options="{
|
|
186
|
-
enabled: enableSelection,
|
|
187
|
-
selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row
|
|
188
|
-
selectionInfoClass: 'custom-class',
|
|
189
|
-
selectionText: 'rows selected',
|
|
190
|
-
clearSelectionText: 'clear',
|
|
191
|
-
disableSelectInfo: true, // disable the select info panel on top
|
|
192
|
-
selectAllByGroup: true, // when used in combination with a grouped table, add a checkbox in the header row to check/uncheck the entire group
|
|
193
|
-
}"
|
|
194
|
-
:sort-options="{
|
|
195
|
-
enabled: sorting,
|
|
196
|
-
initialSortBy: initialSortField,
|
|
197
|
-
}"
|
|
198
|
-
:pagination-options="{ enabled: pagination }"
|
|
199
|
-
:fixed-header="fixedHeader"
|
|
200
|
-
:group-options="{
|
|
201
|
-
enabled: enableGrouping,
|
|
202
|
-
collapsable: enableGrouping,
|
|
203
|
-
maintainExpanded: enableGrouping,
|
|
204
|
-
}"
|
|
205
|
-
@on-selected-rows-change="selectionChanged"
|
|
206
|
-
@on-sort-change="sortChange"
|
|
207
|
-
@on-search="onSearching"
|
|
208
|
-
@on-row-click="onRowClick"
|
|
209
|
-
>
|
|
210
|
-
>
|
|
211
|
-
<template slot="table-column" slot-scope="props">
|
|
212
|
-
<!-- custom sorting icon -->
|
|
213
|
-
<span v-if="props.column.sortable || sorting" class="flex">
|
|
214
|
-
<div>
|
|
215
|
-
{{ props.column.label }}
|
|
216
|
-
</div>
|
|
217
|
-
<!-- render if there is no sorting order, appears on hover -->
|
|
218
|
-
<c-icon
|
|
219
|
-
v-if="props.column.direction == null"
|
|
220
|
-
name="sort-ascending-solid"
|
|
221
|
-
class="sortingIcon invisible ml-3 h-5 w-5"
|
|
222
|
-
type="solid"
|
|
223
|
-
></c-icon>
|
|
224
|
-
<!-- renders when direction is asc -->
|
|
225
|
-
<c-icon
|
|
226
|
-
v-else-if="props.column.direction == 'asc'"
|
|
227
|
-
name="sort-ascending-solid"
|
|
228
|
-
class="ml-3 h-5 w-5"
|
|
229
|
-
type="solid"
|
|
230
|
-
></c-icon>
|
|
231
|
-
<!-- renders when direction is desc -->
|
|
232
|
-
<c-icon
|
|
233
|
-
v-else-if="props.column.direction == 'desc'"
|
|
234
|
-
name="sort-descending-solid"
|
|
235
|
-
class="ml-3 h-5 w-5"
|
|
236
|
-
type="solid"
|
|
237
|
-
></c-icon>
|
|
238
|
-
</span>
|
|
239
|
-
<span class="font-medium text-gray-500" v-else-if="fontHeader">
|
|
240
|
-
{{ props.column.label }}
|
|
241
|
-
</span>
|
|
242
|
-
<span v-else>
|
|
243
|
-
{{ props.column.label }}
|
|
244
|
-
</span>
|
|
245
|
-
</template>
|
|
246
|
-
<div slot="emptystate" v-if="isLoading">
|
|
247
|
-
<vue-skeleton-loader
|
|
248
|
-
v-for="(item, index) in 10"
|
|
249
|
-
:key="index"
|
|
250
|
-
type="table-tbody: table-row-divider@6"
|
|
251
|
-
animation="fade"
|
|
252
|
-
:width="1220"
|
|
253
|
-
:rounded="true"
|
|
254
|
-
:radius="50"
|
|
255
|
-
:class="`skeleton ${index === 0 ? '' : 'mt-2'}`"
|
|
256
|
-
:height="50"
|
|
257
|
-
></vue-skeleton-loader>
|
|
258
|
-
</div>
|
|
259
|
-
<template slot="table-row" slot-scope="props">
|
|
260
|
-
<!-- renders if drag and drop is present in table -->
|
|
261
|
-
<span v-if="props.column.field == 'drag'">
|
|
262
|
-
<c-icon
|
|
263
|
-
name="menu-solid"
|
|
264
|
-
type="solid"
|
|
265
|
-
:class="`handle h-5 w-5 ${
|
|
266
|
-
props.row.status && props.row.status === 2
|
|
267
|
-
? 'pointer-events-none cursor-default opacity-50'
|
|
268
|
-
: 'text-gray-500'
|
|
269
|
-
}`"
|
|
270
|
-
:cursorType="'cursor-grab'"
|
|
271
|
-
></c-icon>
|
|
272
|
-
</span>
|
|
273
|
-
<!-- if customization or adding another form element is required -->
|
|
274
|
-
<span v-else-if="props.column.customizeColumn">
|
|
275
|
-
<slot :records="props"> </slot>
|
|
276
|
-
</span>
|
|
277
|
-
<!-- renders records as per column name -->
|
|
278
|
-
<span v-else>
|
|
279
|
-
{{ props.formattedRow[props.column.field] }}
|
|
280
|
-
</span>
|
|
281
|
-
</template>
|
|
282
|
-
<!-- Custom pagination component -->
|
|
283
|
-
<template v-if="pagination" slot="pagination-bottom">
|
|
284
|
-
<c-pagination
|
|
285
|
-
v-if="paginationRecords.totalRecords > 0"
|
|
286
|
-
:setPaginationRecords="paginationRecords"
|
|
287
|
-
:totalRecordsOnPage="recordsToDisplay"
|
|
288
|
-
:showEntryPicker="showEntryPicker"
|
|
289
|
-
@setCurrentPage="setCurrentPageRecords"
|
|
290
|
-
@setPreviousPage="setPreviousPageRecords"
|
|
291
|
-
@setNextPage="setNextPageRecords"
|
|
292
|
-
@handle-Row-Count-Change="handleChangeRowCount"
|
|
293
|
-
></c-pagination>
|
|
294
|
-
</template>
|
|
295
|
-
</vue-good-table>
|
|
296
|
-
</div>
|
|
297
|
-
</template>
|
|
298
|
-
<script>
|
|
299
|
-
import CIcon from "../CIcon/CIcon.vue";
|
|
300
|
-
import CCheckbox from "../CCheckbox/CCheckbox.vue";
|
|
301
|
-
import CPagination from "../CPagination/CPagination.vue";
|
|
302
|
-
import CButtonIcon from "../CButtonIcon/CButtonIcon.vue";
|
|
303
|
-
|
|
304
|
-
import "vue-good-table/dist/vue-good-table.css";
|
|
305
|
-
import { VueGoodTable } from "vue-good-table";
|
|
306
|
-
import Sortable from "@shopify/draggable/lib/es5/sortable.js";
|
|
307
|
-
import CInput from "../CInput/CInput.vue";
|
|
308
|
-
import { debounce, isEqual } from "lodash-es";
|
|
309
|
-
import VueSkeletonLoader from "skeleton-loader-vue";
|
|
310
|
-
|
|
311
|
-
export default {
|
|
312
|
-
name: "CTable",
|
|
313
|
-
components: {
|
|
314
|
-
CCheckbox,
|
|
315
|
-
CIcon,
|
|
316
|
-
VueGoodTable,
|
|
317
|
-
CPagination,
|
|
318
|
-
CButtonIcon,
|
|
319
|
-
CInput,
|
|
320
|
-
VueSkeletonLoader,
|
|
321
|
-
},
|
|
322
|
-
props: {
|
|
323
|
-
fontHeader: {
|
|
324
|
-
type: Boolean,
|
|
325
|
-
default: false,
|
|
326
|
-
},
|
|
327
|
-
// To show or hide pagination section
|
|
328
|
-
pagination: {
|
|
329
|
-
type: Boolean,
|
|
330
|
-
},
|
|
331
|
-
// To enable or disable sorting
|
|
332
|
-
sorting: {
|
|
333
|
-
type: Boolean,
|
|
334
|
-
},
|
|
335
|
-
// To show or hide search input
|
|
336
|
-
searching: {
|
|
337
|
-
type: Boolean,
|
|
338
|
-
},
|
|
339
|
-
// To add checkbox to select rows
|
|
340
|
-
enableSelection: {
|
|
341
|
-
type: Boolean,
|
|
342
|
-
},
|
|
343
|
-
enableVisibility: {
|
|
344
|
-
type: Boolean,
|
|
345
|
-
default: true,
|
|
346
|
-
},
|
|
347
|
-
enableDownload: {
|
|
348
|
-
type: Boolean,
|
|
349
|
-
default: true,
|
|
350
|
-
},
|
|
351
|
-
// All the buttons displayed on top right side of table
|
|
352
|
-
tableActions: {
|
|
353
|
-
type: Boolean,
|
|
354
|
-
},
|
|
355
|
-
// Placeholder text for search
|
|
356
|
-
searchPlaceholder: {
|
|
357
|
-
type: String,
|
|
358
|
-
},
|
|
359
|
-
// Existing text for search
|
|
360
|
-
searchQuery: {
|
|
361
|
-
type: String,
|
|
362
|
-
},
|
|
363
|
-
isLoading: {
|
|
364
|
-
type: Boolean,
|
|
365
|
-
},
|
|
366
|
-
// Total number of rows in a table to calculate page numbers
|
|
367
|
-
totalRecords: {
|
|
368
|
-
type: String,
|
|
369
|
-
},
|
|
370
|
-
// Shows current selected page and records on per page
|
|
371
|
-
paginationData: {
|
|
372
|
-
type: Object,
|
|
373
|
-
},
|
|
374
|
-
// Pass a column on which initial sorting will be applied
|
|
375
|
-
initialSortField: {
|
|
376
|
-
type: Object,
|
|
377
|
-
},
|
|
378
|
-
// all columns of the table
|
|
379
|
-
cols: {
|
|
380
|
-
type: Array,
|
|
381
|
-
required: true,
|
|
382
|
-
},
|
|
383
|
-
// row records of the table
|
|
384
|
-
rows: {
|
|
385
|
-
type: Array,
|
|
386
|
-
required: true,
|
|
387
|
-
},
|
|
388
|
-
// List of columns to show hide
|
|
389
|
-
showHideColumnList: {
|
|
390
|
-
type: Array,
|
|
391
|
-
},
|
|
392
|
-
// List of items to show download options
|
|
393
|
-
showDownloadDropdownList: {
|
|
394
|
-
type: Array,
|
|
395
|
-
},
|
|
396
|
-
// Function on changing page number
|
|
397
|
-
onPageChange: {
|
|
398
|
-
type: Function,
|
|
399
|
-
},
|
|
400
|
-
// Function on changing sorting on column
|
|
401
|
-
onSortChange: {
|
|
402
|
-
type: Function,
|
|
403
|
-
},
|
|
404
|
-
// Function to fetch results on search query
|
|
405
|
-
onSearch: {
|
|
406
|
-
type: Function,
|
|
407
|
-
},
|
|
408
|
-
// Emit action on clicking the row
|
|
409
|
-
onRowClickAction: {
|
|
410
|
-
type: Function,
|
|
411
|
-
},
|
|
412
|
-
// Start the loader
|
|
413
|
-
downloadLoader: {
|
|
414
|
-
type: Boolean,
|
|
415
|
-
},
|
|
416
|
-
// Start the loader
|
|
417
|
-
downloadOptionLoader: {
|
|
418
|
-
type: Boolean,
|
|
419
|
-
},
|
|
420
|
-
downloadDropdown: {
|
|
421
|
-
type: Boolean,
|
|
422
|
-
},
|
|
423
|
-
rowStyleClassFn: {
|
|
424
|
-
type: Function,
|
|
425
|
-
default: () => "",
|
|
426
|
-
},
|
|
427
|
-
fixedHeader: {
|
|
428
|
-
type: Boolean,
|
|
429
|
-
default: false,
|
|
430
|
-
},
|
|
431
|
-
hideBorder: {
|
|
432
|
-
type: Boolean,
|
|
433
|
-
default: false,
|
|
434
|
-
},
|
|
435
|
-
showEntryPicker: {
|
|
436
|
-
type: Boolean,
|
|
437
|
-
default: false,
|
|
438
|
-
},
|
|
439
|
-
enableGrouping: {
|
|
440
|
-
type: Boolean,
|
|
441
|
-
default: false,
|
|
442
|
-
},
|
|
443
|
-
},
|
|
444
|
-
mounted() {
|
|
445
|
-
// to add drag and drop in table
|
|
446
|
-
this.reorderedArray = this.rows;
|
|
447
|
-
let sortable = new Sortable(document.querySelectorAll("tbody"), {
|
|
448
|
-
draggable: "tr",
|
|
449
|
-
handle: ".handle",
|
|
450
|
-
classes: {
|
|
451
|
-
mirror: ["bg-white"],
|
|
452
|
-
},
|
|
453
|
-
mirror: {
|
|
454
|
-
constrainDimensions: true,
|
|
455
|
-
},
|
|
456
|
-
});
|
|
457
|
-
sortable.on("sortable:stop", (e) => this.rearrange(e.oldIndex, e.newIndex));
|
|
458
|
-
document.addEventListener("keydown", this.handleControlClick, true);
|
|
459
|
-
document.addEventListener("keyup", this.handleControlRelease, true);
|
|
460
|
-
},
|
|
461
|
-
destroyed() {
|
|
462
|
-
//to remove the event listener
|
|
463
|
-
document.removeEventListener("keydown", this.handleControlClick, true);
|
|
464
|
-
document.removeEventListener("keyup", this.handleControlRelease, true);
|
|
465
|
-
},
|
|
466
|
-
data() {
|
|
467
|
-
return {
|
|
468
|
-
toggleDropdown: false,
|
|
469
|
-
toggleDownloadDropdown: false,
|
|
470
|
-
searchTerm: this.searchQuery ? this.searchQuery : "",
|
|
471
|
-
paginationRecords: this.paginationData,
|
|
472
|
-
reorderedArray: [],
|
|
473
|
-
controlClick: false,
|
|
474
|
-
attrs: {
|
|
475
|
-
boilerplate: true,
|
|
476
|
-
elevation: 2,
|
|
477
|
-
},
|
|
478
|
-
recordsToDisplay: {
|
|
479
|
-
option: 10,
|
|
480
|
-
value: 10,
|
|
481
|
-
},
|
|
482
|
-
};
|
|
483
|
-
},
|
|
484
|
-
methods: {
|
|
485
|
-
handleChangeRowCount(value) {
|
|
486
|
-
this.recordsToDisplay = value;
|
|
487
|
-
this.$emit("change-row-count", value.value);
|
|
488
|
-
},
|
|
489
|
-
handleControlClick(event) {
|
|
490
|
-
if (event.keyCode === 17 || event.keyCode === 91) {
|
|
491
|
-
event.preventDefault();
|
|
492
|
-
this.controlClick = true;
|
|
493
|
-
}
|
|
494
|
-
},
|
|
495
|
-
handleControlRelease(event) {
|
|
496
|
-
if (event.keyCode === 17 || event.keyCode === 91) {
|
|
497
|
-
event.preventDefault();
|
|
498
|
-
this.controlClick = false;
|
|
499
|
-
}
|
|
500
|
-
},
|
|
501
|
-
handleToggle() {
|
|
502
|
-
this.toggleDropdown = !this.toggleDropdown;
|
|
503
|
-
},
|
|
504
|
-
handleDownloadToggle() {
|
|
505
|
-
this.toggleDownloadDropdown = !this.toggleDownloadDropdown;
|
|
506
|
-
},
|
|
507
|
-
showHideColumn(value, name) {
|
|
508
|
-
this.$emit("hideCols", value, name);
|
|
509
|
-
},
|
|
510
|
-
// Function to get selected rows on checking the checkbox
|
|
511
|
-
selectionChanged() {
|
|
512
|
-
this.$emit(
|
|
513
|
-
"selectRows",
|
|
514
|
-
this.$refs["my-table"].selectedRows,
|
|
515
|
-
this.$refs["my-table"].allSelected
|
|
516
|
-
);
|
|
517
|
-
},
|
|
518
|
-
// array of rows after drag and drop
|
|
519
|
-
rearrange(oldIndex, newIndex) {
|
|
520
|
-
const movedItem = this.reorderedArray.find(
|
|
521
|
-
(item, index) => index === oldIndex
|
|
522
|
-
);
|
|
523
|
-
const remainingItems = this.reorderedArray.filter(
|
|
524
|
-
(item, index) => index !== oldIndex
|
|
525
|
-
);
|
|
526
|
-
const reorderedItems = [
|
|
527
|
-
...remainingItems.slice(0, newIndex),
|
|
528
|
-
movedItem,
|
|
529
|
-
...remainingItems.slice(newIndex),
|
|
530
|
-
];
|
|
531
|
-
this.reorderedArray = [...reorderedItems];
|
|
532
|
-
this.$emit(
|
|
533
|
-
"reordered",
|
|
534
|
-
this.reorderedArray,
|
|
535
|
-
movedItem,
|
|
536
|
-
oldIndex,
|
|
537
|
-
newIndex
|
|
538
|
-
);
|
|
539
|
-
},
|
|
540
|
-
// listing functions
|
|
541
|
-
sortChange(params) {
|
|
542
|
-
if (params[0].type == "none") {
|
|
543
|
-
params[0].type = "asc";
|
|
544
|
-
}
|
|
545
|
-
this.$emit("onSortChange", params);
|
|
546
|
-
},
|
|
547
|
-
onSearching: debounce(function (params) {
|
|
548
|
-
this.$emit("onSearch", params);
|
|
549
|
-
}, 500),
|
|
550
|
-
setCurrentPageRecords(page) {
|
|
551
|
-
this.paginationRecords.currentPage = page;
|
|
552
|
-
this.$emit("pageChange", page);
|
|
553
|
-
},
|
|
554
|
-
setPreviousPageRecords(page) {
|
|
555
|
-
this.paginationRecords.currentPage = page;
|
|
556
|
-
this.$emit("pageChange", page);
|
|
557
|
-
},
|
|
558
|
-
setNextPageRecords(page) {
|
|
559
|
-
this.paginationRecords.currentPage = page;
|
|
560
|
-
this.$emit("pageChange", page);
|
|
561
|
-
},
|
|
562
|
-
onRowClick(params) {
|
|
563
|
-
if (params.event.target.type === undefined) {
|
|
564
|
-
if (this.controlClick) {
|
|
565
|
-
this.$emit("onRowControlClickAction", params);
|
|
566
|
-
} else {
|
|
567
|
-
this.$emit("onRowClickAction", params);
|
|
568
|
-
}
|
|
569
|
-
} else {
|
|
570
|
-
return false;
|
|
571
|
-
}
|
|
572
|
-
},
|
|
573
|
-
startDownload() {
|
|
574
|
-
this.$emit("handleDownloadButton");
|
|
575
|
-
},
|
|
576
|
-
downloadFromOption(value) {
|
|
577
|
-
this.toggleDownloadDropdown = false;
|
|
578
|
-
this.$emit("handleDownloadOptionButton", value);
|
|
579
|
-
},
|
|
580
|
-
|
|
581
|
-
handleRowExpand() {
|
|
582
|
-
this.$refs["my-table"].expandAll();
|
|
583
|
-
},
|
|
584
|
-
},
|
|
585
|
-
watch: {
|
|
586
|
-
paginationData(newValue, oldValue) {
|
|
587
|
-
if (!isEqual(newValue, oldValue)) {
|
|
588
|
-
this.paginationRecords = newValue;
|
|
589
|
-
}
|
|
590
|
-
},
|
|
591
|
-
rows(newValue, oldValue) {
|
|
592
|
-
if (!isEqual(newValue, oldValue)) {
|
|
593
|
-
this.reorderedArray = newValue;
|
|
594
|
-
}
|
|
595
|
-
},
|
|
596
|
-
},
|
|
597
|
-
};
|
|
598
|
-
</script>
|
|
599
|
-
<style>
|
|
600
|
-
.vgt-table {
|
|
601
|
-
border-spacing: 0;
|
|
602
|
-
border: none !important;
|
|
603
|
-
font-family: "Inter";
|
|
604
|
-
font-size: 14px !important;
|
|
605
|
-
}
|
|
606
|
-
table.vgt-table td {
|
|
607
|
-
vertical-align: middle;
|
|
608
|
-
}
|
|
609
|
-
.vgt-table thead th {
|
|
610
|
-
background: linear-gradient(#fff, #fff);
|
|
611
|
-
}
|
|
612
|
-
.vgt-table th.vgt-checkbox-col {
|
|
613
|
-
border-right: 0;
|
|
614
|
-
border-bottom: 1px solid #dcdfe6;
|
|
615
|
-
background: linear-gradient(#fff, #fff);
|
|
616
|
-
}
|
|
617
|
-
table.vgt-table tr.clickable:hover > th.vgt-checkbox-col {
|
|
618
|
-
background: #f1f5fd;
|
|
619
|
-
border-bottom: 1px solid #dcdfe6 !important;
|
|
620
|
-
}
|
|
621
|
-
.vgt-table th.sortable button::before,
|
|
622
|
-
.vgt-table th.sortable button::after {
|
|
623
|
-
border-right: 0;
|
|
624
|
-
border-left: 0;
|
|
625
|
-
}
|
|
626
|
-
[type="checkbox"],
|
|
627
|
-
[type="checkbox"]:focus {
|
|
628
|
-
border-radius: 4px;
|
|
629
|
-
border-color: #d1d5db;
|
|
630
|
-
cursor: pointer;
|
|
631
|
-
color: #0284c7;
|
|
632
|
-
--tw-ring-color: #0284c7;
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
/* tbody > tr > th.vgt-checkbox-col {
|
|
636
|
-
background: linear-gradient(#fff, #fff);
|
|
637
|
-
border-bottom: 1px solid #dcdfe6;
|
|
638
|
-
} */
|
|
639
|
-
.vgt-global-search {
|
|
640
|
-
background: none;
|
|
641
|
-
border: none;
|
|
642
|
-
padding: 0 0 12px 0;
|
|
643
|
-
}
|
|
644
|
-
.vgt-global-search__input {
|
|
645
|
-
padding-left: 0;
|
|
646
|
-
}
|
|
647
|
-
.input__icon {
|
|
648
|
-
display: none;
|
|
649
|
-
}
|
|
650
|
-
.vgt-global-search__input .vgt-input {
|
|
651
|
-
height: 38px;
|
|
652
|
-
width: 250px;
|
|
653
|
-
}
|
|
654
|
-
.vgt-inner-wrap {
|
|
655
|
-
box-shadow: none;
|
|
656
|
-
}
|
|
657
|
-
.vgt-inner-wrap.is-loading {
|
|
658
|
-
opacity: 1;
|
|
659
|
-
pointer-events: auto;
|
|
660
|
-
}
|
|
661
|
-
.vgt-table th.sortable:hover .sortingIcon {
|
|
662
|
-
visibility: visible;
|
|
663
|
-
}
|
|
664
|
-
.vgt-responsive {
|
|
665
|
-
position: static;
|
|
666
|
-
border-radius: 8px;
|
|
667
|
-
}
|
|
668
|
-
.vgt-wrap {
|
|
669
|
-
position: static;
|
|
670
|
-
}
|
|
671
|
-
</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
|
+
<slot name="customTableFilterActions"></slot>
|
|
10
|
+
<div v-if="searching" class="flex items-center">
|
|
11
|
+
<c-input
|
|
12
|
+
v-model="searchTerm"
|
|
13
|
+
:isValidate="searching"
|
|
14
|
+
:placeholder="searchPlaceholder"
|
|
15
|
+
class="-mt-1 mr-3 w-auto sm:w-56"
|
|
16
|
+
type="text"
|
|
17
|
+
></c-input>
|
|
18
|
+
<slot name="tableInfo"></slot>
|
|
19
|
+
</div>
|
|
20
|
+
<div class="flex flex-1 justify-end">
|
|
21
|
+
<!-- dropdown icon on top right of table -->
|
|
22
|
+
<slot name="customTableActions"></slot>
|
|
23
|
+
<div class="relative inline-block text-left" v-if="enableVisibility">
|
|
24
|
+
<!-- button to show list of columns to show hide in table -->
|
|
25
|
+
<div>
|
|
26
|
+
<button
|
|
27
|
+
@click="handleToggle"
|
|
28
|
+
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"
|
|
29
|
+
aria-haspopup="true"
|
|
30
|
+
aria-expanded="true"
|
|
31
|
+
>
|
|
32
|
+
<c-icon
|
|
33
|
+
name="view-board"
|
|
34
|
+
type="solid"
|
|
35
|
+
class="h-5 w-5 text-gray-400"
|
|
36
|
+
></c-icon>
|
|
37
|
+
<c-icon
|
|
38
|
+
name="chevron-down"
|
|
39
|
+
type="solid"
|
|
40
|
+
class="ml-1 h-5 w-5 text-gray-400"
|
|
41
|
+
></c-icon>
|
|
42
|
+
</button>
|
|
43
|
+
</div>
|
|
44
|
+
<!-- dropdown having list of all columns to show hide -->
|
|
45
|
+
<div
|
|
46
|
+
v-if="toggleDropdown"
|
|
47
|
+
@click="handleToggle"
|
|
48
|
+
class="fixed inset-0 z-20"
|
|
49
|
+
></div>
|
|
50
|
+
<div
|
|
51
|
+
v-if="toggleDropdown"
|
|
52
|
+
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"
|
|
53
|
+
tabindex="0"
|
|
54
|
+
>
|
|
55
|
+
<div
|
|
56
|
+
class="py-1"
|
|
57
|
+
role="menu"
|
|
58
|
+
aria-orientation="vertical"
|
|
59
|
+
aria-labelledby="option-menu"
|
|
60
|
+
>
|
|
61
|
+
<a
|
|
62
|
+
href="#"
|
|
63
|
+
v-for="column in showHideColumnList"
|
|
64
|
+
v-bind:key="column.field"
|
|
65
|
+
class="block flex px-4 py-2 text-sm text-gray-700 hover:bg-gray-100 hover:text-gray-900"
|
|
66
|
+
role="menuitem"
|
|
67
|
+
>
|
|
68
|
+
<c-checkbox
|
|
69
|
+
:label="column.label"
|
|
70
|
+
@onChange="showHideColumn($event, column.field)"
|
|
71
|
+
:value="!column.hidden"
|
|
72
|
+
></c-checkbox>
|
|
73
|
+
</a>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
<slot name="customDatePicker"></slot>
|
|
78
|
+
|
|
79
|
+
<!-- simple download button -->
|
|
80
|
+
<div
|
|
81
|
+
v-if="enableDownload && !downloadDropdown"
|
|
82
|
+
@click="startDownload"
|
|
83
|
+
>
|
|
84
|
+
<c-button-icon
|
|
85
|
+
type="white"
|
|
86
|
+
:icon="
|
|
87
|
+
downloadLoader
|
|
88
|
+
? null
|
|
89
|
+
: {
|
|
90
|
+
name: 'download-solid',
|
|
91
|
+
type: 'solid',
|
|
92
|
+
class: 'h-5 w-5 text-gray-400',
|
|
93
|
+
}
|
|
94
|
+
"
|
|
95
|
+
class="ml-3"
|
|
96
|
+
loaderClasses="ml-2"
|
|
97
|
+
:isLoading="downloadLoader"
|
|
98
|
+
></c-button-icon>
|
|
99
|
+
</div>
|
|
100
|
+
<!-- no download buttons -->
|
|
101
|
+
<div v-if="!enableDownload && !downloadDropdown"></div>
|
|
102
|
+
<!-- download button with download options -->
|
|
103
|
+
<div v-if="enableDownload && downloadDropdown" class="relative ml-3">
|
|
104
|
+
<div>
|
|
105
|
+
<button
|
|
106
|
+
@click="handleDownloadToggle"
|
|
107
|
+
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"
|
|
108
|
+
aria-haspopup="true"
|
|
109
|
+
aria-expanded="true"
|
|
110
|
+
>
|
|
111
|
+
<c-icon
|
|
112
|
+
v-if="downloadOptionLoader"
|
|
113
|
+
cursorType="cursor-pointer"
|
|
114
|
+
class="mr-2 h-5 w-5 text-gray-400"
|
|
115
|
+
name="loader"
|
|
116
|
+
></c-icon>
|
|
117
|
+
<c-icon
|
|
118
|
+
v-else
|
|
119
|
+
name="download-solid"
|
|
120
|
+
type="solid"
|
|
121
|
+
class="h-5 w-5 text-gray-400"
|
|
122
|
+
></c-icon>
|
|
123
|
+
<c-icon
|
|
124
|
+
name="chevron-down"
|
|
125
|
+
type="solid"
|
|
126
|
+
class="ml-1 h-5 w-5 text-gray-400"
|
|
127
|
+
></c-icon>
|
|
128
|
+
</button>
|
|
129
|
+
</div>
|
|
130
|
+
<!-- download options dropdown -->
|
|
131
|
+
<div
|
|
132
|
+
v-if="toggleDownloadDropdown"
|
|
133
|
+
@click="handleDownloadToggle"
|
|
134
|
+
class="fixed inset-0 z-20"
|
|
135
|
+
></div>
|
|
136
|
+
<div
|
|
137
|
+
v-if="toggleDownloadDropdown"
|
|
138
|
+
class="absolute right-0 z-30 mt-2 -mr-1 max-h-96 w-64 origin-top-right overflow-y-auto rounded-md bg-white shadow-lg ring-1 ring-gray-900 ring-opacity-5"
|
|
139
|
+
tabindex="0"
|
|
140
|
+
>
|
|
141
|
+
<div
|
|
142
|
+
class="py-1"
|
|
143
|
+
role="menu"
|
|
144
|
+
aria-orientation="vertical"
|
|
145
|
+
aria-labelledby="option-menu"
|
|
146
|
+
>
|
|
147
|
+
<div
|
|
148
|
+
v-for="(item, index) in showDownloadDropdownList"
|
|
149
|
+
:key="index"
|
|
150
|
+
class="cursor-pointer px-4 py-2 text-sm text-gray-900 hover:bg-gray-100 hover:text-gray-900"
|
|
151
|
+
role="menuitem"
|
|
152
|
+
@click="downloadFromOption(item.value)"
|
|
153
|
+
>
|
|
154
|
+
<p>{{ item.title }}</p>
|
|
155
|
+
<p class="text-sm text-gray-400">{{ item.description }}</p>
|
|
156
|
+
</div>
|
|
157
|
+
</div>
|
|
158
|
+
</div>
|
|
159
|
+
</div>
|
|
160
|
+
<slot name="customTableExtraActions"></slot>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
</div>
|
|
164
|
+
<vue-good-table
|
|
165
|
+
:class="`rounded-lg ${
|
|
166
|
+
hideBorder ? ' border-none' : 'border-2 border-solid border-gray-100'
|
|
167
|
+
}`"
|
|
168
|
+
mode="remote"
|
|
169
|
+
ref="my-table"
|
|
170
|
+
:styleClass="
|
|
171
|
+
isLoading ? 'vgt-table opacity-50 pointer-events-none' : 'vgt-table'
|
|
172
|
+
"
|
|
173
|
+
:row-style-class="rowStyleClassFn"
|
|
174
|
+
min-height="400px"
|
|
175
|
+
:globalSearch="true"
|
|
176
|
+
:totalRows="totalRecords"
|
|
177
|
+
:columns="cols"
|
|
178
|
+
:rows="rows"
|
|
179
|
+
:search-options="{
|
|
180
|
+
enabled: searching,
|
|
181
|
+
externalQuery: searchTerm,
|
|
182
|
+
placeholder: searchPlaceholder,
|
|
183
|
+
trigger: 'enter',
|
|
184
|
+
}"
|
|
185
|
+
:select-options="{
|
|
186
|
+
enabled: enableSelection,
|
|
187
|
+
selectOnCheckboxOnly: true, // only select when checkbox is clicked instead of the row
|
|
188
|
+
selectionInfoClass: 'custom-class',
|
|
189
|
+
selectionText: 'rows selected',
|
|
190
|
+
clearSelectionText: 'clear',
|
|
191
|
+
disableSelectInfo: true, // disable the select info panel on top
|
|
192
|
+
selectAllByGroup: true, // when used in combination with a grouped table, add a checkbox in the header row to check/uncheck the entire group
|
|
193
|
+
}"
|
|
194
|
+
:sort-options="{
|
|
195
|
+
enabled: sorting,
|
|
196
|
+
initialSortBy: initialSortField,
|
|
197
|
+
}"
|
|
198
|
+
:pagination-options="{ enabled: pagination }"
|
|
199
|
+
:fixed-header="fixedHeader"
|
|
200
|
+
:group-options="{
|
|
201
|
+
enabled: enableGrouping,
|
|
202
|
+
collapsable: enableGrouping,
|
|
203
|
+
maintainExpanded: enableGrouping,
|
|
204
|
+
}"
|
|
205
|
+
@on-selected-rows-change="selectionChanged"
|
|
206
|
+
@on-sort-change="sortChange"
|
|
207
|
+
@on-search="onSearching"
|
|
208
|
+
@on-row-click="onRowClick"
|
|
209
|
+
>
|
|
210
|
+
>
|
|
211
|
+
<template slot="table-column" slot-scope="props">
|
|
212
|
+
<!-- custom sorting icon -->
|
|
213
|
+
<span v-if="props.column.sortable || sorting" class="flex">
|
|
214
|
+
<div>
|
|
215
|
+
{{ props.column.label }}
|
|
216
|
+
</div>
|
|
217
|
+
<!-- render if there is no sorting order, appears on hover -->
|
|
218
|
+
<c-icon
|
|
219
|
+
v-if="props.column.direction == null"
|
|
220
|
+
name="sort-ascending-solid"
|
|
221
|
+
class="sortingIcon invisible ml-3 h-5 w-5"
|
|
222
|
+
type="solid"
|
|
223
|
+
></c-icon>
|
|
224
|
+
<!-- renders when direction is asc -->
|
|
225
|
+
<c-icon
|
|
226
|
+
v-else-if="props.column.direction == 'asc'"
|
|
227
|
+
name="sort-ascending-solid"
|
|
228
|
+
class="ml-3 h-5 w-5"
|
|
229
|
+
type="solid"
|
|
230
|
+
></c-icon>
|
|
231
|
+
<!-- renders when direction is desc -->
|
|
232
|
+
<c-icon
|
|
233
|
+
v-else-if="props.column.direction == 'desc'"
|
|
234
|
+
name="sort-descending-solid"
|
|
235
|
+
class="ml-3 h-5 w-5"
|
|
236
|
+
type="solid"
|
|
237
|
+
></c-icon>
|
|
238
|
+
</span>
|
|
239
|
+
<span class="font-medium text-gray-500" v-else-if="fontHeader">
|
|
240
|
+
{{ props.column.label }}
|
|
241
|
+
</span>
|
|
242
|
+
<span v-else>
|
|
243
|
+
{{ props.column.label }}
|
|
244
|
+
</span>
|
|
245
|
+
</template>
|
|
246
|
+
<div slot="emptystate" v-if="isLoading">
|
|
247
|
+
<vue-skeleton-loader
|
|
248
|
+
v-for="(item, index) in 10"
|
|
249
|
+
:key="index"
|
|
250
|
+
type="table-tbody: table-row-divider@6"
|
|
251
|
+
animation="fade"
|
|
252
|
+
:width="1220"
|
|
253
|
+
:rounded="true"
|
|
254
|
+
:radius="50"
|
|
255
|
+
:class="`skeleton ${index === 0 ? '' : 'mt-2'}`"
|
|
256
|
+
:height="50"
|
|
257
|
+
></vue-skeleton-loader>
|
|
258
|
+
</div>
|
|
259
|
+
<template slot="table-row" slot-scope="props">
|
|
260
|
+
<!-- renders if drag and drop is present in table -->
|
|
261
|
+
<span v-if="props.column.field == 'drag'">
|
|
262
|
+
<c-icon
|
|
263
|
+
name="menu-solid"
|
|
264
|
+
type="solid"
|
|
265
|
+
:class="`handle h-5 w-5 ${
|
|
266
|
+
props.row.status && props.row.status === 2
|
|
267
|
+
? 'pointer-events-none cursor-default opacity-50'
|
|
268
|
+
: 'text-gray-500'
|
|
269
|
+
}`"
|
|
270
|
+
:cursorType="'cursor-grab'"
|
|
271
|
+
></c-icon>
|
|
272
|
+
</span>
|
|
273
|
+
<!-- if customization or adding another form element is required -->
|
|
274
|
+
<span v-else-if="props.column.customizeColumn">
|
|
275
|
+
<slot :records="props"> </slot>
|
|
276
|
+
</span>
|
|
277
|
+
<!-- renders records as per column name -->
|
|
278
|
+
<span v-else>
|
|
279
|
+
{{ props.formattedRow[props.column.field] }}
|
|
280
|
+
</span>
|
|
281
|
+
</template>
|
|
282
|
+
<!-- Custom pagination component -->
|
|
283
|
+
<template v-if="pagination" slot="pagination-bottom">
|
|
284
|
+
<c-pagination
|
|
285
|
+
v-if="paginationRecords.totalRecords > 0"
|
|
286
|
+
:setPaginationRecords="paginationRecords"
|
|
287
|
+
:totalRecordsOnPage="recordsToDisplay"
|
|
288
|
+
:showEntryPicker="showEntryPicker"
|
|
289
|
+
@setCurrentPage="setCurrentPageRecords"
|
|
290
|
+
@setPreviousPage="setPreviousPageRecords"
|
|
291
|
+
@setNextPage="setNextPageRecords"
|
|
292
|
+
@handle-Row-Count-Change="handleChangeRowCount"
|
|
293
|
+
></c-pagination>
|
|
294
|
+
</template>
|
|
295
|
+
</vue-good-table>
|
|
296
|
+
</div>
|
|
297
|
+
</template>
|
|
298
|
+
<script>
|
|
299
|
+
import CIcon from "../CIcon/CIcon.vue";
|
|
300
|
+
import CCheckbox from "../CCheckbox/CCheckbox.vue";
|
|
301
|
+
import CPagination from "../CPagination/CPagination.vue";
|
|
302
|
+
import CButtonIcon from "../CButtonIcon/CButtonIcon.vue";
|
|
303
|
+
|
|
304
|
+
import "vue-good-table/dist/vue-good-table.css";
|
|
305
|
+
import { VueGoodTable } from "vue-good-table";
|
|
306
|
+
import Sortable from "@shopify/draggable/lib/es5/sortable.js";
|
|
307
|
+
import CInput from "../CInput/CInput.vue";
|
|
308
|
+
import { debounce, isEqual } from "lodash-es";
|
|
309
|
+
import VueSkeletonLoader from "skeleton-loader-vue";
|
|
310
|
+
|
|
311
|
+
export default {
|
|
312
|
+
name: "CTable",
|
|
313
|
+
components: {
|
|
314
|
+
CCheckbox,
|
|
315
|
+
CIcon,
|
|
316
|
+
VueGoodTable,
|
|
317
|
+
CPagination,
|
|
318
|
+
CButtonIcon,
|
|
319
|
+
CInput,
|
|
320
|
+
VueSkeletonLoader,
|
|
321
|
+
},
|
|
322
|
+
props: {
|
|
323
|
+
fontHeader: {
|
|
324
|
+
type: Boolean,
|
|
325
|
+
default: false,
|
|
326
|
+
},
|
|
327
|
+
// To show or hide pagination section
|
|
328
|
+
pagination: {
|
|
329
|
+
type: Boolean,
|
|
330
|
+
},
|
|
331
|
+
// To enable or disable sorting
|
|
332
|
+
sorting: {
|
|
333
|
+
type: Boolean,
|
|
334
|
+
},
|
|
335
|
+
// To show or hide search input
|
|
336
|
+
searching: {
|
|
337
|
+
type: Boolean,
|
|
338
|
+
},
|
|
339
|
+
// To add checkbox to select rows
|
|
340
|
+
enableSelection: {
|
|
341
|
+
type: Boolean,
|
|
342
|
+
},
|
|
343
|
+
enableVisibility: {
|
|
344
|
+
type: Boolean,
|
|
345
|
+
default: true,
|
|
346
|
+
},
|
|
347
|
+
enableDownload: {
|
|
348
|
+
type: Boolean,
|
|
349
|
+
default: true,
|
|
350
|
+
},
|
|
351
|
+
// All the buttons displayed on top right side of table
|
|
352
|
+
tableActions: {
|
|
353
|
+
type: Boolean,
|
|
354
|
+
},
|
|
355
|
+
// Placeholder text for search
|
|
356
|
+
searchPlaceholder: {
|
|
357
|
+
type: String,
|
|
358
|
+
},
|
|
359
|
+
// Existing text for search
|
|
360
|
+
searchQuery: {
|
|
361
|
+
type: String,
|
|
362
|
+
},
|
|
363
|
+
isLoading: {
|
|
364
|
+
type: Boolean,
|
|
365
|
+
},
|
|
366
|
+
// Total number of rows in a table to calculate page numbers
|
|
367
|
+
totalRecords: {
|
|
368
|
+
type: String,
|
|
369
|
+
},
|
|
370
|
+
// Shows current selected page and records on per page
|
|
371
|
+
paginationData: {
|
|
372
|
+
type: Object,
|
|
373
|
+
},
|
|
374
|
+
// Pass a column on which initial sorting will be applied
|
|
375
|
+
initialSortField: {
|
|
376
|
+
type: Object,
|
|
377
|
+
},
|
|
378
|
+
// all columns of the table
|
|
379
|
+
cols: {
|
|
380
|
+
type: Array,
|
|
381
|
+
required: true,
|
|
382
|
+
},
|
|
383
|
+
// row records of the table
|
|
384
|
+
rows: {
|
|
385
|
+
type: Array,
|
|
386
|
+
required: true,
|
|
387
|
+
},
|
|
388
|
+
// List of columns to show hide
|
|
389
|
+
showHideColumnList: {
|
|
390
|
+
type: Array,
|
|
391
|
+
},
|
|
392
|
+
// List of items to show download options
|
|
393
|
+
showDownloadDropdownList: {
|
|
394
|
+
type: Array,
|
|
395
|
+
},
|
|
396
|
+
// Function on changing page number
|
|
397
|
+
onPageChange: {
|
|
398
|
+
type: Function,
|
|
399
|
+
},
|
|
400
|
+
// Function on changing sorting on column
|
|
401
|
+
onSortChange: {
|
|
402
|
+
type: Function,
|
|
403
|
+
},
|
|
404
|
+
// Function to fetch results on search query
|
|
405
|
+
onSearch: {
|
|
406
|
+
type: Function,
|
|
407
|
+
},
|
|
408
|
+
// Emit action on clicking the row
|
|
409
|
+
onRowClickAction: {
|
|
410
|
+
type: Function,
|
|
411
|
+
},
|
|
412
|
+
// Start the loader
|
|
413
|
+
downloadLoader: {
|
|
414
|
+
type: Boolean,
|
|
415
|
+
},
|
|
416
|
+
// Start the loader
|
|
417
|
+
downloadOptionLoader: {
|
|
418
|
+
type: Boolean,
|
|
419
|
+
},
|
|
420
|
+
downloadDropdown: {
|
|
421
|
+
type: Boolean,
|
|
422
|
+
},
|
|
423
|
+
rowStyleClassFn: {
|
|
424
|
+
type: Function,
|
|
425
|
+
default: () => "",
|
|
426
|
+
},
|
|
427
|
+
fixedHeader: {
|
|
428
|
+
type: Boolean,
|
|
429
|
+
default: false,
|
|
430
|
+
},
|
|
431
|
+
hideBorder: {
|
|
432
|
+
type: Boolean,
|
|
433
|
+
default: false,
|
|
434
|
+
},
|
|
435
|
+
showEntryPicker: {
|
|
436
|
+
type: Boolean,
|
|
437
|
+
default: false,
|
|
438
|
+
},
|
|
439
|
+
enableGrouping: {
|
|
440
|
+
type: Boolean,
|
|
441
|
+
default: false,
|
|
442
|
+
},
|
|
443
|
+
},
|
|
444
|
+
mounted() {
|
|
445
|
+
// to add drag and drop in table
|
|
446
|
+
this.reorderedArray = this.rows;
|
|
447
|
+
let sortable = new Sortable(document.querySelectorAll("tbody"), {
|
|
448
|
+
draggable: "tr",
|
|
449
|
+
handle: ".handle",
|
|
450
|
+
classes: {
|
|
451
|
+
mirror: ["bg-white"],
|
|
452
|
+
},
|
|
453
|
+
mirror: {
|
|
454
|
+
constrainDimensions: true,
|
|
455
|
+
},
|
|
456
|
+
});
|
|
457
|
+
sortable.on("sortable:stop", (e) => this.rearrange(e.oldIndex, e.newIndex));
|
|
458
|
+
document.addEventListener("keydown", this.handleControlClick, true);
|
|
459
|
+
document.addEventListener("keyup", this.handleControlRelease, true);
|
|
460
|
+
},
|
|
461
|
+
destroyed() {
|
|
462
|
+
//to remove the event listener
|
|
463
|
+
document.removeEventListener("keydown", this.handleControlClick, true);
|
|
464
|
+
document.removeEventListener("keyup", this.handleControlRelease, true);
|
|
465
|
+
},
|
|
466
|
+
data() {
|
|
467
|
+
return {
|
|
468
|
+
toggleDropdown: false,
|
|
469
|
+
toggleDownloadDropdown: false,
|
|
470
|
+
searchTerm: this.searchQuery ? this.searchQuery : "",
|
|
471
|
+
paginationRecords: this.paginationData,
|
|
472
|
+
reorderedArray: [],
|
|
473
|
+
controlClick: false,
|
|
474
|
+
attrs: {
|
|
475
|
+
boilerplate: true,
|
|
476
|
+
elevation: 2,
|
|
477
|
+
},
|
|
478
|
+
recordsToDisplay: {
|
|
479
|
+
option: 10,
|
|
480
|
+
value: 10,
|
|
481
|
+
},
|
|
482
|
+
};
|
|
483
|
+
},
|
|
484
|
+
methods: {
|
|
485
|
+
handleChangeRowCount(value) {
|
|
486
|
+
this.recordsToDisplay = value;
|
|
487
|
+
this.$emit("change-row-count", value.value);
|
|
488
|
+
},
|
|
489
|
+
handleControlClick(event) {
|
|
490
|
+
if (event.keyCode === 17 || event.keyCode === 91) {
|
|
491
|
+
event.preventDefault();
|
|
492
|
+
this.controlClick = true;
|
|
493
|
+
}
|
|
494
|
+
},
|
|
495
|
+
handleControlRelease(event) {
|
|
496
|
+
if (event.keyCode === 17 || event.keyCode === 91) {
|
|
497
|
+
event.preventDefault();
|
|
498
|
+
this.controlClick = false;
|
|
499
|
+
}
|
|
500
|
+
},
|
|
501
|
+
handleToggle() {
|
|
502
|
+
this.toggleDropdown = !this.toggleDropdown;
|
|
503
|
+
},
|
|
504
|
+
handleDownloadToggle() {
|
|
505
|
+
this.toggleDownloadDropdown = !this.toggleDownloadDropdown;
|
|
506
|
+
},
|
|
507
|
+
showHideColumn(value, name) {
|
|
508
|
+
this.$emit("hideCols", value, name);
|
|
509
|
+
},
|
|
510
|
+
// Function to get selected rows on checking the checkbox
|
|
511
|
+
selectionChanged() {
|
|
512
|
+
this.$emit(
|
|
513
|
+
"selectRows",
|
|
514
|
+
this.$refs["my-table"].selectedRows,
|
|
515
|
+
this.$refs["my-table"].allSelected
|
|
516
|
+
);
|
|
517
|
+
},
|
|
518
|
+
// array of rows after drag and drop
|
|
519
|
+
rearrange(oldIndex, newIndex) {
|
|
520
|
+
const movedItem = this.reorderedArray.find(
|
|
521
|
+
(item, index) => index === oldIndex
|
|
522
|
+
);
|
|
523
|
+
const remainingItems = this.reorderedArray.filter(
|
|
524
|
+
(item, index) => index !== oldIndex
|
|
525
|
+
);
|
|
526
|
+
const reorderedItems = [
|
|
527
|
+
...remainingItems.slice(0, newIndex),
|
|
528
|
+
movedItem,
|
|
529
|
+
...remainingItems.slice(newIndex),
|
|
530
|
+
];
|
|
531
|
+
this.reorderedArray = [...reorderedItems];
|
|
532
|
+
this.$emit(
|
|
533
|
+
"reordered",
|
|
534
|
+
this.reorderedArray,
|
|
535
|
+
movedItem,
|
|
536
|
+
oldIndex,
|
|
537
|
+
newIndex
|
|
538
|
+
);
|
|
539
|
+
},
|
|
540
|
+
// listing functions
|
|
541
|
+
sortChange(params) {
|
|
542
|
+
if (params[0].type == "none") {
|
|
543
|
+
params[0].type = "asc";
|
|
544
|
+
}
|
|
545
|
+
this.$emit("onSortChange", params);
|
|
546
|
+
},
|
|
547
|
+
onSearching: debounce(function (params) {
|
|
548
|
+
this.$emit("onSearch", params);
|
|
549
|
+
}, 500),
|
|
550
|
+
setCurrentPageRecords(page) {
|
|
551
|
+
this.paginationRecords.currentPage = page;
|
|
552
|
+
this.$emit("pageChange", page);
|
|
553
|
+
},
|
|
554
|
+
setPreviousPageRecords(page) {
|
|
555
|
+
this.paginationRecords.currentPage = page;
|
|
556
|
+
this.$emit("pageChange", page);
|
|
557
|
+
},
|
|
558
|
+
setNextPageRecords(page) {
|
|
559
|
+
this.paginationRecords.currentPage = page;
|
|
560
|
+
this.$emit("pageChange", page);
|
|
561
|
+
},
|
|
562
|
+
onRowClick(params) {
|
|
563
|
+
if (params.event.target.type === undefined) {
|
|
564
|
+
if (this.controlClick) {
|
|
565
|
+
this.$emit("onRowControlClickAction", params);
|
|
566
|
+
} else {
|
|
567
|
+
this.$emit("onRowClickAction", params);
|
|
568
|
+
}
|
|
569
|
+
} else {
|
|
570
|
+
return false;
|
|
571
|
+
}
|
|
572
|
+
},
|
|
573
|
+
startDownload() {
|
|
574
|
+
this.$emit("handleDownloadButton");
|
|
575
|
+
},
|
|
576
|
+
downloadFromOption(value) {
|
|
577
|
+
this.toggleDownloadDropdown = false;
|
|
578
|
+
this.$emit("handleDownloadOptionButton", value);
|
|
579
|
+
},
|
|
580
|
+
|
|
581
|
+
handleRowExpand() {
|
|
582
|
+
this.$refs["my-table"].expandAll();
|
|
583
|
+
},
|
|
584
|
+
},
|
|
585
|
+
watch: {
|
|
586
|
+
paginationData(newValue, oldValue) {
|
|
587
|
+
if (!isEqual(newValue, oldValue)) {
|
|
588
|
+
this.paginationRecords = newValue;
|
|
589
|
+
}
|
|
590
|
+
},
|
|
591
|
+
rows(newValue, oldValue) {
|
|
592
|
+
if (!isEqual(newValue, oldValue)) {
|
|
593
|
+
this.reorderedArray = newValue;
|
|
594
|
+
}
|
|
595
|
+
},
|
|
596
|
+
},
|
|
597
|
+
};
|
|
598
|
+
</script>
|
|
599
|
+
<style>
|
|
600
|
+
.vgt-table {
|
|
601
|
+
border-spacing: 0;
|
|
602
|
+
border: none !important;
|
|
603
|
+
font-family: "Inter";
|
|
604
|
+
font-size: 14px !important;
|
|
605
|
+
}
|
|
606
|
+
table.vgt-table td {
|
|
607
|
+
vertical-align: middle;
|
|
608
|
+
}
|
|
609
|
+
.vgt-table thead th {
|
|
610
|
+
background: linear-gradient(#fff, #fff);
|
|
611
|
+
}
|
|
612
|
+
.vgt-table th.vgt-checkbox-col {
|
|
613
|
+
border-right: 0;
|
|
614
|
+
border-bottom: 1px solid #dcdfe6;
|
|
615
|
+
background: linear-gradient(#fff, #fff);
|
|
616
|
+
}
|
|
617
|
+
table.vgt-table tr.clickable:hover > th.vgt-checkbox-col {
|
|
618
|
+
background: #f1f5fd;
|
|
619
|
+
border-bottom: 1px solid #dcdfe6 !important;
|
|
620
|
+
}
|
|
621
|
+
.vgt-table th.sortable button::before,
|
|
622
|
+
.vgt-table th.sortable button::after {
|
|
623
|
+
border-right: 0;
|
|
624
|
+
border-left: 0;
|
|
625
|
+
}
|
|
626
|
+
[type="checkbox"],
|
|
627
|
+
[type="checkbox"]:focus {
|
|
628
|
+
border-radius: 4px;
|
|
629
|
+
border-color: #d1d5db;
|
|
630
|
+
cursor: pointer;
|
|
631
|
+
color: #0284c7;
|
|
632
|
+
--tw-ring-color: #0284c7;
|
|
633
|
+
}
|
|
634
|
+
|
|
635
|
+
/* tbody > tr > th.vgt-checkbox-col {
|
|
636
|
+
background: linear-gradient(#fff, #fff);
|
|
637
|
+
border-bottom: 1px solid #dcdfe6;
|
|
638
|
+
} */
|
|
639
|
+
.vgt-global-search {
|
|
640
|
+
background: none;
|
|
641
|
+
border: none;
|
|
642
|
+
padding: 0 0 12px 0;
|
|
643
|
+
}
|
|
644
|
+
.vgt-global-search__input {
|
|
645
|
+
padding-left: 0;
|
|
646
|
+
}
|
|
647
|
+
.input__icon {
|
|
648
|
+
display: none;
|
|
649
|
+
}
|
|
650
|
+
.vgt-global-search__input .vgt-input {
|
|
651
|
+
height: 38px;
|
|
652
|
+
width: 250px;
|
|
653
|
+
}
|
|
654
|
+
.vgt-inner-wrap {
|
|
655
|
+
box-shadow: none;
|
|
656
|
+
}
|
|
657
|
+
.vgt-inner-wrap.is-loading {
|
|
658
|
+
opacity: 1;
|
|
659
|
+
pointer-events: auto;
|
|
660
|
+
}
|
|
661
|
+
.vgt-table th.sortable:hover .sortingIcon {
|
|
662
|
+
visibility: visible;
|
|
663
|
+
}
|
|
664
|
+
.vgt-responsive {
|
|
665
|
+
position: static;
|
|
666
|
+
border-radius: 8px;
|
|
667
|
+
}
|
|
668
|
+
.vgt-wrap {
|
|
669
|
+
position: static;
|
|
670
|
+
}
|
|
671
|
+
</style>
|