import { Button, Flex, Form, Input, Modal, Popconfirm, Select, Space, Switch } from "antd"; import { IFilament } from "../../pages/filaments/model"; import { ISpool } from "../../pages/spools/model"; import QRCodePrintingDialog from "./qrCodePrintingDialog"; import { useSavedState } from "../../utils/saveload"; import { useTranslate } from "@refinedev/core"; import { QRCodePrintSettings, SpoolQRCodePrintSettings, useGetPrintSettings, useSetPrintSettings } from "./printing"; import { useState } from "react"; import { DeleteOutlined, EditOutlined, PlusOutlined } from "@ant-design/icons"; import { v4 as uuidv4 } from "uuid"; import _ from "lodash"; interface SpoolQRCodePrintingDialog { visible: boolean; items: ISpool[]; onCancel: () => void; } const SpoolQRCodePrintingDialog: React.FC = ({ visible, items, onCancel }) => { const t = useTranslate(); // Selected setting state const [selectedSetting, setSelectedSetting] = useState(); const allPrintSettings = useGetPrintSettings(); const setPrintSettings = useSetPrintSettings(); // Functions to update settings const addNewPrintSettings = () => { if (!allPrintSettings) return; const newId = uuidv4(); const newSetting = { labelSettings: { printSettings: { id: newId, name: t("printing.generic.newSetting"), }, }, }; setPrintSettings([...allPrintSettings, newSetting]); setSelectedSetting(newId); return newSetting; }; const updateCurrentPrintSettings = (newSettings: SpoolQRCodePrintSettings) => { if (!allPrintSettings) return; setPrintSettings( allPrintSettings.map((settings) => settings.labelSettings.printSettings.id === newSettings.labelSettings.printSettings.id ? newSettings : settings ) ); }; const deleteCurrentPrintSettings = () => { if (!allPrintSettings) return; setPrintSettings( allPrintSettings.filter((qSetting) => qSetting.labelSettings.printSettings.id !== selectedSetting) ); setSelectedSetting(undefined); }; // Initialize settings let selectedPrintSetting: SpoolQRCodePrintSettings; if (allPrintSettings === undefined) { // DB not loaded yet, use a temporary one selectedPrintSetting = { labelSettings: { printSettings: { id: "TEMP", name: t("printing.generic.newSetting"), }, }, }; } else { // DB is loaded, find the selected setting if (allPrintSettings.length === 0) { // DB loaded, but no settings found, add a new one and select it const newSetting = addNewPrintSettings(); if (!newSetting) { console.error("Error adding new setting, this should never happen"); return; } // Mutate the allPrintSettings list so that the rest of the UI will work fine allPrintSettings.push(newSetting); selectedPrintSetting = newSetting; } else { // DB loaded and at least 1 setting exists if (!selectedSetting) { // No setting has been selected, select the first one selectedPrintSetting = allPrintSettings[0]; setSelectedSetting(allPrintSettings[0].labelSettings.printSettings.id); } else { // A setting has been selected, find it const foundSetting = allPrintSettings.find( (settings) => settings.labelSettings.printSettings.id === selectedSetting ); if (foundSetting) { selectedPrintSetting = foundSetting; } else { // Selected setting not found, select a temp one selectedPrintSetting = { labelSettings: { printSettings: { id: "TEMP", name: t("printing.generic.newSetting"), }, }, }; } } } } const showVendor = selectedPrintSetting?.showVendor; const showLotNr = selectedPrintSetting?.showLotNr; const showSpoolWeight = selectedPrintSetting?.showSpoolWeight; const showTemperatures = selectedPrintSetting?.showTemperatures; const showSpoolComment = selectedPrintSetting?.showSpoolComment; const showFilamentComment = selectedPrintSetting?.showFilamentComment; const showVendorComment = selectedPrintSetting?.showVendorComment; const formatFilament = (filament: IFilament) => { let vendorPrefix = ""; if (showVendor && filament.vendor) { vendorPrefix = `${filament.vendor.name} - `; } let name = filament.name; if (!name) { name = `Filament #${filament.id}`; } return `${vendorPrefix}${name}`; }; return ( { selectedPrintSetting.labelSettings = newSettings; updateCurrentPrintSettings(selectedPrintSetting); }} extraSettingsStart={ <>