main
vue 89 lines 2.67 KB
Raw
1 <template>
2 <div class="flex flex-col gap-8">
3 <div class="mb-2 flex gap-6">
4 <n-avatar :size="110" :src="logo" />
5
6 <div class="flex grow flex-col justify-between">
7 <ImageCropper v-slot="{ openCropper }" placeholder="Select a Logo" @crop="setCroppedImage">
8 <n-button @click="openCropper()">
9 <template #icon>
10 <Icon :name="EditIcon" />
11 </template>
12 Edit Logo Image
13 </n-button>
14 </ImageCropper>
15
16 <n-form-item label="Company" :show-feedback="false">
17 <n-input v-model:value="company" placeholder="Insert you company name" />
18 </n-form-item>
19 </div>
20 </div>
21
22 <div class="flex flex-col gap-2">
23 <n-form-item label="Theme" :show-feedback="false">
24 <n-radio-group v-model:value="theme">
25 <n-radio-button value="light">Light</n-radio-button>
26 <n-radio-button value="dark">Dark</n-radio-button>
27 </n-radio-group>
28 </n-form-item>
29 <div class="text-secondary text-sm">⊙ choose panels palette</div>
30 </div>
31
32 <div class="flex flex-col gap-2">
33 <n-form-item label="Retina" :show-feedback="false">
34 <n-switch v-model:value="retina" />
35 </n-form-item>
36 <div class="text-secondary text-sm">⊙ improve panels resolution; it will increase the report size</div>
37 </div>
38 </div>
39 </template>
40
41 <script setup lang="ts">
42 import type { ImageCropperResult } from "@/components/common/ImageCropper.vue"
43 import { useStorage } from "@vueuse/core"
44 import { NAvatar, NButton, NFormItem, NInput, NRadioButton, NRadioGroup, NSwitch } from "naive-ui"
45 import { onMounted, watch } from "vue"
46 import Icon from "@/components/common/Icon.vue"
47 import ImageCropper from "@/components/common/ImageCropper.vue"
48 import * as defaultSettings from "./defaultSettings"
49
50 export interface PrintSettingsData {
51 logo: string
52 company: string
53 theme: "light" | "dark"
54 retina: boolean
55 }
56
57 const emit = defineEmits<{
58 (e: "update", value: PrintSettingsData): void
59 }>()
60
61 const EditIcon = "uil:image-edit"
62
63 const logo = useStorage<string>("report-settings-logo", defaultSettings.logo, localStorage)
64 const company = useStorage<string>("report-settings-company", defaultSettings.company, localStorage)
65 const theme = useStorage<"light" | "dark">("report-settings-theme", defaultSettings.theme, localStorage)
66 const retina = useStorage<boolean>("report-settings-retina", defaultSettings.retina, localStorage)
67
68 watch([logo, company, theme, retina], () => {
69 emitData()
70 })
71
72 function setCroppedImage(result: ImageCropperResult) {
73 const canvas = result.canvas as HTMLCanvasElement
74 logo.value = canvas.toDataURL()
75 }
76
77 function emitData() {
78 emit("update", {
79 logo: logo.value,
80 company: company.value,
81 theme: theme.value,
82 retina: retina.value
83 })
84 }
85
86 onMounted(() => {
87 emitData()
88 })
89 </script>