classcard-ui 0.2.507 → 0.2.510

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +105 -88
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.umd.js +105 -88
  5. package/dist/classcard-ui.umd.js.map +1 -1
  6. package/dist/classcard-ui.umd.min.js +1 -1
  7. package/dist/classcard-ui.umd.min.js.map +1 -1
  8. package/package.json +81 -81
  9. package/src/App.vue +16 -16
  10. package/src/components/CAlerts/CAlerts.vue +70 -70
  11. package/src/components/CAlerts/index.js +2 -2
  12. package/src/components/CAnchorTabs/CAnchorTabs.vue +104 -104
  13. package/src/components/CAnchorTabs/index.js +2 -2
  14. package/src/components/CAnchorTag/CAnchorTag.vue +62 -62
  15. package/src/components/CAnchorTag/index.js +2 -2
  16. package/src/components/CAvatar/CAvatar.vue +89 -89
  17. package/src/components/CAvatar/index.js +2 -2
  18. package/src/components/CAvatarGroup/CAvatarGroup.vue +145 -145
  19. package/src/components/CAvatarGroup/index.js +2 -2
  20. package/src/components/CBasicTable/CBasicTable.vue +184 -184
  21. package/src/components/CBasicTable/index.js +2 -2
  22. package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
  23. package/src/components/CBreadcrumbs/index.js +2 -2
  24. package/src/components/CButton/CButton.vue +150 -150
  25. package/src/components/CButton/index.js +2 -2
  26. package/src/components/CButtonGroup/CButtonGroup.vue +116 -116
  27. package/src/components/CButtonGroup/index.js +2 -2
  28. package/src/components/CButtonIcon/CButtonIcon.vue +91 -91
  29. package/src/components/CButtonIcon/index.js +2 -2
  30. package/src/components/CButtonLink/CButtonLink.vue +39 -39
  31. package/src/components/CButtonLink/index.js +2 -2
  32. package/src/components/CButtonSelect/CButtonSelect.vue +103 -103
  33. package/src/components/CButtonSelect/index.js +2 -2
  34. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +168 -168
  35. package/src/components/CButtonWithDropdown/index.js +2 -2
  36. package/src/components/CCalendar/CCalendar.vue +312 -287
  37. package/src/components/CCalendar/index.js +3 -3
  38. package/src/components/CCard/CCard.vue +49 -49
  39. package/src/components/CCard/index.js +2 -2
  40. package/src/components/CCheckbox/CCheckbox.vue +70 -70
  41. package/src/components/CCheckbox/index.js +2 -2
  42. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +99 -99
  43. package/src/components/CCollapsibleSection/index.js +2 -2
  44. package/src/components/CColorDots/CColorDots.vue +35 -35
  45. package/src/components/CColorDots/index.js +3 -3
  46. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +120 -120
  47. package/src/components/CConfirmActionModal/index.js +3 -3
  48. package/src/components/CDatepicker/CDatepicker.vue +134 -134
  49. package/src/components/CDatepicker/index.js +2 -2
  50. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  51. package/src/components/CDualSelect/index.js +2 -2
  52. package/src/components/CEditor/CEditor.vue +91 -91
  53. package/src/components/CEditor/index.js +2 -2
  54. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +52 -52
  55. package/src/components/CFormSectionHeading/index.js +2 -2
  56. package/src/components/CGroupedSelect/CGroupedSelect.vue +217 -217
  57. package/src/components/CGroupedSelect/index.js +3 -3
  58. package/src/components/CIcon/CIcon.vue +72 -72
  59. package/src/components/CIcon/index.js +2 -2
  60. package/src/components/CIconDropdown/CIconDropdown.vue +94 -94
  61. package/src/components/CIconDropdown/index.js +2 -2
  62. package/src/components/CInput/CInput.vue +115 -115
  63. package/src/components/CInput/index.js +2 -2
  64. package/src/components/CInputAddon/CInputAddon.vue +199 -199
  65. package/src/components/CInputAddon/index.js +2 -2
  66. package/src/components/CInputEmail/CInputEmail.vue +84 -84
  67. package/src/components/CInputEmail/index.js +2 -2
  68. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  69. package/src/components/CModalHeading/index.js +2 -2
  70. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +39 -39
  71. package/src/components/CModuleHelpLinks/index.js +3 -3
  72. package/src/components/CMultiselect/CMultiselect.vue +313 -313
  73. package/src/components/CMultiselect/index.js +2 -2
  74. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  75. package/src/components/CMultiselectr/index.js +2 -2
  76. package/src/components/CPageHeading/CPageHeading.vue +56 -56
  77. package/src/components/CPageHeading/index.js +2 -2
  78. package/src/components/CPagination/CPagination.vue +202 -202
  79. package/src/components/CPagination/index.js +2 -2
  80. package/src/components/CPhoneNumber/CPhoneNumber.vue +62 -62
  81. package/src/components/CPhoneNumber/index.js +2 -2
  82. package/src/components/CRadio/CRadio.vue +70 -70
  83. package/src/components/CRadio/index.js +2 -2
  84. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  85. package/src/components/CRangeSlider/index.js +2 -2
  86. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  87. package/src/components/CReorderableStackedList/index.js +2 -2
  88. package/src/components/CSelect/CSelect.vue +313 -315
  89. package/src/components/CSelect/index.js +2 -2
  90. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  91. package/src/components/CSmallTimeline/index.js +2 -2
  92. package/src/components/CStackedList/CStackedList.vue +87 -87
  93. package/src/components/CStackedList/index.js +2 -2
  94. package/src/components/CStats/CStats.vue +88 -88
  95. package/src/components/CStats/index.js +2 -2
  96. package/src/components/CSwitch/CSwitch.vue +132 -132
  97. package/src/components/CSwitch/index.js +2 -2
  98. package/src/components/CTable/CTable.vue +501 -501
  99. package/src/components/CTable/index.js +2 -2
  100. package/src/components/CTabs/CTabs.vue +107 -107
  101. package/src/components/CTabs/index.js +2 -2
  102. package/src/components/CTag/CTag.vue +36 -36
  103. package/src/components/CTag/index.js +2 -2
  104. package/src/components/CTextarea/CTextarea.vue +85 -85
  105. package/src/components/CTextarea/index.js +2 -2
  106. package/src/components/CTimeline/CTimeline.vue +237 -237
  107. package/src/components/CTimeline/index.js +2 -2
  108. package/src/components/CUpload/CUpload.vue +196 -196
  109. package/src/components/CUpload/index.js +2 -2
  110. package/src/components/index.js +48 -48
  111. package/src/icons.js +254 -254
  112. package/src/main.js +22 -22
  113. package/src/stories/CAlerts.stories.js +37 -37
  114. package/src/stories/CAnchorTabs.stories.js +29 -29
  115. package/src/stories/CAnchorTag.stories.js +36 -36
  116. package/src/stories/CAvatar.stories.js +38 -38
  117. package/src/stories/CAvatarGroup.stories.js +100 -100
  118. package/src/stories/CBasicTable.stories.js +316 -316
  119. package/src/stories/CBreadcrumbs.stories.js +24 -24
  120. package/src/stories/CButton.stories.js +46 -46
  121. package/src/stories/CButtonGroup.stories.js +33 -33
  122. package/src/stories/CButtonIcon.stories.js +27 -27
  123. package/src/stories/CButtonLink.stories.js +24 -24
  124. package/src/stories/CButtonSelect.stories.js +32 -32
  125. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  126. package/src/stories/CCalendar.stories.js +16 -16
  127. package/src/stories/CCard.stories.js +30 -30
  128. package/src/stories/CCheckbox.stories.js +29 -29
  129. package/src/stories/CCollapsibleSection.stories.js +28 -28
  130. package/src/stories/CColorDots.stories.js +28 -28
  131. package/src/stories/CConfirmActionModal.stories.js +59 -59
  132. package/src/stories/CDatepicker.stories.js +30 -30
  133. package/src/stories/CDualSelect.stories.js +29 -29
  134. package/src/stories/CEditor.stories.js +30 -30
  135. package/src/stories/CFormSectionHeading.stories.js +34 -34
  136. package/src/stories/CGroupedSelect.stories.js +69 -69
  137. package/src/stories/CIcon.stories.js +26 -26
  138. package/src/stories/CIconDropdown.stories.js +39 -39
  139. package/src/stories/CInput.stories.js +36 -36
  140. package/src/stories/CInputAddon.stories.js +37 -37
  141. package/src/stories/CInputEmail.stories.js +27 -27
  142. package/src/stories/CModalHeading.stories.js +25 -25
  143. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  144. package/src/stories/CMultiselect.stories.js +97 -97
  145. package/src/stories/CMultiselectr.stories.js +23 -23
  146. package/src/stories/CPageHeading.stories.js +32 -32
  147. package/src/stories/CPagination.stories.js +30 -30
  148. package/src/stories/CPhoneNumber.stories.js +29 -29
  149. package/src/stories/CRadio.stories.js +36 -36
  150. package/src/stories/CRangeSlider.stories.js +23 -23
  151. package/src/stories/CReorderableStackedList.stories.js +23 -23
  152. package/src/stories/CSelect.stories.js +50 -50
  153. package/src/stories/CSmallTimeline.stories.js +26 -26
  154. package/src/stories/CStackedList.stories.js +37 -37
  155. package/src/stories/CStats.stories.js +33 -33
  156. package/src/stories/CSwitch.stories.js +28 -28
  157. package/src/stories/CTable.stories.js +77 -77
  158. package/src/stories/CTabs.stories.js +29 -29
  159. package/src/stories/CTag.stories.js +23 -23
  160. package/src/stories/CTextarea.stories.js +32 -32
  161. package/src/stories/CTimeline.stories.js +26 -26
  162. package/src/stories/CUpload.stories.js +36 -36
  163. package/src/stories/Introduction.stories.mdx +207 -207
  164. package/src/stories/Page.vue +88 -88
  165. package/src/stories/assets/code-brackets.svg +0 -0
  166. package/src/stories/assets/colors.svg +0 -0
  167. package/src/stories/assets/comments.svg +0 -0
  168. package/src/stories/assets/direction.svg +0 -0
  169. package/src/stories/assets/flow.svg +0 -0
  170. package/src/stories/assets/plugin.svg +0 -0
  171. package/src/stories/assets/repo.svg +0 -0
  172. package/src/stories/assets/stackalt.svg +0 -0
  173. package/src/stories/header.css +26 -26
  174. package/src/stories/page.css +69 -69
  175. package/src/stories/utils.css +17 -17
