- {/* Selection checkbox for pending items */}
+ {/* Mobile selected left accent bar */}
+ {isMobileSelectable && isSelected && (
+
+ {/* Mobile selection indicator — left accent bar only, no tick */}
+
+ {/* Selection checkbox for pending items - hidden on mobile, tap card instead */}
{isPending && onToggleSelect && (
{
e.stopPropagation();
onToggleSelect();
}}
- className={`flex items-center justify-center w-6 h-6 rounded border transition-colors ${
+ className={`hidden sm:flex items-center justify-center w-6 h-6 rounded border transition-colors shrink-0 ${
isSelected
? 'bg-bambu-green border-bambu-green text-white'
: 'border-white/30 bg-black/30 hover:border-bambu-green/50'
@@ -390,25 +404,25 @@ function SortableQueueItem({
)}
- {/* Drag handle or position number */}
+ {/* Drag handle or position number - hidden on mobile */}
{isPending ? (
-
+
) : position !== undefined ? (
-
+
#{position}
) : (
-
+
)}
{/* Thumbnail - use plate-specific thumbnail if plate_id is set */}
-
+
{item.archive_thumbnail ? (
) : (
-
+
)}
@@ -439,7 +453,7 @@ function SortableQueueItem({
{/* Info */}
-
+
{item.archive_name || item.library_file_name || `File #${item.archive_id || item.library_file_id}`}
{(platesData?.is_multi_plate ?? false) && item.plate_id !== undefined && item.plate_id !== null && ` • ${plates.find(plate => plate.index === item.plate_id)?.name || t('queue.plateNumber', { index: item.plate_id })}`}
@@ -462,57 +476,59 @@ function SortableQueueItem({
) : null}
-
-
-
+
+
+
+
{item.target_model
? `${t('queue.filter.any')} ${item.target_model}${item.target_location ? ` @ ${item.target_location}` : ''}${item.required_filament_types?.length ? ` (${item.required_filament_types.join(', ')})` : ''}`
: item.printer_id === null
? t('queue.filter.unassigned')
: (item.printer_name || `${t('common.printer')} #${item.printer_id}`)}
+
{item.print_time_seconds && (
-
-
+
+
{formatDuration(item.print_time_seconds)}
)}
{item.filament_used_grams && (
-
-
+
+
{formatWeight(item.filament_used_grams)}
)}
{item.created_by_username && (
-
+
{item.created_by_username}
)}
{isPending && !item.manual_start && (
-
-
+
+
{formatRelativeTime(item.scheduled_time, timeFormat, t)}
)}
{/* Options badges */}
-
+
{item.manual_start && (
-
-
+
+
{t('queue.badges.staged')}
)}
{item.require_previous_success && (
-
+
{t('queue.badges.requiresPrevious')}
)}
{item.auto_off_after && (
-
-
+
+
{t('queue.badges.autoPowerOff')}
)}
@@ -520,17 +536,17 @@ function SortableQueueItem({
{/* Progress bar for printing items - TODO: integrate with WebSocket */}
{isPrinting && status && (
-
-
-
+
+
+
{Math.round(status.progress || 0)}%
-
+
{status.remaining_time != null && status.remaining_time > 0 && (
<>
@@ -554,7 +570,7 @@ function SortableQueueItem({
{/* Waiting reason for model-based assignments */}
{item.waiting_reason && item.status === 'pending' && (
-
+
{item.waiting_reason}
@@ -562,88 +578,92 @@ function SortableQueueItem({
{/* Error message */}
{item.error_message && (
-
+
{item.error_message}
)}
- {/* Status badge */}
-
+ {/* Status badge + Actions */}
+ {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */}
+
e.stopPropagation()}>
+
- {/* Actions */}
-
- {isPrinting && (
-
-
-
- )}
- {isPending && (
- <>
- {item.manual_start && (
+
+ {isPrinting && (
+
+
+
+ )}
+ {isPending && (
+ <>
+ {item.manual_start && (
+
+
+
+ )}
-
+
- )}
-
-
-
-
-
-
- >
- )}
- {isHistory && (
- <>
-
-
-
-
-
-
- >
- )}
+
+
+
+ >
+ )}
+ {isHistory && (
+ <>
+
+
+
+
+
+
+ >
+ )}
+
@@ -987,72 +1007,72 @@ export function QueuePage() {
{/* Summary Cards */}
-
+
-
-
-
-
+
+
+
-
-
{activeItems.length}
-
{t('queue.summary.printing')}
+
+
{activeItems.length}
+
{t('queue.summary.printing')}
-
-
-
-
+
+
+
+
-
-
{pendingItems.length}
-
{t('queue.summary.queued')}
+
+
{pendingItems.length}
+
{t('queue.summary.queued')}
-
-
-
-
+
+
+
+
-
-
{formatDuration(totalQueueTime)}
-
{t('queue.summary.totalTime')}
+
+
{formatDuration(totalQueueTime)}
+
{t('queue.summary.totalTime')}
-
-
-
-
+
+
+
+
-
-
{formatWeight(totalWeight)}
-
{t('queue.summary.totalWeight')}
+
+
{formatWeight(totalWeight)}
+
{t('queue.summary.totalWeight')}
-
-
-
-
-
+
+
+
+
+
-
-
{historyItems.length}
-
{t('queue.summary.history')}
+
+
{historyItems.length}
+
{t('queue.summary.history')}
@@ -1060,9 +1080,9 @@ export function QueuePage() {
{/* Filters */}
-
+
{
const val = e.target.value;
@@ -1079,7 +1099,7 @@ export function QueuePage() {
setFilterStatus(e.target.value)}
>
@@ -1094,7 +1114,7 @@ export function QueuePage() {
{uniqueLocations.length > 0 && (
setFilterLocation(e.target.value)}
>
@@ -1105,10 +1125,11 @@ export function QueuePage() {
)}
-
+
{historyItems.length > 0 && (
setShowClearHistoryConfirm(true)}
@@ -1132,15 +1153,15 @@ export function QueuePage() {
) : (
-
+
{/* Active Prints */}
{activeItems.length > 0 && (
-
+
{t('queue.sections.currentlyPrinting')}
-
+
{activeItems.map((item) => (
0 && (
-
-
-
+
+
+
{t('queue.sections.queued')}
-
+
({t('queue.itemCount', { count: pendingItems.length })})
-
+
{t('queue.dragToReorder')}
setPendingSortBy(e.target.value as 'position' | 'name' | 'printer' | 'time')}
>
@@ -1200,12 +1221,12 @@ export function QueuePage() {
{/* Bulk action toolbar */}
-
+
{selectedItems.length === pendingItems.length && pendingItems.length > 0 ? (
@@ -1216,31 +1237,31 @@ export function QueuePage() {
{selectedItems.length > 0 && (
<>
-
+
{t('queue.bulkEdit.selected', { count: selectedItems.length })}
-
+
setShowBulkEditModal(true)}
- className="flex items-center gap-2 text-bambu-green hover:text-bambu-green-light"
+ className="flex items-center gap-1.5 sm:gap-2 text-xs sm:text-sm text-bambu-green hover:text-bambu-green-light"
disabled={!hasAnyPermission('queue:update_own', 'queue:update_all')}
- title={!hasAnyPermission('queue:update_own', 'queue:update_all') ? t('queue.permissions.noEditItems') : undefined}
+ title={!hasAnyPermission('queue:update_own', 'queue:update_all') ? t('queue.permissions.noEditItems') : t('queue.bulkEdit.editSelected')}
>
-
- {t('queue.bulkEdit.editSelected')}
+
+ {t('queue.bulkEdit.editSelected')}
bulkCancelMutation.mutate(selectedItems)}
- className="flex items-center gap-2 text-red-400 hover:text-red-300"
+ className="flex items-center gap-1.5 sm:gap-2 text-xs sm:text-sm text-red-400 hover:text-red-300"
disabled={bulkCancelMutation.isPending || !hasAnyPermission('queue:delete_own', 'queue:delete_all')}
- title={!hasAnyPermission('queue:delete_own', 'queue:delete_all') ? t('queue.permissions.noCancelItems') : undefined}
+ title={!hasAnyPermission('queue:delete_own', 'queue:delete_all') ? t('queue.permissions.noCancelItems') : t('queue.bulkEdit.cancelSelected')}
>
-
- {t('queue.bulkEdit.cancelSelected')}
+
+ {t('queue.bulkEdit.cancelSelected')}
>
)}
@@ -1255,7 +1276,7 @@ export function QueuePage() {
items={pendingItems.map(i => i.id)}
strategy={verticalListSortingStrategy}
>
-
+
{pendingItems.map((item, index) => (
0 && (
-
-
-
+
+
+
{t('queue.sections.history')}
-
+
({t('queue.itemCount', { count: historyItems.length })})
setHistorySortBy(e.target.value as 'date' | 'name' | 'printer')}
>
@@ -1313,7 +1334,7 @@ export function QueuePage() {
-
+
{historyItems.slice(0, 20).map((item, index) => (