classcard-ui 0.2.1069 → 0.2.1071

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 (190) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +62 -59
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.umd.js +62 -59
  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 +82 -82
  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 +96 -96
  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 +212 -212
  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 +152 -152
  25. package/src/components/CButton/index.js +2 -2
  26. package/src/components/CButtonGroup/CButtonGroup.vue +118 -118
  27. package/src/components/CButtonGroup/index.js +2 -2
  28. package/src/components/CButtonIcon/CButtonIcon.vue +117 -117
  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 +134 -134
  33. package/src/components/CButtonSelect/index.js +2 -2
  34. package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +135 -135
  35. package/src/components/CButtonSelectBorder/index.js +3 -3
  36. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +135 -135
  37. package/src/components/CButtonWithDropdown/index.js +2 -2
  38. package/src/components/CCalendar/CCalendar.vue +410 -410
  39. package/src/components/CCalendar/index.js +3 -3
  40. package/src/components/CCard/CCard.vue +49 -49
  41. package/src/components/CCard/index.js +2 -2
  42. package/src/components/CCheckbox/CCheckbox.vue +123 -123
  43. package/src/components/CCheckbox/index.js +2 -2
  44. package/src/components/CCircularButton/CCircularButton.vue +53 -53
  45. package/src/components/CCircularButton/index.js +2 -2
  46. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +101 -101
  47. package/src/components/CCollapsibleSection/index.js +2 -2
  48. package/src/components/CColorDots/CColorDots.vue +51 -51
  49. package/src/components/CColorDots/index.js +3 -3
  50. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +180 -180
  51. package/src/components/CConfirmActionModal/index.js +3 -3
  52. package/src/components/CDatepicker/CDatepicker.vue +201 -201
  53. package/src/components/CDatepicker/index.js +2 -2
  54. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  55. package/src/components/CDualSelect/index.js +2 -2
  56. package/src/components/CEditor/CEditor.vue +98 -98
  57. package/src/components/CEditor/index.js +2 -2
  58. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +53 -53
  59. package/src/components/CFormSectionHeading/index.js +2 -2
  60. package/src/components/CGroupedSelect/CGroupedSelect.vue +245 -245
  61. package/src/components/CGroupedSelect/index.js +3 -3
  62. package/src/components/CIcon/CIcon.vue +91 -91
  63. package/src/components/CIcon/index.js +2 -2
  64. package/src/components/CIconDropdown/CIconDropdown.vue +146 -146
  65. package/src/components/CIconDropdown/index.js +2 -2
  66. package/src/components/CInput/CInput.vue +134 -134
  67. package/src/components/CInput/index.js +2 -2
  68. package/src/components/CInputAddon/CInputAddon.vue +228 -228
  69. package/src/components/CInputAddon/index.js +2 -2
  70. package/src/components/CInputEmail/CInputEmail.vue +93 -93
  71. package/src/components/CInputEmail/index.js +2 -2
  72. package/src/components/CInsetTabs/CInsetTabs.vue +88 -88
  73. package/src/components/CInsetTabs/index.js +3 -3
  74. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  75. package/src/components/CModalHeading/index.js +2 -2
  76. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +70 -70
  77. package/src/components/CModuleHelpLinks/index.js +3 -3
  78. package/src/components/CMultiselect/CMultiselect.vue +615 -615
  79. package/src/components/CMultiselect/index.js +2 -2
  80. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  81. package/src/components/CMultiselectr/index.js +2 -2
  82. package/src/components/CPageHeading/CPageHeading.vue +56 -56
  83. package/src/components/CPageHeading/index.js +2 -2
  84. package/src/components/CPagination/CPagination.vue +233 -233
  85. package/src/components/CPagination/index.js +2 -2
  86. package/src/components/CPhoneNumber/CPhoneNumber.vue +114 -114
  87. package/src/components/CPhoneNumber/index.js +2 -2
  88. package/src/components/CProgress/CProgress.vue +57 -57
  89. package/src/components/CProgress/index.js +2 -2
  90. package/src/components/CRadio/CRadio.vue +126 -126
  91. package/src/components/CRadio/index.js +2 -2
  92. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  93. package/src/components/CRangeSlider/index.js +2 -2
  94. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  95. package/src/components/CReorderableStackedList/index.js +2 -2
  96. package/src/components/CSelect/CSelect.vue +539 -539
  97. package/src/components/CSelect/index.js +2 -2
  98. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  99. package/src/components/CSmallTimeline/index.js +2 -2
  100. package/src/components/CStackedList/CStackedList.vue +150 -150
  101. package/src/components/CStackedList/index.js +2 -2
  102. package/src/components/CStats/CStats.vue +116 -116
  103. package/src/components/CStats/index.js +2 -2
  104. package/src/components/CSwitch/CSwitch.vue +176 -176
  105. package/src/components/CSwitch/index.js +2 -2
  106. package/src/components/CTabLazy/CTabLazy.vue +63 -63
  107. package/src/components/CTabLazy/index.js +2 -2
  108. package/src/components/CTable/CTable.vue +671 -671
  109. package/src/components/CTable/index.js +2 -2
  110. package/src/components/CTabs/CTabs.vue +169 -169
  111. package/src/components/CTabs/index.js +2 -2
  112. package/src/components/CTag/CTag.vue +59 -59
  113. package/src/components/CTag/index.js +2 -2
  114. package/src/components/CTextarea/CTextarea.vue +107 -107
  115. package/src/components/CTextarea/index.js +2 -2
  116. package/src/components/CTimeline/CTimeline.vue +237 -237
  117. package/src/components/CTimeline/index.js +2 -2
  118. package/src/components/CUpload/CUpload.vue +267 -267
  119. package/src/components/CUpload/index.js +2 -2
  120. package/src/components/index.js +53 -53
  121. package/src/icons.js +459 -453
  122. package/src/main.js +22 -22
  123. package/src/stories/CAlerts.stories.js +37 -37
  124. package/src/stories/CAnchorTabs.stories.js +29 -29
  125. package/src/stories/CAnchorTag.stories.js +36 -36
  126. package/src/stories/CAvatar.stories.js +38 -38
  127. package/src/stories/CAvatarGroup.stories.js +100 -100
  128. package/src/stories/CBasicTable.stories.js +316 -316
  129. package/src/stories/CBreadcrumbs.stories.js +24 -24
  130. package/src/stories/CButton.stories.js +47 -47
  131. package/src/stories/CButtonGroup.stories.js +33 -33
  132. package/src/stories/CButtonIcon.stories.js +27 -27
  133. package/src/stories/CButtonLink.stories.js +24 -24
  134. package/src/stories/CButtonSelect.stories.js +41 -41
  135. package/src/stories/CButtonSelectBorder.stories.js +48 -48
  136. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  137. package/src/stories/CCalendar.stories.js +16 -16
  138. package/src/stories/CCard.stories.js +30 -30
  139. package/src/stories/CCheckbox.stories.js +29 -29
  140. package/src/stories/CCircularButton.stories.js +29 -29
  141. package/src/stories/CCollapsibleSection.stories.js +28 -28
  142. package/src/stories/CColorDots.stories.js +28 -28
  143. package/src/stories/CConfirmActionModal.stories.js +59 -59
  144. package/src/stories/CDatepicker.stories.js +30 -30
  145. package/src/stories/CDualSelect.stories.js +29 -29
  146. package/src/stories/CEditor.stories.js +30 -30
  147. package/src/stories/CFormSectionHeading.stories.js +34 -34
  148. package/src/stories/CGroupedSelect.stories.js +71 -71
  149. package/src/stories/CIcon.stories.js +28 -28
  150. package/src/stories/CIconDropdown.stories.js +45 -45
  151. package/src/stories/CInput.stories.js +36 -36
  152. package/src/stories/CInputAddon.stories.js +37 -37
  153. package/src/stories/CInputEmail.stories.js +27 -27
  154. package/src/stories/CInsetTabs.stories.js +38 -38
  155. package/src/stories/CModalHeading.stories.js +25 -25
  156. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  157. package/src/stories/CMultiselect.stories.js +167 -167
  158. package/src/stories/CMultiselectr.stories.js +23 -23
  159. package/src/stories/CPageHeading.stories.js +32 -32
  160. package/src/stories/CPagination.stories.js +30 -30
  161. package/src/stories/CPhoneNumber.stories.js +29 -29
  162. package/src/stories/CProgress.stories.js +23 -23
  163. package/src/stories/CRadio.stories.js +36 -36
  164. package/src/stories/CRangeSlider.stories.js +23 -23
  165. package/src/stories/CReorderableStackedList.stories.js +23 -23
  166. package/src/stories/CSelect.stories.js +109 -109
  167. package/src/stories/CSmallTimeline.stories.js +26 -26
  168. package/src/stories/CStackedList.stories.js +37 -37
  169. package/src/stories/CStats.stories.js +33 -33
  170. package/src/stories/CSwitch.stories.js +28 -28
  171. package/src/stories/CTabLazy.stories.js +26 -26
  172. package/src/stories/CTable.stories.js +169 -169
  173. package/src/stories/CTabs.stories.js +36 -36
  174. package/src/stories/CTag.stories.js +34 -34
  175. package/src/stories/CTextarea.stories.js +32 -32
  176. package/src/stories/CTimeline.stories.js +26 -26
  177. package/src/stories/CUpload.stories.js +36 -36
  178. package/src/stories/Introduction.stories.mdx +207 -207
  179. package/src/stories/Page.vue +88 -88
  180. package/src/stories/assets/code-brackets.svg +0 -0
  181. package/src/stories/assets/colors.svg +0 -0
  182. package/src/stories/assets/comments.svg +0 -0
  183. package/src/stories/assets/direction.svg +0 -0
  184. package/src/stories/assets/flow.svg +0 -0
  185. package/src/stories/assets/plugin.svg +0 -0
  186. package/src/stories/assets/repo.svg +0 -0
  187. package/src/stories/assets/stackalt.svg +0 -0
  188. package/src/stories/header.css +26 -26
  189. package/src/stories/page.css +69 -69
  190. package/src/stories/utils.css +17 -17
