classcard-ui 0.2.1475 → 0.2.1476

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