mirror of
https://github.com/Sea-Haven-Industries/shoc-frontend-new.git
synced 2026-10-02 22:43:23 +00:00
Add the Completion Docs page under Data Management: a searchable template table, a read-only detail panel, add and edit with a live document preview, and delete behind a confirmation that counts the open work orders still using the template and links to them. Add, edit and delete are hidden for users whose role lacks the matching template permission. The preview shares the work-order completion document's page frame, header, safety bullets and procedure heading so the two stay identical.
98 lines
3.3 KiB
TypeScript
98 lines
3.3 KiB
TypeScript
import { CircularProgress, Dialog, DialogActions, DialogContent, DialogTitle } from "@mui/material";
|
|
import { useNavigate } from "react-router";
|
|
import { Button } from "@/components/ui/button";
|
|
import { DialogCancelButton } from "@/components/ui/dialog-cancel-button";
|
|
import { Text } from "@/components/ui/text";
|
|
import type {
|
|
CompletionTemplate,
|
|
LinkedWorkOrders,
|
|
} from "@/domain/completion-templates/types/completion-template";
|
|
import { useDeleteCompletionTemplate } from "@/domain/completion-templates/use-cases/use-completion-template-mutations";
|
|
import { useLinkedWorkOrders } from "@/domain/completion-templates/use-cases/use-completion-templates";
|
|
import { buildWorkOrderIdsHref } from "@/domain/work-orders/utils/work-order-ids-filter";
|
|
|
|
type DeleteCompletionTemplateDialogProps = {
|
|
template: CompletionTemplate;
|
|
open: boolean;
|
|
onClose: () => void;
|
|
onDeleted: () => void;
|
|
};
|
|
|
|
function deleteMessage(name: string, linked: LinkedWorkOrders): string {
|
|
if (linked.count === 0) return `This will permanently remove "${name}". This cannot be undone.`;
|
|
const plural = linked.count === 1 ? "" : "s";
|
|
return (
|
|
`This will permanently remove "${name}". It's still linked to ${linked.count} open work ` +
|
|
`order${plural} through its Service — deleting it won't change that Service, but new ` +
|
|
"documents generated for those work orders will fall back to a generic procedure until " +
|
|
"reassigned. This cannot be undone."
|
|
);
|
|
}
|
|
|
|
function LinkedWorkOrdersMessage({
|
|
name,
|
|
linked,
|
|
}: {
|
|
name: string;
|
|
linked: ReturnType<typeof useLinkedWorkOrders>;
|
|
}) {
|
|
if (linked.isPending) {
|
|
return (
|
|
<div className="flex items-center gap-2" role="status">
|
|
<CircularProgress size={16} />
|
|
<Text variant="description" tone="muted">
|
|
Checking linked work orders…
|
|
</Text>
|
|
</div>
|
|
);
|
|
}
|
|
if (linked.isError) {
|
|
return (
|
|
<Text variant="error">
|
|
Couldn't check which work orders use this template. Close this and try again.
|
|
</Text>
|
|
);
|
|
}
|
|
return <Text variant="description">{deleteMessage(name, linked.data)}</Text>;
|
|
}
|
|
|
|
/** Deleting always asks first, and names the open work orders that still depend on the template. */
|
|
export function DeleteCompletionTemplateDialog({
|
|
template,
|
|
open,
|
|
onClose,
|
|
onDeleted,
|
|
}: DeleteCompletionTemplateDialogProps) {
|
|
const navigate = useNavigate();
|
|
const linked = useLinkedWorkOrders(open ? template.id : null);
|
|
const remove = useDeleteCompletionTemplate();
|
|
const linkedIds = linked.data?.workOrderIds ?? [];
|
|
|
|
function confirmDelete() {
|
|
remove.mutate(template.id, { onSuccess: onDeleted });
|
|
}
|
|
|
|
return (
|
|
<Dialog open={open} onClose={onClose} maxWidth="xs" fullWidth>
|
|
<DialogTitle>Delete this template?</DialogTitle>
|
|
<DialogContent>
|
|
<LinkedWorkOrdersMessage name={template.name} linked={linked} />
|
|
</DialogContent>
|
|
<DialogActions>
|
|
<DialogCancelButton onClick={onClose} />
|
|
{linkedIds.length > 0 && (
|
|
<Button variant="outline" onClick={() => void navigate(buildWorkOrderIdsHref(linkedIds))}>
|
|
View linked work orders
|
|
</Button>
|
|
)}
|
|
<Button
|
|
variant="destructive"
|
|
onClick={confirmDelete}
|
|
disabled={!linked.isSuccess || remove.isPending}
|
|
>
|
|
Delete
|
|
</Button>
|
|
</DialogActions>
|
|
</Dialog>
|
|
);
|
|
}
|