import { Col, Row, Table } from "antd"; import { ColumnProps as AntdColumnProps } from "antd/es/table"; import { ColumnFilterItem } from "antd/es/table/interface"; import { getFiltersForField, typeFilters } from "../utils/filtering"; import { TableState } from "../utils/saveload"; import { getSortOrderForField, typeSorters } from "../utils/sorting"; import { NumberFieldUnit } from "./numberField"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import { DateField, TextField } from "@refinedev/antd"; import Icon from "@ant-design/icons"; import { ReactComponent as SpoolIcon } from "../icon_spool.svg"; import { useTranslate } from "@refinedev/core"; import { enrichText } from "../utils/parsing"; import { UseQueryResult } from "@tanstack/react-query"; dayjs.extend(utc); interface BaseColumnProps { id: keyof Obj & string; i18ncat?: string; i18nkey?: string; dataSource: Obj[]; tableState: TableState; } interface FilteredColumnProps { filters?: ColumnFilterItem[]; filteredValue?: string[]; allowMultipleFilters?: boolean; } interface CustomColumnProps { // eslint-disable-next-line @typescript-eslint/no-explicit-any render?: (value: any, record: Obj, index: number) => React.ReactNode; onCell?: ( data: Obj, index?: number // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => React.HTMLAttributes | React.TdHTMLAttributes; } function Column(props: BaseColumnProps & FilteredColumnProps & CustomColumnProps) { const t = useTranslate(); if (props.tableState.showColumns && !props.tableState.showColumns.includes(props.id)) { return <>; } const typedSorters = typeSorters(props.tableState.sorters); const columnProps: AntdColumnProps = { dataIndex: props.id, title: t(props.i18nkey ?? `${props.i18ncat}.fields.${props.id}`), sorter: true, sortOrder: getSortOrderForField(typedSorters, props.id), filterMultiple: props.allowMultipleFilters ?? true, }; if (props.filters && props.filteredValue) { columnProps.filters = props.filters; columnProps.filteredValue = props.filteredValue; } if (props.render) { columnProps.render = props.render; } if (props.onCell) { columnProps.onCell = props.onCell; } return {...columnProps} />; } export function SortedColumn(props: BaseColumnProps) { return Column(props); } export function RichColumn(props: BaseColumnProps) { return Column({ ...props, render: (value: string | undefined) => { return enrichText(value); }, }); } interface FilteredQueryColumnProps extends BaseColumnProps { filterValueQuery: UseQueryResult; allowMultipleFilters?: boolean; } export function FilteredQueryColumn(props: FilteredQueryColumnProps) { const query = props.filterValueQuery; let filters: ColumnFilterItem[] = []; if (query.data) { filters = query.data.map((item) => { return { text: item, value: item, }; }); } filters.push({ text: "", value: "", }); const typedFilters = typeFilters(props.tableState.filters); const filteredValue = getFiltersForField(typedFilters, props.id); return Column({ ...props, filters, filteredValue }); } interface NumberColumnProps extends BaseColumnProps { unit: string; decimals?: number; defaultText?: string; } export function NumberColumn(props: NumberColumnProps) { return Column({ ...props, render: (value) => { if (value === null || value === undefined) { return ; } return ( ); }, }); } export function DateColumn(props: BaseColumnProps) { return Column({ ...props, render: (value) => { return (