Skip to content

Commit 3376eb3

Browse files
committed
feat: initial port of images modal for image uploader
1 parent e948dd1 commit 3376eb3

File tree

2 files changed

+89
-14
lines changed

2 files changed

+89
-14
lines changed

src/components/images/ImageUploader.vue

Lines changed: 89 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<div v-if="purpose === 'editor'" class="upload-editor">
1919
<a href="#" data-balloon="Upload Images" @click.prevent="fileInput.click()"><i class="far fa-images" aria-hidden="true"></i></a>
2020
<span v-if="images.length > 0 && purpose === 'editor'">
21-
(<a href="#" @click.prevent="openImageModal()">
21+
(<a href="#" @click.prevent="showImageModal = true">
2222
<span v-if="images.length === 1">
2323
view <span v-html="images.length"></span> image
2424
</span>
@@ -29,18 +29,50 @@
2929
</span>
3030
</div>
3131

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>
3262

3363
</template>
3464

3565
<script>
3666
import { reactive, toRefs, watch } from 'vue'
3767
import { policy, upload } from '@/composables/services/image-upload'
68+
import Modal from '@/components/layout/Modal.vue'
3869
3970
Promise.each = async (arr, fn) => { for(const item of arr) await fn(item) }
4071
4172
export default {
4273
name: 'image-uploader',
4374
props: ['onUpload-success', 'onUpload-error', 'onHover-stop', 'purpose', 'showDropzone'],
75+
components: { Modal },
4476
setup(props, { emit }) { //, { emit }) {
4577
/* View Methods */
4678
const uploadFile = (e) => {
@@ -186,7 +218,7 @@ export default {
186218
if (v.uploadingImages <= 0) v.imagesUploading = false
187219
}
188220
189-
const openImageModal = () => console.log('open image modal')
221+
const fireDone = () => console.log('done')
190222
191223
const v = reactive({
192224
hover: false,
@@ -195,6 +227,8 @@ export default {
195227
progressBar: null,
196228
amountUploaded: null,
197229
showDropzone: props.showDropzone,
230+
showImageModal: false,
231+
focusInput: null,
198232
currentImages: [],
199233
images: [],
200234
imagesUploading: false,
@@ -209,7 +243,7 @@ export default {
209243
210244
watch(() => v.hover, a => a ? null : emit('hover-stop'))
211245
212-
return { ...toRefs(v), uploadFile, openImageModal }
246+
return { ...toRefs(v), uploadFile, fireDone }
213247
}
214248
}
215249
</script>
@@ -269,5 +303,57 @@ export default {
269303
.meter { background: $color-primary; height: 100%; display: block; border-radius: 3px; }
270304
}
271305
}
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+
}
272358
273359
</style>

src/components/layout/Editor.vue

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -710,17 +710,6 @@ export default {
710710
object-fit: cover;
711711
}
712712
}
713-
.picker-body .after {
714-
position: absolute;
715-
bottom: 0;
716-
left: 0;
717-
top: 0;
718-
right: 0;
719-
color: #FFF;
720-
padding: 45px;
721-
text-align: center;
722-
background: rgba(0, 0, 0, .6);
723-
}
724713
725714
.thread-editor-container {
726715
position: relative;

0 commit comments

Comments
 (0)