Implement image selector
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
a6e08ba9a1
commit
29e9dffeda
@ -0,0 +1,42 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import { ref } from "vue";
|
||||||
|
|
||||||
|
defineEmits<{
|
||||||
|
selected: [image: HTMLImageElement]
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const images = ref<HTMLImageElement[]>([]);
|
||||||
|
|
||||||
|
function onFileChange(event: Event): void {
|
||||||
|
const files = (event.target as HTMLInputElement).files!;
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = function(event) {
|
||||||
|
const image = new Image();
|
||||||
|
image.onload = () => images.value.push(image);
|
||||||
|
image.src = event.target!.result as string;
|
||||||
|
}
|
||||||
|
reader.readAsDataURL(files[0]);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="file-column">
|
||||||
|
<input id="file-upload" type="file" @change="onFileChange">
|
||||||
|
<label for="file-upload"><a class="button" style="display: block">Add</a></label>
|
||||||
|
<div v-for="(img, idx) in images" :key="idx" class="image-file">
|
||||||
|
<img :src="img.src" width="64" height="64" alt="" @click="$emit('selected', img)">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#file-upload {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.file-column {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 8px;
|
||||||
|
border-right: 1px solid black;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in new issue