@@ -1,53 +1,53 @@
1
- <template>
2
- <div>
3
- <div :class="classes" class="border-gray-200">
4
- <div class="flex items-center justify-between">
5
- <div>
6
- <h3 class="text-base font-semibold text-gray-900">
7
- {{ heading }}
8
- </h3>
9
- <p v-if="description" class="max-w-4xl text-sm text-gray-500">
10
- {{ description }}
11
- </p>
12
- </div>
13
- <c-button
14
- v-if="tabAction"
15
- :type="tabAction.type"
16
- :label="tabAction.label"
17
- :icon="tabAction.icon"
18
- @action="emitTabAction"
19
- ></c-button>
20
- <c-anchor-tag v-if="tabLink" :label="tabLink.label" :action="emitTabLink"></c-anchor-tag>
21
- </div>
22
- </div>
23
- </div>
24
- </template>
25
- <script>
26
- import CAnchorTag from "../CAnchorTag/CAnchorTag.vue";
27
- import CButton from "../CButton/CButton.vue";
28
- export default {
29
- name: "CFormSectionHeading",
30
- components: { CButton, CAnchorTag },
31
- props: {
32
- heading: { type: String, required: true },
33
- description: { type: String },
34
- divider: { type: Boolean },
35
- tabAction: { type: Object },
36
- tabLink: { type: Object },
37
- actionEvent: {
38
- type: Function,
39
- },
40
- classes: {
41
- type: String,
42
- },
43
- },
44
- methods: {
45
- emitTabAction() {
46
- this.$emit("actionEvent");
47
- },
48
- emitTabLink() {
49
- this.$emit("actionEvent");
50
- },
51
- },
52
- };
53
- </script>
1
+ <template>
2
+ <div>
3
+ <div :class="classes" class="border-gray-200">
4
+ <div class="flex items-center justify-between">
5
+ <div>
6
+ <h3 class="text-base font-semibold text-gray-900">
7
+ {{ heading }}
8
+ </h3>
9
+ <p v-if="description" class="max-w-4xl text-sm text-gray-500">
10
+ {{ description }}
11
+ </p>
12
+ </div>
13
+ <c-button
14
+ v-if="tabAction"
15
+ :type="tabAction.type"
16
+ :label="tabAction.label"
17
+ :icon="tabAction.icon"
18
+ @action="emitTabAction"
19
+ ></c-button>
20
+ <c-anchor-tag v-if="tabLink" :label="tabLink.label" :action="emitTabLink"></c-anchor-tag>
21
+ </div>
22
+ </div>
23
+ </div>
24
+ </template>
25
+ <script>
26
+ import CAnchorTag from "../CAnchorTag/CAnchorTag.vue";
27
+ import CButton from "../CButton/CButton.vue";
28
+ export default {
29
+ name: "CFormSectionHeading",
30
+ components: { CButton, CAnchorTag },
31
+ props: {
32
+ heading: { type: String, required: true },
33
+ description: { type: String },
34
+ divider: { type: Boolean },
35
+ tabAction: { type: Object },
36
+ tabLink: { type: Object },
37
+ actionEvent: {
38
+ type: Function,
39
+ },
40
+ classes: {
41
+ type: String,
42
+ },
43
+ },
44
+ methods: {
45
+ emitTabAction() {
46
+ this.$emit("actionEvent");
47
+ },
48
+ emitTabLink() {
49
+ this.$emit("actionEvent");
50
+ },
51
+ },
52
+ };
53
+ </script>
@@ -1,3 +1,3 @@
1
- import CFormSectionHeading from './CFormSectionHeading.vue'
2
-
1
+ import CFormSectionHeading from './CFormSectionHeading.vue'
2
+
3
3
  export default CFormSectionHeading
