classcard-ui 0.2.403 → 0.2.404

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 +70 -52
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.umd.js +70 -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 +79 -79
  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 +99 -99
  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 +142 -121
  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 +61 -61
  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 +116 -116
  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 +110 -110
  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 +318 -318
  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 +52 -52
  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 +271 -271
  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 +486 -486
  97. package/src/components/CTable/index.js +2 -2
  98. package/src/components/CTabs/CTabs.vue +109 -109
  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 +147 -147
  107. package/src/components/CUpload/index.js +2 -2
  108. package/src/components/index.js +47 -47
  109. package/src/icons.js +231 -231
  110. package/src/main.js +17 -17
  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,271 +1,271 @@
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"
27
- class="focus:outline-none relative w-full cursor-pointer rounded-md py-2 pl-3 pr-10 text-left 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="focus:outline-none max-h-60 overflow-auto rounded-md py-1 text-base ring-1 ring-gray-900 ring-opacity-5 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 class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600">
120
- <c-icon
121
- id="list-icon"
122
- v-show="showSelectedValue"
123
- name="check"
124
- type="solid"
125
- class="h-5 w-5"
126
- ></c-icon>
127
- </span>
128
- </li>
129
- </ul>
130
- </div>
131
- </transition>
132
- <!-- validation error message -->
133
- <p v-if="!isValidate" class="mt-2 text-left text-sm text-red-600">
134
- {{ errorMessage }}
135
- </p>
136
- <p v-if="helpText" class="mt-2 text-sm text-gray-500">
137
- {{ helpText }}
138
- </p>
139
- </div>
140
- </div>
141
- </template>
142
- <script>
143
- import CIcon from "../CIcon/CIcon.vue";
144
- import CAvatar from "../CAvatar/CAvatar.vue";
145
- import { isNumber } from "lodash";
146
- export default {
147
- name: "CSelect",
148
- components: { CIcon, CAvatar },
149
- props: {
150
- // label of selectpicker
151
- label: {
152
- type: String,
153
- },
154
- // placeholder in selectpicker
155
- placeholder: {
156
- type: String,
157
- },
158
- // list to render in dropdown
159
- options: {
160
- type: Array,
161
- required: true,
162
- },
163
- // text below dropdown to describe more about the field
164
- helpText: {
165
- type: String,
166
- },
167
- // text adjacent to label of dropdown to provide hint about field
168
- hint: { type: String },
169
- // to show if image is present along with dropdown option
170
- showImage: { type: Boolean },
171
- // whether the select field is mandatory or not
172
- isRequired: {
173
- type: Boolean,
174
- },
175
- // validation is passed or not
176
- isValidate: { type: Boolean },
177
- // will truncate the text in input field
178
- selectedOptionStyles: {
179
- type: String,
180
- },
181
- // validation error message
182
- errorMessage: {
183
- type: String,
184
- },
185
- // perform action on first option in dropdown
186
- addAction: { type: Object },
187
- // icons in dropdown list
188
- icon: { type: Object },
189
- // value to set as default option in dropdown
190
- value: { type: [Object, String], default: null },
191
- // type of dropdown - gray,tertiary or default
192
- type: {
193
- type: String,
194
- },
195
- // name of the field in array to that contains text to render in dropdown
196
- renderOptionName: {
197
- type: String,
198
- default: "option",
199
- },
200
- // whether to disable the selectpicker
201
- isDisabled: {
202
- type: Boolean,
203
- default: false,
204
- },
205
- },
206
- data() {
207
- return {
208
- toggleDropdown: false,
209
- selectedValue: this.value !== null && this.value.option ? this.value.option : this.value,
210
- showSelectedValue: false,
211
- showFocus: false,
212
- selectSearch: null,
213
- renderOptions: this.options,
214
- };
215
- },
216
- computed: {
217
- classes() {
218
- return {
219
- "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":
220
- this.type == "gray",
221
- "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":
222
- this.type == "tertiary",
223
- "border border-gray-300 focus:ring-indigo-500 focus:border-indigo-500 bg-white shadow-sm focus:ring-1":
224
- this.type == null,
225
- };
226
- },
227
- },
228
- methods: {
229
- handleSelect(event, option) {
230
- this.selectSearch = null;
231
- this.selectedValue = option[this.renderOptionName];
232
- this.$emit("onChangeValue", option);
233
- this.toggleDropdown = false;
234
- },
235
- actionEvent(event) {
236
- this.$emit("listAction", event);
237
- },
238
- close() {
239
- this.selectSearch = null;
240
- this.toggleDropdown = false;
241
- this.type === "tertiary" ? (this.showFocus = false) : "";
242
- this.renderOptions = this.options;
243
- },
244
- search() {
245
- this.selectedValue = null;
246
- if (!this.selectSearch && this.selectSearch == "") {
247
- this.renderOptions = this.options;
248
- return;
249
- }
250
- let options = [...this.options];
251
- this.renderOptions = options.filter((option) => {
252
- isNumber(option[this.renderOptionName])
253
- ? (option[this.renderOptionName] = option[this.renderOptionName].toString())
254
- : "";
255
- return option[this.renderOptionName]
256
- .toLowerCase()
257
- .includes(this.selectSearch.toLowerCase());
258
- });
259
- },
260
- },
261
- watch: {
262
- value() {
263
- this.selectedValue =
264
- this.value !== null && this.value.option ? this.value.option : this.value;
265
- },
266
- options() {
267
- this.renderOptions = this.options;
268
- },
269
- },
270
- };
271
- </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"
27
+ class="focus:outline-none relative w-full cursor-pointer rounded-md py-2 pl-3 pr-10 text-left 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="focus:outline-none max-h-60 overflow-auto rounded-md py-1 text-base ring-1 ring-gray-900 ring-opacity-5 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 class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600">
120
+ <c-icon
121
+ id="list-icon"
122
+ v-show="showSelectedValue"
123
+ name="check"
124
+ type="solid"
125
+ class="h-5 w-5"
126
+ ></c-icon>
127
+ </span>
128
+ </li>
129
+ </ul>
130
+ </div>
131
+ </transition>
132
+ <!-- validation error message -->
133
+ <p v-if="!isValidate" class="mt-2 text-left text-sm text-red-600">
134
+ {{ errorMessage }}
135
+ </p>
136
+ <p v-if="helpText" class="mt-2 text-sm text-gray-500">
137
+ {{ helpText }}
138
+ </p>
139
+ </div>
140
+ </div>
141
+ </template>
142
+ <script>
143
+ import CIcon from "../CIcon/CIcon.vue";
144
+ import CAvatar from "../CAvatar/CAvatar.vue";
145
+ import { isNumber } from "lodash";
146
+ export default {
147
+ name: "CSelect",
148
+ components: { CIcon, CAvatar },
149
+ props: {
150
+ // label of selectpicker
151
+ label: {
152
+ type: String,
153
+ },
154
+ // placeholder in selectpicker
155
+ placeholder: {
156
+ type: String,
157
+ },
158
+ // list to render in dropdown
159
+ options: {
160
+ type: Array,
161
+ required: true,
162
+ },
163
+ // text below dropdown to describe more about the field
164
+ helpText: {
165
+ type: String,
166
+ },
167
+ // text adjacent to label of dropdown to provide hint about field
168
+ hint: { type: String },
169
+ // to show if image is present along with dropdown option
170
+ showImage: { type: Boolean },
171
+ // whether the select field is mandatory or not
172
+ isRequired: {
173
+ type: Boolean,
174
+ },
175
+ // validation is passed or not
176
+ isValidate: { type: Boolean },
177
+ // will truncate the text in input field
178
+ selectedOptionStyles: {
179
+ type: String,
180
+ },
181
+ // validation error message
182
+ errorMessage: {
183
+ type: String,
184
+ },
185
+ // perform action on first option in dropdown
186
+ addAction: { type: Object },
187
+ // icons in dropdown list
188
+ icon: { type: Object },
189
+ // value to set as default option in dropdown
190
+ value: { type: [Object, String], default: null },
191
+ // type of dropdown - gray,tertiary or default
192
+ type: {
193
+ type: String,
194
+ },
195
+ // name of the field in array to that contains text to render in dropdown
196
+ renderOptionName: {
197
+ type: String,
198
+ default: "option",
199
+ },
200
+ // whether to disable the selectpicker
201
+ isDisabled: {
202
+ type: Boolean,
203
+ default: false,
204
+ },
205
+ },
206
+ data() {
207
+ return {
208
+ toggleDropdown: false,
209
+ selectedValue: this.value !== null && this.value.option ? this.value.option : this.value,
210
+ showSelectedValue: false,
211
+ showFocus: false,
212
+ selectSearch: null,
213
+ renderOptions: this.options,
214
+ };
215
+ },
216
+ computed: {
217
+ classes() {
218
+ return {
219
+ "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":
220
+ this.type == "gray",
221
+ "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":
222
+ this.type == "tertiary",
223
+ "border border-gray-300 focus:ring-indigo-500 focus:border-indigo-500 bg-white shadow-sm focus:ring-1":
224
+ this.type == null,
225
+ };
226
+ },
227
+ },
228
+ methods: {
229
+ handleSelect(event, option) {
230
+ this.selectSearch = null;
231
+ this.selectedValue = option[this.renderOptionName];
232
+ this.$emit("onChangeValue", option);
233
+ this.toggleDropdown = false;
234
+ },
235
+ actionEvent(event) {
236
+ this.$emit("listAction", event);
237
+ },
238
+ close() {
239
+ this.selectSearch = null;
240
+ this.toggleDropdown = false;
241
+ this.type === "tertiary" ? (this.showFocus = false) : "";
242
+ this.renderOptions = this.options;
243
+ },
244
+ search() {
245
+ this.selectedValue = null;
246
+ if (!this.selectSearch && this.selectSearch == "") {
247
+ this.renderOptions = this.options;
248
+ return;
249
+ }
250
+ let options = [...this.options];
251
+ this.renderOptions = options.filter((option) => {
252
+ isNumber(option[this.renderOptionName])
253
+ ? (option[this.renderOptionName] = option[this.renderOptionName].toString())
254
+ : "";
255
+ return option[this.renderOptionName]
256
+ .toLowerCase()
257
+ .includes(this.selectSearch.toLowerCase());
258
+ });
259
+ },
260
+ },
261
+ watch: {
262
+ value() {
263
+ this.selectedValue =
264
+ this.value !== null && this.value.option ? this.value.option : this.value;
265
+ },
266
+ options() {
267
+ this.renderOptions = this.options;
268
+ },
269
+ },
270
+ };
271
+ </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