Add bulk change settings modal.

This commit is contained in:
Roger Far 2024-01-05 10:28:22 -07:00
parent ba243d3e83
commit d01cb71866
5 changed files with 274 additions and 4 deletions

View file

@ -74,6 +74,15 @@
>
Retry Selected
</button>
<button
class="button is-primary"
(click)="changeSettingsModal()"
[disabled]="selectedTorrents.length === 0"
*ngIf="torrents.length > 0"
>
Change Settings
</button>
</div>
</div>
@ -150,11 +159,144 @@
class="button is-success"
(click)="retryOk()"
[disabled]="retrying"
[ngClass]="{ 'is-loading': deleting }"
[ngClass]="{ 'is-loading': retrying }"
>
Retry selected
</button>
<button class="button" (click)="retryCancel()" [disabled]="retrying" [ngClass]="{ 'is-loading': deleting }">
<button class="button" (click)="retryCancel()" [disabled]="retrying" [ngClass]="{ 'is-loading': retrying }">
Cancel
</button>
</footer>
</div>
</div>
<div class="modal" [class.is-active]="isChangeSettingsModalActive">
<div class="modal-background"></div>
<div class="modal-card">
<header class="modal-card-head">
<p class="modal-card-title">Change settings for selected torrents</p>
<button class="delete" aria-label="close" (click)="changeSettingsCancel()"></button>
</header>
<section class="modal-card-body">
<div class="field">
<label class="label">Downloader</label>
<div class="control select is-fullwidth">
<select [(ngModel)]="updateSettingsDownloadClient">
<option [ngValue]="null"></option>
<option [ngValue]="0">Internal Downloader</option>
<option [ngValue]="1">Aria2c</option>
<option [ngValue]="2">Symlink Downloader</option>
</select>
</div>
<p class="help">
Select which downloader is used to download this torrent from the debrid provider to your host.
</p>
</div>
<div class="field">
<label class="label">Post Download Action</label>
<div class="control select is-fullwidth">
<select [(ngModel)]="updateSettingsHostDownloadAction">
<option [ngValue]="0">Download all files to host</option>
<option [ngValue]="1">Don't download any files to host</option>
</select>
</div>
<p class="help">
When a torrent is finished downloading on the provider, perform this action. Use this setting if you only want
to add files to Real-Debrid but not download them to the host.
</p>
</div>
<div class="field">
<label class="label">Category</label>
<div class="control">
<input class="input" type="text" maxlength="100" [(ngModel)]="updateSettingsCategory" />
</div>
<p class="help">The category becomes a sub-folder in your main download path.</p>
</div>
<div class="field">
<label class="label">Priority</label>
<div class="control">
<input class="input" type="number" step="1" [(ngModel)]="updateSettingsPriority" />
</div>
<p class="help">
Set the priority for this torrent where 1 is the highest. When empty it will be assigned the lowest priority.
</p>
</div>
<div class="field">
<label class="label">Automatic retry downloads</label>
<div class="control">
<input
class="input"
type="number"
max="1000"
min="0"
step="1"
[(ngModel)]="updateSettingsDownloadRetryAttempts"
/>
</div>
<p class="help">When a single download fails it will retry it this many times before marking it as failed.</p>
</div>
<div class="field">
<label class="label">Automatic retry torrent</label>
<div class="control">
<input
class="input"
type="number"
max="1000"
min="0"
step="1"
[(ngModel)]="updateSettingsTorrentRetryAttempts"
/>
</div>
<p class="help">
When a single download has failed multiple times (see setting above) or when the torrent itself received an
error it will retry the full torrent this many times before marking it failed.
</p>
</div>
<div class="field">
<label class="label">Delete download when in error</label>
<div class="control">
<input class="input" type="number" max="1000" min="0" step="1" [(ngModel)]="updateSettingsDeleteOnError" />
</div>
<p class="help">
When a download has been in error for this many minutes, delete it from the provider and the client. 0 to
disable.
</p>
</div>
<div class="field">
<label class="label">Torrent maximum lifetime</label>
<div class="control">
<input
class="input"
type="number"
max="100000"
min="0"
step="1"
[(ngModel)]="updateSettingsTorrentLifetime"
/>
</div>
<p class="help">
The maximum lifetime of a torrent in minutes. When this time has passed, mark the torrent as error. If the
torrent is completed and has downloads, the lifetime setting will not apply. 0 to disable.
</p>
</div>
<div class="notification is-danger is-light" *ngIf="changeSettingsError?.length > 0">
Error changing settings: {{ changeSettingsError }}
</div>
</section>
<footer class="modal-card-foot">
<button
class="button is-success"
(click)="changeSettingsOk()"
[disabled]="changingSettings"
[ngClass]="{ 'is-loading': changingSettings }"
>
Save
</button>
<button class="button" (click)="changeSettingsCancel()" [disabled]="changingSettings" [ngClass]="{ 'is-loading': changingSettings }">
Cancel
</button>
</footer>

