18
18
<div v-if =" purpose === 'editor'" class =" upload-editor" >
19
19
<a href =" #" data-balloon =" Upload Images" @click.prevent =" fileInput.click()" ><i class =" far fa-images" aria-hidden =" true" ></i ></a >
20
20
<span v-if =" images.length > 0 && purpose === 'editor'" >
21
- (<a href =" #" @click.prevent =" openImageModal() " >
21
+ (<a href =" #" @click.prevent =" showImageModal = true " >
22
22
<span v-if =" images.length === 1" >
23
23
view <span v-html =" images.length" ></span > image
24
24
</span >
29
29
</span >
30
30
</div >
31
31
32
+ <modal :name =" $options.name" :show =" showImageModal" @close =" showImageModal = false" :focusInput =" focusInput" >
33
+ <template v-slot :header >Image Picker</template >
34
+
35
+ <template v-slot :body >
36
+ <ul :class =" images.length > 1 ? 'two-col' : 'one-col'" class =" img-picker-list" >
37
+ <li v-for =" image in images" :key =" image.url" >
38
+ <div class =" image-picker-cell" >
39
+ <!-- image picker header -->
40
+ <div class =" header" :class =" { 'added': image.added }" >
41
+ (<span v-html =" image.progress" ></span >%):
42
+ <a :href =" image.url" target =" _blank" v-if =" image.url" >
43
+ <span v-html =" image.name" ></span >
44
+ </a >
45
+ <span v-html =" image.status" v-if =" !image.url" ></span >
46
+ </div >
47
+ <!-- image picker body -->
48
+ <div class =" picker-body" >
49
+ <img :src =" image.url" @click =" fireDone(image)" />
50
+ <a class =" after" v-if =" image.url" @click =" fireDone(image)" >
51
+ <div >
52
+ <span class =" stroke" v-if =" !image.added" >Add to Editor</span >
53
+ <span v-if =" image.added" ><strong >Added!</strong ></span >
54
+ </div >
55
+ </a >
56
+ </div >
57
+ </div >
58
+ </li >
59
+ </ul >
60
+ </template >
61
+ </modal >
32
62
33
63
</template >
34
64
35
65
<script >
36
66
import { reactive , toRefs , watch } from ' vue'
37
67
import { policy , upload } from ' @/composables/services/image-upload'
68
+ import Modal from ' @/components/layout/Modal.vue'
38
69
39
70
Promise .each = async (arr , fn ) => { for (const item of arr) await fn (item) }
40
71
41
72
export default {
42
73
name: ' image-uploader' ,
43
74
props: [' onUpload-success' , ' onUpload-error' , ' onHover-stop' , ' purpose' , ' showDropzone' ],
75
+ components: { Modal },
44
76
setup (props , { emit }) { // , { emit }) {
45
77
/* View Methods */
46
78
const uploadFile = (e ) => {
@@ -186,7 +218,7 @@ export default {
186
218
if (v .uploadingImages <= 0 ) v .imagesUploading = false
187
219
}
188
220
189
- const openImageModal = () => console .log (' open image modal ' )
221
+ const fireDone = () => console .log (' done ' )
190
222
191
223
const v = reactive ({
192
224
hover: false ,
@@ -195,6 +227,8 @@ export default {
195
227
progressBar: null ,
196
228
amountUploaded: null ,
197
229
showDropzone: props .showDropzone ,
230
+ showImageModal: false ,
231
+ focusInput: null ,
198
232
currentImages: [],
199
233
images: [],
200
234
imagesUploading: false ,
@@ -209,7 +243,7 @@ export default {
209
243
210
244
watch (() => v .hover , a => a ? null : emit (' hover-stop' ))
211
245
212
- return { ... toRefs (v), uploadFile, openImageModal }
246
+ return { ... toRefs (v), uploadFile, fireDone }
213
247
}
214
248
}
215
249
</script >
@@ -269,5 +303,57 @@ export default {
269
303
.meter { background : $color-primary ; height : 100% ; display : block ; border-radius : 3px ; }
270
304
}
271
305
}
306
+ .img-picker-list {
307
+ margin-left : 0 ;
308
+ list-style-type : none ;
309
+ display : grid ;
310
+ & .one-col {
311
+ grid-template-columns : 100% ;
312
+ li {
313
+ overflow-wrap : break-word ;
314
+ }
315
+
316
+ .image-picker-cell {
317
+ .picker-body {
318
+ img {
319
+ height : initial ;
320
+ }
321
+ }
322
+ }
323
+
324
+ }
325
+ & .two-col {
326
+ grid-template-columns : 50% 50% ;
327
+ li {
328
+ overflow-wrap : break-word ;
329
+ }
330
+ }
331
+ .image-picker-cell {
332
+ margin-bottom : 1rem ;
333
+ // border: 2px solid $border-color;
334
+
335
+ .header {
336
+ color : $base-font-color ;
337
+ padding-left : 0.3125rem ;
338
+ padding-bottom : 0.25rem ;
339
+ font-size : 0.8125rem ;
340
+ transition : background-color 1s ;
341
+
342
+ & .added {
343
+ background-color : $color-primary ;
344
+ }
345
+ }
346
+
347
+ .picker-body {
348
+ // height: 8rem;
349
+ position : relative ;
350
+
351
+ img {
352
+ height : 10rem ;
353
+ object-fit : cover ;
354
+ }
355
+ }
356
+ }
357
+ }
272
358
273
359
</style >
0 commit comments