|
@@ -133,6 +133,7 @@ function BulkEditModal({
|
|
|
onClose,
|
|
onClose,
|
|
|
isSaving,
|
|
isSaving,
|
|
|
canControlPrinter,
|
|
canControlPrinter,
|
|
|
|
|
+ hasGcodeSnippets,
|
|
|
t,
|
|
t,
|
|
|
}: {
|
|
}: {
|
|
|
selectedCount: number;
|
|
selectedCount: number;
|
|
@@ -141,12 +142,14 @@ function BulkEditModal({
|
|
|
onClose: () => void;
|
|
onClose: () => void;
|
|
|
isSaving: boolean;
|
|
isSaving: boolean;
|
|
|
canControlPrinter: boolean;
|
|
canControlPrinter: boolean;
|
|
|
|
|
+ hasGcodeSnippets: boolean;
|
|
|
t: (key: string, options?: Record<string, unknown>) => string;
|
|
t: (key: string, options?: Record<string, unknown>) => string;
|
|
|
}) {
|
|
}) {
|
|
|
const [printerId, setPrinterId] = useState<number | null | 'unchanged'>('unchanged');
|
|
const [printerId, setPrinterId] = useState<number | null | 'unchanged'>('unchanged');
|
|
|
const [manualStart, setManualStart] = useState<boolean | 'unchanged'>('unchanged');
|
|
const [manualStart, setManualStart] = useState<boolean | 'unchanged'>('unchanged');
|
|
|
const [autoOffAfter, setAutoOffAfter] = useState<boolean | 'unchanged'>('unchanged');
|
|
const [autoOffAfter, setAutoOffAfter] = useState<boolean | 'unchanged'>('unchanged');
|
|
|
const [requirePreviousSuccess, setRequirePreviousSuccess] = useState<boolean | 'unchanged'>('unchanged');
|
|
const [requirePreviousSuccess, setRequirePreviousSuccess] = useState<boolean | 'unchanged'>('unchanged');
|
|
|
|
|
+ const [gcodeInjection, setGcodeInjection] = useState<boolean | 'unchanged'>('unchanged');
|
|
|
const [bedLevelling, setBedLevelling] = useState<CalibrationMode | 'unchanged'>('unchanged');
|
|
const [bedLevelling, setBedLevelling] = useState<CalibrationMode | 'unchanged'>('unchanged');
|
|
|
const [flowCali, setFlowCali] = useState<CalibrationMode | 'unchanged'>('unchanged');
|
|
const [flowCali, setFlowCali] = useState<CalibrationMode | 'unchanged'>('unchanged');
|
|
|
const [vibrationCali, setVibrationCali] = useState<boolean | 'unchanged'>('unchanged');
|
|
const [vibrationCali, setVibrationCali] = useState<boolean | 'unchanged'>('unchanged');
|
|
@@ -166,6 +169,7 @@ function BulkEditModal({
|
|
|
if (manualStart !== 'unchanged') data.manual_start = manualStart;
|
|
if (manualStart !== 'unchanged') data.manual_start = manualStart;
|
|
|
if (autoOffAfter !== 'unchanged') data.auto_off_after = autoOffAfter;
|
|
if (autoOffAfter !== 'unchanged') data.auto_off_after = autoOffAfter;
|
|
|
if (requirePreviousSuccess !== 'unchanged') data.require_previous_success = requirePreviousSuccess;
|
|
if (requirePreviousSuccess !== 'unchanged') data.require_previous_success = requirePreviousSuccess;
|
|
|
|
|
+ if (gcodeInjection !== 'unchanged') data.gcode_injection = gcodeInjection;
|
|
|
if (bedLevelling !== 'unchanged') data.bed_levelling = bedLevelling;
|
|
if (bedLevelling !== 'unchanged') data.bed_levelling = bedLevelling;
|
|
|
if (flowCali !== 'unchanged') data.flow_cali = flowCali;
|
|
if (flowCali !== 'unchanged') data.flow_cali = flowCali;
|
|
|
if (vibrationCali !== 'unchanged') data.vibration_cali = vibrationCali;
|
|
if (vibrationCali !== 'unchanged') data.vibration_cali = vibrationCali;
|
|
@@ -179,7 +183,7 @@ function BulkEditModal({
|
|
|
const hasChanges = printerId !== 'unchanged' || manualStart !== 'unchanged' || autoOffAfter !== 'unchanged' ||
|
|
const hasChanges = printerId !== 'unchanged' || manualStart !== 'unchanged' || autoOffAfter !== 'unchanged' ||
|
|
|
requirePreviousSuccess !== 'unchanged' || bedLevelling !== 'unchanged' || flowCali !== 'unchanged' ||
|
|
requirePreviousSuccess !== 'unchanged' || bedLevelling !== 'unchanged' || flowCali !== 'unchanged' ||
|
|
|
vibrationCali !== 'unchanged' || layerInspect !== 'unchanged' || timelapse !== 'unchanged' || useAms !== 'unchanged' ||
|
|
vibrationCali !== 'unchanged' || layerInspect !== 'unchanged' || timelapse !== 'unchanged' || useAms !== 'unchanged' ||
|
|
|
- nozzleOffsetCali !== 'unchanged';
|
|
|
|
|
|
|
+ nozzleOffsetCali !== 'unchanged' || gcodeInjection !== 'unchanged';
|
|
|
|
|
|
|
|
return (
|
|
return (
|
|
|
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
|
<div className="fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/50 backdrop-blur-sm">
|
|
@@ -226,6 +230,12 @@ function BulkEditModal({
|
|
|
<TriStateToggle label={t('queue.bulkEdit.staged')} value={manualStart} onChange={setManualStart} t={t} />
|
|
<TriStateToggle label={t('queue.bulkEdit.staged')} value={manualStart} onChange={setManualStart} t={t} />
|
|
|
<TriStateToggle label={t('queue.bulkEdit.autoPowerOff')} value={autoOffAfter} onChange={setAutoOffAfter} disabled={!canControlPrinter} t={t} />
|
|
<TriStateToggle label={t('queue.bulkEdit.autoPowerOff')} value={autoOffAfter} onChange={setAutoOffAfter} disabled={!canControlPrinter} t={t} />
|
|
|
<TriStateToggle label={t('queue.bulkEdit.requirePrevious')} value={requirePreviousSuccess} onChange={setRequirePreviousSuccess} t={t} />
|
|
<TriStateToggle label={t('queue.bulkEdit.requirePrevious')} value={requirePreviousSuccess} onChange={setRequirePreviousSuccess} t={t} />
|
|
|
|
|
+ {/* Same gate as the print modal's checkbox (#3058): hidden until an
|
|
|
|
|
+ admin has saved a snippet for some printer model, so the toggle
|
|
|
|
|
+ never promises an injection that has nothing to inject. */}
|
|
|
|
|
+ {hasGcodeSnippets && (
|
|
|
|
|
+ <TriStateToggle label={t('queue.bulkEdit.gcodeInjection')} value={gcodeInjection} onChange={setGcodeInjection} t={t} />
|
|
|
|
|
+ )}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
@@ -2946,6 +2956,7 @@ export function QueuePage() {
|
|
|
onClose={() => setShowBulkEditModal(false)}
|
|
onClose={() => setShowBulkEditModal(false)}
|
|
|
isSaving={bulkUpdateMutation.isPending}
|
|
isSaving={bulkUpdateMutation.isPending}
|
|
|
canControlPrinter={hasPermission('printers:control')}
|
|
canControlPrinter={hasPermission('printers:control')}
|
|
|
|
|
+ hasGcodeSnippets={!!settings?.gcode_snippets}
|
|
|
t={t}
|
|
t={t}
|
|
|
/>
|
|
/>
|
|
|
)}
|
|
)}
|