classcard-ui 0.2.1502 → 0.2.1503-beta.1

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 (217) hide show
  1. package/README.md +24 -24
  2. package/dist/classcard-ui.common.js +105 -94
  3. package/dist/classcard-ui.common.js.map +1 -1
  4. package/dist/classcard-ui.css +1 -1
  5. package/dist/classcard-ui.umd.js +105 -94
  6. package/dist/classcard-ui.umd.js.map +1 -1
  7. package/dist/classcard-ui.umd.min.js +1 -1
  8. package/dist/classcard-ui.umd.min.js.map +1 -1
  9. package/package.json +84 -84
  10. package/src/App.vue +16 -16
  11. package/src/colorConfig.js +52 -52
  12. package/src/components/CAlertModal/CAlertModal.vue +181 -181
  13. package/src/components/CAlertModal/index.js +3 -3
  14. package/src/components/CAlerts/CAlerts.vue +114 -114
  15. package/src/components/CAlerts/index.js +2 -2
  16. package/src/components/CAnchorTabs/CAnchorTabs.vue +100 -100
  17. package/src/components/CAnchorTabs/index.js +2 -2
  18. package/src/components/CAnchorTag/CAnchorTag.vue +84 -84
  19. package/src/components/CAnchorTag/index.js +2 -2
  20. package/src/components/CAvatar/CAvatar.vue +232 -232
  21. package/src/components/CAvatar/index.js +2 -2
  22. package/src/components/CAvatarGroup/CAvatarGroup.vue +213 -213
  23. package/src/components/CAvatarGroup/index.js +2 -2
  24. package/src/components/CBasicTable/CBasicTable.vue +184 -184
  25. package/src/components/CBasicTable/index.js +2 -2
  26. package/src/components/CBreadcrumbs/CBreadcrumbs.vue +38 -38
  27. package/src/components/CBreadcrumbs/index.js +2 -2
  28. package/src/components/CButton/CButton.vue +239 -239
  29. package/src/components/CButton/index.js +2 -2
  30. package/src/components/CButtonGroup/CButtonGroup.vue +155 -155
  31. package/src/components/CButtonGroup/index.js +2 -2
  32. package/src/components/CButtonIcon/CButtonIcon.vue +166 -166
  33. package/src/components/CButtonIcon/index.js +2 -2
  34. package/src/components/CButtonLink/CButtonLink.vue +43 -43
  35. package/src/components/CButtonLink/index.js +2 -2
  36. package/src/components/CButtonSelect/CButtonSelect.vue +186 -186
  37. package/src/components/CButtonSelect/index.js +2 -2
  38. package/src/components/CButtonSelectBorder/CButtonSelectBorder.vue +265 -265
  39. package/src/components/CButtonSelectBorder/index.js +3 -3
  40. package/src/components/CButtonWithDropdown/CButtonWithDropdown.vue +208 -208
  41. package/src/components/CButtonWithDropdown/index.js +2 -2
  42. package/src/components/CCalendar/CCalendar.vue +443 -443
  43. package/src/components/CCalendar/index.js +3 -3
  44. package/src/components/CCard/CCard.vue +53 -53
  45. package/src/components/CCard/index.js +2 -2
  46. package/src/components/CCheckbox/CCheckbox.vue +200 -200
  47. package/src/components/CCheckbox/index.js +2 -2
  48. package/src/components/CCircularButton/CCircularButton.vue +57 -57
  49. package/src/components/CCircularButton/index.js +2 -2
  50. package/src/components/CCollapsibleSection/CCollapsibleSection.vue +121 -121
  51. package/src/components/CCollapsibleSection/index.js +2 -2
  52. package/src/components/CColorDots/CColorDots.vue +52 -52
  53. package/src/components/CColorDots/index.js +3 -3
  54. package/src/components/CConfirmActionModal/CConfirmActionModal.vue +290 -290
  55. package/src/components/CConfirmActionModal/index.js +3 -3
  56. package/src/components/CDatepicker/CDatepicker.vue +235 -235
  57. package/src/components/CDatepicker/index.js +2 -2
  58. package/src/components/CDualSelect/CDualSelect.vue +193 -193
  59. package/src/components/CDualSelect/index.js +2 -2
  60. package/src/components/CEditor/CEditor.vue +137 -137
  61. package/src/components/CEditor/index.js +6 -6
  62. package/src/components/CEditor/quill-font-setup.js +133 -133
  63. package/src/components/CFormSectionHeading/CFormSectionHeading.vue +76 -76
  64. package/src/components/CFormSectionHeading/index.js +2 -2
  65. package/src/components/CGroupedFilterDropdown/CGroupedFilterDropdown.vue +331 -331
  66. package/src/components/CGroupedFilterDropdown/index.js +2 -2
  67. package/src/components/CGroupedSelect/CGroupedSelect.vue +393 -393
  68. package/src/components/CGroupedSelect/index.js +3 -3
  69. package/src/components/CIcon/CIcon.vue +112 -112
  70. package/src/components/CIcon/index.js +2 -2
  71. package/src/components/CIconDropdown/CIconDropdown.vue +206 -206
  72. package/src/components/CIconDropdown/index.js +2 -2
  73. package/src/components/CIconSelect/CIconSelect.vue +182 -182
  74. package/src/components/CIconSelect/index.js +3 -3
  75. package/src/components/CInput/CInput.vue +173 -173
  76. package/src/components/CInput/index.js +2 -2
  77. package/src/components/CInputAddon/CInputAddon.vue +297 -297
  78. package/src/components/CInputAddon/index.js +2 -2
  79. package/src/components/CInputEmail/CInputEmail.vue +107 -107
  80. package/src/components/CInputEmail/index.js +2 -2
  81. package/src/components/CInsetTabs/CInsetTabs.vue +222 -222
  82. package/src/components/CInsetTabs/index.js +3 -3
  83. package/src/components/CLinearProgressBar/CLinearProgressBar.vue +35 -35
  84. package/src/components/CLinearProgressBar/index.js +2 -2
  85. package/src/components/CModalHeading/CModalHeading.vue +22 -22
  86. package/src/components/CModalHeading/index.js +2 -2
  87. package/src/components/CModuleHelpLinks/CModuleHelpLinks.vue +88 -88
  88. package/src/components/CModuleHelpLinks/index.js +3 -3
  89. package/src/components/CMultiselect/CMultiselect.vue +1314 -1314
  90. package/src/components/CMultiselect/index.js +2 -2
  91. package/src/components/CMultiselectr/CMultiselectr.vue +44 -44
  92. package/src/components/CMultiselectr/index.js +2 -2
  93. package/src/components/CPageHeading/CPageHeading.vue +83 -83
  94. package/src/components/CPageHeading/index.js +2 -2
  95. package/src/components/CPagination/CPagination.vue +239 -239
  96. package/src/components/CPagination/index.js +2 -2
  97. package/src/components/CPhoneNumber/CPhoneNumber.vue +213 -213
  98. package/src/components/CPhoneNumber/index.js +2 -2
  99. package/src/components/CProgress/CProgress.vue +91 -91
  100. package/src/components/CProgress/index.js +2 -2
  101. package/src/components/CRadio/CRadio.vue +197 -197
  102. package/src/components/CRadio/index.js +2 -2
  103. package/src/components/CRadioGroup/CRadioGroup.vue +96 -96
  104. package/src/components/CRadioGroup/index.js +2 -2
  105. package/src/components/CRangeSlider/CRangeSlider.vue +55 -55
  106. package/src/components/CRangeSlider/index.js +2 -2
  107. package/src/components/CReorderableStackedList/CReorderableStackedList.vue +94 -94
  108. package/src/components/CReorderableStackedList/index.js +2 -2
  109. package/src/components/CSelect/CSelect.vue +1216 -1216
  110. package/src/components/CSelect/index.js +2 -2
  111. package/src/components/CSmallTimeline/CSmallTimeline.vue +40 -40
  112. package/src/components/CSmallTimeline/index.js +2 -2
  113. package/src/components/CStackedList/CStackedList.vue +162 -162
  114. package/src/components/CStackedList/index.js +2 -2
  115. package/src/components/CStats/CStats.vue +157 -157
  116. package/src/components/CStats/index.js +2 -2
  117. package/src/components/CSwitch/CSwitch.vue +200 -200
  118. package/src/components/CSwitch/index.js +2 -2
  119. package/src/components/CTabLazy/CTabLazy.vue +83 -83
  120. package/src/components/CTabLazy/index.js +2 -2
  121. package/src/components/CTable/CTable.vue +1114 -1114
  122. package/src/components/CTable/index.js +2 -2
  123. package/src/components/CTabs/CTabs.vue +250 -250
  124. package/src/components/CTabs/index.js +2 -2
  125. package/src/components/CTag/CTag.vue +109 -109
  126. package/src/components/CTag/index.js +2 -2
  127. package/src/components/CTextarea/CTextarea.vue +118 -118
  128. package/src/components/CTextarea/index.js +2 -2
  129. package/src/components/CTimeline/CTimeline.vue +237 -237
  130. package/src/components/CTimeline/index.js +2 -2
  131. package/src/components/CTokenEditor/CTokenEditor.vue +804 -804
  132. package/src/components/CTokenEditor/index.js +3 -3
  133. package/src/components/CToolTip/CToolTip.vue +108 -108
  134. package/src/components/CToolTip/index.js +3 -3
  135. package/src/components/CUpload/CUpload.vue +341 -332
  136. package/src/components/CUpload/index.js +2 -2
  137. package/src/components/NumberAnimator.vue +112 -112
  138. package/src/components/index.js +60 -60
  139. package/src/helper.js +8 -8
  140. package/src/icons.js +850 -850
  141. package/src/main.js +22 -22
  142. package/src/stories/CAlertModal.stories.js +30 -30
  143. package/src/stories/CAlerts.stories.js +39 -39
  144. package/src/stories/CAnchorTabs.stories.js +29 -29
  145. package/src/stories/CAnchorTag.stories.js +38 -38
  146. package/src/stories/CAvatar.stories.js +38 -38
  147. package/src/stories/CAvatarGroup.stories.js +136 -136
  148. package/src/stories/CBasicTable.stories.js +316 -316
  149. package/src/stories/CBreadcrumbs.stories.js +24 -24
  150. package/src/stories/CButton.stories.js +49 -49
  151. package/src/stories/CButtonGroup.stories.js +43 -43
  152. package/src/stories/CButtonIcon.stories.js +27 -27
  153. package/src/stories/CButtonLink.stories.js +24 -24
  154. package/src/stories/CButtonSelect.stories.js +44 -44
  155. package/src/stories/CButtonSelectBorder.stories.js +56 -56
  156. package/src/stories/CButtonWithDropdown.stories.js +41 -41
  157. package/src/stories/CCalendar.stories.js +16 -16
  158. package/src/stories/CCard.stories.js +30 -30
  159. package/src/stories/CCheckbox.stories.js +38 -38
  160. package/src/stories/CCircularButton.stories.js +29 -29
  161. package/src/stories/CCollapsibleSection.stories.js +29 -29
  162. package/src/stories/CColorDots.stories.js +37 -37
  163. package/src/stories/CConfirmActionModal.stories.js +67 -67
  164. package/src/stories/CDatepicker.stories.js +31 -31
  165. package/src/stories/CDualSelect.stories.js +29 -29
  166. package/src/stories/CEditor.stories.js +36 -36
  167. package/src/stories/CFormSectionHeading.stories.js +37 -37
  168. package/src/stories/CGroupedFilterDropdown.stories.js +131 -131
  169. package/src/stories/CGroupedSelect.stories.js +103 -103
  170. package/src/stories/CIcon.stories.js +31 -31
  171. package/src/stories/CIconDropdown.stories.js +52 -52
  172. package/src/stories/CIconSelect.stories.js +45 -45
  173. package/src/stories/CInput.stories.js +36 -36
  174. package/src/stories/CInputAddon.stories.js +37 -37
  175. package/src/stories/CInputEmail.stories.js +27 -27
  176. package/src/stories/CInsetTabs.stories.js +50 -50
  177. package/src/stories/CLinearProgressBar.stories.js +22 -22
  178. package/src/stories/CModalHeading.stories.js +25 -25
  179. package/src/stories/CModuleHelpLinks.stories.js +25 -25
  180. package/src/stories/CMultiselect.stories.js +146 -146
  181. package/src/stories/CMultiselectr.stories.js +23 -23
  182. package/src/stories/CPageHeading.stories.js +32 -32
  183. package/src/stories/CPagination.stories.js +30 -30
  184. package/src/stories/CPhoneNumber.stories.js +37 -37
  185. package/src/stories/CProgress.stories.js +23 -23
  186. package/src/stories/CRadio.stories.js +44 -44
  187. package/src/stories/CRadioGroup.stories.js +51 -51
  188. package/src/stories/CRangeSlider.stories.js +23 -23
  189. package/src/stories/CReorderableStackedList.stories.js +23 -23
  190. package/src/stories/CSelect.stories.js +157 -157
  191. package/src/stories/CSmallTimeline.stories.js +26 -26
  192. package/src/stories/CStackedList.stories.js +37 -37
  193. package/src/stories/CStats.stories.js +53 -53
  194. package/src/stories/CSwitch.stories.js +28 -28
  195. package/src/stories/CTabLazy.stories.js +42 -42
  196. package/src/stories/CTable.stories.js +203 -203
  197. package/src/stories/CTabs.stories.js +36 -36
  198. package/src/stories/CTag.stories.js +37 -37
  199. package/src/stories/CTextarea.stories.js +32 -32
  200. package/src/stories/CTimeline.stories.js +26 -26
  201. package/src/stories/CTokenEditor.stories.js +136 -136
  202. package/src/stories/CToolTip.stories.js +27 -27
  203. package/src/stories/CUpload.stories.js +36 -36
  204. package/src/stories/Introduction.stories.mdx +207 -207
  205. package/src/stories/Page.vue +88 -88
  206. package/src/stories/assets/code-brackets.svg +0 -0
  207. package/src/stories/assets/colors.svg +0 -0
  208. package/src/stories/assets/comments.svg +0 -0
  209. package/src/stories/assets/direction.svg +0 -0
  210. package/src/stories/assets/flow.svg +0 -0
  211. package/src/stories/assets/plugin.svg +0 -0
  212. package/src/stories/assets/repo.svg +0 -0
  213. package/src/stories/assets/stackalt.svg +0 -0
  214. package/src/stories/header.css +26 -26
  215. package/src/stories/page.css +69 -69
  216. package/src/stories/utils.css +32 -32
  217. package/src/.DS_Store +0 -0
