classcard-ui 0.2.487 → 0.2.488

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