From 2c61260e0f03dd051de04667decd04e042b9461f Mon Sep 17 00:00:00 2001 From: Tzahi12345 Date: Thu, 25 May 2023 21:55:35 -0400 Subject: [PATCH] UI updates (#922) * Fixed download spinner in player component * Downloads UI is more mobile friendly (#905) * Code cleanup * Fixed size of actions in home screen downloads * Errored downloads now display their stage as "Error" in the UI * Moved personal settings from about dialog to profile dialog * Profile dialog can now be opened without logging in/without multi-user mode * Fixed issue where archive dialog could be accessed from anywhere * Misc internationalization improvements * Combined download stage and download progress columns * Added back loading spinner to download actions * Adjusted thresholds for consolidating download action buttons * Implemented virtual scrolling for notifications (helps if many notifications exist) * Fixed minor console error --- src/app/app.component.html | 4 +- src/app/app.module.ts | 2 + .../downloads/downloads.component.html | 58 +- .../downloads/downloads.component.scss | 14 +- .../downloads/downloads.component.ts | 139 +++- .../notifications-list.component.html | 60 +- .../notifications-list.component.scss | 15 +- .../notifications/notifications.component.css | 5 +- .../notifications.component.html | 2 +- .../notifications/notifications.component.ts | 9 + .../about-dialog/about-dialog.component.html | 30 - .../about-dialog/about-dialog.component.ts | 13 - .../user-profile-dialog}/locales_list.ts | 0 .../user-profile-dialog.component.html | 45 +- .../user-profile-dialog.component.ts | 31 + src/app/main/main.component.html | 2 +- src/app/player/player.component.css | 15 +- src/app/player/player.component.html | 24 +- src/app/player/player.component.ts | 9 - src/app/posts.services.ts | 2 +- src/app/settings/settings.component.html | 17 - src/app/settings/settings.component.ts | 20 - src/assets/i18n/messages.en.xlf | 659 ++++++++++-------- 23 files changed, 646 insertions(+), 529 deletions(-) rename src/app/{settings => dialogs/user-profile-dialog}/locales_list.ts (100%) diff --git a/src/app/app.component.html b/src/app/app.component.html index a9853d70..6ec00c94 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -17,11 +17,11 @@ - - diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 8768910f..084cab7b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -34,6 +34,7 @@ import { MatBadgeModule } from '@angular/material/badge'; import { DragDropModule } from '@angular/cdk/drag-drop'; import { ClipboardModule } from '@angular/cdk/clipboard'; import { TextFieldModule } from '@angular/cdk/text-field'; +import { ScrollingModule } from '@angular/cdk/scrolling'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { AppComponent } from './app.component'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; @@ -189,6 +190,7 @@ registerLocaleData(es, 'es'); DragDropModule, ClipboardModule, TextFieldModule, + ScrollingModule, NgxFileDropModule, AvatarModule, ContentLoaderModule, diff --git a/src/app/components/downloads/downloads.component.html b/src/app/components/downloads/downloads.component.html index 9dabe7e8..5c11a120 100644 --- a/src/app/components/downloads/downloads.component.html +++ b/src/app/components/downloads/downloads.component.html @@ -10,8 +10,8 @@ - Title - + Title + {{element.title}} @@ -31,41 +31,47 @@ - - - Stage - {{STEP_INDEX_TO_LABEL[element.step_index]}} - - Progress + + {{STEP_INDEX_TO_LABEL[element.step_index]}} + + - {{+(element.percent_complete) > 100 ? '100' : element.percent_complete}}% + {{+(element.percent_complete) > 100 ? '100' : element.percent_complete}}% - N/A + N/A + + Error - Actions - -
- - - - + Actions + +
+ + + + + - - - - - - +
+
+ + + + + +
@@ -80,9 +86,9 @@
- - - + + +
diff --git a/src/app/components/downloads/downloads.component.scss b/src/app/components/downloads/downloads.component.scss index ed84df91..1cdb12c1 100644 --- a/src/app/components/downloads/downloads.component.scss +++ b/src/app/components/downloads/downloads.component.scss @@ -10,15 +10,23 @@ mat-header-cell, mat-cell { .icon-button-spinner { position: absolute; - top: 7px; - left: 6px; + top: -13px; + left: 10px; +} + +.button-span { + position: relative;; } .downloads-action-button-div { - margin-top: 10px; margin-left: 5px; } +.downloads-action-button { + margin-top: 10px; + margin-right: 10px; +} + .rounded-top { border-radius: 16px 16px 0px 0px !important; } diff --git a/src/app/components/downloads/downloads.component.ts b/src/app/components/downloads/downloads.component.ts index c0fde459..f99c4ca8 100644 --- a/src/app/components/downloads/downloads.component.ts +++ b/src/app/components/downloads/downloads.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, OnDestroy, ViewChild, Input, EventEmitter } from '@angular/core'; +import { Component, OnInit, OnDestroy, ViewChild, Input, EventEmitter, HostListener } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { trigger, transition, animateChild, stagger, query, style, animate } from '@angular/animations'; import { Router } from '@angular/router'; @@ -13,31 +13,7 @@ import { Download } from 'api-types'; @Component({ selector: 'app-downloads', templateUrl: './downloads.component.html', - styleUrls: ['./downloads.component.scss'], - animations: [ - // nice stagger effect when showing existing elements - trigger('list', [ - transition(':enter', [ - // child animation selector + stagger - query('@items', - stagger(100, animateChild()), { optional: true } - ) - ]), - ]), - trigger('items', [ - // cubic-bezier for a tiny bouncing feel - transition(':enter', [ - style({ transform: 'scale(0.5)', opacity: 0 }), - animate('500ms cubic-bezier(.8,-0.6,0.2,1.5)', - style({ transform: 'scale(1)', opacity: 1 })) - ]), - transition(':leave', [ - style({ transform: 'scale(1)', opacity: 1, height: '*' }), - animate('1s cubic-bezier(.8,-0.6,0.2,1.5)', - style({ transform: 'scale(0.5)', opacity: 0, height: '0px', margin: '0px' })) - ]), - ]) - ], + styleUrls: ['./downloads.component.scss'] }) export class DownloadsComponent implements OnInit, OnDestroy { @@ -62,13 +38,79 @@ export class DownloadsComponent implements OnInit, OnDestroy { 3: $localize`Complete` } - displayedColumns: string[] = ['timestamp_start', 'title', 'step_index', 'sub_name', 'percent_complete', 'actions']; + actionsFlex = 2; + minimizeButtons = false; + displayedColumnsBig: string[] = ['timestamp_start', 'title', 'sub_name', 'percent_complete', 'actions']; + displayedColumnsSmall: string[] = ['title', 'percent_complete', 'actions']; + displayedColumns: string[] = this.displayedColumnsBig; dataSource = null; // new MatTableDataSource(); + + // The purpose of this is to reduce code reuse for displaying these actions as icons or in a menu + downloadActions: DownloadAction[] = [ + { + tooltip: $localize`Watch content`, + action: (download: Download) => this.watchContent(download), + show: (download: Download) => download.finished && !download.error, + icon: 'smart_display' + }, + { + tooltip: $localize`Show error`, + action: (download: Download) => this.showError(download), + show: (download: Download) => download.finished && !!download.error, + icon: 'warning' + }, + { + tooltip: $localize`Restart`, + action: (download: Download) => this.restartDownload(download), + show: (download: Download) => download.finished, + icon: 'restart_alt' + }, + { + tooltip: $localize`Pause`, + action: (download: Download) => this.pauseDownload(download), + show: (download: Download) => !download.finished && (!download.paused || !download.finished_step), + icon: 'pause', + loading: (download: Download) => download.paused && !download.finished_step + }, + { + tooltip: $localize`Resume`, + action: (download: Download) => this.resumeDownload(download), + show: (download: Download) => !download.finished && download.paused && download.finished_step, + icon: 'play_arrow' + }, + { + tooltip: $localize`Resume`, + action: (download: Download) => this.resumeDownload(download), + show: (download: Download) => !download.finished && download.paused && download.finished_step, + icon: 'play_arrow' + }, + { + tooltip: $localize`Cancel`, + action: (download: Download) => this.cancelDownload(download), + show: (download: Download) => false && !download.finished && !download.paused, // TODO: add possibility to cancel download + icon: 'cancel' + }, + { + tooltip: $localize`Clear`, + action: (download: Download) => this.clearDownload(download), + show: (download: Download) => download.finished || download.paused, + icon: 'delete' + } + ] + downloads_retrieved = false; + innerWidth: number; + @ViewChild(MatPaginator) paginator: MatPaginator; @ViewChild(MatSort) sort: MatSort; + @HostListener('window:resize', ['$event']) + onResize(): void { + this.innerWidth = window.innerWidth; + this.recalculateColumns(); + } + sort_downloads = (a: Download, b: Download): number => { const result = b.timestamp_start - a.timestamp_start; return result; @@ -77,6 +119,10 @@ export class DownloadsComponent implements OnInit, OnDestroy { constructor(public postsService: PostsService, private router: Router, private dialog: MatDialog, private clipboard: Clipboard) { } ngOnInit(): void { + // Remove sub name as it's not necessary for one-off downloads + if (this.uids) this.displayedColumnsBig = this.displayedColumnsBig.filter(col => col !== 'sub_name'); + this.innerWidth = window.innerWidth; + this.recalculateColumns(); if (this.postsService.initialized) { this.getCurrentDownloadsRecurring(); } else { @@ -164,8 +210,8 @@ export class DownloadsComponent implements OnInit, OnDestroy { }); } - pauseDownload(download_uid: string): void { - this.postsService.pauseDownload(download_uid).subscribe(res => { + pauseDownload(download: Download): void { + this.postsService.pauseDownload(download['uid']).subscribe(res => { if (!res['success']) { this.postsService.openSnackBar($localize`Failed to pause download! See server logs for more info.`); } @@ -180,8 +226,8 @@ export class DownloadsComponent implements OnInit, OnDestroy { }); } - resumeDownload(download_uid: string): void { - this.postsService.resumeDownload(download_uid).subscribe(res => { + resumeDownload(download: Download): void { + this.postsService.resumeDownload(download['uid']).subscribe(res => { if (!res['success']) { this.postsService.openSnackBar($localize`Failed to resume download! See server logs for more info.`); } @@ -196,8 +242,8 @@ export class DownloadsComponent implements OnInit, OnDestroy { }); } - restartDownload(download_uid: string): void { - this.postsService.restartDownload(download_uid).subscribe(res => { + restartDownload(download: Download): void { + this.postsService.restartDownload(download['uid']).subscribe(res => { if (!res['success']) { this.postsService.openSnackBar($localize`Failed to restart download! See server logs for more info.`); } else { @@ -208,16 +254,16 @@ export class DownloadsComponent implements OnInit, OnDestroy { }); } - cancelDownload(download_uid: string): void { - this.postsService.cancelDownload(download_uid).subscribe(res => { + cancelDownload(download: Download): void { + this.postsService.cancelDownload(download['uid']).subscribe(res => { if (!res['success']) { this.postsService.openSnackBar($localize`Failed to cancel download! See server logs for more info.`); } }); } - clearDownload(download_uid: string): void { - this.postsService.clearDownload(download_uid).subscribe(res => { + clearDownload(download: Download): void { + this.postsService.clearDownload(download['uid']).subscribe(res => { if (!res['success']) { this.postsService.openSnackBar($localize`Failed to pause download! See server logs for more info.`); } @@ -257,6 +303,7 @@ export class DownloadsComponent implements OnInit, OnDestroy { } showError(download: Download): void { + console.log(download) const copyToClipboardEmitter = new EventEmitter(); this.dialog.open(ConfirmDialogComponent, { data: { @@ -276,4 +323,22 @@ export class DownloadsComponent implements OnInit, OnDestroy { } }); } + + recalculateColumns() { + if (this.innerWidth < 650) this.displayedColumns = this.displayedColumnsSmall; + else this.displayedColumns = this.displayedColumnsBig; + + this.actionsFlex = this.uids || this.innerWidth < 800 ? 1 : 2; + + if (this.innerWidth < 800 && !this.uids || this.innerWidth < 1100 && this.uids) this.minimizeButtons = true; + else this.minimizeButtons = false; + } } + +interface DownloadAction { + tooltip: string, + action: (download: Download) => void, + show: (download: Download) => boolean, + icon: string, + loading?: (download: Download) => boolean +} \ No newline at end of file diff --git a/src/app/components/notifications-list/notifications-list.component.html b/src/app/components/notifications-list/notifications-list.component.html index 78930e11..c64600a3 100644 --- a/src/app/components/notifications-list/notifications-list.component.html +++ b/src/app/components/notifications-list/notifications-list.component.html @@ -1,30 +1,32 @@ -
- - - -
- {{notification.timestamp * 1000 | date:'short'}} -
-
- - - {{NOTIFICATION_PREFIX[notification.type]}} + +
+ + + +
+ {{notification.timestamp * 1000 | date:'short'}} +
+
+ + + {{NOTIFICATION_PREFIX[notification.type]}} + + +
+ + +
+ {{notification['data'][NOTIFICATION_SUFFIX_KEY[notification.type]]}} +
- - - - -
- {{notification['data'][NOTIFICATION_SUFFIX_KEY[notification.type]]}} -
-
-
- - - - - - - -
-
\ No newline at end of file + + + + + + + + +
+
+ \ No newline at end of file diff --git a/src/app/components/notifications-list/notifications-list.component.scss b/src/app/components/notifications-list/notifications-list.component.scss index 8ea107a7..d2f8b99d 100644 --- a/src/app/components/notifications-list/notifications-list.component.scss +++ b/src/app/components/notifications-list/notifications-list.component.scss @@ -13,12 +13,21 @@ font-size: 14px; } +.notification-card-parent { + margin: 5px; +} + .notification-card { margin-top: 5px; } +.notification-actions { + margin-top: auto; +} + .card-radius { border-radius: 12px; + height: 166px; } .dot { @@ -30,4 +39,8 @@ position: absolute; right: 8px; top: 8px; - } \ No newline at end of file +} + +.viewport { + height: 100%; +} \ No newline at end of file diff --git a/src/app/components/notifications/notifications.component.css b/src/app/components/notifications/notifications.component.css index f9f81b89..dfc8e720 100644 --- a/src/app/components/notifications/notifications.component.css +++ b/src/app/components/notifications/notifications.component.css @@ -4,7 +4,10 @@ } .notifications-list-parent { - max-height: 70vh; overflow-y: auto; padding: 0px 10px 10px 10px; +} + +.notifications-list { + display: block } \ No newline at end of file diff --git a/src/app/components/notifications/notifications.component.html b/src/app/components/notifications/notifications.component.html index e13a125e..0e6f6c0f 100644 --- a/src/app/components/notifications/notifications.component.html +++ b/src/app/components/notifications/notifications.component.html @@ -4,7 +4,7 @@ {{filter.value.label}} - + diff --git a/src/app/components/notifications/notifications.component.ts b/src/app/components/notifications/notifications.component.ts index 124bd5a0..0a5c6bbe 100644 --- a/src/app/components/notifications/notifications.component.ts +++ b/src/app/components/notifications/notifications.component.ts @@ -14,6 +14,7 @@ export class NotificationsComponent implements OnInit { notifications: Notification[] = null; filtered_notifications: Notification[] = null; + list_height = '65vh'; @Output() notificationCount = new EventEmitter(); @@ -110,6 +111,8 @@ export class NotificationsComponent implements OnInit { filterNotifications(): void { this.filtered_notifications = this.notifications.filter(notification => this.selectedFilters.length === 0 || this.selectedFilters.includes(notification.type)); + // We need to do this to get the virtual scroll component to have an appropriate height + this.calculateListHeight(); } selectedFiltersChanged(event: MatChipListboxChange): void { @@ -117,6 +120,12 @@ export class NotificationsComponent implements OnInit { this.filterNotifications(); } + calculateListHeight() { + const avgHeight = 166; + const calcHeight = this.filtered_notifications.length * avgHeight; + this.list_height = calcHeight > window.innerHeight*0.65 ? '65vh' : `${calcHeight}px`; + } + originalOrder = (): number => { return 0; } diff --git a/src/app/dialogs/about-dialog/about-dialog.component.html b/src/app/dialogs/about-dialog/about-dialog.component.html index 94898e6d..c3a3b8a9 100644 --- a/src/app/dialogs/about-dialog/about-dialog.component.html +++ b/src/app/dialogs/about-dialog/about-dialog.component.html @@ -35,36 +35,6 @@
Installation details:

Found a bug or have a suggestion? Click here to create an issue!

- -
-
Personal settings:
- - Sidepanel mode - - - Over - - - Side - - - -
- - File card size - - - Large - - - Medium - - - Small - - - -
diff --git a/src/app/dialogs/about-dialog/about-dialog.component.ts b/src/app/dialogs/about-dialog/about-dialog.component.ts index 826421a3..7729a4f1 100644 --- a/src/app/dialogs/about-dialog/about-dialog.component.ts +++ b/src/app/dialogs/about-dialog/about-dialog.component.ts @@ -16,8 +16,6 @@ export class AboutDialogComponent implements OnInit { checking_for_updates = true; current_version_tag = CURRENT_VERSION; - sidepanel_mode = this.postsService.sidepanel_mode; - card_size = this.postsService.card_size; constructor(public postsService: PostsService) { } @@ -31,15 +29,4 @@ export class AboutDialogComponent implements OnInit { this.latestGithubRelease = res; }); } - - sidePanelModeChanged(new_mode) { - localStorage.setItem('sidepanel_mode', new_mode); - this.postsService.sidepanel_mode = new_mode; - } - - cardSizeOptionChanged(new_size) { - localStorage.setItem('card_size', new_size); - this.postsService.card_size = new_size; - } - } diff --git a/src/app/settings/locales_list.ts b/src/app/dialogs/user-profile-dialog/locales_list.ts similarity index 100% rename from src/app/settings/locales_list.ts rename to src/app/dialogs/user-profile-dialog/locales_list.ts diff --git a/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html b/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html index c3bb84f9..2e1bfde1 100644 --- a/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html +++ b/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html @@ -13,19 +13,52 @@

Your Profile

+ - -
-
warnYou are not logged in.
- -
+ + Language + + + + {{all_locales[locale]['nativeName']}} + + + + +
+ + Sidepanel mode + + + Over + + + Side + + + +
+ + File card size + + + Large + + + Medium + + + Small + + +
- +
diff --git a/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.ts b/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.ts index 17d8c86d..3c30d430 100644 --- a/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.ts +++ b/src/app/dialogs/user-profile-dialog/user-profile-dialog.component.ts @@ -2,6 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { PostsService } from 'app/posts.services'; import { Router } from '@angular/router'; import { MatDialogRef } from '@angular/material/dialog'; +import { isoLangs } from './locales_list'; @Component({ selector: 'app-user-profile-dialog', @@ -10,9 +11,24 @@ import { MatDialogRef } from '@angular/material/dialog'; }) export class UserProfileDialogComponent implements OnInit { + all_locales = isoLangs; + supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'ko', 'id', 'en-GB']; + initialLocale = localStorage.getItem('locale'); + sidepanel_mode = this.postsService.sidepanel_mode; + card_size = this.postsService.card_size; + constructor(public postsService: PostsService, private router: Router, public dialogRef: MatDialogRef) { } ngOnInit(): void { + this.postsService.getSupportedLocales().subscribe(res => { + if (res && res['supported_locales']) { + this.supported_locales = ['en', 'en-GB']; // required + this.supported_locales = this.supported_locales.concat(res['supported_locales']); + } + }, err => { + console.error(`Failed to retrieve list of supported languages! You may need to run: 'node src/postbuild.mjs'. Error below:`); + console.error(err); + }); } loginClicked() { @@ -25,4 +41,19 @@ export class UserProfileDialogComponent implements OnInit { this.dialogRef.close(); } + localeSelectChanged(new_val: string): void { + localStorage.setItem('locale', new_val); + this.postsService.openSnackBar($localize`Language successfully changed! Reload to update the page.`) + } + + sidePanelModeChanged(new_mode) { + localStorage.setItem('sidepanel_mode', new_mode); + this.postsService.sidepanel_mode = new_mode; + } + + cardSizeOptionChanged(new_size) { + localStorage.setItem('card_size', new_size); + this.postsService.card_size = new_size; + } + } diff --git a/src/app/main/main.component.html b/src/app/main/main.component.html index e5ae633e..8afa7ef1 100644 --- a/src/app/main/main.component.html +++ b/src/app/main/main.component.html @@ -205,7 +205,7 @@
- +
diff --git a/src/app/player/player.component.css b/src/app/player/player.component.css index ea67baf2..29991f5e 100644 --- a/src/app/player/player.component.css +++ b/src/app/player/player.component.css @@ -37,11 +37,15 @@ } .spinner { - bottom: 1px; - left: 2px; + bottom: -2px; + left: 6px; position: absolute; } +.buttons { + position: relative; +} + .save-button { right: 25px; position: fixed; @@ -85,13 +89,6 @@ margin-bottom: 15px; } -.spinner-div { - position: relative; - display: inline-block; - margin-right: 12px; - top: 8px; -} - .skip-ad-button { position: absolute; right: 20px; diff --git a/src/app/player/player.component.html b/src/app/player/player.component.html index 3b12c981..ed447308 100644 --- a/src/app/player/player.component.html +++ b/src/app/player/player.component.html @@ -22,20 +22,22 @@

-

+

No description available.

- - + + + - - - + + + + - + @@ -56,14 +58,6 @@ - -
diff --git a/src/app/player/player.component.ts b/src/app/player/player.component.ts index c21d33c7..3316c180 100644 --- a/src/app/player/player.component.ts +++ b/src/app/player/player.component.ts @@ -61,8 +61,6 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { url = null; name = null; - innerWidth: number; - downloading = false; save_volume_timer = null; @@ -70,14 +68,7 @@ export class PlayerComponent implements OnInit, AfterViewInit, OnDestroy { @ViewChild('twitchchat') twitchChat: TwitchChatComponent; - @HostListener('window:resize', ['$event']) - onResize(): void { - this.innerWidth = window.innerWidth; - } - ngOnInit(): void { - this.innerWidth = window.innerWidth; - this.playlist_id = this.route.snapshot.paramMap.get('playlist_id'); this.uid = this.route.snapshot.paramMap.get('uid'); this.sub_id = this.route.snapshot.paramMap.get('sub_id'); diff --git a/src/app/posts.services.ts b/src/app/posts.services.ts index 59a0be3f..67f86e37 100644 --- a/src/app/posts.services.ts +++ b/src/app/posts.services.ts @@ -115,7 +115,7 @@ import { RestartDownloadResponse, TaskType } from '../api-types'; -import { isoLangs } from './settings/locales_list'; +import { isoLangs } from './dialogs/user-profile-dialog/locales_list'; import { Title } from '@angular/platform-browser'; import { MatDrawerMode } from '@angular/material/sidenav'; diff --git a/src/app/settings/settings.component.html b/src/app/settings/settings.component.html index 59b12d81..6d4ae4d1 100644 --- a/src/app/settings/settings.component.html +++ b/src/app/settings/settings.component.html @@ -78,23 +78,6 @@

Settings

- -
-
-
- - Language - - - - {{all_locales[locale]['nativeName']}} - - - - -
-
-
diff --git a/src/app/settings/settings.component.ts b/src/app/settings/settings.component.ts index c2b10575..ee599aa8 100644 --- a/src/app/settings/settings.component.ts +++ b/src/app/settings/settings.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit, EventEmitter } from '@angular/core'; import { PostsService } from 'app/posts.services'; -import { isoLangs } from './locales_list'; import { MatSnackBar } from '@angular/material/snack-bar'; import {DomSanitizer} from '@angular/platform-browser'; import { MatDialog } from '@angular/material/dialog'; @@ -22,10 +21,6 @@ import { GenerateRssUrlComponent } from 'app/dialogs/generate-rss-url/generate-r styleUrls: ['./settings.component.scss'] }) export class SettingsComponent implements OnInit { - all_locales = isoLangs; - supported_locales = ['en', 'es', 'de', 'fr', 'nl', 'pt', 'it', 'ca', 'cs', 'nb', 'ru', 'zh', 'ko', 'id', 'en-GB']; - initialLocale = localStorage.getItem('locale'); - initial_config = null; new_config = null loading_config = false; @@ -83,16 +78,6 @@ export class SettingsComponent implements OnInit { const tab = this.route.snapshot.paramMap.get('tab'); this.tabIndex = tab && this.TAB_TO_INDEX[tab] ? this.TAB_TO_INDEX[tab] : 0; - - this.postsService.getSupportedLocales().subscribe(res => { - if (res && res['supported_locales']) { - this.supported_locales = ['en', 'en-GB']; // required - this.supported_locales = this.supported_locales.concat(res['supported_locales']); - } - }, err => { - console.error(`Failed to retrieve list of supported languages! You may need to run: 'node src/postbuild.mjs'. Error below:`); - console.error(err); - }); } getConfig(): void { @@ -207,11 +192,6 @@ export class SettingsComponent implements OnInit { }); } - localeSelectChanged(new_val: string): void { - localStorage.setItem('locale', new_val); - this.postsService.openSnackBar($localize`Language successfully changed! Reload to update the page.`) - } - generateBookmarklet(): void { this.bookmarksite('YTDL-Material', this.generated_bookmarklet_code); } diff --git a/src/assets/i18n/messages.en.xlf b/src/assets/i18n/messages.en.xlf index 0083fae4..77ffd323 100644 --- a/src/assets/i18n/messages.en.xlf +++ b/src/assets/i18n/messages.en.xlf @@ -60,10 +60,6 @@ src/app/components/login/login.component.html 39 - - src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 20 - Navigation menu Login Page title @@ -341,7 +337,7 @@ src/app/settings/settings.component.ts - 175 + 160 @@ -387,11 +383,19 @@ Stage + + Error + + src/app/components/downloads/downloads.component.html + 39 + + Error + Progress src/app/components/downloads/downloads.component.html - 42 + 45 Progress @@ -399,7 +403,7 @@ Actions src/app/components/downloads/downloads.component.html - 55 + 58 src/app/components/tasks/tasks.component.html @@ -407,276 +411,234 @@ Actions - - Pause + + Pause all downloads src/app/components/downloads/downloads.component.html - 59 + 89 - Pause + Pause all downloads - - Resume + + Resume all downloads src/app/components/downloads/downloads.component.html - 60 + 90 - Resume + Resume all downloads - - Cancel + + Clear downloads src/app/components/downloads/downloads.component.html - 61 - - - src/app/components/modify-users/modify-users.component.html - 62 - - - src/app/components/task-settings/task-settings.component.html - 25 - - - src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html - 90 - - - src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html - 58 + 91 + Clear downloads + + + No downloads available! - src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html - 64 + src/app/components/downloads/downloads.component.html + 96 + No downloads label + + + Creating download - src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html - 24 + src/app/components/downloads/downloads.component.ts + 35 + + + Getting info - src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html - 81 + src/app/components/downloads/downloads.component.ts + 36 + + + Downloading file - src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html - 52 + src/app/components/downloads/downloads.component.ts + 37 + + + Complete - src/app/settings/settings.component.html - 609 + src/app/components/downloads/downloads.component.ts + 38 - Cancel - + Watch content - src/app/components/downloads/downloads.component.html - 64 + src/app/components/downloads/downloads.component.ts + 50 - Watch content - + Show error - src/app/components/downloads/downloads.component.html - 65 - - - src/app/components/tasks/tasks.component.html - 81 + src/app/components/downloads/downloads.component.ts + 56 - Show error - + Restart - src/app/components/downloads/downloads.component.html - 66 + src/app/components/downloads/downloads.component.ts + 62 - Restart - - Clear + + Pause - src/app/components/downloads/downloads.component.html + src/app/components/downloads/downloads.component.ts 68 - Clear - - - Pause all downloads - - src/app/components/downloads/downloads.component.html - 83 - - Pause all downloads - - Resume all downloads - - src/app/components/downloads/downloads.component.html - 84 - - Resume all downloads - - - Clear downloads + + Resume - src/app/components/downloads/downloads.component.html - 85 + src/app/components/downloads/downloads.component.ts + 74 - Clear downloads - - - No downloads available! - src/app/components/downloads/downloads.component.html - 90 + src/app/components/downloads/downloads.component.ts + 80 - No downloads label - - Creating download + + Cancel src/app/components/downloads/downloads.component.ts - 59 + 86 - - - Getting info - src/app/components/downloads/downloads.component.ts - 60 + src/app/dialogs/confirm-dialog/confirm-dialog.component.ts + 15 - - Downloading file + + Clear src/app/components/downloads/downloads.component.ts - 61 + 92 - - - Complete src/app/components/downloads/downloads.component.ts - 62 + 177 Clear downloads src/app/components/downloads/downloads.component.ts - 131 + 175 Select downloads to clear src/app/components/downloads/downloads.component.ts - 132 - - - - Clear - - src/app/components/downloads/downloads.component.ts - 133 + 176 Finished downloads src/app/components/downloads/downloads.component.ts - 138 + 182 Paused downloads src/app/components/downloads/downloads.component.ts - 142 + 186 Errored downloads src/app/components/downloads/downloads.component.ts - 146 + 190 Failed to clear finished downloads! src/app/components/downloads/downloads.component.ts - 157 + 201 Cleared downloads! src/app/components/downloads/downloads.component.ts - 159 + 203 Failed to pause download! See server logs for more info. src/app/components/downloads/downloads.component.ts - 170 + 214 src/app/components/downloads/downloads.component.ts - 222 + 266 Failed to pause all downloads! See server logs for more info. src/app/components/downloads/downloads.component.ts - 178 + 222 Failed to resume download! See server logs for more info. src/app/components/downloads/downloads.component.ts - 186 + 230 Failed to resume all downloads! See server logs for more info. src/app/components/downloads/downloads.component.ts - 194 + 238 Failed to restart download! See server logs for more info. src/app/components/downloads/downloads.component.ts - 202 + 246 Failed to cancel download! See server logs for more info. src/app/components/downloads/downloads.component.ts - 214 + 258 Error for src/app/components/downloads/downloads.component.ts - 263 + 308 Copy to clipboard src/app/components/downloads/downloads.component.ts - 265 + 310 src/app/components/tasks/tasks.component.ts @@ -687,7 +649,7 @@ Close src/app/components/downloads/downloads.component.ts - 266 + 311 src/app/components/tasks/tasks.component.ts @@ -698,7 +660,7 @@ Copied to clipboard! src/app/components/downloads/downloads.component.ts - 274 + 319 src/app/components/tasks/tasks.component.ts @@ -873,7 +835,7 @@ src/app/dialogs/about-dialog/about-dialog.component.html - 72 + 42 src/app/dialogs/add-user-dialog/add-user-dialog.component.html @@ -901,7 +863,7 @@ src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 27 + 60 src/app/dialogs/video-info-dialog/video-info-dialog.component.html @@ -1094,10 +1056,50 @@ src/app/settings/settings.component.html - 606 + 589 save user edit action button tooltip + + Cancel + + src/app/components/modify-users/modify-users.component.html + 62 + + + src/app/components/task-settings/task-settings.component.html + 25 + + + src/app/dialogs/arg-modifier-dialog/arg-modifier-dialog.component.html + 90 + + + src/app/dialogs/edit-category-dialog/edit-category-dialog.component.html + 58 + + + src/app/dialogs/edit-subscription-dialog/edit-subscription-dialog.component.html + 64 + + + src/app/dialogs/restore-db-dialog/restore-db-dialog.component.html + 24 + + + src/app/dialogs/subscribe-dialog/subscribe-dialog.component.html + 81 + + + src/app/dialogs/update-task-schedule-dialog/update-task-schedule-dialog.component.html + 52 + + + src/app/settings/settings.component.html + 592 + + cancel user edit action button tooltip + Edit user @@ -1543,6 +1545,14 @@ Schedule + + Show error + + src/app/components/tasks/tasks.component.html + 81 + + Show error + Restore DB from backup @@ -1961,11 +1971,11 @@ src/app/settings/settings.component.html - 300 + 283 src/app/settings/settings.component.html - 306 + 289 About bug click here @@ -1977,22 +1987,6 @@ About bug suffix - - Sidepanel mode - - src/app/dialogs/about-dialog/about-dialog.component.html - 42 - - Sidepanel mode - - - File card size - - src/app/dialogs/about-dialog/about-dialog.component.html - 54 - - File card size - Register a user @@ -2073,13 +2067,6 @@ Arg modifier modify button - - Cancel - - src/app/dialogs/confirm-dialog/confirm-dialog.component.ts - 15 - - Upload new cookies @@ -2163,11 +2150,11 @@ src/app/settings/settings.component.html - 127 + 110 src/app/settings/settings.component.html - 365 + 348 Custom output template documentation link @@ -2315,7 +2302,7 @@ src/app/settings/settings.component.html - 290 + 273 Generate RSS URL @@ -2739,22 +2726,85 @@ Created - - You are not logged in. + + Language src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html 19 - Not logged in notification + Language select label + + + Sidepanel mode + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 30 + + Sidepanel mode + + + Over + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 32,34 + + Over + + + Side + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 35,37 + + Side + + + File card size + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 42 + + File card size + + + Large + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 44,46 + + Large + + + Medium + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 47,49 + + Medium + + + Small + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html + 50,52 + + Small Logout src/app/dialogs/user-profile-dialog/user-profile-dialog.component.html - 28 + 61 Logout + + Language successfully changed! Reload to update the page. + + src/app/dialogs/user-profile-dialog/user-profile-dialog.component.ts + 46 + + Uploader @@ -3029,22 +3079,30 @@ View count label + + No description available. + + src/app/player/player.component.html + 25,27 + + No description + Failed to get file information from the server. src/app/player/player.component.ts - 151 + 142 Failed to load playlist! src/app/player/player.component.ts - 188 + 179 src/app/player/player.component.ts - 191 + 182 @@ -3183,19 +3241,11 @@ Allow theme change setting - - Language - - src/app/settings/settings.component.html - 86 - - Language select label - Downloader src/app/settings/settings.component.html - 101 + 84 Downloader settings label @@ -3203,7 +3253,7 @@ Audio folder path src/app/settings/settings.component.html - 108 + 91 Audio folder path @@ -3211,7 +3261,7 @@ Path for audio only downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 110 + 93 Aduio path setting input hint @@ -3219,7 +3269,7 @@ Video folder path src/app/settings/settings.component.html - 116 + 99 Video folder path @@ -3227,7 +3277,7 @@ Path for video downloads. It is relative to YTDL-Material's root folder. src/app/settings/settings.component.html - 118 + 101 Video path setting input hint @@ -3235,7 +3285,7 @@ Default file output src/app/settings/settings.component.html - 124 + 107 Default file output @@ -3243,7 +3293,7 @@ Path is relative to the above download paths. Don't include extension. src/app/settings/settings.component.html - 128 + 111 Custom Output input hint @@ -3251,7 +3301,7 @@ Global custom args src/app/settings/settings.component.html - 135 + 118 Global custom args @@ -3259,7 +3309,7 @@ Global custom args for downloads on the home page. (Set args for subscriptions for each subscriptions separately!) Args are delimited using two commas like so: ,, src/app/settings/settings.component.html - 137 + 120 Custom args setting input hint @@ -3267,7 +3317,7 @@ Categories src/app/settings/settings.component.html - 147 + 130 Categories @@ -3275,7 +3325,7 @@ With this setting enabled, if a single video matches a category, the entire playlist will receive that category. src/app/settings/settings.component.html - 161 + 144 Allow playlist categorization setting tooltip @@ -3283,7 +3333,7 @@ Allow playlist categorization src/app/settings/settings.component.html - 161 + 144 Allow playlist categorization setting label @@ -3291,7 +3341,7 @@ Use youtube-dl archive src/app/settings/settings.component.html - 169 + 152 Use youtubedl archive setting @@ -3299,7 +3349,7 @@ Include thumbnail src/app/settings/settings.component.html - 173 + 156 Include thumbnail setting @@ -3307,7 +3357,7 @@ Include metadata src/app/settings/settings.component.html - 177 + 160 Include metadata setting @@ -3315,7 +3365,7 @@ Max concurrent downloads src/app/settings/settings.component.html - 186 + 169 Max concurrent downloads @@ -3323,7 +3373,7 @@ Limits the amount of downloads that can be simultaneously downloaded. Use -1 for no limit. src/app/settings/settings.component.html - 188 + 171 Max concurrent downloads input hint @@ -3331,7 +3381,7 @@ Download rate limit src/app/settings/settings.component.html - 193 + 176 Download rate limit @@ -3339,7 +3389,7 @@ Rate limits your downloads to the specified amount. Ex: 200K src/app/settings/settings.component.html - 195 + 178 Download rate limit input hint @@ -3347,7 +3397,7 @@ Kill all downloads src/app/settings/settings.component.html - 204 + 187 Kill all downloads button @@ -3355,7 +3405,7 @@ Extra src/app/settings/settings.component.html - 211 + 194 Extra settings label @@ -3363,7 +3413,7 @@ Top title src/app/settings/settings.component.html - 217 + 200 Top title @@ -3371,7 +3421,7 @@ File manager enabled src/app/settings/settings.component.html - 223 + 206 File manager enabled setting @@ -3379,7 +3429,7 @@ Downloads manager enabled src/app/settings/settings.component.html - 226 + 209 Downloads manager enabled setting @@ -3387,7 +3437,7 @@ Allow quality select src/app/settings/settings.component.html - 229 + 212 Allow quality seelct setting @@ -3395,7 +3445,7 @@ Download only mode src/app/settings/settings.component.html - 232 + 215 Download only mode setting @@ -3403,7 +3453,7 @@ Force autoplay src/app/settings/settings.component.html - 235 + 218 Force autoplay setting @@ -3411,7 +3461,7 @@ Enable Public API src/app/settings/settings.component.html - 243 + 226 Enable Public API key setting @@ -3419,7 +3469,7 @@ Public API Key src/app/settings/settings.component.html - 248 + 231 Public API Key @@ -3427,7 +3477,7 @@ View documentation src/app/settings/settings.component.html - 250 + 233 View API docs setting hint @@ -3435,7 +3485,7 @@ This will delete your old API key! src/app/settings/settings.component.html - 254 + 237 delete api key tooltip @@ -3443,7 +3493,7 @@ Generate src/app/settings/settings.component.html - 254 + 237 Generate key button @@ -3451,7 +3501,7 @@ Use YouTube API src/app/settings/settings.component.html - 263 + 246 Use YouTube API setting @@ -3459,7 +3509,7 @@ Youtube API Key src/app/settings/settings.component.html - 267 + 250 Youtube API Key @@ -3467,7 +3517,7 @@ Generating a key is easy! src/app/settings/settings.component.html - 269 + 252 Youtube API Key setting hint @@ -3475,7 +3525,7 @@ Auto-download Twitch Chat src/app/settings/settings.component.html - 273 + 256 Auto download Twitch Chat setting @@ -3483,7 +3533,7 @@ Enables a button to skip ads when viewing supported videos. src/app/settings/settings.component.html - 276 + 259 SponsorBlock API tooltip @@ -3491,7 +3541,7 @@ Use SponsorBlock API src/app/settings/settings.component.html - 276 + 259 Use SponsorBlock API setting @@ -3499,7 +3549,7 @@ Generates NFO files with every download, primarily used by Kodi. src/app/settings/settings.component.html - 279 + 262 Generate NFO files tooltip @@ -3507,7 +3557,7 @@ Generate NFO files src/app/settings/settings.component.html - 279 + 262 Generate NFO files setting @@ -3515,7 +3565,7 @@ Enable RSS Feed src/app/settings/settings.component.html - 288 + 271 Enable RSS Feed setting @@ -3523,7 +3573,7 @@ Be careful enabling this with multi-user mode! User data may be exposed. src/app/settings/settings.component.html - 289 + 272 RSS Feed prefix @@ -3531,7 +3581,7 @@ See documentation here. src/app/settings/settings.component.html - 291 + 274 RSS feed documentation @@ -3539,7 +3589,7 @@ to download the official YoutubeDL-Material Chrome extension manually. src/app/settings/settings.component.html - 300 + 283 Chrome click here suffix @@ -3547,7 +3597,7 @@ You must manually load the extension and modify the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 301 + 284 Chrome setup suffix @@ -3555,7 +3605,7 @@ to install the official YoutubeDL-Material Firefox extension right off the Firefox extensions page. src/app/settings/settings.component.html - 306 + 289 Firefox click here suffix @@ -3563,7 +3613,7 @@ Detailed setup instructions. src/app/settings/settings.component.html - 307 + 290 Firefox setup prefix link @@ -3571,7 +3621,7 @@ Not much is required other than changing the extension's settings to set the frontend URL. src/app/settings/settings.component.html - 307 + 290 Firefox setup suffix @@ -3579,7 +3629,7 @@ Drag the link below to your bookmarks, and you're good to go! Just navigate to the YouTube video you'd like to download, and click the bookmark. src/app/settings/settings.component.html - 312 + 295 Bookmarklet instructions @@ -3587,7 +3637,7 @@ Generate 'audio only' bookmarklet src/app/settings/settings.component.html - 313 + 296 Generate audio only bookmarklet checkbox @@ -3595,7 +3645,7 @@ Database src/app/settings/settings.component.html - 322 + 305 Database settings label @@ -3603,7 +3653,7 @@ Database location: src/app/settings/settings.component.html - 328 + 311 Database location label @@ -3611,7 +3661,7 @@ Records per table src/app/settings/settings.component.html - 329 + 312 Records per table label @@ -3619,7 +3669,7 @@ MongoDB Connection String src/app/settings/settings.component.html - 337 + 320 MongoDB Connection String @@ -3627,7 +3677,7 @@ Example: src/app/settings/settings.component.html - 339 + 322 MongoDB Connection String setting hint AKA preamble @@ -3635,7 +3685,7 @@ Test connection string src/app/settings/settings.component.html - 343 + 326 Test connection string button @@ -3643,7 +3693,7 @@ Transfer DB to src/app/settings/settings.component.html - 348 + 331 Transfer DB button @@ -3651,7 +3701,7 @@ Database information could not be retrieved. Check the server logs for more information. src/app/settings/settings.component.html - 352 + 335 Database info not retrieved error message @@ -3659,7 +3709,7 @@ Notifications src/app/settings/settings.component.html - 360 + 343 Notifications settings label @@ -3667,7 +3717,7 @@ Enable notifications src/app/settings/settings.component.html - 366 + 349 Enable notifications setting @@ -3675,7 +3725,7 @@ Enable all notifications src/app/settings/settings.component.html - 369 + 352 Enable all notifications setting @@ -3683,7 +3733,7 @@ Allowed notification types src/app/settings/settings.component.html - 373 + 356 Allowed notification types @@ -3691,7 +3741,7 @@ Download complete src/app/settings/settings.component.html - 375 + 358 Download complete @@ -3699,7 +3749,7 @@ Download error src/app/settings/settings.component.html - 376 + 359 Download error @@ -3707,7 +3757,7 @@ Task finished src/app/settings/settings.component.html - 377 + 360 Task finished @@ -3715,7 +3765,7 @@ Webhook URL src/app/settings/settings.component.html - 383 + 366 webhook URL @@ -3723,7 +3773,7 @@ Discord Webhook URL src/app/settings/settings.component.html - 390 + 373 Discord Webhook URL @@ -3731,23 +3781,23 @@ See docs here. src/app/settings/settings.component.html - 392 + 375 src/app/settings/settings.component.html - 399 + 382 src/app/settings/settings.component.html - 409 + 392 src/app/settings/settings.component.html - 419 + 402 src/app/settings/settings.component.html - 426 + 409 Discord API setting hint @@ -3755,7 +3805,7 @@ Slack Webhook URL src/app/settings/settings.component.html - 397 + 380 Slack Webhook URL @@ -3763,7 +3813,7 @@ Use ntfy API src/app/settings/settings.component.html - 403 + 386 Use ntfy API setting @@ -3771,7 +3821,7 @@ ntfy topic URL src/app/settings/settings.component.html - 407 + 390 ntfy topic URL @@ -3779,7 +3829,7 @@ Use gotify API src/app/settings/settings.component.html - 413 + 396 Use gotify API setting @@ -3787,7 +3837,7 @@ Gotify server URL src/app/settings/settings.component.html - 417 + 400 Gotify server URL @@ -3795,7 +3845,7 @@ Gotify app token src/app/settings/settings.component.html - 424 + 407 Gotify app token @@ -3803,7 +3853,7 @@ Use Telegram API src/app/settings/settings.component.html - 430 + 413 Use Telegram API setting @@ -3811,7 +3861,7 @@ Telegram bot token src/app/settings/settings.component.html - 434 + 417 Telegram bot token @@ -3819,7 +3869,7 @@ Create bot here. src/app/settings/settings.component.html - 436 + 419 Telegram bot create link @@ -3827,7 +3877,7 @@ Telegram chat ID src/app/settings/settings.component.html - 441 + 424 Telegram chat ID @@ -3835,7 +3885,7 @@ How do I get the chat ID? src/app/settings/settings.component.html - 443 + 426 Telegram chat ID help @@ -3843,7 +3893,7 @@ Advanced src/app/settings/settings.component.html - 451 + 434 Host settings label @@ -3851,7 +3901,7 @@ Select a downloader src/app/settings/settings.component.html - 457 + 440 Default downloader select label @@ -3859,7 +3909,7 @@ Restart required. src/app/settings/settings.component.html - 463 + 446 Restart required hint @@ -3867,7 +3917,7 @@ Use default downloading agent src/app/settings/settings.component.html - 467 + 450 Use default downloading agent setting @@ -3875,7 +3925,7 @@ Select a download agent src/app/settings/settings.component.html - 471 + 454 Custom downloader select label @@ -3883,7 +3933,7 @@ Log Level src/app/settings/settings.component.html - 485 + 468 Log Level label @@ -3891,7 +3941,7 @@ Login expiration src/app/settings/settings.component.html - 497 + 480 Login expiration select label @@ -3899,7 +3949,7 @@ Allow advanced download src/app/settings/settings.component.html - 508 + 491 Allow advanced downloading setting @@ -3907,7 +3957,7 @@ Use Cookies src/app/settings/settings.component.html - 516 + 499 Use cookies setting @@ -3915,7 +3965,7 @@ Set Cookies src/app/settings/settings.component.html - 517 + 500 Set cookies button @@ -3923,7 +3973,7 @@ Restart server src/app/settings/settings.component.html - 529 + 512 Restart server button @@ -3931,7 +3981,7 @@ Users src/app/settings/settings.component.html - 538 + 521 Users settings label @@ -3939,7 +3989,7 @@ Allow user registration src/app/settings/settings.component.html - 544 + 527 Allow registration setting @@ -3947,7 +3997,7 @@ Auth method src/app/settings/settings.component.html - 548 + 531 Auth method @@ -3955,7 +4005,7 @@ Internal src/app/settings/settings.component.html - 551 + 534 Internal auth method @@ -3963,7 +4013,7 @@ LDAP src/app/settings/settings.component.html - 554 + 537 LDAP auth method @@ -3971,7 +4021,7 @@ LDAP URL src/app/settings/settings.component.html - 561 + 544 LDAP URL @@ -3979,7 +4029,7 @@ Bind DN src/app/settings/settings.component.html - 567 + 550 Bind DN @@ -3987,7 +4037,7 @@ Bind Credentials src/app/settings/settings.component.html - 573 + 556 Bind Credentials @@ -3995,7 +4045,7 @@ Search Base src/app/settings/settings.component.html - 579 + 562 Search Base @@ -4003,7 +4053,7 @@ Search Filter src/app/settings/settings.component.html - 585 + 568 Search Filter @@ -4011,7 +4061,7 @@ Logs src/app/settings/settings.component.html - 595 + 578 Logs settings label @@ -4019,130 +4069,123 @@ You must enable multi-user mode to access this tab. src/app/settings/settings.component.ts - 50 + 45 Failed to update categories! src/app/settings/settings.component.ts - 138 + 123 Delete category src/app/settings/settings.component.ts - 173 + 158 Would you like to delete ? src/app/settings/settings.component.ts - 174 + 159 Successfully deleted ! src/app/settings/settings.component.ts - 183 + 168 Failed to delete ! src/app/settings/settings.component.ts - 187 - - - - Language successfully changed! Reload to update the page. - - src/app/settings/settings.component.ts - 212 + 172 Chrome users must drag the 'Alternate URL' link to your bookmarks. src/app/settings/settings.component.ts - 240 + 220 Successfully killed all downloads! src/app/settings/settings.component.ts - 295 + 275 Failed to kill all downloads! Check logs for details. src/app/settings/settings.component.ts - 298 + 278 src/app/settings/settings.component.ts - 302 + 282 Restarting! src/app/settings/settings.component.ts - 310 + 290 Failed to restart the server. src/app/settings/settings.component.ts - 312 + 292 Successfully transfered DB! Reloading info... src/app/settings/settings.component.ts - 343 + 323 Failed to transfer DB -- transfer was aborted. Error: src/app/settings/settings.component.ts - 346 + 326 Failed to transfer DB -- API call failed. See browser logs for details. src/app/settings/settings.component.ts - 350 + 330 Connection successful! src/app/settings/settings.component.ts - 360 + 340 Connection failed! Error: src/app/settings/settings.component.ts - 362 + 342 Connection failed! Error: Server error. See logs for more info. src/app/settings/settings.component.ts - 366 + 346