import { getBasePath } from "../../utils/url"; import { InboxOutlined, PrinterOutlined, ToTopOutlined } from "@ant-design/icons"; import { DateField, NumberField, Show, TextField } from "@refinedev/antd"; import { IResourceComponentsProps, useInvalidate, useShow, useTranslate } from "@refinedev/core"; import { Button, Modal, Typography } from "antd"; import dayjs from "dayjs"; import utc from "dayjs/plugin/utc"; import React from "react"; import { ExtraFieldDisplay } from "../../components/extraFields"; import { NumberFieldUnit } from "../../components/numberField"; import SpoolIcon from "../../components/spoolIcon"; import { enrichText } from "../../utils/parsing"; import { EntityType, useGetFields } from "../../utils/queryFields"; import { useCurrency } from "../../utils/settings"; import { IFilament } from "../filaments/model"; import { setSpoolArchived } from "./functions"; import { ISpool } from "./model"; dayjs.extend(utc); const { Title } = Typography; const { confirm } = Modal; export const SpoolShow: React.FC = () => { const t = useTranslate(); const extraFields = useGetFields(EntityType.spool); const currency = useCurrency(); const invalidate = useInvalidate(); const { queryResult } = useShow({ liveMode: "auto", }); const { data, isLoading } = queryResult; const record = data?.data; const spoolPrice = (item: ISpool) => { let spoolPrice = ""; if (item.price === undefined) { spoolPrice = `${item.filament.price}`; return spoolPrice; } return item.price; }; // Function for opening an ant design modal that asks for confirmation for archiving a spool const archiveSpool = async (spool: ISpool, archive: boolean) => { await setSpoolArchived(spool, archive); invalidate({ resource: "spool", id: spool.id, invalidates: ["list", "detail"], }); }; const archiveSpoolPopup = async (spool: ISpool | undefined) => { if (spool === undefined) { return; } // If the spool has no remaining weight, archive it immediately since it's likely not a mistake if (spool.remaining_weight != undefined && spool.remaining_weight <= 0) { await archiveSpool(spool, true); } else { confirm({ title: t("spool.titles.archive"), content: t("spool.messages.archive"), okText: t("buttons.archive"), okType: "primary", cancelText: t("buttons.cancel"), onOk() { return archiveSpool(spool, true); }, }); } }; const formatFilament = (item: IFilament) => { let vendorPrefix = ""; if (item.vendor) { vendorPrefix = `${item.vendor.name} - `; } let name = item.name; if (!name) { name = `ID: ${item.id}`; } let material = ""; if (item.material) { material = ` - ${item.material}`; } return `${vendorPrefix}${name}${material}`; }; const filamentURL = (item: IFilament) => { const URL = `/filament/show/${item.id}`; return {formatFilament(item)}; }; const formatTitle = (item: ISpool) => { return t("spool.titles.show_title", { id: item.id, name: formatFilament(item.filament), interpolation: { escapeValue: false }, }); }; const colorObj = record?.filament.multi_color_hexes ? { colors: record.filament.multi_color_hexes.split(","), vertical: record.filament.multi_color_direction === "longitudinal", } : record?.filament.color_hex; return ( ( <> {record?.archived ? ( ) : ( )} {defaultButtons} )} > {t("spool.fields.id")} {t("spool.fields.filament")} {colorObj && } {t("spool.fields.price")} {t("spool.fields.registered")} {t("spool.fields.first_used")} ); }; export default SpoolShow;