View file

@ -25,7 +25,23 @@ export class TorrentTableComponent implements OnInit {
public retryError: string;
public retrying: boolean;
constructor(private router: Router, private torrentService: TorrentService) {}
public isChangeSettingsModalActive: boolean;
public changeSettingsError: string;
public changingSettings: boolean;
public updateSettingsDownloadClient: number;
public updateSettingsHostDownloadAction: number;
public updateSettingsCategory: string;
public updateSettingsPriority: number;
public updateSettingsDownloadRetryAttempts: number;
public updateSettingsTorrentRetryAttempts: number;
public updateSettingsDeleteOnError: number;
public updateSettingsTorrentLifetime: number;
constructor(
private router: Router,
private torrentService: TorrentService,
) {}
ngOnInit(): void {
this.torrentService.getList().subscribe(
@ -38,7 +54,7 @@ export class TorrentTableComponent implements OnInit {
},
(err) => {
this.error = err.error;
}
},
);
}
@ -138,4 +154,89 @@ export class TorrentTableComponent implements OnInit {
},
});
}
public changeSettingsModal(): void {
this.changeSettingsError = null;
const selectedTorrents = this.torrents.where((m) => this.selectedTorrents.indexOf(m.torrentId) > -1);
this.updateSettingsDownloadClient =
selectedTorrents.distinctBy((m) => m.downloadClient).count() == 1 ? selectedTorrents[0].downloadClient : null;
this.updateSettingsHostDownloadAction =
selectedTorrents.distinctBy((m) => m.hostDownloadAction).count() == 1
? selectedTorrents[0].hostDownloadAction
: null;
this.updateSettingsCategory =
selectedTorrents.distinctBy((m) => m.category).count() == 1 ? selectedTorrents[0].category : null;
this.updateSettingsPriority =
selectedTorrents.distinctBy((m) => m.priority).count() == 1 ? selectedTorrents[0].priority : null;
this.updateSettingsDownloadRetryAttempts =
selectedTorrents.distinctBy((m) => m.downloadRetryAttempts).count() == 1
? selectedTorrents[0].downloadRetryAttempts
: null;
this.updateSettingsTorrentRetryAttempts =
selectedTorrents.distinctBy((m) => m.torrentRetryAttempts).count() == 1
? selectedTorrents[0].torrentRetryAttempts
: null;
this.updateSettingsDeleteOnError =
selectedTorrents.distinctBy((m) => m.deleteOnError).count() == 1 ? selectedTorrents[0].deleteOnError : null;
this.updateSettingsTorrentLifetime =
selectedTorrents.distinctBy((m) => m.lifetime).count() == 1 ? selectedTorrents[0].lifetime : null;
this.isChangeSettingsModalActive = true;
}
public changeSettingsCancel(): void {
this.isChangeSettingsModalActive = false;
}
public changeSettingsOk(): void {
this.changingSettings = true;
let calls: Observable<void>[] = [];
const selectedTorrents = this.torrents.where((m) => this.selectedTorrents.indexOf(m.torrentId) > -1);
selectedTorrents.forEach((torrent) => {
if (this.updateSettingsDownloadClient != null) {
torrent.downloadClient = this.updateSettingsDownloadClient;
}
if (this.updateSettingsHostDownloadAction != null) {
torrent.hostDownloadAction = this.updateSettingsHostDownloadAction;
}
if (this.updateSettingsCategory != null) {
torrent.category = this.updateSettingsCategory;
}
if (this.updateSettingsPriority != null) {
torrent.priority = this.updateSettingsPriority;
}
if (this.updateSettingsDownloadRetryAttempts != null) {
torrent.retryCount = this.updateSettingsDownloadRetryAttempts;
}
if (this.updateSettingsTorrentRetryAttempts != null) {
torrent.torrentRetryAttempts = this.updateSettingsTorrentRetryAttempts;
}
if (this.updateSettingsDeleteOnError != null) {
torrent.deleteOnError = this.updateSettingsDeleteOnError;
}
if (this.updateSettingsTorrentLifetime != null) {
torrent.lifetime = this.updateSettingsTorrentLifetime;
}
calls.push(this.torrentService.update(torrent));
});
forkJoin(calls).subscribe({
complete: () => {
this.isChangeSettingsModalActive = false;
this.changingSettings = false;
this.selectedTorrents = [];
},
error: (err) => {
this.changeSettingsError = err.error;
this.changingSettings = false;
},
});
}
}

