Package booking new rules update, cascade delete option updates

This commit is contained in:
Stephanos A
2026-07-06 22:12:04 +03:00
parent f52d7442ac
commit 36055d0d82
31 changed files with 777 additions and 339 deletions

View File

@@ -15,7 +15,7 @@ export default function ClassesPage() {
const [filters, setFilters] = useState({ search: '' });
const [showModal, setShowModal] = useState(false);
const [editingClass, setEditingClass] = useState<any>(null);
const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; class: any | null; error?: string }>({ isOpen: false, class: null });
const [deleteConfirm, setDeleteConfirm] = useState<{ isOpen: boolean; class: any | null; error?: string; cascade?: boolean; cascadeChecked?: boolean }>({ isOpen: false, class: null });
const [selectedCoachTypeId, setSelectedCoachTypeId] = useState<string>('');
const queryClient = useQueryClient();
@@ -56,13 +56,18 @@ export default function ClassesPage() {
});
const deleteMutation = useMutation({
mutationFn: seatClassesApi.delete,
mutationFn: ({ id, cascade }: { id: string; cascade?: boolean }) => seatClassesApi.delete(id, cascade),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ['classes'] });
},
onError: (e: any) => {
const msg = e?.response?.data?.message || e?.message || 'Failed to delete class';
setDeleteConfirm(prev => ({ ...prev, error: Array.isArray(msg) ? msg.join(' ') : msg }));
const isFkError = msg?.includes('Cannot delete') || e?.response?.status === 400;
if (isFkError && !deleteConfirm.cascade) {
setDeleteConfirm(prev => ({ ...prev, cascade: true, cascadeChecked: false, error: Array.isArray(msg) ? msg.join(' ') : msg }));
} else {
setDeleteConfirm(prev => ({ ...prev, error: Array.isArray(msg) ? msg.join(' ') : msg }));
}
},
});
@@ -99,7 +104,7 @@ export default function ClassesPage() {
const confirmDelete = async () => {
if (!deleteConfirm.class) return;
try {
await deleteMutation.mutateAsync(deleteConfirm.class.id);
await deleteMutation.mutateAsync({ id: deleteConfirm.class.id, cascade: deleteConfirm.cascade && deleteConfirm.cascadeChecked });
setDeleteConfirm({ isOpen: false, class: null });
} catch {
// error is set by onError handler
@@ -239,7 +244,10 @@ export default function ClassesPage() {
isDanger={true}
isLoading={deleteMutation.isPending}
error={deleteConfirm.error}
warning="This class may be used by coaches and fare rules. Deleting it may impact seat assignments and pricing."
warning={!deleteConfirm.cascade ? "This class may be used by coaches and fare rules. Deleting it may impact seat assignments and pricing." : undefined}
cascadeWarning={deleteConfirm.cascade ? "This class has related fare rules that will also be permanently deleted." : undefined}
cascadeChecked={deleteConfirm.cascadeChecked}
onCascadeChange={(checked) => setDeleteConfirm(prev => ({ ...prev, cascadeChecked: checked }))}
/>
{/* Add/Edit Modal */}