mirror of
https://github.com/sysadminsmedia/homebox.git
synced 2025-12-21 21:33:02 +01:00
* feat: migrate tools page and label generator to shadcn * chore: lint issues * feat: also do profile page * feat: shadcn 404 page * feat: login page shadcn * fix: daisyui ironically breaks the z height for the login page * feat: componentise the language selector and add it to the login page * feat: use nuxtlink * feat: card and table made more shadcn * feat: shadcn statscard * chore: lint * feat: shadcn labelchip and locationcard * feat: shadcn locations page * refactor: remove unused new item page * chore: lint * feat: shadcn item card * fix: wrapping of location and lint * feat: ctrl enter in text area in form submits form * feat: begin shadcn locations page and remove pageqrcode comp in favour of integrating it into labelmaker * chore: lint + remove unused code * fix: remove uneeded margin * feat: shadcn labels page and fix some issues with location * feat: shadcn scanner * chore: lint * feat: begin shadcning item pages * feat: shadcn maintenance page * feat: begin shadcn search page * fix: quick switch blurry text and crashing page when switching + incorrect z height for create menu * feat: finish shadcn search page * chore: lint * feat: shadcn edit item page * fix: quickmenumodal bug * feat: shadcn item details page * feat: remove all non-color related daisyui classes * fix: type error * fix: quick menu modal again :(
172 lines
5.1 KiB
Vue
172 lines
5.1 KiB
Vue
<template>
|
|
<Dialog dialog-id="edit-maintenance">
|
|
<DialogContent>
|
|
<DialogHeader>
|
|
<DialogTitle>
|
|
{{ entry.id ? $t("maintenance.modal.edit_title") : $t("maintenance.modal.new_title") }}
|
|
</DialogTitle>
|
|
</DialogHeader>
|
|
|
|
<form class="flex flex-col gap-2" @submit.prevent="dispatchFormSubmit">
|
|
<FormTextField v-model="entry.name" autofocus :label="$t('maintenance.modal.entry_name')" />
|
|
<DatePicker v-model="entry.completedDate" :label="$t('maintenance.modal.completed_date')" />
|
|
<DatePicker v-model="entry.scheduledDate" :label="$t('maintenance.modal.scheduled_date')" />
|
|
<FormTextArea v-model="entry.description" :label="$t('maintenance.modal.notes')" />
|
|
<FormTextField v-model="entry.cost" autofocus :label="$t('maintenance.modal.cost')" />
|
|
|
|
<DialogFooter>
|
|
<Button type="submit">
|
|
<MdiPost />
|
|
{{ entry.id ? $t("maintenance.modal.edit_action") : $t("maintenance.modal.new_action") }}
|
|
</Button>
|
|
</DialogFooter>
|
|
</form>
|
|
</DialogContent>
|
|
</Dialog>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { useI18n } from "vue-i18n";
|
|
import { toast } from "@/components/ui/sonner";
|
|
import type { MaintenanceEntry, MaintenanceEntryWithDetails } from "~~/lib/api/types/data-contracts";
|
|
import MdiPost from "~icons/mdi/post";
|
|
import DatePicker from "~~/components/Form/DatePicker.vue";
|
|
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog";
|
|
import { useDialog } from "@/components/ui/dialog-provider";
|
|
|
|
const { openDialog, closeDialog } = useDialog();
|
|
|
|
const { t } = useI18n();
|
|
const api = useUserApi();
|
|
|
|
const emit = defineEmits(["changed"]);
|
|
|
|
const entry = reactive({
|
|
id: null as string | null,
|
|
name: "",
|
|
completedDate: null as Date | null,
|
|
scheduledDate: null as Date | null,
|
|
description: "",
|
|
cost: "",
|
|
itemId: null as string | null,
|
|
});
|
|
|
|
async function dispatchFormSubmit() {
|
|
if (entry.id) {
|
|
await editEntry();
|
|
return;
|
|
}
|
|
|
|
await createEntry();
|
|
}
|
|
|
|
async function createEntry() {
|
|
if (!entry.itemId) {
|
|
return;
|
|
}
|
|
const { error } = await api.items.maintenance.create(entry.itemId, {
|
|
name: entry.name,
|
|
completedDate: entry.completedDate ?? "",
|
|
scheduledDate: entry.scheduledDate ?? "",
|
|
description: entry.description,
|
|
cost: parseFloat(entry.cost) ? entry.cost : "0",
|
|
});
|
|
|
|
if (error) {
|
|
toast.error(t("maintenance.toast.failed_to_create"));
|
|
return;
|
|
}
|
|
|
|
closeDialog("edit-maintenance");
|
|
emit("changed");
|
|
}
|
|
|
|
async function editEntry() {
|
|
if (!entry.id) {
|
|
return;
|
|
}
|
|
|
|
const { error } = await api.maintenance.update(entry.id, {
|
|
name: entry.name,
|
|
completedDate: entry.completedDate ?? "null",
|
|
scheduledDate: entry.scheduledDate ?? "null",
|
|
description: entry.description,
|
|
cost: entry.cost,
|
|
});
|
|
|
|
if (error) {
|
|
toast.error(t("maintenance.toast.failed_to_update"));
|
|
return;
|
|
}
|
|
|
|
closeDialog("edit-maintenance");
|
|
emit("changed");
|
|
}
|
|
|
|
const openCreateModal = (itemId: string) => {
|
|
entry.id = null;
|
|
entry.name = "";
|
|
entry.completedDate = null;
|
|
entry.scheduledDate = null;
|
|
entry.description = "";
|
|
entry.cost = "";
|
|
entry.itemId = itemId;
|
|
openDialog("edit-maintenance");
|
|
};
|
|
|
|
const openUpdateModal = (maintenanceEntry: MaintenanceEntry | MaintenanceEntryWithDetails) => {
|
|
entry.id = maintenanceEntry.id;
|
|
entry.name = maintenanceEntry.name;
|
|
entry.completedDate = new Date(maintenanceEntry.completedDate);
|
|
entry.scheduledDate = new Date(maintenanceEntry.scheduledDate);
|
|
entry.description = maintenanceEntry.description;
|
|
entry.cost = maintenanceEntry.cost;
|
|
entry.itemId = null;
|
|
openDialog("edit-maintenance");
|
|
};
|
|
|
|
const confirm = useConfirm();
|
|
|
|
async function deleteEntry(id: string) {
|
|
const result = await confirm.open(t("maintenance.modal.delete_confirmation"));
|
|
if (result.isCanceled) {
|
|
return;
|
|
}
|
|
|
|
const { error } = await api.maintenance.delete(id);
|
|
|
|
if (error) {
|
|
toast.error(t("maintenance.toast.failed_to_delete"));
|
|
return;
|
|
}
|
|
emit("changed");
|
|
}
|
|
|
|
async function complete(maintenanceEntry: MaintenanceEntry) {
|
|
const { error } = await api.maintenance.update(maintenanceEntry.id, {
|
|
name: maintenanceEntry.name,
|
|
completedDate: new Date(Date.now()),
|
|
scheduledDate: maintenanceEntry.scheduledDate ?? "null",
|
|
description: maintenanceEntry.description,
|
|
cost: maintenanceEntry.cost,
|
|
});
|
|
if (error) {
|
|
toast.error(t("maintenance.toast.failed_to_update"));
|
|
}
|
|
emit("changed");
|
|
}
|
|
|
|
function duplicate(maintenanceEntry: MaintenanceEntry | MaintenanceEntryWithDetails, itemId: string) {
|
|
entry.id = null;
|
|
entry.name = maintenanceEntry.name;
|
|
entry.completedDate = null;
|
|
entry.scheduledDate = null;
|
|
entry.description = maintenanceEntry.description;
|
|
entry.cost = maintenanceEntry.cost;
|
|
entry.itemId = itemId;
|
|
openDialog("edit-maintenance");
|
|
}
|
|
|
|
defineExpose({ openCreateModal, openUpdateModal, deleteEntry, complete, duplicate });
|
|
</script>
|