@@ -1,332 +1,341 @@
1
- <template>
2
- <div :class="`flex h-full ${isCol ? '' : 'flex-col'}`">
3
- <div class="flex items-center justify-between">
4
- <div class="flex items-center">
5
- <!-- label of input 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
- <label v-if="!isUploaded" class="text-sm text-gray-500">
13
- {{ hint }}
14
- </label>
15
- </div>
16
- <button
17
- type="button"
18
- class="inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2"
19
- @click="initFilestack()"
20
- :id="id"
21
- v-if="displayMode == 'overlay' && icon"
22
- >
23
- <c-icon
24
- :type="icon.type"
25
- :class="icon.class"
26
- :name="icon.name"
27
- :viewBox="icon.viewBox"
28
- ></c-icon>
29
- {{ buttonText }}
30
- </button>
31
- <button
32
- type="button"
33
- class="mt-1.5 flex h-full w-auto items-center justify-center rounded-lg border-2 border-dashed border-gray-300 px-9 py-14 text-center hover:border-gray-400 focus:outline-none"
34
- @click="initFilestack()"
35
- :id="id"
36
- v-if="displayMode == 'overlay' && !icon && !isAvatar && !isIconBtn"
37
- >
38
- <c-icon
39
- name="arrow-up"
40
- type="solid"
41
- cursorType="cursor-pointer"
42
- class="mr-1 h-5 w-5 flex-none text-indigo-600"
43
- viewBox="0 0 20 20"
44
- ></c-icon>
45
- <span class="text-sm font-medium text-indigo-900"> Upload </span>
46
- </button>
47
- <button
48
- type="button"
49
- class="group rounded-full p-2 text-gray-400 hover:bg-gray-200 hover:text-gray-500"
50
- @click="initFilestack()"
51
- :id="id"
52
- v-if="displayMode == 'overlay' && !icon && !isAvatar && isIconBtn"
53
- >
54
- <c-icon
55
- :name="isIconBtnName"
56
- :type="iconBtnType"
57
- class="h-5 w-5 flex-none text-gray-400 group-hover:text-gray-500"
58
- viewBox="0 0 20 20"
59
- cursorType="cursor-pointer"
60
- ></c-icon>
61
- </button>
62
- <div
63
- class="relative hidden h-full w-full overflow-hidden rounded-full lg:block"
64
- @click="initFilestack()"
65
- :id="id"
66
- v-if="displayMode == 'overlay' && !icon && isAvatar"
67
- >
68
- <img
69
- v-if="imageUrl"
70
- class="relative h-full w-full rounded-full object-cover"
71
- :src="imageUrl"
72
- />
73
- <c-avatar
74
- v-else
75
- size="very large"
76
- :nameInitials="shortName"
77
- :isDynamicallyColored="coloredAvatars"
78
- :rounded="true"
79
- ></c-avatar>
80
- <label
81
- class="absolute inset-0 flex h-full w-full cursor-pointer items-center justify-center bg-gray-900 bg-opacity-75 text-sm font-medium text-white opacity-0 focus-within:opacity-100 hover:opacity-100"
82
- >
83
- <c-icon
84
- v-if="openIcon"
85
- :name="openIcon.name"
86
- :type="openIcon.type"
87
- :class="openIcon.class"
88
- ></c-icon>
89
- <span>{{ uploadText }}</span>
90
- <span class="sr-only"> user photo</span>
91
- </label>
92
- </div>
93
- <div :class="filestackClasses" :id="filestackId"></div>
94
- <p v-if="!isValidate" class="mt-2 text-sm text-red-600">
95
- {{ errorMessage }}
96
- </p>
97
- <!-- description about the input field -->
98
- <p v-if="helpText && isValidate == true" class="mt-2 text-sm text-gray-500">
99
- {{ helpText }}
100
- </p>
101
- </div>
102
- </template>
103
-
104
- <script>
105
- import * as filestack from "filestack-js";
106
- import CIcon from "../CIcon/CIcon.vue";
107
- import CAvatar from "../CAvatar/CAvatar.vue";
108
-
109
- export default {
110
- name: "CUpload",
111
- components: {
112
- CIcon,
113
- CAvatar,
114
- },
115
- props: {
116
- id: {
117
- type: String,
118
- },
119
- buttonText: {
120
- type: String,
121
- default: "Upload",
122
- },
123
- isAvatar: {
124
- type: Boolean,
125
- default: false,
126
- },
127
- isIconBtn: {
128
- type: Boolean,
129
- default: false,
130
- },
131
- isIconBtnName: {
132
- type: String,
133
- default: "attachment-solid",
134
- },
135
- iconBtnType: {
136
- type: String,
137
- default: "solid",
138
- },
139
- shortName: {
140
- type: String,
141
- },
142
- imageUrl: {
143
- type: String,
144
- default: "",
145
- },
146
- icon: {
147
- type: Object,
148
- },
149
- fileSize: {
150
- type: String,
151
- },
152
- filestackId: {
153
- type: String,
154
- default: "filestack-uploader",
155
- },
156
- openIcon: {
157
- type: Object,
158
- },
159
- uploadText: {
160
- type: String,
161
- default: "Change",
162
- },
163
- hint: {
164
- type: String,
165
- default: "",
166
- },
167
- helpText: {
168
- type: String,
169
- },
170
- label: {
171
- type: String,
172
- default: "",
173
- },
174
- isValidate: { type: Boolean },
175
- errorMessage: {
176
- type: String,
177
- },
178
- filestackApiKey: {
179
- type: String,
180
- default: "",
181
- },
182
- filestackClasses: {
183
- type: String,
184
- default: "w-96 h-96",
185
- },
186
- url: {
187
- type: String,
188
- },
189
- maxFiles: {
190
- type: Number,
191
- default: 1,
192
- },
193
- onUploadSuccess: {
194
- type: Function,
195
- },
196
- aspectRatio: {
197
- type: Number,
198
- default: null,
199
- },
200
- onUploadOpen: {
201
- type: Function,
202
- },
203
- displayMode: {
204
- type: String,
205
- default: "inline",
206
- },
207
- isUploaded: {
208
- type: Boolean,
209
- default: false,
210
- },
211
- isCircle: {
212
- type: Boolean,
213
- default: false,
214
- },
215
- coloredAvatars: {
216
- type: Boolean,
217
- default: false,
218
- },
219
- uploadSources: {
220
- type: Array,
221
- default: () => ["local_file_system", "unsplash"],
222
- },
223
- isRequired: {
224
- type: Boolean,
225
- },
226
- isCol: {
227
- type: Boolean,
228
- },
229
- disableTransformer: {
230
- type: Boolean,
231
- default: false,
232
- },
233
- maxSize: {
234
- type: Number,
235
- default: null,
236
- },
237
- fileTypes: {
238
- type: Array,
239
- default: () => [],
240
- },
241
- policy: {
242
- type: String,
243
- default: "",
244
- },
245
- signature: {
246
- type: String,
247
- default: "",
248
- },
249
- hasSecureInitialisation: {
250
- type: Boolean,
251
- default: false,
252
- },
253
- },
254
- data() {
255
- return {};
256
- },
257
- methods: {
258
- initFilestack() {
259
- if (this.hasSecureInitialisation && !this.policy.length) {
260
- if (this.displayMode == "overlay") {
261
- this.$emit("fetchPolicyDetails");
262
- }
263
- return;
264
- }
265
- const client = this.hasSecureInitialisation
266
- ? filestack.init(this.filestackApiKey, {
267
- security: {
268
- policy: this.policy,
269
- signature: this.signature,
270
- },
271
- })
272
- : filestack.init(this.filestackApiKey);
273
-
274
- const options = {
275
- displayMode: this.displayMode,
276
- container: `#${this.filestackId}`,
277
- uploadInBackground: false,
278
- maxFiles: this.maxFiles,
279
- onOpen: (param) => this.$emit("onUploadOpen", param, "open"),
280
- onClose: (param) => this.$emit("onUploadOpen", param, "close"),
281
- onUploadDone: (res) => this.$emit("filestack-uploaded", res),
282
- fromSources: this.uploadSources,
283
- disableTransformer: this.disableTransformer,
284
- transformations: {
285
- crop: {
286
- aspectRatio: this.aspectRatio ? this.aspectRatio : 0,
287
- force: this.aspectRatio ? true : false,
288
- },
289
- circle: this.isCircle,
290
- },
291
- };
292
- if (this.maxSize) {
293
- options["maxSize"] = this.maxSize;
294
- }
295
- if (this.fileTypes && this.fileTypes.length > 0) {
296
- options["accept"] = this.fileTypes;
297
- }
298
- const picker = client.picker(options);
299
- picker.open();
300
- },
301
- },
302
- computed: {
303
- errorClasses() {
304
- return {
305
- "border-red-300 text-red-900 placeholder-red-300 focus:ring-red-500 focus:border-red-500":
306
- this.isValidate == false,
307
- "border-gray-300 border-dashed": this.isValidate == true,
308
- };
309
- },
310
- },
311
- watch: {
312
- policy: {
313
- handler(newVal, oldVal) {
314
- if (
315
- this.hasSecureInitialisation &&
316
- newVal.length &&
317
- newVal !== oldVal
318
- ) {
319
- this.initFilestack();
320
- }
321
- },
322
- },
323
- },
324
- mounted() {
325
- if (this.displayMode == "inline") {
326
- this.initFilestack();
327
- }
328
- },
329
- };
330
- </script>
331
-
332
- <style></style>
1
+ <template>
2
+ <div :class="`flex h-full ${isCol ? '' : 'flex-col'}`">
3
+ <div class="flex items-center justify-between">
4
+ <div class="flex items-center">
5
+ <!-- label of input 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
+ <label v-if="!isUploaded" class="text-sm text-gray-500">
13
+ {{ hint }}
14
+ </label>
15
+ </div>
16
+ <button
17
+ type="button"
18
+ :class="[
19
+ 'inline-flex items-center rounded-md border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2',
20
+ extraClasses,
21
+ ]"
22
+ @click="initFilestack()"
23
+ :id="id"
24
+ v-if="displayMode == 'overlay' && icon"
25
+ >
26
+ <p>{{ extraClasses }}</p>
27
+ <c-icon
28
+ :type="icon.type"
29
+ :class="icon.class"
30
+ :name="icon.name"
31
+ :viewBox="icon.viewBox"
32
+ cursorType="cursor-pointer"
33
+ ></c-icon>
34
+ {{ buttonText }}
35
+ </button>
36
+ <button
37
+ type="button"
38
+ class="mt-1.5 flex h-full w-auto items-center justify-center rounded-lg border-2 border-dashed border-gray-300 px-9 py-14 text-center hover:border-gray-400 focus:outline-none"
39
+ @click="initFilestack()"
40
+ :id="id"
41
+ v-if="displayMode == 'overlay' && !icon && !isAvatar && !isIconBtn"
42
+ >
43
+ <c-icon
44
+ name="arrow-up"
45
+ type="solid"
46
+ cursorType="cursor-pointer"
47
+ class="mr-1 h-5 w-5 flex-none text-indigo-600"
48
+ viewBox="0 0 20 20"
49
+ ></c-icon>
50
+ <span class="text-sm font-medium text-indigo-900"> Upload </span>
51
+ </button>
52
+ <button
53
+ type="button"
54
+ class="group rounded-full p-2 text-gray-400 hover:bg-gray-200 hover:text-gray-500"
55
+ @click="initFilestack()"
56
+ :id="id"
57
+ v-if="displayMode == 'overlay' && !icon && !isAvatar && isIconBtn"
58
+ >
59
+ <c-icon
60
+ :name="isIconBtnName"
61
+ :type="iconBtnType"
62
+ class="h-5 w-5 flex-none text-gray-400 group-hover:text-gray-500"
63
+ viewBox="0 0 20 20"
64
+ cursorType="cursor-pointer"
65
+ ></c-icon>
66
+ </button>
67
+ <div
68
+ class="relative hidden h-full w-full overflow-hidden rounded-full lg:block"
69
+ @click="initFilestack()"
70
+ :id="id"
71
+ v-if="displayMode == 'overlay' && !icon && isAvatar"
72
+ >
73
+ <img
74
+ v-if="imageUrl"
75
+ class="relative h-full w-full rounded-full object-cover"
76
+ :src="imageUrl"
77
+ />
78
+ <c-avatar
79
+ v-else
80
+ size="very large"
81
+ :nameInitials="shortName"
82
+ :isDynamicallyColored="coloredAvatars"
83
+ :rounded="true"
84
+ ></c-avatar>
85
+ <label
86
+ class="absolute inset-0 flex h-full w-full cursor-pointer items-center justify-center bg-gray-900 bg-opacity-75 text-sm font-medium text-white opacity-0 focus-within:opacity-100 hover:opacity-100"
87
+ >
88
+ <c-icon
89
+ v-if="openIcon"
90
+ :name="openIcon.name"
91
+ :type="openIcon.type"
92
+ :class="openIcon.class"
93
+ ></c-icon>
94
+ <span>{{ uploadText }}</span>
95
+ <span class="sr-only"> user photo</span>
96
+ </label>
97
+ </div>
98
+ <div :class="filestackClasses" :id="filestackId"></div>
99
+ <p v-if="!isValidate" class="mt-2 text-sm text-red-600">
100
+ {{ errorMessage }}
101
+ </p>
102
+ <!-- description about the input field -->
103
+ <p v-if="helpText && isValidate == true" class="mt-2 text-sm text-gray-500">
104
+ {{ helpText }}
105
+ </p>
106
+ </div>
107
+ </template>
108
+
109
+ <script>
110
+ import * as filestack from "filestack-js";
111
+ import CIcon from "../CIcon/CIcon.vue";
112
+ import CAvatar from "../CAvatar/CAvatar.vue";
113
+
114
+ export default {
115
+ name: "CUpload",
116
+ components: {
117
+ CIcon,
118
+ CAvatar,
119
+ },
120
+ props: {
121
+ id: {
122
+ type: String,
123
+ },
124
+ extraClasses: {
125
+ type: String,
126
+ default: "",
127
+ },
128
+ buttonText: {
129
+ type: String,
130
+ default: "Upload",
131
+ },
132
+ isAvatar: {
133
+ type: Boolean,
134
+ default: false,
135
+ },
136
+ isIconBtn: {
137
+ type: Boolean,
138
+ default: false,
139
+ },
140
+ isIconBtnName: {
141
+ type: String,
142
+ default: "attachment-solid",
143
+ },
144
+ iconBtnType: {
145
+ type: String,
146
+ default: "solid",
147
+ },
148
+ shortName: {
149
+ type: String,
150
+ },
151
+ imageUrl: {
152
+ type: String,
153
+ default: "",
154
+ },
155
+ icon: {
156
+ type: Object,
157
+ },
158
+ fileSize: {
159
+ type: String,
160
+ },
161
+ filestackId: {
162
+ type: String,
163
+ default: "filestack-uploader",
164
+ },
165
+ openIcon: {
166
+ type: Object,
167
+ },
168
+ uploadText: {
169
+ type: String,
170
+ default: "Change",
171
+ },
172
+ hint: {
173
+ type: String,
174
+ default: "",
175
+ },
176
+ helpText: {
177
+ type: String,
178
+ },
179
+ label: {
180
+ type: String,
181
+ default: "",
182
+ },
183
+ isValidate: { type: Boolean },
184
+ errorMessage: {
185
+ type: String,
186
+ },
187
+ filestackApiKey: {
188
+ type: String,
189
+ default: "",
190
+ },
191
+ filestackClasses: {
192
+ type: String,
193
+ default: "w-96 h-96",
194
+ },
195
+ url: {
196
+ type: String,
197
+ },
198
+ maxFiles: {
199
+ type: Number,
200
+ default: 1,
201
+ },
202
+ onUploadSuccess: {
203
+ type: Function,
204
+ },
205
+ aspectRatio: {
206
+ type: Number,
207
+ default: null,
208
+ },
209
+ onUploadOpen: {
210
+ type: Function,
211
+ },
212
+ displayMode: {
213
+ type: String,
214
+ default: "inline",
215
+ },
216
+ isUploaded: {
217
+ type: Boolean,
218
+ default: false,
219
+ },
220
+ isCircle: {
221
+ type: Boolean,
222
+ default: false,
223
+ },
224
+ coloredAvatars: {
225
+ type: Boolean,
226
+ default: false,
227
+ },
228
+ uploadSources: {
229
+ type: Array,
230
+ default: () => ["local_file_system", "unsplash"],
231
+ },
232
+ isRequired: {
233
+ type: Boolean,
234
+ },
235
+ isCol: {
236
+ type: Boolean,
237
+ },
238
+ disableTransformer: {
239
+ type: Boolean,
240
+ default: false,
241
+ },
242
+ maxSize: {
243
+ type: Number,
244
+ default: null,
245
+ },
246
+ fileTypes: {
247
+ type: Array,
248
+ default: () => [],
249
+ },
250
+ policy: {
251
+ type: String,
252
+ default: "",
253
+ },
254
+ signature: {
255
+ type: String,
256
+ default: "",
257
+ },
258
+ hasSecureInitialisation: {
259
+ type: Boolean,
260
+ default: false,
261
+ },
262
+ },
263
+ data() {
264
+ return {};
265
+ },
266
+ methods: {
267
+ initFilestack() {
268
+ if (this.hasSecureInitialisation && !this.policy.length) {
269
+ if (this.displayMode == "overlay") {
270
+ this.$emit("fetchPolicyDetails");
271
+ }
272
+ return;
273
+ }
274
+ const client = this.hasSecureInitialisation
275
+ ? filestack.init(this.filestackApiKey, {
276
+ security: {
277
+ policy: this.policy,
278
+ signature: this.signature,
279
+ },
280
+ })
281
+ : filestack.init(this.filestackApiKey);
282
+
283
+ const options = {
284
+ displayMode: this.displayMode,
285
+ container: `#${this.filestackId}`,
286
+ uploadInBackground: false,
287
+ maxFiles: this.maxFiles,
288
+ onOpen: (param) => this.$emit("onUploadOpen", param, "open"),
289
+ onClose: (param) => this.$emit("onUploadOpen", param, "close"),
290
+ onUploadDone: (res) => this.$emit("filestack-uploaded", res),
291
+ fromSources: this.uploadSources,
292
+ disableTransformer: this.disableTransformer,
293
+ transformations: {
294
+ crop: {
295
+ aspectRatio: this.aspectRatio ? this.aspectRatio : 0,
296
+ force: this.aspectRatio ? true : false,
297
+ },
298
+ circle: this.isCircle,
299
+ },
300
+ };
301
+ if (this.maxSize) {
302
+ options["maxSize"] = this.maxSize;
303
+ }
304
+ if (this.fileTypes && this.fileTypes.length > 0) {
305
+ options["accept"] = this.fileTypes;
306
+ }
307
+ const picker = client.picker(options);
308
+ picker.open();
309
+ },
310
+ },
311
+ computed: {
312
+ errorClasses() {
313
+ return {
314
+ "border-red-300 text-red-900 placeholder-red-300 focus:ring-red-500 focus:border-red-500":
315
+ this.isValidate == false,
316
+ "border-gray-300 border-dashed": this.isValidate == true,
317
+ };
318
+ },
319
+ },
320
+ watch: {
321
+ policy: {
322
+ handler(newVal, oldVal) {
323
+ if (
324
+ this.hasSecureInitialisation &&
325
+ newVal.length &&
326
+ newVal !== oldVal
327
+ ) {
328
+ this.initFilestack();
329
+ }
330
+ },
331
+ },
332
+ },
333
+ mounted() {
334
+ if (this.displayMode == "inline") {
335
+ this.initFilestack();
336
+ }
337
+ },
338
+ };
339
+ </script>
340
+
341
+ <style></style>