-
Дмитрий Малюгин authoredДмитрий Малюгин authored
CreateEntityMenu.vue 2.13 KiB
<script setup lang="ts">
import { v4 as uuidv4 } from 'uuid';
import { useFileDialog } from '@vueuse/core';
import { useInterfaceStore } from '@/stores/interface';
const emit = defineEmits(['addEntity']);
const {
files,
open: uploadFile,
reset,
onChange
} = useFileDialog({
accept: 'image/*'
});
const addImage = (files: FileList) => {
console.log('files', files);
const file = files[0];
const reader = new FileReader();
reader.readAsDataURL(file);
reader.addEventListener('load', () => {
const url = reader.result;
emit('addEntity', {
type: 'image',
uuid: uuidv4(),
url,
position: 'left',
height: 300
});
});
};
onChange((files) => {
if (files && files?.length > 0) {
addImage(files);
}
});
const speedDialItems = ref([
{
label: 'Text',
icon: 'pi pi-pencil',
command: () => {
emit('addEntity', {
type: 'text',
uuid: uuidv4(),
text: ''
});
}
},
{
label: 'Image',
icon: 'pi pi-image',
command: () => {
uploadFile();
console.log('uploadFile finished');
}
},
{
label: 'Table',
icon: 'pi pi-table',
command: () => {
emit('addEntity', {
type: 'table',
uuid: uuidv4(),
columns: [
{
name: 'Name',
type: 'text'
},
{
name: 'Description',
type: 'text'
},
{
name: 'Status',
type: 'status'
}
]
});
}
}
]);
</script>
<template>
<SpeedDial
:model="speedDialItems"
direction="right"
:buttonProps="{ severity: 'info', rounded: true }"
style="position: absolute; left: 5%; top: 0"
>
<template #item="{ item, toggleCallback }">
<div
class="flex flex-col items-center justify-between -translate-8 gap-2 p-2 border rounded border-surface-200 dark:border-surface-700 w-20 cursor-pointer"
@click="toggleCallback"
>
<span :class="item.icon" />
<span>
{{ item.label }}
</span>
</div>
</template>
</SpeedDial>
</template>
<style scoped></style>