diff --git a/package.json b/package.json index 02aa6f2..9235117 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "real-debrid-downloader", - "version": "1.6.4", + "version": "1.6.5", "description": "Real-Debrid Downloader Desktop (Electron + React + TypeScript)", "main": "build/main/main/main.js", "author": "Sucukdeluxe", diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 3048987..5a60469 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -1474,6 +1474,38 @@ export function App(): ReactElement { movePackage(packageId, "down"); }, [movePackage]); + const moveSelectedPackages = useCallback((direction: "up" | "down") => { + const currentOrder = packageOrderRef.current; + const selPkgs = new Set([...selectedIds].filter((id) => snapshot.session.packages[id])); + if (selPkgs.size === 0) return; + const order = [...currentOrder]; + if (direction === "up") { + for (let i = 0; i < order.length; i++) { + if (selPkgs.has(order[i]) && i > 0 && !selPkgs.has(order[i - 1])) { + [order[i - 1], order[i]] = [order[i], order[i - 1]]; + } + } + } else { + for (let i = order.length - 1; i >= 0; i--) { + if (selPkgs.has(order[i]) && i < order.length - 1 && !selPkgs.has(order[i + 1])) { + [order[i], order[i + 1]] = [order[i + 1], order[i]]; + } + } + } + const unchanged = order.length === currentOrder.length && order.every((id, idx) => id === currentOrder[idx]); + if (unchanged) return; + setDownloadsSortDescending(false); + pendingPackageOrderRef.current = [...order]; + pendingPackageOrderAtRef.current = Date.now(); + packageOrderRef.current = [...order]; + void window.rd.reorderPackages(order).catch((error) => { + pendingPackageOrderRef.current = null; + pendingPackageOrderAtRef.current = 0; + packageOrderRef.current = serverPackageOrderRef.current; + showToast(`Sortierung fehlgeschlagen: ${String(error)}`, 2400); + }); + }, [selectedIds, snapshot.session.packages, showToast]); + const onPackageToggle = useCallback((packageId: string): void => { void window.rd.togglePackage(packageId).catch((error) => { showToast(`Paket-Umschalten fehlgeschlagen: ${String(error)}`, 2400); @@ -2148,6 +2180,23 @@ export function App(): ReactElement { > +
+ +
{snapshot.reconnectSeconds > 0 && (
Reconnect: {snapshot.reconnectSeconds}s
diff --git a/src/renderer/styles.css b/src/renderer/styles.css index e6800b9..1a83b14 100644 --- a/src/renderer/styles.css +++ b/src/renderer/styles.css @@ -344,6 +344,15 @@ body, background: rgba(244, 63, 94, 0.1); } +.ctrl-icon-btn.ctrl-move:not(:disabled) { + color: var(--accent); +} + +.ctrl-icon-btn.ctrl-move:hover:not(:disabled) { + border-color: var(--accent); + background: color-mix(in srgb, var(--accent) 10%, transparent); +} + .ctrl-icon-btn.ctrl-speed.active { color: #f59e0b; border-color: rgba(245, 158, 11, 0.5); @@ -577,7 +586,7 @@ body, .pkg-column-header { display: grid; - grid-template-columns: 1fr 160px 80px 110px 110px 70px 160px 90px; + /* grid-template-columns set via inline style from columnOrder */ gap: 8px; padding: 5px 12px; background: var(--card); @@ -595,7 +604,8 @@ body, .pkg-column-header .pkg-col-account, .pkg-column-header .pkg-col-prio, .pkg-column-header .pkg-col-status, -.pkg-column-header .pkg-col-speed { +.pkg-column-header .pkg-col-speed, +.pkg-column-header .pkg-col-added { text-align: center; } @@ -613,7 +623,7 @@ body, .pkg-columns { display: grid; - grid-template-columns: 1fr 160px 80px 110px 110px 70px 160px 90px; + /* grid-template-columns set via inline style from columnOrder */ gap: 8px; align-items: center; min-width: 0; @@ -639,7 +649,8 @@ body, .pkg-columns .pkg-col-account, .pkg-columns .pkg-col-prio, .pkg-columns .pkg-col-status, -.pkg-columns .pkg-col-speed { +.pkg-columns .pkg-col-speed, +.pkg-columns .pkg-col-added { font-size: 13px; color: var(--muted); overflow: hidden; @@ -862,7 +873,7 @@ body, .status-bar { display: flex; flex-wrap: wrap; - gap: 16px; + gap: 8px 16px; align-items: center; color: var(--muted); font-size: 12px; @@ -873,6 +884,16 @@ body, margin: 0 -14px -10px; } +.footer-spacer { + flex: 1; +} + +.footer-btn { + font-size: 11px; + padding: 2px 8px; + min-height: 0; +} + .settings-shell { display: grid; grid-template-rows: auto 1fr; @@ -1286,7 +1307,7 @@ td { .item-row { display: grid; - grid-template-columns: 1fr 160px 80px 110px 110px 70px 160px 90px; + /* grid-template-columns set via inline style from columnOrder */ gap: 8px; align-items: center; margin: 0 -12px; @@ -1348,6 +1369,22 @@ td { color: #64748b !important; } +.pkg-col-dragging { + opacity: 0.4; +} + +.pkg-col-drop-target { + box-shadow: -2px 0 0 0 var(--accent); +} + +.pkg-column-header .pkg-col { + cursor: grab; +} + +.pkg-column-header .pkg-col.sortable { + cursor: pointer; +} + .ctx-menu-sub { position: relative; } @@ -1378,6 +1415,12 @@ td { color: var(--accent) !important; } +.ctx-menu-disabled { + opacity: 0.4; + cursor: not-allowed !important; + pointer-events: none; +} + .item-remove { background: none; border: none; @@ -1807,8 +1850,9 @@ td { } .pkg-columns, - .pkg-column-header { - grid-template-columns: 1fr; + .pkg-column-header, + .item-row { + grid-template-columns: 1fr !important; } .pkg-column-header .pkg-col-progress, @@ -1817,7 +1861,8 @@ td { .pkg-column-header .pkg-col-account, .pkg-column-header .pkg-col-prio, .pkg-column-header .pkg-col-status, - .pkg-column-header .pkg-col-speed { + .pkg-column-header .pkg-col-speed, + .pkg-column-header .pkg-col-added { display: none; } @@ -1827,7 +1872,8 @@ td { .pkg-columns .pkg-col-account, .pkg-columns .pkg-col-prio, .pkg-columns .pkg-col-status, - .pkg-columns .pkg-col-speed { + .pkg-columns .pkg-col-speed, + .pkg-columns .pkg-col-added { display: none; }