@@ -1,245 +1,245 @@
1
- <template>
2
- <div>
3
- <div
4
- v-if="showDropDown && options.length > 0"
5
- class="fixed inset-0"
6
- @click="closeDropDown(false)"
7
- aria-hidden="true"
8
- ></div>
9
- <label v-if="label" class="block text-sm font-medium text-gray-700">
10
- {{ label }}
11
- </label>
12
- <div class="relative mt-1">
13
- <div class="relative">
14
- <input
15
- type="text"
16
- class="relative w-full cursor-default rounded-md border border-gray-300 bg-white py-2 pl-3 pr-10 text-left shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 disabled:pointer-events-none disabled:opacity-50 sm:text-sm"
17
- aria-haspopup="listbox"
18
- aria-expanded="true"
19
- aria-labelledby="listbox-label"
20
- :value="inputValue"
21
- :placeholder="placeholder"
22
- @focus="openDropDown()"
23
- @input="onInput"
24
- :disabled="disabled"
25
- />
26
- <span
27
- class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"
28
- >
29
- <svg
30
- class="h-5 w-5 animate-spin text-gray-400"
31
- xmlns="http://www.w3.org/2000/svg"
32
- fill="none"
33
- viewBox="0 0 24 24"
34
- v-if="isSearching"
35
- >
36
- <circle
37
- class="opacity-25"
38
- cx="12"
39
- cy="12"
40
- r="10"
41
- stroke="currentColor"
42
- stroke-width="4"
43
- ></circle>
44
- <path
45
- class="opacity-75"
46
- fill="currentColor"
47
- d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
48
- ></path>
49
- </svg>
50
- <!-- Heroicon name: solid/selector -->
51
- <svg
52
- class="h-5 w-5 text-gray-400"
53
- xmlns="http://www.w3.org/2000/svg"
54
- viewBox="0 0 20 20"
55
- fill="currentColor"
56
- aria-hidden="true"
57
- v-if="!isSearching"
58
- >
59
- <path
60
- fill-rule="evenodd"
61
- d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z"
62
- clip-rule="evenodd"
63
- />
64
- </svg>
65
- </span>
66
- </div>
67
- <!--
68
- Select popover, show/hide based on select state.
69
-
70
- Entering: ""
71
- From: ""
72
- To: ""
73
- Leaving: "transition ease-in duration-100"
74
- From: "opacity-100"
75
- To: "opacity-0"
76
- -->
77
- <ul
78
- class="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm"
79
- tabindex="-1"
80
- role="listbox"
81
- aria-labelledby="listbox-label"
82
- aria-activedescendant="listbox-option-3"
83
- v-if="showDropDown && options.length > 0"
84
- >
85
- <!--
86
- Select option, manage highlight styles based on mouseenter/mouseleave and keyboard navigation.
87
-
88
- Highlighted: "text-white bg-indigo-600", Not Highlighted: "text-gray-900"
89
- -->
90
-
91
- <span v-for="option in options" :key="option.id">
92
- <li
93
- class="relative cursor-default select-none bg-gray-100 py-2 pl-3 pr-9 text-left text-xs font-semibold text-gray-900"
94
- role="option"
95
- >
96
- <span class="block truncate"> {{ option.label }} </span>
97
- </li>
98
- <li
99
- class="group group relative cursor-default select-none py-2 pl-3 pr-9 text-left text-gray-900 hover:bg-indigo-600 hover:text-white"
100
- v-for="subOption in option.options"
101
- :key="subOption.id"
102
- role="option"
103
- @click="handleOptionClick(subOption)"
104
- >
105
- <!-- Selected: "font-semibold", Not Selected: "font-normal" -->
106
- <span
107
- class="flex"
108
- :class="[
109
- subOption[keyField] === value[keyField]
110
- ? 'font-semibold'
111
- : 'font-normal',
112
- ' block break-words',
113
- ]"
114
- >
115
- {{ subOption.label }}
116
- <span
117
- v-if="subOption.labelExtra"
118
- class="ml-1 text-sm text-gray-400 group-hover:text-white"
119
- >{{ subOption.labelExtra }}</span
120
- >
121
- <div
122
- v-if="
123
- subOption.stock_level ||
124
- (subOption.stock_level <= 0 && subOption.stock_level !== null)
125
- "
126
- >
127
- <p
128
- class="ml-2 text-sm"
129
- :class="[quantityLabelColor(subOption)]"
130
- >
131
- {{ subOption.stock_level }} units
132
- </p>
133
- </div>
134
- </span>
135
-
136
- <!--
137
- Checkmark, only display for selected option.
138
-
139
- Highlighted: "text-white", Not Highlighted: "text-indigo-600"
140
- -->
141
- <span
142
- class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600 group-hover:text-white"
143
- v-if="subOption[keyField] === value[keyField]"
144
- >
145
- <!-- Heroicon name: solid/check -->
146
- <svg
147
- class="h-5 w-5"
148
- xmlns="http://www.w3.org/2000/svg"
149
- viewBox="0 0 20 20"
150
- fill="currentColor"
151
- aria-hidden="true"
152
- >
153
- <path
154
- fill-rule="evenodd"
155
- d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
156
- clip-rule="evenodd"
157
- />
158
- </svg>
159
- </span>
160
- </li>
161
- </span>
162
-
163
- <!-- More items... -->
164
- </ul>
165
- </div>
166
- <p v-if="isError" class="mt-2 text-left text-sm text-red-600">
167
- {{ errorMessage }}
168
- </p>
169
- </div>
170
- </template>
171
-
172
- <script>
173
- import { debounce } from "lodash-es";
174
-
175
- export default {
176
- name: "CGroupedSelect",
177
- props: {
178
- label: String,
179
- options: Array,
180
- value: Object,
181
- placeholder: String,
182
- isSearching: Boolean,
183
- disabled: { type: Boolean, default: false },
184
- isError: { type: Boolean, default: false },
185
- errorMessage: {
186
- type: String,
187
- default: "This field cannot be empty",
188
- },
189
- keyField: { type: String, default: "label" },
190
- },
191
- data() {
192
- return {
193
- showDropDown: false,
194
- inputValue: "",
195
- };
196
- },
197
- methods: {
198
- onInput(e) {
199
- this.inputValue = e.target.value;
200
- this.emitSearch(e.target.value);
201
- },
202
- emitSearch: debounce(function (value) {
203
- if (value !== this.value.label) {
204
- this.$emit("search", value);
205
- } else {
206
- this.$emit("search", "");
207
- }
208
- }, 500),
209
- handleOptionClick(option) {
210
- this.inputValue = option.label;
211
- this.closeDropDown(true);
212
- this.$emit("input", option);
213
- },
214
- closeDropDown(hasData) {
215
- this.inputValue = this.value.label;
216
- this.showDropDown = false;
217
- this.$emit("blur", { hasData: hasData });
218
- },
219
- openDropDown() {
220
- this.showDropDown = true;
221
- this.emitSearch("");
222
- },
223
- quantityLabelColor(data) {
224
- console.log("test");
225
- if (data.stock_level <= 0) {
226
- return "text-red-300";
227
- } else if (data.stock_level < data.alert_level) {
228
- return "text-orange-300";
229
- } else {
230
- return "text-gray-300";
231
- }
232
- },
233
- },
234
- watch: {
235
- value(newValue) {
236
- this.inputValue = newValue.label;
237
- },
238
- },
239
- mounted() {
240
- this.inputValue = this.value.label;
241
- },
242
- };
243
- </script>
244
-
245
- <style></style>
1
+ <template>
2
+ <div>
3
+ <div
4
+ v-if="showDropDown && options.length > 0"
5
+ class="fixed inset-0"
6
+ @click="closeDropDown(false)"
7
+ aria-hidden="true"
8
+ ></div>
9
+ <label v-if="label" class="block text-sm font-medium text-gray-700">
10
+ {{ label }}
11
+ </label>
12
+ <div class="relative mt-1">
13
+ <div class="relative">
14
+ <input
15
+ type="text"
16
+ class="relative w-full cursor-default rounded-md border border-gray-300 bg-white py-2 pl-3 pr-10 text-left shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 disabled:pointer-events-none disabled:opacity-50 sm:text-sm"
17
+ aria-haspopup="listbox"
18
+ aria-expanded="true"
19
+ aria-labelledby="listbox-label"
20
+ :value="inputValue"
21
+ :placeholder="placeholder"
22
+ @focus="openDropDown()"
23
+ @input="onInput"
24
+ :disabled="disabled"
25
+ />
26
+ <span
27
+ class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"
28
+ >
29
+ <svg
30
+ class="h-5 w-5 animate-spin text-gray-400"
31
+ xmlns="http://www.w3.org/2000/svg"
32
+ fill="none"
33
+ viewBox="0 0 24 24"
34
+ v-if="isSearching"
35
+ >
36
+ <circle
37
+ class="opacity-25"
38
+ cx="12"
39
+ cy="12"
40
+ r="10"
41
+ stroke="currentColor"
42
+ stroke-width="4"
43
+ ></circle>
44
+ <path
45
+ class="opacity-75"
46
+ fill="currentColor"
47
+ d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
48
+ ></path>
49
+ </svg>
50
+ <!-- Heroicon name: solid/selector -->
51
+ <svg
52
+ class="h-5 w-5 text-gray-400"
53
+ xmlns="http://www.w3.org/2000/svg"
54
+ viewBox="0 0 20 20"
55
+ fill="currentColor"
56
+ aria-hidden="true"
57
+ v-if="!isSearching"
58
+ >
59
+ <path
60
+ fill-rule="evenodd"
61
+ d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z"
62
+ clip-rule="evenodd"
63
+ />
64
+ </svg>
65
+ </span>
66
+ </div>
67
+ <!--
68
+ Select popover, show/hide based on select state.
69
+
70
+ Entering: ""
71
+ From: ""
72
+ To: ""
73
+ Leaving: "transition ease-in duration-100"
74
+ From: "opacity-100"
75
+ To: "opacity-0"
76
+ -->
77
+ <ul
78
+ class="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-white py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm"
79
+ tabindex="-1"
80
+ role="listbox"
81
+ aria-labelledby="listbox-label"
82
+ aria-activedescendant="listbox-option-3"
83
+ v-if="showDropDown && options.length > 0"
84
+ >
85
+ <!--
86
+ Select option, manage highlight styles based on mouseenter/mouseleave and keyboard navigation.
87
+
88
+ Highlighted: "text-white bg-indigo-600", Not Highlighted: "text-gray-900"
89
+ -->
90
+
91
+ <span v-for="option in options" :key="option.id">
92
+ <li
93
+ class="relative cursor-default select-none bg-gray-100 py-2 pl-3 pr-9 text-left text-xs font-semibold text-gray-900"
94
+ role="option"
95
+ >
96
+ <span class="block truncate"> {{ option.label }} </span>
97
+ </li>
98
+ <li
99
+ class="group group relative cursor-default select-none py-2 pl-3 pr-9 text-left text-gray-900 hover:bg-indigo-600 hover:text-white"
100
+ v-for="subOption in option.options"
101
+ :key="subOption.id"
102
+ role="option"
103
+ @click="handleOptionClick(subOption)"
104
+ >
105
+ <!-- Selected: "font-semibold", Not Selected: "font-normal" -->
106
+ <span
107
+ class="flex"
108
+ :class="[
109
+ subOption[keyField] === value[keyField]
110
+ ? 'font-semibold'
111
+ : 'font-normal',
112
+ ' block break-words',
113
+ ]"
114
+ >
115
+ {{ subOption.label }}
116
+ <span
117
+ v-if="subOption.labelExtra"
118
+ class="ml-1 text-sm text-gray-400 group-hover:text-white"
119
+ >{{ subOption.labelExtra }}</span
120
+ >
121
+ <div
122
+ v-if="
123
+ subOption.stock_level ||
124
+ (subOption.stock_level <= 0 && subOption.stock_level !== null)
125
+ "
126
+ >
127
+ <p
128
+ class="ml-2 text-sm"
129
+ :class="[quantityLabelColor(subOption)]"
130
+ >
131
+ {{ subOption.stock_level }} units
132
+ </p>
133
+ </div>
134
+ </span>
135
+
136
+ <!--
137
+ Checkmark, only display for selected option.
138
+
139
+ Highlighted: "text-white", Not Highlighted: "text-indigo-600"
140
+ -->
141
+ <span
142
+ class="absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600 group-hover:text-white"
143
+ v-if="subOption[keyField] === value[keyField]"
144
+ >
145
+ <!-- Heroicon name: solid/check -->
146
+ <svg
147
+ class="h-5 w-5"
148
+ xmlns="http://www.w3.org/2000/svg"
149
+ viewBox="0 0 20 20"
150
+ fill="currentColor"
151
+ aria-hidden="true"
152
+ >
153
+ <path
154
+ fill-rule="evenodd"
155
+ d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z"
156
+ clip-rule="evenodd"
157
+ />
158
+ </svg>
159
+ </span>
160
+ </li>
161
+ </span>
162
+
163
+ <!-- More items... -->
164
+ </ul>
165
+ </div>
166
+ <p v-if="isError" class="mt-2 text-left text-sm text-red-600">
167
+ {{ errorMessage }}
168
+ </p>
169
+ </div>
170
+ </template>
171
+
172
+ <script>
173
+ import { debounce } from "lodash-es";
174
+
175
+ export default {
176
+ name: "CGroupedSelect",
177
+ props: {
178
+ label: String,
179
+ options: Array,
180
+ value: Object,
181
+ placeholder: String,
182
+ isSearching: Boolean,
183
+ disabled: { type: Boolean, default: false },
184
+ isError: { type: Boolean, default: false },
185
+ errorMessage: {
186
+ type: String,
187
+ default: "This field cannot be empty",
188
+ },
189
+ keyField: { type: String, default: "label" },
190
+ },
191
+ data() {
192
+ return {
193
+ showDropDown: false,
194
+ inputValue: "",
195
+ };
196
+ },
197
+ methods: {
198
+ onInput(e) {
199
+ this.inputValue = e.target.value;
200
+ this.emitSearch(e.target.value);
201
+ },
202
+ emitSearch: debounce(function (value) {
203
+ if (value !== this.value.label) {
204
+ this.$emit("search", value);
205
+ } else {
206
+ this.$emit("search", "");
207
+ }
208
+ }, 500),
209
+ handleOptionClick(option) {
210
+ this.inputValue = option.label;
211
+ this.closeDropDown(true);
212
+ this.$emit("input", option);
213
+ },
214
+ closeDropDown(hasData) {
215
+ this.inputValue = this.value.label;
216
+ this.showDropDown = false;
217
+ this.$emit("blur", { hasData: hasData });
218
+ },
219
+ openDropDown() {
220
+ this.showDropDown = true;
221
+ this.emitSearch("");
222
+ },
223
+ quantityLabelColor(data) {
224
+ console.log("test");
225
+ if (data.stock_level <= 0) {
226
+ return "text-red-300";
227
+ } else if (data.stock_level < data.alert_level) {
228
+ return "text-orange-300";
229
+ } else {
230
+ return "text-gray-300";
231
+ }
232
+ },
233
+ },
234
+ watch: {
235
+ value(newValue) {
236
+ this.inputValue = newValue.label;
237
+ },
238
+ },
239
+ mounted() {
240
+ this.inputValue = this.value.label;
241
+ },
242
+ };
243
+ </script>
244
+
245
+ <style></style>
@@ -1,3 +1,3 @@
1
- import CGroupedSelect from "./CGroupedSelect.vue";
2
-
3
- export default CGroupedSelect;
1
+ import CGroupedSelect from "./CGroupedSelect.vue";
2
+
3
+ export default CGroupedSelect;