| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- import { IconDotsVertical, IconDownload, IconRefresh, IconTrash } from "@tabler/icons-react";
- import { createColumnHelper, getCoreRowModel, useReactTable } from "@tanstack/react-table";
- import { useMemo } from "react";
- import type { Certificate } from "src/api/backend";
- import {
- CertificateInUseFormatter,
- DateFormatter,
- DomainsFormatter,
- EmptyData,
- GravatarFormatter,
- } from "src/components";
- import { TableLayout } from "src/components/Table/TableLayout";
- import { intl, T } from "src/locale";
- import { showCustomCertificateModal, showDNSCertificateModal, showHTTPCertificateModal } from "src/modals";
- interface Props {
- data: Certificate[];
- isFiltered?: boolean;
- isFetching?: boolean;
- onDelete?: (id: number) => void;
- onRenew?: (id: number) => void;
- onDownload?: (id: number) => void;
- }
- export default function Table({ data, isFetching, onDelete, onRenew, onDownload, isFiltered }: Props) {
- const columnHelper = createColumnHelper<Certificate>();
- const columns = useMemo(
- () => [
- columnHelper.accessor((row: any) => row.owner, {
- id: "owner",
- cell: (info: any) => {
- const value = info.getValue();
- return <GravatarFormatter url={value.avatar} name={value.name} />;
- },
- meta: {
- className: "w-1",
- },
- }),
- columnHelper.accessor((row: any) => row, {
- id: "domainNames",
- header: intl.formatMessage({ id: "column.name" }),
- cell: (info: any) => {
- const value = info.getValue();
- return <DomainsFormatter domains={value.domainNames} createdOn={value.createdOn} />;
- },
- }),
- columnHelper.accessor((row: any) => row.provider, {
- id: "provider",
- header: intl.formatMessage({ id: "column.provider" }),
- cell: (info: any) => {
- if (info.getValue() === "letsencrypt") {
- return <T id="lets-encrypt" />;
- }
- return <T id={info.getValue()} />;
- },
- }),
- columnHelper.accessor((row: any) => row.expiresOn, {
- id: "expiresOn",
- header: intl.formatMessage({ id: "column.expires" }),
- cell: (info: any) => {
- return <DateFormatter value={info.getValue()} highlightPast />;
- },
- }),
- columnHelper.accessor((row: any) => row, {
- id: "proxyHosts",
- header: intl.formatMessage({ id: "column.status" }),
- cell: (info: any) => {
- const r = info.getValue();
- return (
- <CertificateInUseFormatter
- proxyHosts={r.proxyHosts}
- redirectionHosts={r.redirectionHosts}
- deadHosts={r.deadHosts}
- />
- );
- },
- }),
- columnHelper.display({
- id: "id",
- cell: (info: any) => {
- return (
- <span className="dropdown">
- <button
- type="button"
- className="btn dropdown-toggle btn-action btn-sm px-1"
- data-bs-boundary="viewport"
- data-bs-toggle="dropdown"
- >
- <IconDotsVertical />
- </button>
- <div className="dropdown-menu dropdown-menu-end">
- <span className="dropdown-header">
- <T
- id="object.actions-title"
- tData={{ object: "certificate" }}
- data={{ id: info.row.original.id }}
- />
- </span>
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- onRenew?.(info.row.original.id);
- }}
- >
- <IconRefresh size={16} />
- <T id="action.renew" />
- </a>
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- onDownload?.(info.row.original.id);
- }}
- >
- <IconDownload size={16} />
- <T id="action.download" />
- </a>
- <div className="dropdown-divider" />
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- onDelete?.(info.row.original.id);
- }}
- >
- <IconTrash size={16} />
- <T id="action.delete" />
- </a>
- </div>
- </span>
- );
- },
- meta: {
- className: "text-end w-1",
- },
- }),
- ],
- [columnHelper, onDelete, onRenew, onDownload],
- );
- const tableInstance = useReactTable<Certificate>({
- columns,
- data,
- getCoreRowModel: getCoreRowModel(),
- rowCount: data.length,
- meta: {
- isFetching,
- },
- enableSortingRemoval: false,
- });
- const customAddBtn = (
- <div className="dropdown">
- <button type="button" className="btn dropdown-toggle btn-pink my-3" data-bs-toggle="dropdown">
- <T id="object.add" tData={{ object: "certificate" }} />
- </button>
- <div className="dropdown-menu">
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- showHTTPCertificateModal();
- }}
- >
- <T id="lets-encrypt-via-http" />
- </a>
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- showDNSCertificateModal();
- }}
- >
- <T id="lets-encrypt-via-dns" />
- </a>
- <div className="dropdown-divider" />
- <a
- className="dropdown-item"
- href="#"
- onClick={(e) => {
- e.preventDefault();
- showCustomCertificateModal();
- }}
- >
- <T id="certificates.custom" />
- </a>
- </div>
- </div>
- );
- return (
- <TableLayout
- tableInstance={tableInstance}
- emptyState={
- <EmptyData
- object="certificate"
- objects="certificates"
- tableInstance={tableInstance}
- isFiltered={isFiltered}
- color="pink"
- customAddBtn={customAddBtn}
- />
- }
- />
- );
- }
|