|
@@ -111,6 +111,7 @@ function BulkEditModal({
|
|
|
onSave,
|
|
onSave,
|
|
|
onClose,
|
|
onClose,
|
|
|
isSaving,
|
|
isSaving,
|
|
|
|
|
+ canControlPrinter,
|
|
|
t,
|
|
t,
|
|
|
}: {
|
|
}: {
|
|
|
selectedCount: number;
|
|
selectedCount: number;
|
|
@@ -118,6 +119,7 @@ function BulkEditModal({
|
|
|
onSave: (data: Partial<PrintQueueBulkUpdate>) => void;
|
|
onSave: (data: Partial<PrintQueueBulkUpdate>) => void;
|
|
|
onClose: () => void;
|
|
onClose: () => void;
|
|
|
isSaving: boolean;
|
|
isSaving: boolean;
|
|
|
|
|
+ canControlPrinter: 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');
|
|
@@ -193,7 +195,7 @@ function BulkEditModal({
|
|
|
<label className="block text-sm font-medium text-white mb-2">{t('queue.bulkEdit.queueOptions')}</label>
|
|
<label className="block text-sm font-medium text-white mb-2">{t('queue.bulkEdit.queueOptions')}</label>
|
|
|
<div className="space-y-2">
|
|
<div className="space-y-2">
|
|
|
<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} 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} />
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
@@ -231,32 +233,37 @@ function TriStateToggle({
|
|
|
label,
|
|
label,
|
|
|
value,
|
|
value,
|
|
|
onChange,
|
|
onChange,
|
|
|
|
|
+ disabled,
|
|
|
t,
|
|
t,
|
|
|
}: {
|
|
}: {
|
|
|
label: string;
|
|
label: string;
|
|
|
value: boolean | 'unchanged';
|
|
value: boolean | 'unchanged';
|
|
|
onChange: (val: boolean | 'unchanged') => void;
|
|
onChange: (val: boolean | 'unchanged') => void;
|
|
|
|
|
+ disabled?: boolean;
|
|
|
t: (key: string) => string;
|
|
t: (key: string) => string;
|
|
|
}) {
|
|
}) {
|
|
|
return (
|
|
return (
|
|
|
- <div className="flex items-center justify-between py-1">
|
|
|
|
|
|
|
+ <div className={`flex items-center justify-between py-1 ${disabled ? 'opacity-50' : ''}`}>
|
|
|
<span className="text-sm text-bambu-gray">{label}</span>
|
|
<span className="text-sm text-bambu-gray">{label}</span>
|
|
|
<div className="flex items-center gap-1 bg-bambu-dark rounded-lg p-0.5">
|
|
<div className="flex items-center gap-1 bg-bambu-dark rounded-lg p-0.5">
|
|
|
<button
|
|
<button
|
|
|
onClick={() => onChange('unchanged')}
|
|
onClick={() => onChange('unchanged')}
|
|
|
- className={`px-2 py-1 text-xs rounded ${value === 'unchanged' ? 'bg-bambu-dark-tertiary text-white' : 'text-bambu-gray hover:text-white'}`}
|
|
|
|
|
|
|
+ disabled={disabled}
|
|
|
|
|
+ className={`px-2 py-1 text-xs rounded ${value === 'unchanged' ? 'bg-bambu-dark-tertiary text-white' : 'text-bambu-gray hover:text-white'} disabled:cursor-not-allowed`}
|
|
|
>
|
|
>
|
|
|
—
|
|
—
|
|
|
</button>
|
|
</button>
|
|
|
<button
|
|
<button
|
|
|
onClick={() => onChange(false)}
|
|
onClick={() => onChange(false)}
|
|
|
- className={`px-2 py-1 text-xs rounded ${value === false ? 'bg-red-500/20 text-red-400' : 'text-bambu-gray hover:text-white'}`}
|
|
|
|
|
|
|
+ disabled={disabled}
|
|
|
|
|
+ className={`px-2 py-1 text-xs rounded ${value === false ? 'bg-red-500/20 text-red-400' : 'text-bambu-gray hover:text-white'} disabled:cursor-not-allowed`}
|
|
|
>
|
|
>
|
|
|
{t('common.off')}
|
|
{t('common.off')}
|
|
|
</button>
|
|
</button>
|
|
|
<button
|
|
<button
|
|
|
onClick={() => onChange(true)}
|
|
onClick={() => onChange(true)}
|
|
|
- className={`px-2 py-1 text-xs rounded ${value === true ? 'bg-bambu-green/20 text-bambu-green' : 'text-bambu-gray hover:text-white'}`}
|
|
|
|
|
|
|
+ disabled={disabled}
|
|
|
|
|
+ className={`px-2 py-1 text-xs rounded ${value === true ? 'bg-bambu-green/20 text-bambu-green' : 'text-bambu-gray hover:text-white'} disabled:cursor-not-allowed`}
|
|
|
>
|
|
>
|
|
|
{t('common.on')}
|
|
{t('common.on')}
|
|
|
</button>
|
|
</button>
|
|
@@ -1431,6 +1438,7 @@ export function QueuePage() {
|
|
|
}}
|
|
}}
|
|
|
onClose={() => setShowBulkEditModal(false)}
|
|
onClose={() => setShowBulkEditModal(false)}
|
|
|
isSaving={bulkUpdateMutation.isPending}
|
|
isSaving={bulkUpdateMutation.isPending}
|
|
|
|
|
+ canControlPrinter={hasPermission('printers:control')}
|
|
|
t={t}
|
|
t={t}
|
|
|
/>
|
|
/>
|
|
|
)}
|
|
)}
|