404 hosts polish

This commit is contained in:
Jamie Curnow
2025-09-24 19:45:00 +10:00
parent 4240e00a46
commit d558594031
10 changed files with 95 additions and 25 deletions

View File

@@ -12,9 +12,10 @@ interface Props {
isFetching?: boolean;
onEdit?: (id: number) => void;
onDelete?: (id: number) => void;
onDisableToggle?: (id: number, enabled: boolean) => void;
onNew?: () => void;
}
export default function Table({ data, isFetching, onEdit, onDelete, onNew }: Props) {
export default function Table({ data, isFetching, onEdit, onDelete, onDisableToggle, onNew }: Props) {
const columnHelper = createColumnHelper<DeadHost>();
const columns = useMemo(
() => [
@@ -83,9 +84,18 @@ export default function Table({ data, isFetching, onEdit, onDelete, onNew }: Pro
<IconEdit size={16} />
{intl.formatMessage({ id: "action.edit" })}
</a>
<a className="dropdown-item" href="#">
<a
className="dropdown-item"
href="#"
onClick={(e) => {
e.preventDefault();
onDisableToggle?.(info.row.original.id, !info.row.original.enabled);
}}
>
<IconPower size={16} />
{intl.formatMessage({ id: "action.disable" })}
{intl.formatMessage({
id: info.row.original.enabled ? "action.disable" : "action.enable",
})}
</a>
<div className="dropdown-divider" />
<a
@@ -108,7 +118,7 @@ export default function Table({ data, isFetching, onEdit, onDelete, onNew }: Pro
},
}),
],
[columnHelper, onDelete, onEdit],
[columnHelper, onDelete, onEdit, onDisableToggle],
);
const tableInstance = useReactTable<DeadHost>({

View File

@@ -1,6 +1,8 @@
import { IconSearch } from "@tabler/icons-react";
import { useQueryClient } from "@tanstack/react-query";
import { useState } from "react";
import Alert from "react-bootstrap/Alert";
import { deleteDeadHost, toggleDeadHost } from "src/api/backend";
import { Button, LoadingPage } from "src/components";
import { useDeadHosts } from "src/hooks";
import { intl } from "src/locale";
@@ -9,6 +11,7 @@ import { showSuccess } from "src/notifications";
import Table from "./Table";
export default function TableWrapper() {
const queryClient = useQueryClient();
const [deleteId, setDeleteId] = useState(0);
const [editId, setEditId] = useState(0 as number | "new");
const { isFetching, isLoading, isError, error, data } = useDeadHosts(["owner", "certificate"]);
@@ -22,10 +25,17 @@ export default function TableWrapper() {
}
const handleDelete = async () => {
// await deleteUser(deleteId);
await deleteDeadHost(deleteId);
showSuccess(intl.formatMessage({ id: "notification.host-deleted" }));
};
const handleDisableToggle = async (id: number, enabled: boolean) => {
await toggleDeadHost(id, enabled);
queryClient.invalidateQueries({ queryKey: ["dead-hosts"] });
queryClient.invalidateQueries({ queryKey: ["dead-host", id] });
showSuccess(intl.formatMessage({ id: enabled ? "notification.host-enabled" : "notification.host-disabled" }));
};
return (
<div className="card mt-4">
<div className="card-status-top bg-red" />
@@ -60,17 +70,18 @@ export default function TableWrapper() {
isFetching={isFetching}
onEdit={(id: number) => setEditId(id)}
onDelete={(id: number) => setDeleteId(id)}
onDisableToggle={handleDisableToggle}
onNew={() => setEditId("new")}
/>
{editId ? <DeadHostModal id={editId} onClose={() => setEditId(0)} /> : null}
{deleteId ? (
<DeleteConfirmModal
title={intl.formatMessage({ id: "user.delete.title" })}
title={intl.formatMessage({ id: "dead-host.delete.title" })}
onConfirm={handleDelete}
onClose={() => setDeleteId(0)}
invalidations={[["dead-hosts"], ["dead-host", deleteId]]}
>
{intl.formatMessage({ id: "user.delete.content" })}
{intl.formatMessage({ id: "dead-host.delete.content" })}
</DeleteConfirmModal>
) : null}
</div>