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;
}