Minimal Viable Product + Refactor to pinia store + Fix PDF export
This commit is contained in:
@@ -1,26 +1,23 @@
|
||||
<script setup lang="ts">
|
||||
import { Resume, ResumeComponentPlacement, ResumeInputData } from '@/types/resume';
|
||||
import { ResumeComponentPlacement, ResumeInputData } from '@/types/resume';
|
||||
import Button from '../ui/button/Button.vue';
|
||||
import { ChevronLeft } from 'lucide-vue-next';
|
||||
import { SidebarGroup, SidebarGroupLabel } from '@/components/ui/sidebar';
|
||||
import ResumeComponentEditForm from './ResumeComponentEditForm.vue';
|
||||
import { httpApi } from '@/lib/utils';
|
||||
import { useResumesStore } from '@/stores/resume';
|
||||
|
||||
const SEND_CHANGED_DATA_DELAY = 500;
|
||||
|
||||
const props = defineProps<{
|
||||
resume: Resume
|
||||
selectedComponent: ResumeComponentPlacement | null
|
||||
}>();
|
||||
|
||||
const emit = defineEmits(['selected-component-change']);
|
||||
const resumeStore = useResumesStore();
|
||||
const selectedComponent = resumeStore.currentSelectedResumePlacement;
|
||||
|
||||
let delayedSendTimeout: ReturnType<typeof setTimeout> | null = null
|
||||
async function sendChangedData(newData: ResumeInputData[]) {
|
||||
const newSelectedComponent = {
|
||||
...props.selectedComponent,
|
||||
const newSelectedComponent: ResumeComponentPlacement = {
|
||||
...selectedComponent.value,
|
||||
component_data: {
|
||||
...props.selectedComponent?.component_data,
|
||||
...selectedComponent.value?.component_data,
|
||||
input_data: newData
|
||||
}
|
||||
};
|
||||
@@ -31,7 +28,7 @@ async function sendChangedData(newData: ResumeInputData[]) {
|
||||
clearTimeout(delayedSendTimeout);
|
||||
}
|
||||
delayedSendTimeout = setTimeout(async () => {
|
||||
const { data, error } = await httpApi(route('resume-component-placements.update', newSelectedComponent.id), {
|
||||
const { data, error } = await httpApi(route('resume-component-placements.update', newSelectedComponent), {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
@@ -54,21 +51,21 @@ async function sendChangedData(newData: ResumeInputData[]) {
|
||||
return;
|
||||
}
|
||||
|
||||
emit('selected-component-change', newSelectedComponent);
|
||||
resumeStore.modifyCurrentSelectedResumePlacement(newSelectedComponent!);
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="h-full w-full">
|
||||
<Button @click="emit('selected-component-change', null)" variant="outline" size="icon" class="cursor-pointer"><ChevronLeft class="w-4 h-4" /></Button>
|
||||
<Button @click="resumeStore.clearSelectedResumePlacement();" variant="outline" size="icon" class="cursor-pointer"><ChevronLeft class="w-4 h-4" /></Button>
|
||||
<SidebarGroup class="w-full p-0">
|
||||
<SidebarGroupLabel>{{ props.selectedComponent?.component_data?.component?.name }}</SidebarGroupLabel>
|
||||
<SidebarGroupLabel>{{ selectedComponent?.component_data?.component?.name }}</SidebarGroupLabel>
|
||||
<ResumeComponentEditForm
|
||||
v-if="props.selectedComponent?.component_data?.input_data"
|
||||
:data="props.selectedComponent?.component_data?.input_data!"
|
||||
v-if="selectedComponent?.component_data?.input_data"
|
||||
:data="selectedComponent?.component_data?.input_data!"
|
||||
@data-changed="sendChangedData($event)"
|
||||
/>
|
||||
<p v-else class="text-destructive">No component input data : {{ props.selectedComponent?.component_data }}</p>
|
||||
<p v-else class="text-destructive">No component input data : {{ selectedComponent?.component_data }}</p>
|
||||
</SidebarGroup>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
Reference in New Issue
Block a user