| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- import { IconHelp, IconSearch } from "@tabler/icons-react";
- import { useQueryClient } from "@tanstack/react-query";
- import { useState } from "react";
- import Alert from "react-bootstrap/Alert";
- import { deleteProxyHost, toggleProxyHost } from "src/api/backend";
- import { Button, LoadingPage } from "src/components";
- import { useProxyHosts } from "src/hooks";
- import { T } from "src/locale";
- import { showDeleteConfirmModal, showHelpModal, showProxyHostModal } from "src/modals";
- import { showObjectSuccess } from "src/notifications";
- import Table from "./Table";
- export default function TableWrapper() {
- const queryClient = useQueryClient();
- const [search, setSearch] = useState("");
- const { isFetching, isLoading, isError, error, data } = useProxyHosts(["owner", "access_list", "certificate"]);
- if (isLoading) {
- return <LoadingPage />;
- }
- if (isError) {
- return <Alert variant="danger">{error?.message || "Unknown error"}</Alert>;
- }
- const handleDelete = async (id: number) => {
- await deleteProxyHost(id);
- showObjectSuccess("proxy-host", "deleted");
- };
- const handleDisableToggle = async (id: number, enabled: boolean) => {
- await toggleProxyHost(id, enabled);
- queryClient.invalidateQueries({ queryKey: ["proxy-hosts"] });
- queryClient.invalidateQueries({ queryKey: ["proxy-host", id] });
- showObjectSuccess("proxy-host", enabled ? "enabled" : "disabled");
- };
- let filtered = null;
- if (search && data) {
- filtered = data?.filter(
- (item) =>
- item.domainNames.some((domain: string) => domain.toLowerCase().includes(search)) ||
- item.forwardHost.toLowerCase().includes(search) ||
- `${item.forwardPort}`.includes(search),
- );
- } else if (search !== "") {
- // this can happen if someone deletes the last item while searching
- setSearch("");
- }
- return (
- <div className="card mt-4">
- <div className="card-status-top bg-lime" />
- <div className="card-table">
- <div className="card-header">
- <div className="row w-full">
- <div className="col">
- <h2 className="mt-1 mb-0">
- <T id="proxy-hosts" />
- </h2>
- </div>
- <div className="col-md-auto col-sm-12">
- <div className="ms-auto d-flex flex-wrap btn-list">
- {data?.length ? (
- <div className="input-group input-group-flat w-auto">
- <span className="input-group-text input-group-text-sm">
- <IconSearch size={16} />
- </span>
- <input
- id="advanced-table-search"
- type="text"
- className="form-control form-control-sm"
- autoComplete="off"
- onChange={(e: any) => setSearch(e.target.value.toLowerCase().trim())}
- />
- </div>
- ) : null}
- <Button size="sm" onClick={() => showHelpModal("ProxyHosts", "lime")}>
- <IconHelp size={20} />
- </Button>
- {data?.length ? (
- <Button size="sm" className="btn-lime" onClick={() => showProxyHostModal("new")}>
- <T id="object.add" tData={{ object: "proxy-host" }} />
- </Button>
- ) : null}
- </div>
- </div>
- </div>
- </div>
- <Table
- data={filtered ?? data ?? []}
- isFiltered={!!search}
- isFetching={isFetching}
- onEdit={(id: number) => showProxyHostModal(id)}
- onDelete={(id: number) =>
- showDeleteConfirmModal({
- title: <T id="object.delete" tData={{ object: "proxy-host" }} />,
- onConfirm: () => handleDelete(id),
- invalidations: [["proxy-hosts"], ["proxy-host", id]],
- children: <T id="object.delete.content" tData={{ object: "proxy-host" }} />,
- })
- }
- onDisableToggle={handleDisableToggle}
- onNew={() => showProxyHostModal("new")}
- />
- </div>
- </div>
- );
- }
|