View file

@ -51,6 +51,14 @@
<label class="label">Category</label>
{{ torrent.category || "(no category set)" }}
</div>
<div class="field">
<label class="label">Downloader</label>
<ng-container [ngSwitch]="torrent.downloadClient">
<ng-container *ngSwitchCase="0">Internal Downloader</ng-container>
<ng-container *ngSwitchCase="1">Aria2c</ng-container>
<ng-container *ngSwitchCase="2">Symlink Downloader</ng-container>
</ng-container>
</div>
<div class="field">
<label class="label">Post Download Action</label>
<ng-container [ngSwitch]="torrent.hostDownloadAction">
@ -469,10 +477,25 @@
<button class="delete" aria-label="close" (click)="updateSettingsCancel()"></button>
</header>
<section class="modal-card-body">
<p>Settings that are blank do not have the same values for each torrent. Updating a setting with a blank value will not update it.</p>
<div class="field">
<label class="label">Downloader</label>
<div class="control select is-fullwidth">
<select [(ngModel)]="updateSettingsDownloadClient">
<option [ngValue]="0">Internal Downloader</option>
<option [ngValue]="1">Aria2c</option>
<option [ngValue]="2">Symlink Downloader</option>
</select>
</div>
<p class="help">
Select which downloader is used to download this torrent from the debrid provider to your host.
</p>
</div>
<div class="field">
<label class="label">Post Download Action</label>
<div class="control select is-fullwidth">
<select [(ngModel)]="updateSettingsHostDownloadAction">
<option [ngValue]="null"></option>
<option [ngValue]="0">Download all files to host</option>
<option [ngValue]="1">Don't download any files to host</option>
</select>

View file

@ -36,6 +36,7 @@ export class TorrentComponent implements OnInit {
public isUpdateSettingsModalActive: boolean;
public updateSettingsDownloadClient: number;
public updateSettingsHostDownloadAction: number;
public updateSettingsCategory: string;
public updateSettingsPriority: number;
@ -177,6 +178,7 @@ export class TorrentComponent implements OnInit {
}
public showUpdateSettingsModal(): void {
this.updateSettingsDownloadClient = this.torrent.downloadClient;
this.updateSettingsHostDownloadAction = this.torrent.hostDownloadAction;
this.updateSettingsCategory = this.torrent.category;
this.updateSettingsPriority = this.torrent.priority;
@ -195,6 +197,7 @@ export class TorrentComponent implements OnInit {
public updateSettingsOk(): void {
this.updating = true;
this.torrent.downloadClient = this.updateSettingsDownloadClient;
this.torrent.hostDownloadAction = this.updateSettingsHostDownloadAction;
this.torrent.category = this.updateSettingsCategory;
this.torrent.priority = this.updateSettingsPriority;

View file

@ -150,6 +150,7 @@ public class TorrentData
return;
}
dbTorrent.DownloadClient = torrent.DownloadClient;
dbTorrent.HostDownloadAction = torrent.HostDownloadAction;
dbTorrent.Category = torrent.Category;
dbTorrent.Priority = torrent.Priority;