@@ -1,315 +1,313 @@
1
- <template>
2
- <div>
3
- <div class="flex w-full justify-between" v-if="label">
4
- <div class="flex items-center">
5
- <!-- label of select field -->
6
- <label class="block text-sm font-medium text-gray-900">
7
- {{ label }}
8
- </label>
9
- <!-- asterisk sign to render if field is required -->
10
- <p v-if="isRequired" class="ml-1 text-red-600">*</p>
11
- </div>
12
- <span v-if="hint" class="text-sm text-gray-500">{{ hint }}</span>
13
- </div>
14
-
15
- <div class="relative" :class="label ? 'mt-1' : ''">
16
- <input
17
- type="text"
18
- v-model="selectSearch"
19
- @click="toggleDropdown = !toggleDropdown"
20
- @focus="type == 'tertiary' ? (showFocus = true) : ''"
21
- @blur="close()"
22
- @keyup="search()"
23
- aria-haspopup="listbox"
24
- aria-expanded="true"
25
- aria-labelledby="listbox-label"
26
- :class="{ ...classes, [inputClasses]: true }"
27
- class="relative w-full cursor-pointer rounded-md py-2 pl-3 pr-10 text-left text-sm focus:outline-none disabled:opacity-50 sm:text-sm"
28
- :disabled="isDisabled"
29
- autocomplete="off"
30
- />
31
-
32
- <div class="pointer-events-none absolute top-2 left-3 flex">
33
- <span class="flex items-center" :style="selectedOptionStyles">
34
- <c-avatar
35
- v-if="showImage && !selectSearch && value && value.photo"
36
- size="extraextrasmall"
37
- :image="value.photo"
38
- :rounded="true"
39
- ></c-avatar>
40
- <c-avatar
41
- v-else-if="
42
- showImage &&
43
- !selectSearch &&
44
- value &&
45
- value.initials &&
46
- value.type !== location
47
- "
48
- size="extraextrasmall"
49
- :nameInitials="value.initials"
50
- :rounded="true"
51
- ></c-avatar>
52
- <c-icon
53
- v-if="icon && !showImage"
54
- :class="icon.class"
55
- :name="icon.name"
56
- :type="icon.type"
57
- >
58
- </c-icon>
59
- <span :class="showImage ? 'ml-3' : ''" class="block truncate text-sm">
60
- {{
61
- selectedValue
62
- ? selectedValue
63
- : !selectSearch || selectSearch == ""
64
- ? placeholder
65
- : null
66
- }}
67
- </span>
68
- </span>
69
- </div>
70
- <div class="pointer-events-none absolute top-2.5 right-3 flex">
71
- <div
72
- v-if="type == 'tertiary' ? showFocus : true"
73
- class="pointer-events-none right-0 flex items-center"
74
- >
75
- <c-icon name="selector" type="solid" class="h-5 w-5"></c-icon>
76
- </div>
77
- </div>
78
- <transition
79
- enter-active-class="transition ease-out duration-100"
80
- enter-class="transform opacity-0 scale-95"
81
- enter-to-class="transform opacity-100 scale-100"
82
- leave-active-class="transition ease-in duration-75"
83
- leave-class="transform opacity-100 scale-100"
84
- leave-to-class="transform opacity-0 scale-95"
85
- >
86
- <div
87
- v-if="toggleDropdown && !isDisabled"
88
- class="absolute z-10 mt-1 w-full rounded-md bg-white shadow-lg"
89
- >
90
- <ul
91
- tabindex="-1"
92
- role="listbox"
93
- aria-labelledby="listbox-label"
94
- class="max-h-60 overflow-auto rounded-md py-1 text-base ring-1 ring-gray-900 ring-opacity-5 focus:outline-none sm:text-sm"
95
- >
96
- <li
97
- v-if="addAction"
98
- @mousedown="actionEvent($event)"
99
- class="relative flex cursor-pointer select-none py-2 pl-3 pr-9 text-indigo-500 hover:bg-indigo-100 hover:text-indigo-700"
100
- >
101
- <c-icon
102
- type="outline"
103
- class="mr-1 h-5 w-5 text-indigo-400 group-hover:text-indigo-500"
104
- name="plus"
105
- ></c-icon>
106
- {{ addAction.label }}
107
- </li>
108
- <li
109
- v-for="(option, index) in renderOptions"
110
- :key="index"
111
- id="listbox-option-0"
112
- role="option"
113
- @mousedown="handleSelect($event, option)"
114
- class="relative cursor-pointer select-none py-2 pl-3 pr-9 text-gray-900 hover:bg-indigo-700 hover:text-white"
115
- :class="option.isDisabled ? 'pointer-events-none opacity-50' : ''"
116
- >
117
- <span class="flex items-center">
118
- <c-avatar
119
- v-if="showImage && option.photo"
120
- size="extraextrasmall"
121
- :image="option.photo"
122
- :rounded="true"
123
- ></c-avatar>
124
- <c-avatar
125
- v-else-if="
126
- showImage && option.initials && option.type !== location
127
- "
128
- size="extraextrasmall"
129
- :nameInitials="option.initials"
130
- :rounded="true"
131
- ></c-avatar>
132
- <c-icon
133
- v-if="icon && !showImage"
134
- :class="icon.class"
135
- :name="icon.name"
136
- :type="icon.type"
137
- >
138
- </c-icon>
139
- <span
140
- :class="
141
- (showImage && option.photo) || option.initials ? 'ml-3' : ''
142
- "
143
- class="list-options block break-words font-normal"
144
- >{{ option[renderOptionName] }}
145
- </span>
146
- </span>
147
-
148
- <span
149
- class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600"
150
- >
151
- <c-icon
152
- id="list-icon"
153
- v-show="showSelectedValue"
154
- name="check"
155
- type="solid"
156
- class="h-5 w-5"
157
- ></c-icon>
158
- </span>
159
- </li>
160
- </ul>
161
- </div>
162
- </transition>
163
- <!-- validation error message -->
164
- <p v-if="!isValidate" class="mt-2 text-left text-sm text-red-600">
165
- {{ errorMessage }}
166
- </p>
167
- <p v-if="helpText" class="mt-2 text-sm text-gray-500">
168
- {{ helpText }}
169
- </p>
170
- </div>
171
- </div>
172
- </template>
173
- <script>
174
- import CIcon from "../CIcon/CIcon.vue";
175
- import CAvatar from "../CAvatar/CAvatar.vue";
176
- import { isNumber } from "lodash";
177
- export default {
178
- name: "CSelect",
179
- components: { CIcon, CAvatar },
180
- props: {
181
- // label of selectpicker
182
- label: {
183
- type: String,
184
- },
185
- // placeholder in selectpicker
186
- placeholder: {
187
- type: String,
188
- },
189
- // list to render in dropdown
190
- options: {
191
- type: Array,
192
- required: true,
193
- },
194
- // text below dropdown to describe more about the field
195
- helpText: {
196
- type: String,
197
- },
198
- // text adjacent to label of dropdown to provide hint about field
199
- hint: { type: String },
200
- // to show if image is present along with dropdown option
201
- showImage: { type: Boolean },
202
- // whether the select field is mandatory or not
203
- isRequired: {
204
- type: Boolean,
205
- },
206
- // validation is passed or not
207
- isValidate: { type: Boolean, default: true },
208
- // will truncate the text in input field
209
- selectedOptionStyles: {
210
- type: String,
211
- },
212
- // validation error message
213
- errorMessage: {
214
- type: String,
215
- },
216
- // perform action on first option in dropdown
217
- addAction: { type: Object },
218
- // icons in dropdown list
219
- icon: { type: Object },
220
- // value to set as default option in dropdown
221
- value: { type: [Object, String], default: null },
222
- // type of dropdown - gray,tertiary or default
223
- type: {
224
- type: String,
225
- },
226
- // name of the field in array to that contains text to render in dropdown
227
- renderOptionName: {
228
- type: String,
229
- default: "option",
230
- },
231
- // whether to disable the selectpicker
232
- isDisabled: {
233
- type: Boolean,
234
- default: false,
235
- },
236
- inputClasses: {
237
- type: String,
238
- default: "",
239
- },
240
- },
241
- data() {
242
- return {
243
- toggleDropdown: false,
244
- selectedValue: null,
245
- showSelectedValue: false,
246
- showFocus: false,
247
- selectSearch: null,
248
- renderOptions: this.options,
249
- };
250
- },
251
- computed: {
252
- classes() {
253
- return {
254
- "text-gray-900 border border-gray-200 hover:bg-gray-200 bg-gray-100 focus:ring-2 focus:border-gray-200 focus:ring-gray-200 focus:ring-offset-2 shadow-sm":
255
- this.type == "gray",
256
- "bg-white border border-gray-200 hover:bg-indigo-100 text-indigo-600 hover:text-indigo-800 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-200":
257
- this.type == "tertiary",
258
- "border border-gray-300 focus:ring-indigo-500 focus:border-indigo-500 bg-white shadow-sm focus:ring-1":
259
- this.type == null,
260
- };
261
- },
262
- },
263
- methods: {
264
- handleSelect(event, option) {
265
- this.selectSearch = null;
266
- this.selectedValue = option[this.renderOptionName];
267
- this.$emit("onChangeValue", option);
268
- this.toggleDropdown = false;
269
- },
270
- actionEvent(event) {
271
- this.$emit("listAction", event);
272
- },
273
- close() {
274
- this.selectSearch = null;
275
- this.toggleDropdown = false;
276
- this.type === "tertiary" ? (this.showFocus = false) : "";
277
- this.renderOptions = this.options;
278
- },
279
- search() {
280
- this.selectedValue = null;
281
- if (!this.selectSearch || this.selectSearch == "") {
282
- this.renderOptions = this.options;
283
- return;
284
- }
285
- let options = [...this.options];
286
- this.renderOptions = options.filter((option) => {
287
- isNumber(option[this.renderOptionName])
288
- ? (option[this.renderOptionName] =
289
- option[this.renderOptionName].toString())
290
- : "";
291
- return option[this.renderOptionName]
292
- .toLowerCase()
293
- .includes(this.selectSearch.toLowerCase());
294
- });
295
- },
296
- },
297
- watch: {
298
- value() {
299
- this.selectedValue =
300
- this.value !== null && this.value[this.renderOptionName]
301
- ? this.value[this.renderOptionName]
302
- : this.value;
303
- },
304
- options() {
305
- this.renderOptions = this.options;
306
- },
307
- },
308
- mounted() {
309
- this.selectedValue =
310
- this.value !== null && this.value[this.renderOptionName]
311
- ? this.value[this.renderOptionName]
312
- : this.value;
313
- },
314
- };
315
- </script>
1
+ <template>
2
+ <div>
3
+ <div class="flex w-full justify-between" v-if="label">
4
+ <div class="flex items-center">
5
+ <!-- label of select field -->
6
+ <label class="block text-sm font-medium text-gray-900">
7
+ {{ label }}
8
+ </label>
9
+ <!-- asterisk sign to render if field is required -->
10
+ <p v-if="isRequired" class="ml-1 text-red-600">*</p>
11
+ </div>
12
+ <span v-if="hint" class="text-sm text-gray-500">{{ hint }}</span>
13
+ </div>
14
+
15
+ <div class="relative" :class="label ? 'mt-1' : ''">
16
+ <input
17
+ type="text"
18
+ v-model="selectSearch"
19
+ @click="toggleDropdown = !toggleDropdown"
20
+ @focus="type == 'tertiary' ? (showFocus = true) : ''"
21
+ @blur="close()"
22
+ @keyup="search()"
23
+ aria-haspopup="listbox"
24
+ aria-expanded="true"
25
+ aria-labelledby="listbox-label"
26
+ :class="{ ...classes, [inputClasses]: true }"
27
+ class="relative w-full cursor-pointer rounded-md py-2 pl-3 pr-10 text-left text-sm focus:outline-none disabled:opacity-50 sm:text-sm"
28
+ :disabled="isDisabled"
29
+ autocomplete="off"
30
+ />
31
+
32
+ <div class="pointer-events-none absolute top-2 left-3 flex">
33
+ <span class="flex items-center" :style="selectedOptionStyles">
34
+ <c-avatar
35
+ v-if="showImage && !selectSearch && value && value.photo"
36
+ size="extraextrasmall"
37
+ :image="value.photo"
38
+ :rounded="true"
39
+ ></c-avatar>
40
+ <c-avatar
41
+ v-if="
42
+ showImage &&
43
+ !selectSearch &&
44
+ value &&
45
+ value.initials &&
46
+ value.type !== 'location'
47
+ "
48
+ size="extraextrasmall"
49
+ :nameInitials="value.initials"
50
+ :rounded="true"
51
+ ></c-avatar>
52
+ <c-icon
53
+ v-if="icon && !showImage"
54
+ :class="icon.class"
55
+ :name="icon.name"
56
+ :type="icon.type"
57
+ >
58
+ </c-icon>
59
+ <span :class="showImage ? 'ml-3' : ''" class="block truncate text-sm">
60
+ {{
61
+ selectedValue
62
+ ? selectedValue
63
+ : !selectSearch || selectSearch == ""
64
+ ? placeholder
65
+ : null
66
+ }}
67
+ </span>
68
+ </span>
69
+ </div>
70
+ <div class="pointer-events-none absolute top-2.5 right-3 flex">
71
+ <div
72
+ v-if="type == 'tertiary' ? showFocus : true"
73
+ class="pointer-events-none right-0 flex items-center"
74
+ >
75
+ <c-icon name="selector" type="solid" class="h-5 w-5"></c-icon>
76
+ </div>
77
+ </div>
78
+ <transition
79
+ enter-active-class="transition ease-out duration-100"
80
+ enter-class="transform opacity-0 scale-95"
81
+ enter-to-class="transform opacity-100 scale-100"
82
+ leave-active-class="transition ease-in duration-75"
83
+ leave-class="transform opacity-100 scale-100"
84
+ leave-to-class="transform opacity-0 scale-95"
85
+ >
86
+ <div
87
+ v-if="toggleDropdown && !isDisabled"
88
+ class="absolute z-10 mt-1 w-full rounded-md bg-white shadow-lg"
89
+ >
90
+ <ul
91
+ tabindex="-1"
92
+ role="listbox"
93
+ aria-labelledby="listbox-label"
94
+ class="max-h-60 overflow-auto rounded-md py-1 text-base ring-1 ring-gray-900 ring-opacity-5 focus:outline-none sm:text-sm"
95
+ >
96
+ <li
97
+ v-if="addAction"
98
+ @mousedown="actionEvent($event)"
99
+ class="relative flex cursor-pointer select-none py-2 pl-3 pr-9 text-indigo-500 hover:bg-indigo-100 hover:text-indigo-700"
100
+ >
101
+ <c-icon
102
+ type="outline"
103
+ class="mr-1 h-5 w-5 text-indigo-400 group-hover:text-indigo-500"
104
+ name="plus"
105
+ ></c-icon>
106
+ {{ addAction.label }}
107
+ </li>
108
+ <li
109
+ v-for="(option, index) in renderOptions"
110
+ :key="index"
111
+ id="listbox-option-0"
112
+ role="option"
113
+ @mousedown="handleSelect($event, option)"
114
+ class="relative cursor-pointer select-none py-2 pl-3 pr-9 text-gray-900 hover:bg-indigo-700 hover:text-white"
115
+ :class="option.isDisabled ? 'pointer-events-none opacity-50' : ''"
116
+ >
117
+ <span class="flex items-center">
118
+ <c-avatar
119
+ v-if="option.photo"
120
+ size="extraextrasmall"
121
+ :image="option.photo"
122
+ :rounded="true"
123
+ ></c-avatar>
124
+ <c-avatar
125
+ v-if="option.initials && option.type !== 'location'"
126
+ size="extraextrasmall"
127
+ :nameInitials="option.initials"
128
+ :rounded="true"
129
+ ></c-avatar>
130
+ <c-icon
131
+ v-if="icon && option.type === 'location'"
132
+ :class="icon.class"
133
+ :name="icon.name"
134
+ :type="icon.type"
135
+ >
136
+ </c-icon>
137
+ <span
138
+ :class="
139
+ (showImage && option.photo) || option.initials ? 'ml-3' : ''
140
+ "
141
+ class="list-options block break-words font-normal"
142
+ >{{ option[renderOptionName] }}
143
+ </span>
144
+ </span>
145
+
146
+ <span
147
+ class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600"
148
+ >
149
+ <c-icon
150
+ id="list-icon"
151
+ v-show="showSelectedValue"
152
+ name="check"
153
+ type="solid"
154
+ class="h-5 w-5"
155
+ ></c-icon>
156
+ </span>
157
+ </li>
158
+ </ul>
159
+ </div>
160
+ </transition>
161
+ <!-- validation error message -->
162
+ <p v-if="!isValidate" class="mt-2 text-left text-sm text-red-600">
163
+ {{ errorMessage }}
164
+ </p>
165
+ <p v-if="helpText" class="mt-2 text-sm text-gray-500">
166
+ {{ helpText }}
167
+ </p>
168
+ </div>
169
+ </div>
170
+ </template>
171
+ <script>
172
+ import CIcon from "../CIcon/CIcon.vue";
173
+ import CAvatar from "../CAvatar/CAvatar.vue";
174
+ import { isNumber } from "lodash";
175
+ export default {
176
+ name: "CSelect",
177
+ components: { CIcon, CAvatar },
178
+ props: {
179
+ // label of selectpicker
180
+ label: {
181
+ type: String,
182
+ },
183
+ // placeholder in selectpicker
184
+ placeholder: {
185
+ type: String,
186
+ },
187
+ // list to render in dropdown
188
+ options: {
189
+ type: Array,
190
+ required: true,
191
+ },
192
+ // text below dropdown to describe more about the field
193
+ helpText: {
194
+ type: String,
195
+ },
196
+ // text adjacent to label of dropdown to provide hint about field
197
+ hint: { type: String },
198
+ // to show if image is present along with dropdown option
199
+ showImage: { type: Boolean },
200
+ // whether the select field is mandatory or not
201
+ isRequired: {
202
+ type: Boolean,
203
+ },
204
+ // validation is passed or not
205
+ isValidate: { type: Boolean, default: true },
206
+ // will truncate the text in input field
207
+ selectedOptionStyles: {
208
+ type: String,
209
+ },
210
+ // validation error message
211
+ errorMessage: {
212
+ type: String,
213
+ },
214
+ // perform action on first option in dropdown
215
+ addAction: { type: Object },
216
+ // icons in dropdown list
217
+ icon: { type: Object },
218
+ // value to set as default option in dropdown
219
+ value: { type: [Object, String], default: null },
220
+ // type of dropdown - gray,tertiary or default
221
+ type: {
222
+ type: String,
223
+ },
224
+ // name of the field in array to that contains text to render in dropdown
225
+ renderOptionName: {
226
+ type: String,
227
+ default: "option",
228
+ },
229
+ // whether to disable the selectpicker
230
+ isDisabled: {
231
+ type: Boolean,
232
+ default: false,
233
+ },
234
+ inputClasses: {
235
+ type: String,
236
+ default: "",
237
+ },
238
+ },
239
+ data() {
240
+ return {
241
+ toggleDropdown: false,
242
+ selectedValue: null,
243
+ showSelectedValue: false,
244
+ showFocus: false,
245
+ selectSearch: null,
246
+ renderOptions: this.options,
247
+ };
248
+ },
249
+ computed: {
250
+ classes() {
251
+ return {
252
+ "text-gray-900 border border-gray-200 hover:bg-gray-200 bg-gray-100 focus:ring-2 focus:border-gray-200 focus:ring-gray-200 focus:ring-offset-2 shadow-sm":
253
+ this.type == "gray",
254
+ "bg-white border border-gray-200 hover:bg-indigo-100 text-indigo-600 hover:text-indigo-800 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-200":
255
+ this.type == "tertiary",
256
+ "border border-gray-300 focus:ring-indigo-500 focus:border-indigo-500 bg-white shadow-sm focus:ring-1":
257
+ this.type == null,
258
+ };
259
+ },
260
+ },
261
+ methods: {
262
+ handleSelect(event, option) {
263
+ this.selectSearch = null;
264
+ this.selectedValue = option[this.renderOptionName];
265
+ this.$emit("onChangeValue", option);
266
+ this.toggleDropdown = false;
267
+ },
268
+ actionEvent(event) {
269
+ this.$emit("listAction", event);
270
+ },
271
+ close() {
272
+ this.selectSearch = null;
273
+ this.toggleDropdown = false;
274
+ this.type === "tertiary" ? (this.showFocus = false) : "";
275
+ this.renderOptions = this.options;
276
+ },
277
+ search() {
278
+ this.selectedValue = null;
279
+ if (!this.selectSearch || this.selectSearch == "") {
280
+ this.renderOptions = this.options;
281
+ return;
282
+ }
283
+ let options = [...this.options];
284
+ this.renderOptions = options.filter((option) => {
285
+ isNumber(option[this.renderOptionName])
286
+ ? (option[this.renderOptionName] =
287
+ option[this.renderOptionName].toString())
288
+ : "";
289
+ return option[this.renderOptionName]
290
+ .toLowerCase()
291
+ .includes(this.selectSearch.toLowerCase());
292
+ });
293
+ },
294
+ },
295
+ watch: {
296
+ value() {
297
+ this.selectedValue =
298
+ this.value !== null && this.value[this.renderOptionName]
299
+ ? this.value[this.renderOptionName]
300
+ : this.value;
301
+ },
302
+ options() {
303
+ this.renderOptions = this.options;
304
+ },
305
+ },
306
+ mounted() {
307
+ this.selectedValue =
308
+ this.value !== null && this.value[this.renderOptionName]
309
+ ? this.value[this.renderOptionName]
310
+ : this.value;
311
+ },
312
+ };
313
+ </script>
@@ -1,3 +1,3 @@
1
- import CSelect from './CSelect.vue'
2
-
1
+ import CSelect from './CSelect.vue'
2
+
3
3
  export default CSelect