|
@@ -186,7 +186,6 @@ import { AmsBackupModal } from '../components/AmsBackupModal';
|
|
|
import { HeaterHistoryModal } from '../components/HeaterHistoryModal';
|
|
import { HeaterHistoryModal } from '../components/HeaterHistoryModal';
|
|
|
import type { HeaterSensorKind } from '../api/client';
|
|
import type { HeaterSensorKind } from '../api/client';
|
|
|
import { FilamentHoverCard, EmptySlotHoverCard } from '../components/FilamentHoverCard';
|
|
import { FilamentHoverCard, EmptySlotHoverCard } from '../components/FilamentHoverCard';
|
|
|
-import { LinkSpoolModal } from '../components/LinkSpoolModal';
|
|
|
|
|
import { AssignSpoolModal } from '../components/AssignSpoolModal';
|
|
import { AssignSpoolModal } from '../components/AssignSpoolModal';
|
|
|
import { ConfigureAmsSlotModal } from '../components/ConfigureAmsSlotModal';
|
|
import { ConfigureAmsSlotModal } from '../components/ConfigureAmsSlotModal';
|
|
|
import { useToast } from '../contexts/ToastContext';
|
|
import { useToast } from '../contexts/ToastContext';
|
|
@@ -199,7 +198,7 @@ import { PrinterInfoModal } from '../components/PrinterInfoModal';
|
|
|
import { FeedDirectionModal } from '../components/FeedDirectionModal';
|
|
import { FeedDirectionModal } from '../components/FeedDirectionModal';
|
|
|
import { plateCheckFailureText } from '../utils/plateCheck';
|
|
import { plateCheckFailureText } from '../utils/plateCheck';
|
|
|
import { amsHasLoadedTray, getAmsLabel, getEmptySlotKind, getGlobalTrayId, getFillBarColor, getSpoolmanFillLevel, getFallbackSpoolTag, installedNozzleDiameters, isAmsHtUnit, isBambuLabSpool, trayForSlot, resolveSlotNozzleDiameter, resolveSlotExtruder, formatSlotLabel, slotPresetDescribesTray, FTS_INLET_SIDE } from '../utils/amsHelpers';
|
|
import { amsHasLoadedTray, getAmsLabel, getEmptySlotKind, getGlobalTrayId, getFillBarColor, getSpoolmanFillLevel, getFallbackSpoolTag, installedNozzleDiameters, isAmsHtUnit, isBambuLabSpool, trayForSlot, resolveSlotNozzleDiameter, resolveSlotExtruder, formatSlotLabel, slotPresetDescribesTray, FTS_INLET_SIDE } from '../utils/amsHelpers';
|
|
|
-import { MAX_CHAMBER_TEMP_C, getPrinterImage, getWifiStrength, filterCompatibleQueueItems, isPrinterCurrentlyDispatchable } from '../utils/printer';
|
|
|
|
|
|
|
+import { MAX_CHAMBER_TEMP_C, getPrinterImage, getWifiStrength, filterCompatibleQueueItems, isPrinterCurrentlyDispatchable, IDLE_PRINTER_STATES } from '../utils/printer';
|
|
|
import { FilamentSlotCircle } from '../components/FilamentSlotCircle';
|
|
import { FilamentSlotCircle } from '../components/FilamentSlotCircle';
|
|
|
import { Collapsible } from '../components/Collapsible';
|
|
import { Collapsible } from '../components/Collapsible';
|
|
|
import { ConnectionDiagnosticModal, DiagnosticChecklist } from '../components/ConnectionDiagnostic';
|
|
import { ConnectionDiagnosticModal, DiagnosticChecklist } from '../components/ConnectionDiagnostic';
|
|
@@ -2047,7 +2046,6 @@ function PrinterCard({
|
|
|
spoolmanEnabled = false,
|
|
spoolmanEnabled = false,
|
|
|
linkedSpools,
|
|
linkedSpools,
|
|
|
spoolmanUrl,
|
|
spoolmanUrl,
|
|
|
- spoolmanSyncMode,
|
|
|
|
|
onGetAssignment,
|
|
onGetAssignment,
|
|
|
onUnassignSpool,
|
|
onUnassignSpool,
|
|
|
spoolmanSpools,
|
|
spoolmanSpools,
|
|
@@ -2085,10 +2083,8 @@ function PrinterCard({
|
|
|
tempFair: number;
|
|
tempFair: number;
|
|
|
};
|
|
};
|
|
|
spoolmanEnabled?: boolean;
|
|
spoolmanEnabled?: boolean;
|
|
|
- hasUnlinkedSpools?: boolean;
|
|
|
|
|
linkedSpools?: Record<string, LinkedSpoolInfo>;
|
|
linkedSpools?: Record<string, LinkedSpoolInfo>;
|
|
|
spoolmanUrl?: string | null;
|
|
spoolmanUrl?: string | null;
|
|
|
- spoolmanSyncMode?: string | null;
|
|
|
|
|
spoolAssignments?: SpoolAssignment[];
|
|
spoolAssignments?: SpoolAssignment[];
|
|
|
onGetAssignment?: (printerId: number, amsId: number, trayId: number) => SpoolAssignment | undefined;
|
|
onGetAssignment?: (printerId: number, amsId: number, trayId: number) => SpoolAssignment | undefined;
|
|
|
onUnassignSpool?: (printerId: number, amsId: number, trayId: number) => void;
|
|
onUnassignSpool?: (printerId: number, amsId: number, trayId: number) => void;
|
|
@@ -2240,13 +2236,6 @@ function PrinterCard({
|
|
|
initialKind: HeaterSensorKind;
|
|
initialKind: HeaterSensorKind;
|
|
|
availableKinds: HeaterSensorKind[];
|
|
availableKinds: HeaterSensorKind[];
|
|
|
} | null>(null);
|
|
} | null>(null);
|
|
|
- const [linkSpoolModal, setLinkSpoolModal] = useState<{
|
|
|
|
|
- tagUid: string;
|
|
|
|
|
- trayUuid: string;
|
|
|
|
|
- printerId: number;
|
|
|
|
|
- amsId: number;
|
|
|
|
|
- trayId: number;
|
|
|
|
|
- } | null>(null);
|
|
|
|
|
const [assignSpoolModal, setAssignSpoolModal] = useState<{
|
|
const [assignSpoolModal, setAssignSpoolModal] = useState<{
|
|
|
printerId: number;
|
|
printerId: number;
|
|
|
amsId: number;
|
|
amsId: number;
|
|
@@ -2710,19 +2699,6 @@ function PrinterCard({
|
|
|
onError: (error: Error) => showToast(error.message || t('printers.toast.failedToSendCommand'), 'error'),
|
|
onError: (error: Error) => showToast(error.message || t('printers.toast.failedToSendCommand'), 'error'),
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
- const unlinkSpoolMutation = useMutation({
|
|
|
|
|
- mutationFn: (spoolId: number) => api.unlinkSpool(spoolId),
|
|
|
|
|
- onSuccess: (result) => {
|
|
|
|
|
- showToast(t('spoolman.unlinkSuccess') || result?.message, 'success');
|
|
|
|
|
- queryClient.invalidateQueries({ queryKey: ['linked-spools'] });
|
|
|
|
|
- queryClient.invalidateQueries({ queryKey: ['unlinked-spools'] });
|
|
|
|
|
- queryClient.invalidateQueries({ queryKey: ['spoolman-slot-assignments'] });
|
|
|
|
|
- },
|
|
|
|
|
- onError: (error: Error) => {
|
|
|
|
|
- showToast(error.message || t('spoolman.unlinkFailed'), 'error');
|
|
|
|
|
- },
|
|
|
|
|
- });
|
|
|
|
|
-
|
|
|
|
|
// AMS drying mutations
|
|
// AMS drying mutations
|
|
|
const startDryingMutation = useMutation({
|
|
const startDryingMutation = useMutation({
|
|
|
mutationFn: ({ amsId, temp, duration, filament, rotateTray }: { amsId: number; temp: number; duration: number; filament: string; rotateTray: boolean }) =>
|
|
mutationFn: ({ amsId, temp, duration, filament, rotateTray }: { amsId: number; temp: number; duration: number; filament: string; rotateTray: boolean }) =>
|
|
@@ -5701,22 +5677,6 @@ function PrinterCard({
|
|
|
linkedSpoolId: slotAssignmentForFill?.spoolman_spool_id
|
|
linkedSpoolId: slotAssignmentForFill?.spoolman_spool_id
|
|
|
?? (trayTag ? linkedSpools?.[trayTag]?.id : undefined),
|
|
?? (trayTag ? linkedSpools?.[trayTag]?.id : undefined),
|
|
|
spoolmanUrl,
|
|
spoolmanUrl,
|
|
|
- syncMode: spoolmanSyncMode,
|
|
|
|
|
- // Suppress Link button when slot is already occupied by ANY assignment
|
|
|
|
|
- // (Spoolman SlotAssignment OR local SpoolAssignment). Phase 9 only
|
|
|
|
|
- // suppressed for Spoolman; the maintainer screenshot shows the badge
|
|
|
|
|
- // still appearing on slots with a local Devil Design PLA assigned.
|
|
|
|
|
- onLinkSpool: (spoolmanEnabled && !slotAssignmentForFill && !inventoryAssignment) ? () => {
|
|
|
|
|
- const linkTag = (filamentData.trayUuid || filamentData.tagUid || getFallbackSpoolTag(printer.serial_number, ams.id, slotIdx)).toUpperCase();
|
|
|
|
|
- setLinkSpoolModal({
|
|
|
|
|
- tagUid: filamentData.tagUid || linkTag,
|
|
|
|
|
- trayUuid: filamentData.trayUuid || '',
|
|
|
|
|
- printerId: printer.id,
|
|
|
|
|
- amsId: ams.id,
|
|
|
|
|
- trayId: slotIdx,
|
|
|
|
|
- });
|
|
|
|
|
- } : undefined,
|
|
|
|
|
- onUnlinkSpool: linkedSpool?.id ? () => unlinkSpoolMutation.mutate(linkedSpool.id) : undefined,
|
|
|
|
|
}}
|
|
}}
|
|
|
inventory={(() => {
|
|
inventory={(() => {
|
|
|
if (spoolmanEnabled) {
|
|
if (spoolmanEnabled) {
|
|
@@ -6119,19 +6079,6 @@ function PrinterCard({
|
|
|
linkedSpoolId: htSlotAssignmentForFill?.spoolman_spool_id
|
|
linkedSpoolId: htSlotAssignmentForFill?.spoolman_spool_id
|
|
|
?? (htTrayTag ? linkedSpools?.[htTrayTag]?.id : undefined),
|
|
?? (htTrayTag ? linkedSpools?.[htTrayTag]?.id : undefined),
|
|
|
spoolmanUrl,
|
|
spoolmanUrl,
|
|
|
- syncMode: spoolmanSyncMode,
|
|
|
|
|
- // Suppress Link button when slot is occupied by ANY assignment (Phase 13 P13-6d)
|
|
|
|
|
- onLinkSpool: (spoolmanEnabled && !htSlotAssignmentForFill && !htInventoryAssignment) ? () => {
|
|
|
|
|
- const linkTag = (filamentData.trayUuid || filamentData.tagUid || getFallbackSpoolTag(printer.serial_number, ams.id, htSlotId)).toUpperCase();
|
|
|
|
|
- setLinkSpoolModal({
|
|
|
|
|
- tagUid: filamentData.tagUid || linkTag,
|
|
|
|
|
- trayUuid: filamentData.trayUuid || '',
|
|
|
|
|
- printerId: printer.id,
|
|
|
|
|
- amsId: ams.id,
|
|
|
|
|
- trayId: htSlotId,
|
|
|
|
|
- });
|
|
|
|
|
- } : undefined,
|
|
|
|
|
- onUnlinkSpool: htLinkedSpool?.id ? () => unlinkSpoolMutation.mutate(htLinkedSpool.id) : undefined,
|
|
|
|
|
}}
|
|
}}
|
|
|
inventory={(() => {
|
|
inventory={(() => {
|
|
|
if (spoolmanEnabled) {
|
|
if (spoolmanEnabled) {
|
|
@@ -6410,19 +6357,6 @@ function PrinterCard({
|
|
|
linkedSpoolId: extSlotAssignmentForFill?.spoolman_spool_id
|
|
linkedSpoolId: extSlotAssignmentForFill?.spoolman_spool_id
|
|
|
?? (extTrayTag ? linkedSpools?.[extTrayTag]?.id : undefined),
|
|
?? (extTrayTag ? linkedSpools?.[extTrayTag]?.id : undefined),
|
|
|
spoolmanUrl,
|
|
spoolmanUrl,
|
|
|
- syncMode: spoolmanSyncMode,
|
|
|
|
|
- // Suppress Link button when slot is occupied by ANY assignment (Phase 13 P13-6d)
|
|
|
|
|
- onLinkSpool: (spoolmanEnabled && !extSlotAssignmentForFill && !extInventoryAssignment) ? () => {
|
|
|
|
|
- const linkTag = (extFilamentData.trayUuid || extFilamentData.tagUid || getFallbackSpoolTag(printer.serial_number, 255, slotTrayId)).toUpperCase();
|
|
|
|
|
- setLinkSpoolModal({
|
|
|
|
|
- tagUid: extFilamentData.tagUid || linkTag,
|
|
|
|
|
- trayUuid: extFilamentData.trayUuid || '',
|
|
|
|
|
- printerId: printer.id,
|
|
|
|
|
- amsId: 255,
|
|
|
|
|
- trayId: slotTrayId,
|
|
|
|
|
- });
|
|
|
|
|
- } : undefined,
|
|
|
|
|
- onUnlinkSpool: extLinkedSpool?.id ? () => unlinkSpoolMutation.mutate(extLinkedSpool.id) : undefined,
|
|
|
|
|
}}
|
|
}}
|
|
|
inventory={(() => {
|
|
inventory={(() => {
|
|
|
if (spoolmanEnabled) {
|
|
if (spoolmanEnabled) {
|
|
@@ -7311,19 +7245,6 @@ function PrinterCard({
|
|
|
/>
|
|
/>
|
|
|
)}
|
|
)}
|
|
|
|
|
|
|
|
- {/* Link Spool Modal */}
|
|
|
|
|
- {linkSpoolModal && (
|
|
|
|
|
- <LinkSpoolModal
|
|
|
|
|
- isOpen={!!linkSpoolModal}
|
|
|
|
|
- onClose={() => setLinkSpoolModal(null)}
|
|
|
|
|
- tagUid={linkSpoolModal.tagUid}
|
|
|
|
|
- trayUuid={linkSpoolModal.trayUuid}
|
|
|
|
|
- printerId={linkSpoolModal.printerId}
|
|
|
|
|
- amsId={linkSpoolModal.amsId}
|
|
|
|
|
- trayId={linkSpoolModal.trayId}
|
|
|
|
|
- />
|
|
|
|
|
- )}
|
|
|
|
|
-
|
|
|
|
|
{/* Assign Spool Modal */}
|
|
{/* Assign Spool Modal */}
|
|
|
{assignSpoolModal && (
|
|
{assignSpoolModal && (
|
|
|
<AssignSpoolModal
|
|
<AssignSpoolModal
|
|
@@ -7346,6 +7267,7 @@ function PrinterCard({
|
|
|
slotInfo={configureSlotModal}
|
|
slotInfo={configureSlotModal}
|
|
|
printerModel={mapModelCode(printer.model) || undefined}
|
|
printerModel={mapModelCode(printer.model) || undefined}
|
|
|
nozzleDiameter={resolveSlotNozzleDiameter(status, configureSlotModal.amsId)}
|
|
nozzleDiameter={resolveSlotNozzleDiameter(status, configureSlotModal.amsId)}
|
|
|
|
|
+ printerState={status?.state}
|
|
|
onSuccess={() => {
|
|
onSuccess={() => {
|
|
|
// Refresh slot presets to show updated profile name
|
|
// Refresh slot presets to show updated profile name
|
|
|
queryClient.invalidateQueries({ queryKey: ['slotPresets', printer.id] });
|
|
queryClient.invalidateQueries({ queryKey: ['slotPresets', printer.id] });
|
|
@@ -7383,6 +7305,7 @@ function PrinterCard({
|
|
|
<FirmwareUpdateModal
|
|
<FirmwareUpdateModal
|
|
|
printer={printer}
|
|
printer={printer}
|
|
|
firmwareInfo={firmwareInfo}
|
|
firmwareInfo={firmwareInfo}
|
|
|
|
|
+ printerState={status?.state ?? null}
|
|
|
onClose={() => setShowFirmwareModal(false)}
|
|
onClose={() => setShowFirmwareModal(false)}
|
|
|
/>
|
|
/>
|
|
|
)}
|
|
)}
|
|
@@ -8185,10 +8108,12 @@ export function AddPrinterModal({
|
|
|
function FirmwareUpdateModal({
|
|
function FirmwareUpdateModal({
|
|
|
printer,
|
|
printer,
|
|
|
firmwareInfo,
|
|
firmwareInfo,
|
|
|
|
|
+ printerState,
|
|
|
onClose,
|
|
onClose,
|
|
|
}: {
|
|
}: {
|
|
|
printer: Printer;
|
|
printer: Printer;
|
|
|
firmwareInfo: FirmwareUpdateInfo;
|
|
firmwareInfo: FirmwareUpdateInfo;
|
|
|
|
|
+ printerState: string | null;
|
|
|
onClose: () => void;
|
|
onClose: () => void;
|
|
|
}) {
|
|
}) {
|
|
|
const { t } = useTranslation();
|
|
const { t } = useTranslation();
|
|
@@ -8196,6 +8121,8 @@ function FirmwareUpdateModal({
|
|
|
const { showToast } = useToast();
|
|
const { showToast } = useToast();
|
|
|
const { hasPermission } = useAuth();
|
|
const { hasPermission } = useAuth();
|
|
|
const canUpdate = hasPermission('firmware:update');
|
|
const canUpdate = hasPermission('firmware:update');
|
|
|
|
|
+ // Firmware goes onto the SD card the printer prints from: only while idle.
|
|
|
|
|
+ const printerIdle = IDLE_PRINTER_STATES.includes(printerState ?? '');
|
|
|
const [uploadStatus, setUploadStatus] = useState<FirmwareUploadStatus | null>(null);
|
|
const [uploadStatus, setUploadStatus] = useState<FirmwareUploadStatus | null>(null);
|
|
|
const [isUploading, setIsUploading] = useState(false);
|
|
const [isUploading, setIsUploading] = useState(false);
|
|
|
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout | null>(null);
|
|
const [pollInterval, setPollInterval] = useState<NodeJS.Timeout | null>(null);
|
|
@@ -8205,7 +8132,8 @@ function FirmwareUpdateModal({
|
|
|
|
|
|
|
|
// Prepare check query — runs when a version is selected and user can update
|
|
// Prepare check query — runs when a version is selected and user can update
|
|
|
const { data: prepareInfo, isLoading: isPreparing } = useQuery({
|
|
const { data: prepareInfo, isLoading: isPreparing } = useQuery({
|
|
|
- queryKey: ['firmwarePrepare', printer.id, selectedVersion],
|
|
|
|
|
|
|
+ // Asked again once the printer turns idle: a busy printer's answer says no.
|
|
|
|
|
+ queryKey: ['firmwarePrepare', printer.id, selectedVersion, printerIdle],
|
|
|
queryFn: () => firmwareApi.prepareUpload(printer.id, selectedVersion ?? undefined),
|
|
queryFn: () => firmwareApi.prepareUpload(printer.id, selectedVersion ?? undefined),
|
|
|
staleTime: 30000,
|
|
staleTime: 30000,
|
|
|
enabled: !!selectedVersion && canUpdate && !isUploading,
|
|
enabled: !!selectedVersion && canUpdate && !isUploading,
|
|
@@ -8373,7 +8301,12 @@ function FirmwareUpdateModal({
|
|
|
</div>
|
|
</div>
|
|
|
) : prepareInfo && !isUploading && !uploadStatus ? (
|
|
) : prepareInfo && !isUploading && !uploadStatus ? (
|
|
|
<div className="mb-4">
|
|
<div className="mb-4">
|
|
|
- {prepareInfo.can_proceed ? (
|
|
|
|
|
|
|
+ {prepareInfo.can_proceed && !printerIdle ? (
|
|
|
|
|
+ <div className="flex items-center gap-2 text-red-700 dark:text-red-400 text-sm">
|
|
|
|
|
+ <AlertCircle className="w-4 h-4 flex-shrink-0" />
|
|
|
|
|
+ {t('printers.firmwareModal.printerBusy')}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ ) : prepareInfo.can_proceed ? (
|
|
|
<div className="flex items-center gap-2 text-bambu-green text-sm">
|
|
<div className="flex items-center gap-2 text-bambu-green text-sm">
|
|
|
<Box className="w-4 h-4" />
|
|
<Box className="w-4 h-4" />
|
|
|
{t('printers.firmwareModal.sdCardReady')}
|
|
{t('printers.firmwareModal.sdCardReady')}
|
|
@@ -8437,7 +8370,7 @@ function FirmwareUpdateModal({
|
|
|
<Button variant="secondary" onClick={onClose}>
|
|
<Button variant="secondary" onClick={onClose}>
|
|
|
{uploadStatus?.status === 'complete' ? t('printers.firmwareModal.done') : t('common.cancel')}
|
|
{uploadStatus?.status === 'complete' ? t('printers.firmwareModal.done') : t('common.cancel')}
|
|
|
</Button>
|
|
</Button>
|
|
|
- {prepareInfo?.can_proceed && !isUploading && uploadStatus?.status !== 'complete' && canUpdate && (
|
|
|
|
|
|
|
+ {prepareInfo?.can_proceed && printerIdle && !isUploading && uploadStatus?.status !== 'complete' && canUpdate && (
|
|
|
<Button
|
|
<Button
|
|
|
onClick={handleStartUpload}
|
|
onClick={handleStartUpload}
|
|
|
disabled={uploadMutation.isPending}
|
|
disabled={uploadMutation.isPending}
|
|
@@ -9092,23 +9025,6 @@ export function PrintersPage() {
|
|
|
});
|
|
});
|
|
|
const spoolmanEnabled = spoolmanStatus?.enabled && spoolmanStatus?.connected;
|
|
const spoolmanEnabled = spoolmanStatus?.enabled && spoolmanStatus?.connected;
|
|
|
|
|
|
|
|
- // Fetch Spoolman settings to get sync mode
|
|
|
|
|
- const { data: spoolmanSettings } = useQuery({
|
|
|
|
|
- queryKey: ['spoolman-settings'],
|
|
|
|
|
- queryFn: api.getSpoolmanSettings,
|
|
|
|
|
- enabled: !!spoolmanEnabled,
|
|
|
|
|
- staleTime: 60 * 1000, // 1 minute
|
|
|
|
|
- });
|
|
|
|
|
- const spoolmanSyncMode = spoolmanSettings?.spoolman_sync_mode;
|
|
|
|
|
-
|
|
|
|
|
- // Fetch unlinked spools to know if link button should be enabled
|
|
|
|
|
- const { data: unlinkedSpools } = useQuery({
|
|
|
|
|
- queryKey: ['unlinked-spools'],
|
|
|
|
|
- queryFn: api.getUnlinkedSpools,
|
|
|
|
|
- enabled: !!spoolmanEnabled,
|
|
|
|
|
- staleTime: 30 * 1000, // 30 seconds
|
|
|
|
|
- });
|
|
|
|
|
- const hasUnlinkedSpools = unlinkedSpools && unlinkedSpools.length > 0;
|
|
|
|
|
|
|
|
|
|
// Fetch linked spools map (tag -> spool_id) to know which spools are already in Spoolman
|
|
// Fetch linked spools map (tag -> spool_id) to know which spools are already in Spoolman
|
|
|
const { data: linkedSpoolsData } = useQuery({
|
|
const { data: linkedSpoolsData } = useQuery({
|
|
@@ -10060,10 +9976,8 @@ export function PrintersPage() {
|
|
|
tempFair: Number(settings.ams_temp_fair) || 35,
|
|
tempFair: Number(settings.ams_temp_fair) || 35,
|
|
|
} : undefined}
|
|
} : undefined}
|
|
|
spoolmanEnabled={spoolmanEnabled}
|
|
spoolmanEnabled={spoolmanEnabled}
|
|
|
- hasUnlinkedSpools={hasUnlinkedSpools}
|
|
|
|
|
linkedSpools={linkedSpools}
|
|
linkedSpools={linkedSpools}
|
|
|
spoolmanUrl={spoolmanStatus?.url}
|
|
spoolmanUrl={spoolmanStatus?.url}
|
|
|
- spoolmanSyncMode={spoolmanSyncMode}
|
|
|
|
|
onGetAssignment={getAssignment}
|
|
onGetAssignment={getAssignment}
|
|
|
onUnassignSpool={(pid, aid, tid) => unassignMutation.mutate({ printerId: pid, amsId: aid, trayId: tid })}
|
|
onUnassignSpool={(pid, aid, tid) => unassignMutation.mutate({ printerId: pid, amsId: aid, trayId: tid })}
|
|
|
spoolmanSpools={spoolmanSpools}
|
|
spoolmanSpools={spoolmanSpools}
|
|
@@ -10107,10 +10021,8 @@ export function PrintersPage() {
|
|
|
viewMode={viewMode}
|
|
viewMode={viewMode}
|
|
|
cardSize={cardSize}
|
|
cardSize={cardSize}
|
|
|
spoolmanEnabled={spoolmanEnabled}
|
|
spoolmanEnabled={spoolmanEnabled}
|
|
|
- hasUnlinkedSpools={hasUnlinkedSpools}
|
|
|
|
|
linkedSpools={linkedSpools}
|
|
linkedSpools={linkedSpools}
|
|
|
spoolmanUrl={spoolmanStatus?.url}
|
|
spoolmanUrl={spoolmanStatus?.url}
|
|
|
- spoolmanSyncMode={spoolmanSyncMode}
|
|
|
|
|
onGetAssignment={getAssignment}
|
|
onGetAssignment={getAssignment}
|
|
|
onUnassignSpool={(pid, aid, tid) => unassignMutation.mutate({ printerId: pid, amsId: aid, trayId: tid })}
|
|
onUnassignSpool={(pid, aid, tid) => unassignMutation.mutate({ printerId: pid, amsId: aid, trayId: tid })}
|
|
|
spoolmanSpools={spoolmanSpools}
|
|
spoolmanSpools={spoolmanSpools}
|