edvoyui-component-library-test-flight 0.0.184 → 0.0.185
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 +57 -8
- package/dist/EUIButton.vue.d.ts.map +1 -0
- package/dist/EUIButtonGroup.vue.d.ts.map +1 -0
- package/dist/edvoy-ui.cjs.js +1 -1
- package/dist/edvoy-ui.es.js +7 -10
- package/dist/edvoy-ui.umd.js +1 -1
- package/package.json +18 -17
- package/dist/button/EUIButton.vue.d.ts.map +0 -1
- package/dist/button/EUIButtonGroup.vue.d.ts.map +0 -1
- package/src/App.vue +0 -16
- package/src/App.vue.js.map +0 -1
- package/src/assets/fonts/gilroy/GilroyBold/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyBold/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyBoldItalic/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyExtraBold/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyExtraBoldItalic/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroyMedium/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyMedium/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroyRegular/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroyRegular/font.woff2 +0 -0
- package/src/assets/fonts/gilroy/GilroySemiBold/font.woff +0 -0
- package/src/assets/fonts/gilroy/GilroySemiBold/font.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Bold.woff +0 -0
- package/src/assets/fonts/inter/Inter-Bold.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Italic.woff +0 -0
- package/src/assets/fonts/inter/Inter-Italic.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Medium.woff +0 -0
- package/src/assets/fonts/inter/Inter-Medium.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-MediumItalic.woff +0 -0
- package/src/assets/fonts/inter/Inter-MediumItalic.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-Regular.woff +0 -0
- package/src/assets/fonts/inter/Inter-Regular.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-SemiBold.woff +0 -0
- package/src/assets/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
- package/src/assets/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/src/assets/images/search-nodata.png +0 -0
- package/src/assets/scss/body.scss +0 -25
- package/src/assets/svg/CheckTick.vue +0 -21
- package/src/assets/svg/CheckTick.vue.js.map +0 -1
- package/src/assets/svg/ChevronBigDown.vue +0 -22
- package/src/assets/svg/ChevronBigDown.vue.js.map +0 -1
- package/src/assets/svg/ChevronDownSolid.vue +0 -19
- package/src/assets/svg/ChevronDownSolid.vue.js.map +0 -1
- package/src/assets/svg/ChevronDownStroke.vue +0 -22
- package/src/assets/svg/ChevronDownStroke.vue.js.map +0 -1
- package/src/assets/svg/ChevronDownStrokeSolid.vue +0 -19
- package/src/assets/svg/ChevronDownStrokeSolid.vue.js.map +0 -1
- package/src/assets/svg/SearchBigZoomIn.vue +0 -21
- package/src/assets/svg/SearchBigZoomIn.vue.js.map +0 -1
- package/src/assets/svg/SortArrow.vue +0 -24
- package/src/assets/svg/SortArrow.vue.js.map +0 -1
- package/src/assets/svg/Student.vue +0 -30
- package/src/assets/svg/Student.vue.js.map +0 -1
- package/src/assets/svg/partner.vue +0 -33
- package/src/assets/svg/partner.vue.js.map +0 -1
- package/src/assets/svg/people.vue +0 -25
- package/src/assets/svg/people.vue.js.map +0 -1
- package/src/assets/vue.svg +0 -1
- package/src/components/HelloWorld.vue +0 -1972
- package/src/components/HelloWorld.vue.js.map +0 -1
- package/src/components/accordion/EUIAccordion.stories.ts +0 -204
- package/src/components/accordion/EUIAccordion.vue +0 -152
- package/src/components/accordion/EUIAccordion.vue.js.map +0 -1
- package/src/components/alerts/EUIAlerts.stories.ts +0 -217
- package/src/components/alerts/EUIAlerts.vue +0 -194
- package/src/components/alerts/EUIAlerts.vue.js.map +0 -1
- package/src/components/avatar/EUIAvatar.stories.ts +0 -157
- package/src/components/avatar/EUIAvatar.vue +0 -96
- package/src/components/avatar/EUIAvatar.vue.js.map +0 -1
- package/src/components/breadcrumb/EUIBreadcrumb.stories.ts +0 -75
- package/src/components/breadcrumb/EUIBreadcrumb.vue +0 -59
- package/src/components/breadcrumb/EUIBreadcrumb.vue.js.map +0 -1
- package/src/components/button/EUIButton.stories.ts +0 -270
- package/src/components/button/EUIButton.vue +0 -154
- package/src/components/button/EUIButton.vue.js.map +0 -1
- package/src/components/button/EUIButtonGroup.vue +0 -287
- package/src/components/button/EUIButtonGroup.vue.js.map +0 -1
- package/src/components/button/buttonAnimateTab.vue +0 -74
- package/src/components/button/buttonAnimateTab.vue.js.map +0 -1
- package/src/components/checkbox/EUICheckbox.stories.ts +0 -58
- package/src/components/checkbox/EUICheckbox.vue +0 -110
- package/src/components/checkbox/EUICheckbox.vue.js.map +0 -1
- package/src/components/datepicker/EUIDatepicker.stories.ts +0 -492
- package/src/components/datepicker/EUIDatepicker.vue +0 -295
- package/src/components/datepicker/EUIDatepicker.vue.js.map +0 -1
- package/src/components/delete.vue +0 -262
- package/src/components/delete.vue.js.map +0 -1
- package/src/components/dragModal/EUIDrag.vue +0 -179
- package/src/components/dragModal/EUIDrag.vue.js.map +0 -1
- package/src/components/dropdown/EUIMultiDropdown.stories.ts +0 -294
- package/src/components/dropdown/EUIMultiDropdown.vue +0 -187
- package/src/components/dropdown/EUIMultiDropdown.vue.js.map +0 -1
- package/src/components/errorMessage/EUIErrorMessage.scss +0 -0
- package/src/components/errorMessage/EUIErrorMessage.stories.ts +0 -41
- package/src/components/errorMessage/EUIErrorMessage.vue +0 -25
- package/src/components/errorMessage/EUIErrorMessage.vue.js.map +0 -1
- package/src/components/index.js.map +0 -1
- package/src/components/index.ts +0 -61
- package/src/components/input/EUIInput.stories.ts +0 -387
- package/src/components/input/EUIInput.vue +0 -223
- package/src/components/input/EUIInput.vue.js.map +0 -1
- package/src/components/input/EUINumberInput.vue +0 -250
- package/src/components/loader/EUICircleLoader.vue +0 -31
- package/src/components/loader/EUICircleLoader.vue.js.map +0 -1
- package/src/components/loader/EUICubeLoader.vue +0 -237
- package/src/components/loader/EUICubeLoader.vue.js.map +0 -1
- package/src/components/loader/EUILoader.stories.ts +0 -99
- package/src/components/loader/EUILoader.vue +0 -17
- package/src/components/loader/EUILoader.vue.js.map +0 -1
- package/src/components/loader/EUISquareLoader.vue +0 -47
- package/src/components/loader/EUISquareLoader.vue.js.map +0 -1
- package/src/components/modal/EUIModal.stories.ts +0 -412
- package/src/components/modal/EUIModal.vue +0 -228
- package/src/components/modal/EUIModal.vue.js.map +0 -1
- package/src/components/pillSelect/EUIPillSelect.stories.ts +0 -74
- package/src/components/pillSelect/EUIPillSelect.vue +0 -149
- package/src/components/pillSelect/EUIPillSelect.vue.js.map +0 -1
- package/src/components/popover/EUIPopover.stories.ts +0 -306
- package/src/components/popover/EUIPopover.vue +0 -297
- package/src/components/popover/EUIPopover.vue.js.map +0 -1
- package/src/components/radio/EUIRadio.stories.ts +0 -54
- package/src/components/radio/EUIRadio.vue +0 -75
- package/src/components/radio/EUIRadio.vue.js.map +0 -1
- package/src/components/searchInput/EUISearch.stories.ts +0 -24
- package/src/components/searchInput/EUISearch.vue +0 -223
- package/src/components/searchInput/EUISearch.vue.js.map +0 -1
- package/src/components/searchTagSelect/EUISearchTagSelect.stories.ts +0 -217
- package/src/components/searchTagSelect/EUISearchTagSelect.vue +0 -642
- package/src/components/searchTagSelect/EUISearchTagSelect.vue.js.map +0 -1
- package/src/components/searchTagSelect/SearchInput.vue +0 -167
- package/src/components/searchTagSelect/SearchInput.vue.js.map +0 -1
- package/src/components/searchexpand/EUISearchExpand.vue +0 -148
- package/src/components/searchexpand/EUISearchExpand.vue.js.map +0 -1
- package/src/components/searchexpand/EUISearchToggle.vue +0 -86
- package/src/components/searchexpand/EUISearchToggle.vue.js.map +0 -1
- package/src/components/select/EUISelect.stories.ts +0 -101
- package/src/components/select/EUISelect.vue +0 -1092
- package/src/components/select/EUISelect.vue.js.map +0 -1
- package/src/components/slideover/EUISlideover.stories.ts +0 -318
- package/src/components/slideover/EUISlideover.vue +0 -212
- package/src/components/slideover/EUISlideover.vue.js.map +0 -1
- package/src/components/stepperTimeline/EUIStepperHorizontal.vue +0 -242
- package/src/components/stepperTimeline/EUIStepperHorizontal.vue.js.map +0 -1
- package/src/components/stepperTimeline/EUIStepperTimeline.stories.ts +0 -54
- package/src/components/stepperTimeline/EUIStepperTimeline.vue +0 -16
- package/src/components/stepperTimeline/EUIStepperTimeline.vue.js.map +0 -1
- package/src/components/stepperTimeline/EUIStepperVertical.vue +0 -112
- package/src/components/stepperTimeline/EUIStepperVertical.vue.js.map +0 -1
- package/src/components/table/ColumnResizeTable.vue +0 -740
- package/src/components/table/ColumnResizeTable.vue.js.map +0 -1
- package/src/components/table/EUIDashboardTable.vue +0 -514
- package/src/components/table/EUIDashboardTable.vue.js.map +0 -1
- package/src/components/table/EUIPageLimit.vue +0 -66
- package/src/components/table/EUIPageLimit.vue.js.map +0 -1
- package/src/components/table/EUIPagination.vue +0 -175
- package/src/components/table/EUIPagination.vue.js.map +0 -1
- package/src/components/table/EUIStudentPagination.vue +0 -172
- package/src/components/table/EUIStudentPagination.vue.js.map +0 -1
- package/src/components/table/EUITable.stories.ts +0 -300
- package/src/components/table/EUITable.vue +0 -559
- package/src/components/table/EUITable.vue.js.map +0 -1
- package/src/components/table/EUITableCheckbox.vue +0 -98
- package/src/components/table/EUITableCheckbox.vue.js.map +0 -1
- package/src/components/table/GrowthTable.vue +0 -575
- package/src/components/table/GrowthTable.vue.js.map +0 -1
- package/src/components/table/GrowthTableView.vue +0 -108
- package/src/components/table/GrowthTableView.vue.js.map +0 -1
- package/src/components/table/ResizeTableview.vue +0 -198
- package/src/components/table/ResizeTableview.vue.js.map +0 -1
- package/src/components/table/UCheckbox.vue +0 -169
- package/src/components/table/UCheckbox.vue.js.map +0 -1
- package/src/components/table/UTable.scss +0 -69
- package/src/components/table/UTable.vue +0 -611
- package/src/components/table/UTable.vue.js.map +0 -1
- package/src/components/table/UTableview.vue +0 -189
- package/src/components/table/UTableview.vue.js.map +0 -1
- package/src/components/tabs/EUITabOutline.vue +0 -263
- package/src/components/tabs/EUITabOutline.vue.js.map +0 -1
- package/src/components/tabs/EUITabs.vue +0 -262
- package/src/components/tabs/EUITabs.vue.js.map +0 -1
- package/src/components/tabs/EUItabs.stories.ts +0 -137
- package/src/components/tag/EUITag.stories.ts +0 -53
- package/src/components/tag/EUITag.vue +0 -88
- package/src/components/tag/EUITag.vue.js.map +0 -1
- package/src/components/telephone/EUITelephone.stories.ts +0 -358
- package/src/components/telephone/EUITelephone.vue +0 -291
- package/src/components/telephone/EUITelephone.vue.js.map +0 -1
- package/src/components/textArea/EUITextArea.stories.ts +0 -134
- package/src/components/textArea/EUITextArea.vue +0 -155
- package/src/components/textArea/EUITextArea.vue.js.map +0 -1
- package/src/components/timeLine/EUITimeLine.stories.ts +0 -247
- package/src/components/timeLine/EUITimeLine.vue +0 -148
- package/src/components/timeLine/EUITimeLine.vue.js.map +0 -1
- package/src/components/toggle/EUIToggle.stories.ts +0 -63
- package/src/components/toggle/EUIToggle.vue +0 -101
- package/src/components/toggle/EUIToggle.vue.js.map +0 -1
- package/src/components/tooltip/EUITooltip.stories.ts +0 -53
- package/src/components/tooltip/EUITooltip.vue +0 -111
- package/src/components/tooltip/EUITooltip.vue.js.map +0 -1
- package/src/components/uidemo/select-com.vue +0 -120
- package/src/components/uidemo/select-com.vue.js.map +0 -1
- package/src/data/books.js.map +0 -1
- package/src/data/books.ts +0 -163
- package/src/data/country.ts +0 -56
- package/src/data/tab.js.map +0 -1
- package/src/data/tab.ts +0 -40
- package/src/data/table.js.map +0 -1
- package/src/data/table.ts +0 -5654
- package/src/main.js.map +0 -1
- package/src/main.ts +0 -5
- package/src/style.scss +0 -186
- package/src/utils/helpers.js.map +0 -1
- package/src/utils/helpers.ts +0 -30
- package/src/utils/lodash.js.map +0 -1
- package/src/utils/lodash.ts +0 -9
- package/src/utils/types.js.map +0 -1
- package/src/utils/types.ts +0 -9
- package/src/vite-env.d.ts +0 -5
- /package/dist/{button/EUIButton.vue.d.ts → EUIButton.vue.d.ts} +0 -0
- /package/dist/{button/EUIButtonGroup.vue.d.ts → EUIButtonGroup.vue.d.ts} +0 -0
|
@@ -1,1092 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div :class="{ isUseCustomSelect: isUseCustomSelect }">
|
|
3
|
-
<label
|
|
4
|
-
v-if="!inputFilled && label"
|
|
5
|
-
:class="[
|
|
6
|
-
'text-xs w-full text-gray-500 cursor-pointer font-medium block mb-1',
|
|
7
|
-
required && `after:content-['*'] after:ml-0.5 after:text-red-500`,
|
|
8
|
-
]"
|
|
9
|
-
>
|
|
10
|
-
{{ label }}
|
|
11
|
-
</label>
|
|
12
|
-
<vSelect
|
|
13
|
-
v-model="selected"
|
|
14
|
-
:filter="isFussySeach ? fuseSearch : undefined"
|
|
15
|
-
:options="items"
|
|
16
|
-
:label="searchLabel"
|
|
17
|
-
:name="name"
|
|
18
|
-
:value="selected"
|
|
19
|
-
:placeholder="showPlaceholder"
|
|
20
|
-
:multiple="multiple"
|
|
21
|
-
:taggable="taggable"
|
|
22
|
-
:push-tags="pushtags"
|
|
23
|
-
:deselect-from-dropdown="true"
|
|
24
|
-
append-to-body
|
|
25
|
-
:searchable="searchable"
|
|
26
|
-
:calculate-position="withPopper"
|
|
27
|
-
:loading="loading"
|
|
28
|
-
:disabled="disabled"
|
|
29
|
-
:selectable="selectedLimit"
|
|
30
|
-
:class="[
|
|
31
|
-
isUseCustomSelect
|
|
32
|
-
? 'customselect'
|
|
33
|
-
: 'border border-gray-200 focus-within:border-purple-600 focus-within:ring-inset focus-within:ring-1 focus-within:ring-purple-600 z-10 focus-within:rounded',
|
|
34
|
-
inputFilled ? 'rounded-2xl min-h-14' : 'rounded-md min-h-10',
|
|
35
|
-
'group relative w-full bg-white cursor-pointer overflow-hidden',
|
|
36
|
-
{ 'opacity-75': disabled },
|
|
37
|
-
className,
|
|
38
|
-
]"
|
|
39
|
-
:clearable="clearable"
|
|
40
|
-
:no-drop="nodropDown"
|
|
41
|
-
:components="customComponents"
|
|
42
|
-
@search="search($event)"
|
|
43
|
-
@option:selected="change($event)"
|
|
44
|
-
@option:deselected="deselected($event)"
|
|
45
|
-
@option:created="handleOptionCreate"
|
|
46
|
-
@open="open"
|
|
47
|
-
:dropdown-should-open="dropdownShouldOpen"
|
|
48
|
-
>
|
|
49
|
-
<!-- :clearable="isUseCustomSelect ? clearable : undefined" -->
|
|
50
|
-
<!-- Allow parent to override header slot -->
|
|
51
|
-
<template v-if="$slots.header" #header>
|
|
52
|
-
<slot name="header"></slot>
|
|
53
|
-
</template>
|
|
54
|
-
<template v-if="inputFilled && !$slots.header" #header>
|
|
55
|
-
<div
|
|
56
|
-
:class="[
|
|
57
|
-
inputValue
|
|
58
|
-
? 'top-3.5 text-xs text-gray-400 cursor-default max-w-max'
|
|
59
|
-
: 'top-1/2 text-sm text-gray-700 cursor-pointer h-14 pt-5 pb-4 bg-transparent ring-0 ring-gray-200 group-hover:top-3.5 group-hover:py-0 group-hover:h-auto bg-white group-hover:text-xs group-hover:w-max w-[88%] group-hover:-translate-y-1/2 group-hover:text-gray-400',
|
|
60
|
-
disabled ? ' cursor-not-allowed' : '',
|
|
61
|
-
required && `after:content-['*'] after:ml-0.5 after:text-red-500`,
|
|
62
|
-
]"
|
|
63
|
-
class="absolute text-left font-medium inset-x-0 px-4 z-10 -translate-y-1/2 duration-200 group-focus-within:top-3.5 group-focus-within:text-xs group-focus-within:text-gray-400 rounded-2xl group-focus-within:bg-transparent group-focus-within:-translate-y-1/2 group-focus-within:ring-transparent group-focus-within:h-auto group-focus-within:py-0 capitalize leading-[normal]"
|
|
64
|
-
>
|
|
65
|
-
{{ startCaseText(label) || "Select" }}
|
|
66
|
-
</div>
|
|
67
|
-
</template>
|
|
68
|
-
|
|
69
|
-
<!-- option, deselect, multiple, disabled -->
|
|
70
|
-
<template
|
|
71
|
-
v-if="selectedCount && multiple"
|
|
72
|
-
#selected-option-container="{}"
|
|
73
|
-
>
|
|
74
|
-
<div class="vs__selected_count" :class="[isShowDropdown ? '!p-0' : '']">
|
|
75
|
-
<template v-if="!isShowDropdown">
|
|
76
|
-
{{ selectedCountLabel }} <span>{{ selected?.length }}</span>
|
|
77
|
-
</template>
|
|
78
|
-
</div>
|
|
79
|
-
</template>
|
|
80
|
-
|
|
81
|
-
<!-- Allow parent to override selected-option slot -->
|
|
82
|
-
<template v-if="$slots['selected-option']" #selected-option="slotProps">
|
|
83
|
-
<slot
|
|
84
|
-
name="selected-option"
|
|
85
|
-
v-bind="slotProps as Record<string, any>"
|
|
86
|
-
></slot>
|
|
87
|
-
</template>
|
|
88
|
-
|
|
89
|
-
<template v-if="!$slots['selected-option']" #selected-option="item">
|
|
90
|
-
<div
|
|
91
|
-
:class="
|
|
92
|
-
isUseCustomSelect
|
|
93
|
-
? 'break-words flex items-start'
|
|
94
|
-
: 'flex items-center'
|
|
95
|
-
"
|
|
96
|
-
>
|
|
97
|
-
<img
|
|
98
|
-
v-if="
|
|
99
|
-
name == 'country' ? getFlag({ nameText:item[fieldName], iconlink:(item as any)?.iconlink }) : (item as any)?.iconlink
|
|
100
|
-
"
|
|
101
|
-
:class="isUseCustomSelect ? 'w-6 mr-1 flex-initial' : 'w-6 mr-2'"
|
|
102
|
-
:src="
|
|
103
|
-
name == 'country' ? getFlag({ nameText:item[fieldName], iconlink:(item as any)?.iconlink }) : (item as any)?.iconlink
|
|
104
|
-
"
|
|
105
|
-
:alt="item[fieldName]"
|
|
106
|
-
/>
|
|
107
|
-
{{
|
|
108
|
-
isStartCaseText ? startCaseText(item[fieldName]) : item[fieldName]
|
|
109
|
-
}}
|
|
110
|
-
</div>
|
|
111
|
-
</template>
|
|
112
|
-
|
|
113
|
-
<!-- Allow parent to override option slot -->
|
|
114
|
-
<template v-if="$slots.option" #option="option">
|
|
115
|
-
<slot name="option" v-bind="option as Record<string, any>"></slot>
|
|
116
|
-
<!-- Passing the 'option' data -->
|
|
117
|
-
</template>
|
|
118
|
-
<template v-else #option="item">
|
|
119
|
-
<div class="flex items-center gap-2">
|
|
120
|
-
<img
|
|
121
|
-
v-if="(item as any).iconlink"
|
|
122
|
-
class="flex-shrink-0 size-6"
|
|
123
|
-
:src="(item as any).iconlink"
|
|
124
|
-
:alt="item[fieldName]"
|
|
125
|
-
/>
|
|
126
|
-
|
|
127
|
-
<span v-if="isCheckbox" class="flex-shrink-0">
|
|
128
|
-
<input
|
|
129
|
-
:id="`checkbox-${item[fieldName]}`"
|
|
130
|
-
type="checkbox"
|
|
131
|
-
:checked="isChecked(item)"
|
|
132
|
-
class="selectall__input"
|
|
133
|
-
@change="(e) => onCheckBoxChange(item, e)"
|
|
134
|
-
/>
|
|
135
|
-
</span>
|
|
136
|
-
{{
|
|
137
|
-
isStartCaseText ? startCaseText(item[fieldName]) : item[fieldName]
|
|
138
|
-
}}
|
|
139
|
-
</div>
|
|
140
|
-
</template>
|
|
141
|
-
|
|
142
|
-
<!-- Allow parent to override spinner slot -->
|
|
143
|
-
<template v-if="$slots.spinner" #spinner="{ loading: _loading }">
|
|
144
|
-
<slot name="spinner" :loading="_loading || loading"></slot>
|
|
145
|
-
</template>
|
|
146
|
-
<template v-else #spinner="{ loading: _loading }">
|
|
147
|
-
<div
|
|
148
|
-
v-if="loading || _loading"
|
|
149
|
-
style="border-left-color: rgba(107, 30, 190, 0.71)"
|
|
150
|
-
class="vs__spinner"
|
|
151
|
-
/>
|
|
152
|
-
</template>
|
|
153
|
-
|
|
154
|
-
<!-- Allow parent to override list-header slot -->
|
|
155
|
-
<template v-if="$slots['list-header']" #list-header>
|
|
156
|
-
<slot name="list-header"></slot>
|
|
157
|
-
</template>
|
|
158
|
-
|
|
159
|
-
<template v-else-if="isSelectAll || isCheckbox" #list-header>
|
|
160
|
-
<div
|
|
161
|
-
v-if="isCheckbox && groupSelect"
|
|
162
|
-
class="sticky top-0 left-0 z-10 flex flex-row items-center justify-between gap-1 px-2 py-2 bg-white border-b border-gray-200 border-solid"
|
|
163
|
-
>
|
|
164
|
-
<h3 class="text-xs font-semibold text-black">Options</h3>
|
|
165
|
-
|
|
166
|
-
<div class="flex items-center gap-px whitespace-nowrap">
|
|
167
|
-
<button
|
|
168
|
-
class="w-full p-1 font-medium transition duration-75 rounded text-xss text-start"
|
|
169
|
-
:class="[
|
|
170
|
-
items?.length !== selected?.length
|
|
171
|
-
? 'text-gray-600 hover:bg-gray-50 hover:text-violet-600'
|
|
172
|
-
: 'pointer-events-none opacity-50 cursor-default text-gray-400',
|
|
173
|
-
]"
|
|
174
|
-
:disabled="items?.length === selected?.length"
|
|
175
|
-
@click.prevent="isCheckedAll"
|
|
176
|
-
>
|
|
177
|
-
Select All
|
|
178
|
-
</button>
|
|
179
|
-
<button
|
|
180
|
-
class="w-full p-1 font-medium transition duration-75 rounded text-xss text-start"
|
|
181
|
-
:class="[
|
|
182
|
-
(selected?.length ?? 0) > 0
|
|
183
|
-
? 'text-gray-600 hover:text-red-600 hover:bg-gray-50'
|
|
184
|
-
: 'pointer-events-none opacity-50 cursor-default text-gray-400',
|
|
185
|
-
]"
|
|
186
|
-
:disabled="(selected?.length ?? 0) === 0"
|
|
187
|
-
@click.prevent="clearAll"
|
|
188
|
-
>
|
|
189
|
-
Clear All
|
|
190
|
-
</button>
|
|
191
|
-
</div>
|
|
192
|
-
</div>
|
|
193
|
-
|
|
194
|
-
<div
|
|
195
|
-
v-if="
|
|
196
|
-
selectedCount &&
|
|
197
|
-
multiple &&
|
|
198
|
-
selected &&
|
|
199
|
-
selected.length > 0 &&
|
|
200
|
-
isShowDropdown
|
|
201
|
-
"
|
|
202
|
-
class="px-2 py-2 border-b border-gray-200 border-solid"
|
|
203
|
-
>
|
|
204
|
-
<h3 class="mb-2 font-semibold text-gray-500 text-xss">
|
|
205
|
-
Selected Countries
|
|
206
|
-
</h3>
|
|
207
|
-
<div class="flex flex-wrap gap-1">
|
|
208
|
-
<div
|
|
209
|
-
v-for="(item, index) in selected"
|
|
210
|
-
:key="index"
|
|
211
|
-
class="inline-flex items-center gap-1 px-2 py-1 text-xs text-purple-700 bg-purple-100 rounded-full"
|
|
212
|
-
>
|
|
213
|
-
<span>{{ item[fieldName] }}</span>
|
|
214
|
-
<button
|
|
215
|
-
@click.stop="onRemoveSelectedItem(item)"
|
|
216
|
-
class="text-gray-500 hover:text-red-600"
|
|
217
|
-
>
|
|
218
|
-
<XMarkIcon class="size-4" />
|
|
219
|
-
</button>
|
|
220
|
-
</div>
|
|
221
|
-
</div>
|
|
222
|
-
</div>
|
|
223
|
-
|
|
224
|
-
<template v-else-if="isSelectAll">
|
|
225
|
-
<button
|
|
226
|
-
v-if="items.length !== selected?.length"
|
|
227
|
-
class="w-full px-6 py-2 text-sm font-medium text-gray-600 transition duration-75 hover:font-bold hover:text-gray-900 text-start"
|
|
228
|
-
@click.prevent="selectAll"
|
|
229
|
-
>
|
|
230
|
-
Select All
|
|
231
|
-
</button>
|
|
232
|
-
</template>
|
|
233
|
-
</template>
|
|
234
|
-
|
|
235
|
-
<!-- Allow parent to override open-indicator slot -->
|
|
236
|
-
<template v-if="$slots['open-indicator']" #open-indicator="attributes">
|
|
237
|
-
<slot
|
|
238
|
-
name="open-indicator"
|
|
239
|
-
v-bind="attributes as Record<string, any>"
|
|
240
|
-
></slot>
|
|
241
|
-
</template>
|
|
242
|
-
|
|
243
|
-
<template v-else #open-indicator="{ attributes }">
|
|
244
|
-
<span v-bind="attributes as Record<string, any>">
|
|
245
|
-
<ChevronDownSolid class="text-current size-6" />
|
|
246
|
-
</span>
|
|
247
|
-
</template>
|
|
248
|
-
</vSelect>
|
|
249
|
-
|
|
250
|
-
<template v-if="errors && Object.keys(errors).length">
|
|
251
|
-
<EUIErrorMessage :errors="errors" :name="name" />
|
|
252
|
-
</template>
|
|
253
|
-
</div>
|
|
254
|
-
</template>
|
|
255
|
-
|
|
256
|
-
<script setup lang="ts">
|
|
257
|
-
import EUIErrorMessage from "../errorMessage/EUIErrorMessage.vue";
|
|
258
|
-
import vSelect from "vue-select";
|
|
259
|
-
import "vue-select/dist/vue-select.css";
|
|
260
|
-
import { createPopper } from "@popperjs/core";
|
|
261
|
-
import Fuse from "fuse.js";
|
|
262
|
-
import _, { startCase } from "lodash";
|
|
263
|
-
import {
|
|
264
|
-
computed,
|
|
265
|
-
onBeforeUnmount,
|
|
266
|
-
onMounted,
|
|
267
|
-
PropType,
|
|
268
|
-
ref,
|
|
269
|
-
toRefs,
|
|
270
|
-
watch,
|
|
271
|
-
h,
|
|
272
|
-
} from "vue";
|
|
273
|
-
import { ValidationErrors } from "../../utils/types";
|
|
274
|
-
import { XMarkIcon } from "@heroicons/vue/20/solid";
|
|
275
|
-
import ChevronDownSolid from "../../assets/svg/ChevronDownStroke.vue";
|
|
276
|
-
|
|
277
|
-
const customComponents = {
|
|
278
|
-
Deselect: {
|
|
279
|
-
render() {
|
|
280
|
-
return h(XMarkIcon, { class: "w-4 h-4 text-current" });
|
|
281
|
-
},
|
|
282
|
-
},
|
|
283
|
-
OpenIndicator: {
|
|
284
|
-
render() {
|
|
285
|
-
return h(ChevronDownSolid, { class: "w-6 h-6 text-gray-800" });
|
|
286
|
-
},
|
|
287
|
-
},
|
|
288
|
-
};
|
|
289
|
-
|
|
290
|
-
type VirtualElement = {
|
|
291
|
-
getBoundingClientRect: () => ClientRect | DOMRect;
|
|
292
|
-
contextElement?: Element;
|
|
293
|
-
};
|
|
294
|
-
|
|
295
|
-
const showPlaceholder = computed(() => {
|
|
296
|
-
const label = props.placeholder || `Select ${name}`;
|
|
297
|
-
const labelReq = props.required ? "*" : "";
|
|
298
|
-
return `${label} ${labelReq}`;
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
const startCaseText = (x: string) => {
|
|
302
|
-
return startCase(x);
|
|
303
|
-
};
|
|
304
|
-
|
|
305
|
-
const selected = ref<
|
|
306
|
-
string | string[] | Record<string, any> | Record<string, any>[] | null
|
|
307
|
-
>(null);
|
|
308
|
-
|
|
309
|
-
const nodropDown = ref(false);
|
|
310
|
-
const props = defineProps({
|
|
311
|
-
clearable: {
|
|
312
|
-
type: Boolean,
|
|
313
|
-
default: true,
|
|
314
|
-
},
|
|
315
|
-
isUseCustomSelect: {
|
|
316
|
-
type: Boolean,
|
|
317
|
-
required: false,
|
|
318
|
-
default: false,
|
|
319
|
-
},
|
|
320
|
-
customWidth: {
|
|
321
|
-
type: String,
|
|
322
|
-
default: "",
|
|
323
|
-
required: false,
|
|
324
|
-
},
|
|
325
|
-
customHeight: {
|
|
326
|
-
type: String,
|
|
327
|
-
default: "",
|
|
328
|
-
required: false,
|
|
329
|
-
},
|
|
330
|
-
customOffset: {
|
|
331
|
-
type: Array as PropType<any>,
|
|
332
|
-
required: false,
|
|
333
|
-
},
|
|
334
|
-
className: {
|
|
335
|
-
type: Array as PropType<string[]>,
|
|
336
|
-
required: false,
|
|
337
|
-
default: () => [],
|
|
338
|
-
},
|
|
339
|
-
errors: {
|
|
340
|
-
type: Object as PropType<ValidationErrors>,
|
|
341
|
-
required: false,
|
|
342
|
-
default: () => {},
|
|
343
|
-
},
|
|
344
|
-
items: {
|
|
345
|
-
type: Array as PropType<any>,
|
|
346
|
-
required: true,
|
|
347
|
-
},
|
|
348
|
-
placeholder: {
|
|
349
|
-
type: String,
|
|
350
|
-
default: "",
|
|
351
|
-
},
|
|
352
|
-
label: {
|
|
353
|
-
type: String,
|
|
354
|
-
default: "",
|
|
355
|
-
required: false,
|
|
356
|
-
},
|
|
357
|
-
searchLabel: {
|
|
358
|
-
type: String,
|
|
359
|
-
default: "name",
|
|
360
|
-
required: false,
|
|
361
|
-
},
|
|
362
|
-
name: {
|
|
363
|
-
type: String,
|
|
364
|
-
default: "",
|
|
365
|
-
required: false,
|
|
366
|
-
},
|
|
367
|
-
modelValue: {
|
|
368
|
-
type: [Object, Array, String],
|
|
369
|
-
required: true,
|
|
370
|
-
default: () => {},
|
|
371
|
-
},
|
|
372
|
-
value: {
|
|
373
|
-
type: [Object, Array, String],
|
|
374
|
-
required: true,
|
|
375
|
-
default: () => {},
|
|
376
|
-
},
|
|
377
|
-
multiple: {
|
|
378
|
-
type: Boolean,
|
|
379
|
-
required: false,
|
|
380
|
-
default: true,
|
|
381
|
-
},
|
|
382
|
-
multipleLimit: {
|
|
383
|
-
type: Number,
|
|
384
|
-
required: false,
|
|
385
|
-
},
|
|
386
|
-
disabled: {
|
|
387
|
-
type: Boolean as PropType<boolean>,
|
|
388
|
-
required: false,
|
|
389
|
-
default: false,
|
|
390
|
-
},
|
|
391
|
-
isStartCaseText: {
|
|
392
|
-
type: Boolean as PropType<boolean>,
|
|
393
|
-
required: false,
|
|
394
|
-
default: false,
|
|
395
|
-
},
|
|
396
|
-
isFussySeach: {
|
|
397
|
-
type: Boolean,
|
|
398
|
-
required: false,
|
|
399
|
-
default: false,
|
|
400
|
-
},
|
|
401
|
-
keys: {
|
|
402
|
-
type: Array as PropType<string[]>,
|
|
403
|
-
required: false,
|
|
404
|
-
default: () => ["e", "label", "value"],
|
|
405
|
-
},
|
|
406
|
-
loading: {
|
|
407
|
-
type: Boolean,
|
|
408
|
-
required: false,
|
|
409
|
-
default: false,
|
|
410
|
-
},
|
|
411
|
-
isSelectAll: {
|
|
412
|
-
type: Boolean,
|
|
413
|
-
default: false,
|
|
414
|
-
},
|
|
415
|
-
taggable: {
|
|
416
|
-
type: Boolean,
|
|
417
|
-
required: false,
|
|
418
|
-
default: false,
|
|
419
|
-
},
|
|
420
|
-
pushtags: {
|
|
421
|
-
type: Boolean,
|
|
422
|
-
required: false,
|
|
423
|
-
default: false,
|
|
424
|
-
},
|
|
425
|
-
required: {
|
|
426
|
-
type: Boolean,
|
|
427
|
-
default: false,
|
|
428
|
-
},
|
|
429
|
-
searchable: {
|
|
430
|
-
type: Boolean,
|
|
431
|
-
required: false,
|
|
432
|
-
default: true,
|
|
433
|
-
},
|
|
434
|
-
inputFilled: {
|
|
435
|
-
type: Boolean,
|
|
436
|
-
default: false,
|
|
437
|
-
},
|
|
438
|
-
fieldName: {
|
|
439
|
-
type: String,
|
|
440
|
-
default: "name",
|
|
441
|
-
},
|
|
442
|
-
selectedCount: {
|
|
443
|
-
type: Boolean,
|
|
444
|
-
default: false,
|
|
445
|
-
},
|
|
446
|
-
selectedCountLabel: {
|
|
447
|
-
type: String,
|
|
448
|
-
default: "Selected",
|
|
449
|
-
},
|
|
450
|
-
isCheckbox: {
|
|
451
|
-
type: Boolean,
|
|
452
|
-
default: false,
|
|
453
|
-
},
|
|
454
|
-
groupSelect: { type: Boolean, default: false },
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
const {
|
|
458
|
-
modelValue,
|
|
459
|
-
isFussySeach,
|
|
460
|
-
clearable,
|
|
461
|
-
isUseCustomSelect,
|
|
462
|
-
items,
|
|
463
|
-
keys,
|
|
464
|
-
loading,
|
|
465
|
-
multiple,
|
|
466
|
-
isStartCaseText,
|
|
467
|
-
required,
|
|
468
|
-
fieldName,
|
|
469
|
-
} = toRefs(props);
|
|
470
|
-
const emit = defineEmits([
|
|
471
|
-
"update:modelValue",
|
|
472
|
-
"update:searchString",
|
|
473
|
-
"change",
|
|
474
|
-
"deselected",
|
|
475
|
-
"search",
|
|
476
|
-
"tag",
|
|
477
|
-
"selectedOption",
|
|
478
|
-
"open",
|
|
479
|
-
]);
|
|
480
|
-
|
|
481
|
-
const isCheckedAll = (e: Event) => {
|
|
482
|
-
if (e.target) {
|
|
483
|
-
selected.value = [...props.items];
|
|
484
|
-
}
|
|
485
|
-
};
|
|
486
|
-
|
|
487
|
-
const isShowDropdown = ref(false);
|
|
488
|
-
|
|
489
|
-
const dropdownShouldOpen = (VueSelect: any) => {
|
|
490
|
-
isShowDropdown.value = VueSelect.open;
|
|
491
|
-
return VueSelect.open;
|
|
492
|
-
};
|
|
493
|
-
|
|
494
|
-
const onRemoveSelectedItem = (itemToRemove: any) => {
|
|
495
|
-
if (Array.isArray(selected.value)) {
|
|
496
|
-
selected.value = selected.value.filter((item: any) => {
|
|
497
|
-
return item[fieldName.value] !== itemToRemove[fieldName.value];
|
|
498
|
-
});
|
|
499
|
-
}
|
|
500
|
-
};
|
|
501
|
-
|
|
502
|
-
const isChecked = (item: any) => {
|
|
503
|
-
const sel = selected.value;
|
|
504
|
-
const itemValue = item?.[fieldName.value];
|
|
505
|
-
if (Array.isArray(sel)) {
|
|
506
|
-
return sel.some((s: any) => {
|
|
507
|
-
if (s && typeof s === "string") {
|
|
508
|
-
return s === itemValue;
|
|
509
|
-
} else {
|
|
510
|
-
return s?.[fieldName.value] === itemValue;
|
|
511
|
-
}
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
if (sel && typeof sel === "object") {
|
|
515
|
-
return sel?.[fieldName.value] === itemValue;
|
|
516
|
-
}
|
|
517
|
-
return false;
|
|
518
|
-
};
|
|
519
|
-
|
|
520
|
-
const clearAll = (e: Event) => {
|
|
521
|
-
if (e.target) {
|
|
522
|
-
selected.value = [];
|
|
523
|
-
nodropDown.value = false;
|
|
524
|
-
}
|
|
525
|
-
};
|
|
526
|
-
|
|
527
|
-
const onCheckBoxChange = (item: any, event: Event) => {
|
|
528
|
-
const target = event.target as HTMLInputElement;
|
|
529
|
-
|
|
530
|
-
if (!Array.isArray(selected.value)) {
|
|
531
|
-
selected.value = [];
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
const current = selected.value as any[];
|
|
535
|
-
|
|
536
|
-
if (target.checked) {
|
|
537
|
-
const exists = current.some((s) => {
|
|
538
|
-
if (typeof s === "string") return s === item[fieldName.value];
|
|
539
|
-
return s?.[fieldName.value] === item[fieldName.value];
|
|
540
|
-
});
|
|
541
|
-
|
|
542
|
-
if (!exists) {
|
|
543
|
-
current.push(item);
|
|
544
|
-
}
|
|
545
|
-
} else {
|
|
546
|
-
selected.value = current.filter((s) => {
|
|
547
|
-
if (typeof s === "string") return s !== item[fieldName.value];
|
|
548
|
-
return s?.[fieldName.value] !== item[fieldName.value];
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
};
|
|
552
|
-
|
|
553
|
-
const selectAll = (e: Event) => {
|
|
554
|
-
if (e.target) {
|
|
555
|
-
selected.value = [{ _id: "6565d869eb1b7cf8745d6beb", name: "All" }];
|
|
556
|
-
nodropDown.value = true;
|
|
557
|
-
}
|
|
558
|
-
};
|
|
559
|
-
|
|
560
|
-
watch(selected, (newValue) => {
|
|
561
|
-
// Emit scalar for single-select, array for multi-select
|
|
562
|
-
if (props.multiple) {
|
|
563
|
-
emit("update:modelValue", newValue);
|
|
564
|
-
} else {
|
|
565
|
-
if (Array.isArray(newValue)) {
|
|
566
|
-
emit("update:modelValue", newValue[0] ?? "");
|
|
567
|
-
} else {
|
|
568
|
-
emit("update:modelValue", newValue as any);
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
if (
|
|
572
|
-
newValue === null ||
|
|
573
|
-
!newValue ||
|
|
574
|
-
(Array.isArray(newValue) && newValue.length === 0)
|
|
575
|
-
) {
|
|
576
|
-
emit("deselected", newValue);
|
|
577
|
-
}
|
|
578
|
-
});
|
|
579
|
-
|
|
580
|
-
const change = (newValue: any) => {
|
|
581
|
-
emit("change", newValue);
|
|
582
|
-
};
|
|
583
|
-
|
|
584
|
-
const deselected = (newValue: any) => {
|
|
585
|
-
emit("deselected", newValue);
|
|
586
|
-
if (newValue[fieldName.value] === "All") {
|
|
587
|
-
nodropDown.value = false;
|
|
588
|
-
}
|
|
589
|
-
};
|
|
590
|
-
|
|
591
|
-
watch(modelValue, (newValue: any) => {
|
|
592
|
-
if (props.multiple) {
|
|
593
|
-
selected.value = Array.isArray(newValue)
|
|
594
|
-
? newValue
|
|
595
|
-
: newValue
|
|
596
|
-
? [newValue]
|
|
597
|
-
: [];
|
|
598
|
-
} else {
|
|
599
|
-
// keep scalar
|
|
600
|
-
selected.value = Array.isArray(newValue) ? newValue[0] ?? "" : newValue;
|
|
601
|
-
}
|
|
602
|
-
});
|
|
603
|
-
|
|
604
|
-
const search = (x: string) => {
|
|
605
|
-
emit("update:searchString", x);
|
|
606
|
-
emit("search", x);
|
|
607
|
-
};
|
|
608
|
-
|
|
609
|
-
const selectWidth = computed(() => props.customWidth);
|
|
610
|
-
const selectMaxHeight = computed(() => props.customHeight);
|
|
611
|
-
const offsetValue = computed(() => props.customOffset);
|
|
612
|
-
|
|
613
|
-
const withPopper = (
|
|
614
|
-
dropdownList: HTMLElement,
|
|
615
|
-
component: { $refs: { toggle: Element | VirtualElement } },
|
|
616
|
-
{ width, maxHeight }: any
|
|
617
|
-
) => {
|
|
618
|
-
const newwidth = selectWidth.value || width; //setcustom width '400px'
|
|
619
|
-
const newHeight = selectMaxHeight.value || width; //setcustom maxHeight '600px'
|
|
620
|
-
|
|
621
|
-
const newOffset = offsetValue.value || [0, 7]; //setcustom Offset '[123, -1]'
|
|
622
|
-
const customWidth = isUseCustomSelect.value ? newwidth : width;
|
|
623
|
-
dropdownList.style.width = customWidth;
|
|
624
|
-
dropdownList.style.maxHeight = isUseCustomSelect.value
|
|
625
|
-
? newHeight
|
|
626
|
-
: maxHeight;
|
|
627
|
-
const offsetValues = isUseCustomSelect.value ? newOffset : [0, 7];
|
|
628
|
-
const popper = createPopper(component.$refs.toggle, dropdownList, {
|
|
629
|
-
placement: "bottom",
|
|
630
|
-
modifiers: [
|
|
631
|
-
{
|
|
632
|
-
name: "offset",
|
|
633
|
-
options: {
|
|
634
|
-
offset: offsetValues,
|
|
635
|
-
},
|
|
636
|
-
},
|
|
637
|
-
],
|
|
638
|
-
});
|
|
639
|
-
dropdownList.classList.add("toggle-dropdown");
|
|
640
|
-
return () => popper.destroy();
|
|
641
|
-
};
|
|
642
|
-
|
|
643
|
-
const fuseSearch = (
|
|
644
|
-
options: readonly unknown[],
|
|
645
|
-
search: string | any[] | Fuse.Expression
|
|
646
|
-
) => {
|
|
647
|
-
const fuse: any = new Fuse(options, {
|
|
648
|
-
keys: keys.value,
|
|
649
|
-
shouldSort: true,
|
|
650
|
-
});
|
|
651
|
-
|
|
652
|
-
return search ? fuse.search(search).map((item: any) => item) : fuse?.list;
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
onMounted(() => {
|
|
656
|
-
if (props.multiple) {
|
|
657
|
-
if (Array.isArray(props.value)) {
|
|
658
|
-
selected.value = props.value;
|
|
659
|
-
} else if (props.value) {
|
|
660
|
-
selected.value = [props.value];
|
|
661
|
-
} else {
|
|
662
|
-
selected.value = [];
|
|
663
|
-
}
|
|
664
|
-
} else {
|
|
665
|
-
// single: scalar
|
|
666
|
-
if (Array.isArray(props.value)) {
|
|
667
|
-
selected.value = props.value[0] ?? "";
|
|
668
|
-
} else {
|
|
669
|
-
selected.value = props.value ?? "";
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
});
|
|
673
|
-
|
|
674
|
-
onBeforeUnmount(() => {
|
|
675
|
-
selected.value = null;
|
|
676
|
-
});
|
|
677
|
-
|
|
678
|
-
onBeforeUnmount(() => {
|
|
679
|
-
selected.value = [];
|
|
680
|
-
});
|
|
681
|
-
|
|
682
|
-
const slectedChipbg = computed(() => (props.multiple ? "#f3e8ff" : ""));
|
|
683
|
-
const slectedChiptextColor = computed(() => (props.multiple ? "#7e22ce" : ""));
|
|
684
|
-
const slectedChipHeight = computed(() =>
|
|
685
|
-
props.multiple && props.inputFilled
|
|
686
|
-
? "fit-content"
|
|
687
|
-
: props.inputFilled
|
|
688
|
-
? ""
|
|
689
|
-
: "auto"
|
|
690
|
-
);
|
|
691
|
-
|
|
692
|
-
const dropDownIcon = computed(() => (props.clearable ? "flex" : "none"));
|
|
693
|
-
|
|
694
|
-
const selectBG = computed(() => {
|
|
695
|
-
if (selected.value?.length === 0 || !!_.isEmpty(selected.value)) {
|
|
696
|
-
return "#ffffff";
|
|
697
|
-
}
|
|
698
|
-
return "transparent";
|
|
699
|
-
});
|
|
700
|
-
const selectHeight = computed(() => {
|
|
701
|
-
if (selected.value?.length === 0 || _.isEmpty(selected.value)) {
|
|
702
|
-
return props.inputFilled ? "54px" : "36px";
|
|
703
|
-
}
|
|
704
|
-
|
|
705
|
-
let heightValue;
|
|
706
|
-
|
|
707
|
-
if (props.multiple) {
|
|
708
|
-
heightValue = props.inputFilled ? "32px" : "0px";
|
|
709
|
-
} else if (isUseCustomSelect.value) {
|
|
710
|
-
heightValue = "fit-content";
|
|
711
|
-
} else {
|
|
712
|
-
heightValue = props.inputFilled ? "40px" : "30px";
|
|
713
|
-
}
|
|
714
|
-
|
|
715
|
-
return heightValue;
|
|
716
|
-
});
|
|
717
|
-
|
|
718
|
-
const selectedMultiple = computed(() => {
|
|
719
|
-
if (selected.value?.length === 0 || _.isEmpty(selected.value)) {
|
|
720
|
-
return "0px";
|
|
721
|
-
}
|
|
722
|
-
let heightValue;
|
|
723
|
-
if (isUseCustomSelect.value || props.multiple) {
|
|
724
|
-
heightValue = props.inputFilled ? "24px" : "4px";
|
|
725
|
-
} else {
|
|
726
|
-
heightValue = props.inputFilled ? "12px" : "2px";
|
|
727
|
-
}
|
|
728
|
-
|
|
729
|
-
return heightValue;
|
|
730
|
-
});
|
|
731
|
-
|
|
732
|
-
const selectFocus = computed(() =>
|
|
733
|
-
props.multiple && props.inputFilled
|
|
734
|
-
? "8px"
|
|
735
|
-
: props.inputFilled
|
|
736
|
-
? "8px"
|
|
737
|
-
: "0px"
|
|
738
|
-
);
|
|
739
|
-
const searchMargin = computed(() =>
|
|
740
|
-
props.multiple && props.inputFilled
|
|
741
|
-
? "10px"
|
|
742
|
-
: props.inputFilled
|
|
743
|
-
? "10px"
|
|
744
|
-
: "0px"
|
|
745
|
-
);
|
|
746
|
-
|
|
747
|
-
const selectRequited = computed(() =>
|
|
748
|
-
props.required
|
|
749
|
-
? "-webkit-linear-gradient(left, #374151 0%, #374151 92%,red 8%,red 100%)"
|
|
750
|
-
: "-webkit-linear-gradient(left, #374151 50%, #374151 50%)"
|
|
751
|
-
);
|
|
752
|
-
|
|
753
|
-
interface Iflag {
|
|
754
|
-
nameText: string;
|
|
755
|
-
iconlink: string;
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
interface IKeyValueRef {
|
|
759
|
-
value: string;
|
|
760
|
-
name: string;
|
|
761
|
-
key: string;
|
|
762
|
-
}
|
|
763
|
-
|
|
764
|
-
const getFlag = computed(() => {
|
|
765
|
-
return (x: Iflag) =>
|
|
766
|
-
items.value?.find((item: IKeyValueRef) => item.name === x.nameText)
|
|
767
|
-
?.iconlink;
|
|
768
|
-
});
|
|
769
|
-
|
|
770
|
-
const inputValue = computed(() => {
|
|
771
|
-
// return !!(props.modelValue || selected.value);
|
|
772
|
-
const modelValue = props.modelValue;
|
|
773
|
-
const selectedValue = selected.value;
|
|
774
|
-
if (modelValue) return true;
|
|
775
|
-
if (Array.isArray(selectedValue)) return !!selectedValue.length;
|
|
776
|
-
if (selectedValue && typeof selectedValue === "object")
|
|
777
|
-
return !!Object.keys(selectedValue).length;
|
|
778
|
-
return !!selectedValue;
|
|
779
|
-
});
|
|
780
|
-
|
|
781
|
-
const handleOptionCreate = (e: any) => {
|
|
782
|
-
emit("selectedOption", e);
|
|
783
|
-
};
|
|
784
|
-
|
|
785
|
-
const isSelectable = computed(() => {
|
|
786
|
-
return (
|
|
787
|
-
!props.multipleLimit || (selected.value?.length ?? 0) < props.multipleLimit
|
|
788
|
-
);
|
|
789
|
-
});
|
|
790
|
-
|
|
791
|
-
const selectedLimit = () => {
|
|
792
|
-
if (!props.multipleLimit) return true;
|
|
793
|
-
|
|
794
|
-
if (props.multipleLimit) {
|
|
795
|
-
return isSelectable.value;
|
|
796
|
-
}
|
|
797
|
-
};
|
|
798
|
-
|
|
799
|
-
const open = () => {
|
|
800
|
-
emit("open");
|
|
801
|
-
};
|
|
802
|
-
</script>
|
|
803
|
-
<style lang="scss">
|
|
804
|
-
:root {
|
|
805
|
-
--vs-dropdown-color: theme("colors.gray.600");
|
|
806
|
-
--vs-dropdown-option--active-color: theme("colors.white");
|
|
807
|
-
--vs-disabled-bg: theme("colors.white");
|
|
808
|
-
}
|
|
809
|
-
.scrollbar {
|
|
810
|
-
&--hide {
|
|
811
|
-
@apply overflow-y-auto;
|
|
812
|
-
&::-webkit-scrollbar {
|
|
813
|
-
@apply w-0 h-full;
|
|
814
|
-
}
|
|
815
|
-
&::-webkit-scrollbar-track {
|
|
816
|
-
@apply bg-transparent rounded-full;
|
|
817
|
-
}
|
|
818
|
-
&::-webkit-scrollbar-thumb {
|
|
819
|
-
@apply bg-transparent rounded-full;
|
|
820
|
-
}
|
|
821
|
-
}
|
|
822
|
-
&--thin {
|
|
823
|
-
@apply overflow-y-auto transition delay-300 ease-in;
|
|
824
|
-
&::-webkit-scrollbar {
|
|
825
|
-
@apply w-1 h-full;
|
|
826
|
-
}
|
|
827
|
-
&::-webkit-scrollbar-track {
|
|
828
|
-
@apply bg-transparent rounded-full;
|
|
829
|
-
}
|
|
830
|
-
&::-webkit-scrollbar-thumb {
|
|
831
|
-
@apply bg-transparent rounded-full;
|
|
832
|
-
}
|
|
833
|
-
&:hover::-webkit-scrollbar-thumb {
|
|
834
|
-
@apply bg-gray-500;
|
|
835
|
-
}
|
|
836
|
-
}
|
|
837
|
-
}
|
|
838
|
-
.vs__dropdown-menu.toggle-dropdown {
|
|
839
|
-
border-top-style: solid;
|
|
840
|
-
margin-top: -5px !important;
|
|
841
|
-
border-radius: 6px !important;
|
|
842
|
-
}
|
|
843
|
-
|
|
844
|
-
.vs--single.vs--open .vs__selected,
|
|
845
|
-
.vs--single.vs--loading .vs__selected {
|
|
846
|
-
@apply opacity-0;
|
|
847
|
-
}
|
|
848
|
-
.vs__dropdown {
|
|
849
|
-
&-toggle {
|
|
850
|
-
@apply px-1 py-0 border-transparent;
|
|
851
|
-
&[aria-expanded="true"] {
|
|
852
|
-
@apply bg-transparent;
|
|
853
|
-
}
|
|
854
|
-
}
|
|
855
|
-
&-option {
|
|
856
|
-
@apply py-2 text-sm font-medium;
|
|
857
|
-
&--selected {
|
|
858
|
-
@apply bg-purple-100 text-purple-700;
|
|
859
|
-
}
|
|
860
|
-
&--highlight {
|
|
861
|
-
@apply bg-gray-100 text-gray-900 font-medium;
|
|
862
|
-
}
|
|
863
|
-
}
|
|
864
|
-
&-menu {
|
|
865
|
-
@apply max-h-64 py-0;
|
|
866
|
-
}
|
|
867
|
-
}
|
|
868
|
-
.vs__no-options {
|
|
869
|
-
@apply py-3 font-medium text-base;
|
|
870
|
-
}
|
|
871
|
-
|
|
872
|
-
.vs__actions {
|
|
873
|
-
.vs__clear {
|
|
874
|
-
@apply mr-0.5 scale-95 transform transition-all duration-300 ease-out text-gray-400;
|
|
875
|
-
&:hover {
|
|
876
|
-
@apply scale-125 text-red-600;
|
|
877
|
-
}
|
|
878
|
-
}
|
|
879
|
-
.vs__open-indicator {
|
|
880
|
-
fill: var(--vs-controls-color);
|
|
881
|
-
}
|
|
882
|
-
}
|
|
883
|
-
|
|
884
|
-
.vs__selected-options {
|
|
885
|
-
@apply group-focus:bg-transparent focus-within:bg-transparent border-transparent;
|
|
886
|
-
background-color: v-bind(selectBG);
|
|
887
|
-
min-height: v-bind(selectHeight);
|
|
888
|
-
margin-top: v-bind(selectedMultiple);
|
|
889
|
-
span.vs__selected {
|
|
890
|
-
background: v-bind(slectedChipbg) !important;
|
|
891
|
-
color: v-bind(slectedChiptextColor) !important;
|
|
892
|
-
height: v-bind(slectedChipHeight) !important;
|
|
893
|
-
@apply rounded-md pl-2 text-sm font-medium bg-gray-200 border-transparent;
|
|
894
|
-
|
|
895
|
-
button.vs__deselect {
|
|
896
|
-
@apply p-1 text-gray-400;
|
|
897
|
-
}
|
|
898
|
-
&:hover button.vs__deselect svg {
|
|
899
|
-
@apply fill-current text-red-600;
|
|
900
|
-
}
|
|
901
|
-
}
|
|
902
|
-
}
|
|
903
|
-
|
|
904
|
-
.v-select.vs--multiple {
|
|
905
|
-
.vs__selected-options {
|
|
906
|
-
margin-top: v-bind(selectedMultiple);
|
|
907
|
-
.vs__selected {
|
|
908
|
-
@apply mt-px;
|
|
909
|
-
}
|
|
910
|
-
}
|
|
911
|
-
}
|
|
912
|
-
|
|
913
|
-
.vs {
|
|
914
|
-
&__search {
|
|
915
|
-
@apply px-2 placeholder:text-sm placeholder:font-medium placeholder:leading-loose appearance-none;
|
|
916
|
-
margin-top: v-bind(searchMargin);
|
|
917
|
-
&:focus {
|
|
918
|
-
@apply text-sm font-medium pl-2.5;
|
|
919
|
-
padding-top: v-bind(selectFocus);
|
|
920
|
-
}
|
|
921
|
-
}
|
|
922
|
-
&__selected {
|
|
923
|
-
@apply text-sm font-medium;
|
|
924
|
-
}
|
|
925
|
-
}
|
|
926
|
-
|
|
927
|
-
.v-select.drop-up.vs--open .vs__dropdown-toggle {
|
|
928
|
-
border-radius: 0 0 4px 4px;
|
|
929
|
-
border-top-color: transparent;
|
|
930
|
-
border-bottom-color: rgba(60, 60, 60, 0.26);
|
|
931
|
-
}
|
|
932
|
-
|
|
933
|
-
[data-popper-placement="top"] {
|
|
934
|
-
border-radius: 4px 4px 0 0;
|
|
935
|
-
border-top-style: solid;
|
|
936
|
-
border-bottom-style: none;
|
|
937
|
-
box-shadow: 0 -3px 6px rgba(0, 0, 0, 0.15);
|
|
938
|
-
}
|
|
939
|
-
|
|
940
|
-
:root {
|
|
941
|
-
--vs-dropdown-option--active-bg: #7e22ce;
|
|
942
|
-
--vs-dropdown-option--active-color: #eeeeee;
|
|
943
|
-
}
|
|
944
|
-
|
|
945
|
-
.v-select input::-webkit-input-placeholder {
|
|
946
|
-
width: fit-content;
|
|
947
|
-
background: v-bind(selectRequited);
|
|
948
|
-
-webkit-background-clip: text;
|
|
949
|
-
-webkit-text-fill-color: transparent;
|
|
950
|
-
@apply appearance-none;
|
|
951
|
-
}
|
|
952
|
-
|
|
953
|
-
.v-select .vs__selected-options .vs__selected_count {
|
|
954
|
-
@apply text-gray-600 first:flex items-center justify-start gap-2 hidden text-sm font-medium leading-snug px-2 py-1;
|
|
955
|
-
span {
|
|
956
|
-
@apply flex items-center justify-center h-5 text-xs text-gray-800 bg-gray-200 rounded-3xl shrink-0 min-w-5;
|
|
957
|
-
}
|
|
958
|
-
}
|
|
959
|
-
|
|
960
|
-
.isUseCustomSelect {
|
|
961
|
-
.v-select.customselect {
|
|
962
|
-
.vs__search:focus {
|
|
963
|
-
padding-top: v-bind(selectFocus);
|
|
964
|
-
}
|
|
965
|
-
.vs--single.vs--open .vs__selected,
|
|
966
|
-
.vs--single.vs--loading .vs__selected {
|
|
967
|
-
@apply opacity-0;
|
|
968
|
-
}
|
|
969
|
-
.vs__dropdown {
|
|
970
|
-
&-toggle {
|
|
971
|
-
@apply px-1 py-0 border-transparent;
|
|
972
|
-
&[aria-expanded="true"] {
|
|
973
|
-
@apply bg-transparent;
|
|
974
|
-
}
|
|
975
|
-
}
|
|
976
|
-
&-option {
|
|
977
|
-
@apply py-2 text-sm font-medium;
|
|
978
|
-
&--selected {
|
|
979
|
-
@apply bg-purple-100 text-purple-700;
|
|
980
|
-
}
|
|
981
|
-
&--highlight {
|
|
982
|
-
@apply bg-gray-100 text-black font-medium;
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
&-menu {
|
|
986
|
-
@apply max-h-64 py-0;
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
.vs__no-options {
|
|
990
|
-
@apply py-3 font-medium text-base;
|
|
991
|
-
}
|
|
992
|
-
|
|
993
|
-
.vs__selected-options {
|
|
994
|
-
@apply group-focus:bg-transparent focus-within:bg-transparent border-transparent scrollbar--thin;
|
|
995
|
-
background-color: v-bind(selectBG);
|
|
996
|
-
min-height: v-bind(selectHeight);
|
|
997
|
-
margin-top: v-bind(selectedMultiple);
|
|
998
|
-
max-height: 54px;
|
|
999
|
-
span.vs__selected {
|
|
1000
|
-
background: v-bind(slectedChipbg) !important;
|
|
1001
|
-
color: v-bind(slectedChiptextColor) !important;
|
|
1002
|
-
height: v-bind(slectedChipHeight) !important;
|
|
1003
|
-
@apply rounded p-0.5 pl-1 text-xs font-medium bg-gray-200 border-transparent;
|
|
1004
|
-
|
|
1005
|
-
button.vs__deselect {
|
|
1006
|
-
@apply p-0.5;
|
|
1007
|
-
}
|
|
1008
|
-
&:hover button.vs__deselect svg {
|
|
1009
|
-
@apply fill-current text-red-600;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
.vs {
|
|
1015
|
-
&__search {
|
|
1016
|
-
@apply placeholder-gray-700 placeholder:text-sm placeholder:font-medium;
|
|
1017
|
-
}
|
|
1018
|
-
&__selected {
|
|
1019
|
-
@apply text-sm font-medium;
|
|
1020
|
-
}
|
|
1021
|
-
}
|
|
1022
|
-
}
|
|
1023
|
-
|
|
1024
|
-
.v-select.customselect.vs--multiple {
|
|
1025
|
-
.vs__selected-options {
|
|
1026
|
-
margin-top: v-bind(selectedMultiple);
|
|
1027
|
-
}
|
|
1028
|
-
}
|
|
1029
|
-
|
|
1030
|
-
.v-select.customselect.drop-up.vs--open .vs__dropdown-toggle {
|
|
1031
|
-
border-radius: 0 0 4px 4px;
|
|
1032
|
-
border-top-color: transparent;
|
|
1033
|
-
border-bottom-color: rgba(60, 60, 60, 0.26);
|
|
1034
|
-
}
|
|
1035
|
-
|
|
1036
|
-
.v-select.customselect .vs__dropdown-toggle .vs__actions {
|
|
1037
|
-
display: v-bind(dropDownIcon);
|
|
1038
|
-
}
|
|
1039
|
-
|
|
1040
|
-
:root {
|
|
1041
|
-
--vs-dropdown-option--active-bg: #7e22ce;
|
|
1042
|
-
--vs-dropdown-option--active-color: #eeeeee;
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
.v-select.customselect input::-webkit-input-placeholder {
|
|
1046
|
-
width: fit-content;
|
|
1047
|
-
background: v-bind(selectRequited);
|
|
1048
|
-
-webkit-background-clip: text;
|
|
1049
|
-
-webkit-text-fill-color: transparent;
|
|
1050
|
-
}
|
|
1051
|
-
}
|
|
1052
|
-
|
|
1053
|
-
.selectall__input {
|
|
1054
|
-
@apply size-4 flex-shrink-0 border border-solid border-gray-200 bg-white appearance-none inline-block select-none cursor-pointer align-middle rounded relative before:content-[''] before:transform before:translate-x-1/2 before:-translate-y-1/2 before:z-[-1] before:absolute before:top-1/2 before:right-1/2 before:block before:size-9 before:rounded-full before:bg-violet-100 before:opacity-0 before:transition-opacity hover:before:opacity-75;
|
|
1055
|
-
&::after {
|
|
1056
|
-
@apply absolute hidden border-solid inset-0 -ml-px -mt-px size-4 scale-90;
|
|
1057
|
-
content: "";
|
|
1058
|
-
background-image: url(data:image/svg+xml,%3Csvg%20width%3D%2224%22%20height%3D%2224%22%20viewBox%3D%220%200%2024%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%2012.7132L10.0168%2017.7247L10.4177%2017.0238C12.5668%2013.2658%2015.541%2010.0448%2019.1161%207.60354L20%207%22%20stroke%3D%22%23ffffff%22%20stroke-width%3D%223%22%20stroke-linecap%3D%22round%22%20stroke-linejoin%3D%22round%22%2F%3E%3C%2Fsvg%3E);
|
|
1059
|
-
background-size: contain;
|
|
1060
|
-
transition: all 0.2s ease;
|
|
1061
|
-
}
|
|
1062
|
-
&:hover {
|
|
1063
|
-
@apply bg-violet-100 border-violet-500;
|
|
1064
|
-
}
|
|
1065
|
-
&:checked {
|
|
1066
|
-
transition: all 0.3s ease;
|
|
1067
|
-
transform: translate3d(0, 1, 0);
|
|
1068
|
-
@apply bg-violet-700 border-violet-700;
|
|
1069
|
-
&::after {
|
|
1070
|
-
@apply block border-white;
|
|
1071
|
-
}
|
|
1072
|
-
&:focus {
|
|
1073
|
-
@apply bg-violet-700;
|
|
1074
|
-
}
|
|
1075
|
-
}
|
|
1076
|
-
&:focus {
|
|
1077
|
-
@apply outline-none border border-violet-700 bg-violet-200;
|
|
1078
|
-
}
|
|
1079
|
-
&:disabled {
|
|
1080
|
-
@apply bg-gray-300 border-gray-100 cursor-not-allowed;
|
|
1081
|
-
& ~ span {
|
|
1082
|
-
@apply cursor-not-allowed;
|
|
1083
|
-
}
|
|
1084
|
-
&:checked {
|
|
1085
|
-
@apply bg-white border-white;
|
|
1086
|
-
&::after {
|
|
1087
|
-
@apply block border-gray-100;
|
|
1088
|
-
}
|
|
1089
|
-
}
|
|
1090
|
-
}
|
|
1091
|
-
}
|
|
1092
|
-
</style>
|