diff --git a/src/app/modules/entity/entity-job/entity-job-config.interface.ts b/src/app/modules/entity/entity-job/entity-job-config.interface.ts deleted file mode 100644 index af1ce4c5cf3..00000000000 --- a/src/app/modules/entity/entity-job/entity-job-config.interface.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface EntityJobConfig { - title: string; - closeOnClickOutside: boolean; -} diff --git a/src/app/modules/entity/entity-job/entity-job.component.html b/src/app/modules/entity/entity-job/entity-job.component.html deleted file mode 100644 index 5d7eed743e3..00000000000 --- a/src/app/modules/entity/entity-job/entity-job.component.html +++ /dev/null @@ -1,113 +0,0 @@ -

{{ title | translate }}

- - @if (showRealtimeLogs && realtimeLogs) { -
-
{{ 'Logs' | translate }}
-
{{ realtimeLogs }}
-
- } - - @if (job?.state === JobState.Running) { -
-
- {{ job.description ? job.description : job.method }} - @if (!hideProgressValue) { - - {{ progressTotalPercent || 0 | number: '1.2-2' }}% - - } -
- -
- } - - @if (showHttpProgress) { -
-
- - {{ uploadPercentage || 0 | number: '1.2-2' }}% -
- - -
- } - - @if (description) { -
- } - - @if (!description && !job) { -
- -
- } - - @if (!description) { -
- @if (altMessage) { - - } @else { -
- @if (job?.state === JobState.Waiting) { - {{ 'Waiting' | translate }} - } @else { - {{ 'Fetching data...' | translate }} - } -
- } -
- } -
- -
- @if (job?.state === JobState.Failed) { - - } @else { - @if (showAbortButton && job?.state === JobState.Running) { - - } - @if (showCloseButton) { - - } - } - -
diff --git a/src/app/modules/entity/entity-job/entity-job.component.scss b/src/app/modules/entity/entity-job/entity-job.component.scss deleted file mode 100644 index cb2e6be9850..00000000000 --- a/src/app/modules/entity/entity-job/entity-job.component.scss +++ /dev/null @@ -1,67 +0,0 @@ -@import 'scss-imports/variables'; - -:host { - display: block; - position: relative; - - ::ng-deep { - .mat-mdc-dialog-actions { - position: static; - } - } -} - -mat-dialog-content.entity-job-dialog { - max-height: 350px; - max-width: 100%; - width: 100%; - - @media (min-width: $breakpoint-tablet) { - max-width: 400px; - min-width: 370px; - } - - .mat-mdc-dialog-content { - overflow: auto !important; - } -} - -.mat-dialog-close { - position: absolute; - right: 5px; - top: 5px; -} - -.entity-job-progress { - margin: 3px 0; -} - -.entity-job-description { - opacity: 0.75; - white-space: pre-line; -} - -.entity-job-time { - opacity: 0.5; -} - -.logs-container { - margin-bottom: 20px; - max-height: 200px; - overflow-y: auto; -} - -.logs { - background: rgba(0, 0, 0, 0.096); - color: white; - overflow-x: auto; - padding: 5px; - white-space: pre-wrap; - word-wrap: break-word; -} - -.percentage-row { - display: flex; - gap: 8px; - justify-content: space-between; -} diff --git a/src/app/modules/entity/entity-job/entity-job.component.ts b/src/app/modules/entity/entity-job/entity-job.component.ts deleted file mode 100644 index 2bca3291e4f..00000000000 --- a/src/app/modules/entity/entity-job/entity-job.component.ts +++ /dev/null @@ -1,265 +0,0 @@ -import { - HttpClient, HttpErrorResponse, HttpEvent, HttpEventType, -} from '@angular/common/http'; -import { - // eslint-disable-next-line no-restricted-imports - OnInit, Component, Inject, AfterViewChecked, Output, - EventEmitter, -} from '@angular/core'; -import { MatDialogConfig, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { replace } from 'lodash-es'; -import { Subscription } from 'rxjs'; -import { filter, map } from 'rxjs/operators'; -import { JobState } from 'app/enums/job-state.enum'; -import { ApiJobDirectory, ApiJobMethod } from 'app/interfaces/api/api-job-directory.interface'; -import { Job, JobProgress } from 'app/interfaces/job.interface'; -import { EntityJobConfig } from 'app/modules/entity/entity-job/entity-job-config.interface'; -import { WebSocketService } from 'app/services/ws.service'; - -@UntilDestroy() -// eslint-disable-next-line @angular-eslint/prefer-on-push-component-change-detection -@Component({ - selector: 'ix-entity-job-dialog', - templateUrl: 'entity-job.component.html', - styleUrls: ['./entity-job.component.scss'], -}) -/** - * @deprecated Use jobDialog in DialogService. Remember to handle errors. - */ -export class EntityJobComponent implements OnInit, AfterViewChecked { - job: Job = {} as Job; - progressTotalPercent = 0; - description: string; - method: ApiJobMethod; - args: ApiJobDirectory[ApiJobMethod]['params'] = []; - - title = ''; - showHttpProgress = false; - uploadPercentage: number = null; - showCloseButton = true; - showAbortButton = false; // enable to abort job - jobId: number; - progressNumberType: string; - hideProgressValue = false; - altMessage: string; - showRealtimeLogs = false; - autoCloseOnSuccess = false; - readonly JobState = JobState; - - private realtimeLogsSubscribed = false; - realtimeLogs = ''; - // eslint-disable-next-line @angular-eslint/no-output-native - @Output() progress = new EventEmitter(); - // eslint-disable-next-line @angular-eslint/no-output-native - @Output() success = new EventEmitter(); - @Output() aborted = new EventEmitter(); - @Output() failure = new EventEmitter(); - @Output() prefailure = new EventEmitter(); - - constructor( - public dialogRef: MatDialogRef, - private ws: WebSocketService, - @Inject(MAT_DIALOG_DATA) public data: EntityJobConfig, - protected http: HttpClient, - ) {} - - ngOnInit(): void { - if (this.data.title) { - this.setTitle(this.data.title); - } - - if (this.dialogRef.disableClose) { - this.showCloseButton = false; - } - if (this.data.closeOnClickOutside) { - this.showCloseButton = true; - this.dialogRef.disableClose = true; - } - this.progress.pipe(untilDestroyed(this)).subscribe((progress: JobProgress) => { - if (progress.description) { - this.description = progress.description; - } - if (progress.percent) { - if (this.progressNumberType === 'nopercent') { - this.progressTotalPercent = progress.percent * 100; - } else { - this.progressTotalPercent = progress.percent; - } - } - this.disableProgressValue(progress.percent === null); - }); - - this.failure.pipe(untilDestroyed(this)).subscribe((job) => { - let error = replace(job.error, '<', '< '); - error = replace(error, '>', ' >'); - - this.description = 'Error: ' + error; - }); - } - - ngAfterViewChecked(): void { - this.scrollBottom(); - } - - setCall(method: K, args?: ApiJobDirectory[K]['params']): void { - this.method = method; - if (args) { - this.args = args; - } - } - - setTitle(title: string): void { - this.title = title; - } - - enableRealtimeLogs(showRealtimeLogs: boolean): void { - this.showRealtimeLogs = showRealtimeLogs; - } - - changeAltMessage(msg: string): void { - this.altMessage = msg; - } - - disableProgressValue(hide: boolean): void { - this.hideProgressValue = hide; - } - - submit(): void { - let logsSubscription: Subscription = null; - this.ws.job(this.method, this.args) - .pipe(untilDestroyed(this)).subscribe({ - next: (job) => { - this.job = job; - this.showAbortButton = this.job.abortable; - if (this.showRealtimeLogs && this.job.logs_path && !this.realtimeLogsSubscribed) { - logsSubscription = this.getRealtimeLogs(); - } - if (job.progress && !this.showRealtimeLogs) { - this.progress.emit(job.progress); - } - if (this.job.state === JobState.Aborted) { - this.aborted.emit(this.job); - } - }, - error: (job: Job) => { - this.job = job; - this.failure.emit(this.job); - }, - complete: () => { - if (this.job.state === JobState.Success) { - this.success.emit(this.job); - } else if (this.job.state === JobState.Failed) { - this.failure.emit(this.job); - } - if (this.realtimeLogsSubscribed) { - logsSubscription.unsubscribe(); - } - }, - }); - } - - wspostWithProgressUpdates(path: string, options: unknown): void { - this.showHttpProgress = true; - this.http.post(path, options, { reportProgress: true, observe: 'events' }) - .pipe(untilDestroyed(this)) - .subscribe({ - next: (event: HttpEvent) => { - if (event.type === HttpEventType.UploadProgress) { - const eventTotal = event.total ? event.total : 0; - let progress = 0; - if (eventTotal !== 0) { - progress = Math.round(event.loaded / eventTotal * 100); - } - this.uploadPercentage = progress; - } else if (event.type === HttpEventType.Response) { - this.showHttpProgress = false; - const body = event.body; - this.job = body as Job; // Type is actually not a Job, but a { job_id: number } - if (body && 'job_id' in body) { - this.jobId = body.job_id; - } - this.wsshow(); - } - }, - error: (err: HttpErrorResponse) => { - this.showHttpProgress = false; - this.prefailure.emit(err); - }, - }); - } - - wsshow(): void { - this.ws.call('core.get_jobs', [[['id', '=', this.jobId]]]) - .pipe(untilDestroyed(this)).subscribe((jobs) => { - if (jobs.length > 0) { - this.wsjobUpdate(jobs[0]); - } - }); - this.ws.subscribe('core.get_jobs') - .pipe( - filter((event) => event.id === this.jobId), - map((event) => event.fields), - untilDestroyed(this), - ) - .subscribe((job) => { - this.wsjobUpdate(job); - }); - } - - wsjobUpdate(job: Job): void { - this.job = job; - this.showAbortButton = this.job.abortable; - if ('progress' in job) { - this.progress.emit(job.progress); - } - switch (job.state) { - case JobState.Success: - this.success.emit(this.job); - if (this.autoCloseOnSuccess) { - this.dialogRef.close(); - } - break; - case JobState.Failed: - this.failure.emit(this.job); - break; - case JobState.Aborted: - this.aborted.emit(this.job); - break; - default: - break; - } - } - - abortJob(): void { - this.ws.call('core.job_abort', [this.job.id]).pipe(untilDestroyed(this)).subscribe(() => { - this.dialogRef.close(); - }); - } - - /** - * This method returns the subscription id that is used when subscribing to real time - * websocket updates. The subscription id is used to unsubscribe form those real time - * websocket updates at a later time. Unsubscription is not possible without this id - */ - getRealtimeLogs(): Subscription { - this.realtimeLogsSubscribed = true; - const subName = 'filesystem.file_tail_follow:' + this.job.logs_path; - return this.ws.subscribeToLogs(subName) - .pipe(map((apiEvent) => apiEvent.fields), untilDestroyed(this)) - .subscribe((logs) => { - if (logs?.data && typeof logs.data === 'string') { - this.realtimeLogs += logs.data; - } - }); - } - - scrollBottom(): void { - const cardContainer = document.getElementsByClassName('entity-job-dialog')[0]; - const logsContainer = cardContainer.getElementsByClassName('logs-container')[0]; - if (!logsContainer) { - return; - } - logsContainer.scrollTop = logsContainer.scrollHeight; - } -} diff --git a/src/app/modules/entity/entity.module.ts b/src/app/modules/entity/entity.module.ts deleted file mode 100644 index 4a334e0076b..00000000000 --- a/src/app/modules/entity/entity.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DecimalPipe } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatSliderModule } from '@angular/material/slider'; -import { TranslateModule } from '@ngx-translate/core'; -import { EntityJobComponent } from 'app/modules/entity/entity-job/entity-job.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { TestDirective } from 'app/modules/test-id/test.directive'; - -@NgModule({ - imports: [ - MatDialogModule, - MatProgressBarModule, - MatButtonModule, - IxIconComponent, - TranslateModule, - MatSliderModule, - DecimalPipe, - TestDirective, - ], - declarations: [ - EntityJobComponent, - ], -}) -export class EntityModule { } diff --git a/src/app/modules/terminal/terminal.module.ts b/src/app/modules/terminal/terminal.module.ts index f6a1895c9d6..a78fc37dd84 100644 --- a/src/app/modules/terminal/terminal.module.ts +++ b/src/app/modules/terminal/terminal.module.ts @@ -3,7 +3,6 @@ import { NgModule } from '@angular/core'; import { MatButtonModule } from '@angular/material/button'; import { MatDialogModule } from '@angular/material/dialog'; import { TranslateModule } from '@ngx-translate/core'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { ToolbarSliderComponent } from 'app/modules/forms/toolbar-slider/toolbar-slider.component'; import { PageHeaderModule } from 'app/modules/page-header/page-header.module'; import { CopyPasteMessageComponent } from 'app/modules/terminal/components/copy-paste-message/copy-paste-message.component'; @@ -13,7 +12,6 @@ import { TooltipComponent } from 'app/modules/tooltip/tooltip.component'; @NgModule({ imports: [ - EntityModule, TranslateModule, MatButtonModule, MatDialogModule, diff --git a/src/app/pages/account/account.module.ts b/src/app/pages/account/account.module.ts index 2bb734f7013..a3fb4953a81 100644 --- a/src/app/pages/account/account.module.ts +++ b/src/app/pages/account/account.module.ts @@ -5,14 +5,12 @@ import { MatListModule } from '@angular/material/list'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSortModule } from '@angular/material/sort'; import { TranslateModule } from '@ngx-translate/core'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { GroupsModule } from './groups/groups.module'; import { UsersModule } from './users/users.module'; @NgModule({ imports: [ - EntityModule, ReactiveFormsModule, TranslateModule, MatSortModule, diff --git a/src/app/pages/account/groups/groups.module.ts b/src/app/pages/account/groups/groups.module.ts index f6f4c3f8b76..77c4edfcdf3 100644 --- a/src/app/pages/account/groups/groups.module.ts +++ b/src/app/pages/account/groups/groups.module.ts @@ -20,7 +20,6 @@ import { StoreModule } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -62,7 +61,6 @@ import { DeleteGroupDialogComponent } from './group-details-row/delete-group-dia providers: [], imports: [ EffectsModule.forFeature([GroupEffects]), - EntityModule, MatButtonModule, IxIconComponent, MatListModule, diff --git a/src/app/pages/account/users/users.module.ts b/src/app/pages/account/users/users.module.ts index 590d2d6b8ce..d84f0111adb 100644 --- a/src/app/pages/account/users/users.module.ts +++ b/src/app/pages/account/users/users.module.ts @@ -22,7 +22,6 @@ import { StoreModule } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -67,7 +66,6 @@ import { UserDetailsRowComponent } from './user-details-row/user-details-row.com providers: [], imports: [ EffectsModule.forFeature([UserEffects]), - EntityModule, MatButtonModule, IxIconComponent, MatListModule, diff --git a/src/app/pages/api-keys/api-keys.module.ts b/src/app/pages/api-keys/api-keys.module.ts index 7f7d693804b..4bd2c81809e 100644 --- a/src/app/pages/api-keys/api-keys.module.ts +++ b/src/app/pages/api-keys/api-keys.module.ts @@ -11,7 +11,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; @@ -38,7 +37,6 @@ import { ApiKeyComponentStore } from './store/api-key.store'; imports: [ ReactiveFormsModule, ClipboardModule, - EntityModule, MatButtonModule, MatCardModule, MatSortModule, diff --git a/src/app/pages/apps/apps.module.ts b/src/app/pages/apps/apps.module.ts index 9d8f1da8288..089eff8a65b 100644 --- a/src/app/pages/apps/apps.module.ts +++ b/src/app/pages/apps/apps.module.ts @@ -26,7 +26,6 @@ import { IxDetailsHeightDirective } from 'app/directives/details-height/details- import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { IxDynamicFormModule } from 'app/modules/forms/ix-dynamic-form/ix-dynamic-form.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; @@ -161,7 +160,6 @@ import { InstalledAppsComponent } from './components/installed-apps/installed-ap TranslateModule, IxDynamicFormModule, ReactiveFormsModule, - EntityModule, MatCardModule, MatSelectModule, MatCheckboxModule, diff --git a/src/app/pages/credentials/credentials.module.ts b/src/app/pages/credentials/credentials.module.ts index 7ad2f404f6c..0f6c471c352 100644 --- a/src/app/pages/credentials/credentials.module.ts +++ b/src/app/pages/credentials/credentials.module.ts @@ -16,7 +16,6 @@ import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-r import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { CopyButtonComponent } from 'app/modules/buttons/copy-button/copy-button.component'; import { OauthButtonModule } from 'app/modules/buttons/oauth-button/oauth-button.module'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { IxDynamicFormModule } from 'app/modules/forms/ix-dynamic-form/ix-dynamic-form.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; @@ -172,7 +171,6 @@ import { CertificateSubjectComponent } from './certificates-dash/forms/common-st CloudCredentialsCardComponent, ], imports: [ - EntityModule, IxDynamicFormModule, IxIconComponent, MatButtonModule, diff --git a/src/app/pages/data-protection/data-protection.module.ts b/src/app/pages/data-protection/data-protection.module.ts index a6fcee2465b..29b147e93b7 100755 --- a/src/app/pages/data-protection/data-protection.module.ts +++ b/src/app/pages/data-protection/data-protection.module.ts @@ -17,7 +17,6 @@ import { TranslateModule } from '@ngx-translate/core'; import { IxDetailsHeightDirective } from 'app/directives/details-height/details-height.directive'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { CloudCredentialsSelectModule } from 'app/modules/forms/custom-selects/cloud-credentials-select/cloud-credentials-select.module'; import { SshCredentialsSelectModule } from 'app/modules/forms/custom-selects/ssh-credentials-select/ssh-credentials-select.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; @@ -131,7 +130,6 @@ import { SmartTaskListComponent } from './smart-task/smart-task-list/smart-task- @NgModule({ imports: [ RouterModule.forChild(dataProtectionRoutes), - EntityModule, ReactiveFormsModule, MatProgressBarModule, MatTooltipModule, diff --git a/src/app/pages/datasets/datasets.module.ts b/src/app/pages/datasets/datasets.module.ts index a199c91abd9..63bebe4df79 100644 --- a/src/app/pages/datasets/datasets.module.ts +++ b/src/app/pages/datasets/datasets.module.ts @@ -18,7 +18,6 @@ import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-r import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { CopyButtonComponent } from 'app/modules/buttons/copy-button/copy-button.component'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -86,9 +85,7 @@ import { DatasetNodeComponent } from './components/dataset-node/dataset-node.com EncryptionModule, ReactiveFormsModule, TreeModule, - EntityModule, MatDialogModule, - EntityModule, NgxSkeletonLoaderModule, SnapshotsModule, EmptyComponent, diff --git a/src/app/pages/datasets/modules/encryption/encryption.module.ts b/src/app/pages/datasets/modules/encryption/encryption.module.ts index 2d9dabc4629..8f338d1d784 100644 --- a/src/app/pages/datasets/modules/encryption/encryption.module.ts +++ b/src/app/pages/datasets/modules/encryption/encryption.module.ts @@ -8,7 +8,6 @@ import { MatDividerModule } from '@angular/material/divider'; import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxFileInputComponent } from 'app/modules/forms/ix-forms/components/ix-file-input/ix-file-input.component'; @@ -39,7 +38,6 @@ import { LockDatasetDialogComponent } from './components/lock-dataset-dialog/loc MatCardModule, RouterModule, MatButtonModule, - EntityModule, ReactiveFormsModule, MatDialogModule, IxIconComponent, diff --git a/src/app/pages/datasets/modules/snapshots/snapshots.module.ts b/src/app/pages/datasets/modules/snapshots/snapshots.module.ts index 046983f4c29..c2bfd669bc7 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshots.module.ts +++ b/src/app/pages/datasets/modules/snapshots/snapshots.module.ts @@ -19,7 +19,6 @@ import { StoreModule } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; @@ -68,7 +67,6 @@ const components = [ providers: [], imports: [ EffectsModule.forFeature([SnapshotEffects]), - EntityModule, IxIconComponent, MatButtonModule, MatCardModule, diff --git a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.spec.ts b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.spec.ts index e40716d4779..d20adc6e848 100644 --- a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.spec.ts +++ b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.spec.ts @@ -16,7 +16,6 @@ import { helptextIdmap } from 'app/helptext/directory-service/idmap'; import { IdmapBackendOptions, IdmapBackendParameter } from 'app/interfaces/idmap-backend-options.interface'; import { Idmap } from 'app/interfaces/idmap.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { IxSlideInRef } from 'app/modules/forms/ix-forms/components/ix-slide-in/ix-slide-in-ref'; import { SLIDE_IN_DATA } from 'app/modules/forms/ix-forms/components/ix-slide-in/ix-slide-in.token'; import { @@ -52,7 +51,6 @@ describe('IdmapFormComponent', () => { component: IdmapFormComponent, imports: [ ReactiveFormsModule, - EntityModule, ], declarations: [ MockComponent(WithManageCertificatesLinkComponent), diff --git a/src/app/pages/directory-service/directory-service.module.ts b/src/app/pages/directory-service/directory-service.module.ts index 9bc2fd66949..6ac6ccae4de 100644 --- a/src/app/pages/directory-service/directory-service.module.ts +++ b/src/app/pages/directory-service/directory-service.module.ts @@ -11,7 +11,6 @@ import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -53,7 +52,6 @@ import { LdapComponent } from './components/ldap/ldap.component'; @NgModule({ imports: [ - EntityModule, ReactiveFormsModule, routing, MatListModule, diff --git a/src/app/pages/jobs/jobs-list.module.ts b/src/app/pages/jobs/jobs-list.module.ts index b67cadabf21..5db465b312d 100644 --- a/src/app/pages/jobs/jobs-list.module.ts +++ b/src/app/pages/jobs/jobs-list.module.ts @@ -14,7 +14,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { CopyButtonComponent } from 'app/modules/buttons/copy-button/copy-button.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { SearchInput1Component } from 'app/modules/forms/search-input1/search-input1.component'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { IxTableComponent } from 'app/modules/ix-table/components/ix-table/ix-table.component'; @@ -34,7 +33,6 @@ import { JobsListComponent } from './jobs-list/jobs-list.component'; @NgModule({ imports: [ - EntityModule, IxIconComponent, MatTooltipModule, MatProgressBarModule, diff --git a/src/app/pages/network/network.module.ts b/src/app/pages/network/network.module.ts index ab878d3b0cb..f18ce87acc0 100644 --- a/src/app/pages/network/network.module.ts +++ b/src/app/pages/network/network.module.ts @@ -13,7 +13,6 @@ import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -71,7 +70,6 @@ import { routing } from './network.routing'; @NgModule({ imports: [ - EntityModule, FormsModule, ReactiveFormsModule, routing, diff --git a/src/app/pages/reports-dashboard/reports-dashboard.module.ts b/src/app/pages/reports-dashboard/reports-dashboard.module.ts index f12c2ef156a..15bdc2d125a 100644 --- a/src/app/pages/reports-dashboard/reports-dashboard.module.ts +++ b/src/app/pages/reports-dashboard/reports-dashboard.module.ts @@ -14,7 +14,6 @@ import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { IxDynamicFormModule } from 'app/modules/forms/ix-dynamic-form/ix-dynamic-form.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; @@ -63,7 +62,6 @@ import { ReportsGlobalControlsComponent } from './components/reports-global-cont IxDateComponent, MatToolbarModule, TranslateModule, - EntityModule, MatTooltipModule, IxIconComponent, MatMenuModule, diff --git a/src/app/pages/services/services.module.ts b/src/app/pages/services/services.module.ts index 2ec3408ae00..71258796028 100644 --- a/src/app/pages/services/services.module.ts +++ b/src/app/pages/services/services.module.ts @@ -14,7 +14,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -57,7 +56,6 @@ import { routing } from './services.routing'; @NgModule({ imports: [ FormsModule, - EntityModule, routing, TranslateModule, IxIconComponent, diff --git a/src/app/pages/sharing/sharing.module.ts b/src/app/pages/sharing/sharing.module.ts index 916ba478f30..09fa6b2e73a 100644 --- a/src/app/pages/sharing/sharing.module.ts +++ b/src/app/pages/sharing/sharing.module.ts @@ -20,7 +20,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxChipsComponent } from 'app/modules/forms/ix-forms/components/ix-chips/ix-chips.component'; @@ -101,7 +100,6 @@ import { SmbStatusComponent } from './smb/smb-status/smb-status.component'; imports: [ ReactiveFormsModule, routing, - EntityModule, TranslateModule, MatProgressBarModule, MatTabsModule, diff --git a/src/app/pages/shell/shell.module.ts b/src/app/pages/shell/shell.module.ts index fa6b7ccc2b7..77fe746f901 100644 --- a/src/app/pages/shell/shell.module.ts +++ b/src/app/pages/shell/shell.module.ts @@ -1,14 +1,12 @@ import { NgModule } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { TerminalModule } from 'app/modules/terminal/terminal.module'; import { ShellComponent } from './shell.component'; import { routing } from './shell.routing'; @NgModule({ imports: [ - EntityModule, routing, TranslateModule, TerminalModule, diff --git a/src/app/pages/storage/modules/devices/devices.module.ts b/src/app/pages/storage/modules/devices/devices.module.ts index 58b552d3cdc..8aac962e7be 100644 --- a/src/app/pages/storage/modules/devices/devices.module.ts +++ b/src/app/pages/storage/modules/devices/devices.module.ts @@ -15,7 +15,6 @@ import { IxDetailsHeightDirective } from 'app/directives/details-height/details- import { HasRoleDirective } from 'app/directives/has-role/has-role.directive'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { CopyButtonComponent } from 'app/modules/buttons/copy-button/copy-button.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { UnusedDiskSelectComponent } from 'app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; @@ -60,7 +59,6 @@ import { ExtendDialogComponent } from './components/zfs-info-card/extend-dialog/ @NgModule({ imports: [ - EntityModule, TreeModule, MatButtonModule, MatCardModule, diff --git a/src/app/pages/storage/modules/disks/disks.module.ts b/src/app/pages/storage/modules/disks/disks.module.ts index 8ffc5575608..ba5461eb304 100644 --- a/src/app/pages/storage/modules/disks/disks.module.ts +++ b/src/app/pages/storage/modules/disks/disks.module.ts @@ -10,7 +10,6 @@ import { RouterModule } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { UnusedDiskSelectComponent } from 'app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; @@ -60,7 +59,6 @@ import { routes } from 'app/pages/storage/modules/disks/disks.routing'; MatButtonModule, MatDialogModule, RouterModule.forChild(routes), - EntityModule, MatCardModule, MatDividerModule, MatProgressBarModule, diff --git a/src/app/pages/storage/storage.module.ts b/src/app/pages/storage/storage.module.ts index cc66a41dce1..b9541828c7a 100644 --- a/src/app/pages/storage/storage.module.ts +++ b/src/app/pages/storage/storage.module.ts @@ -25,7 +25,6 @@ import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; @@ -90,7 +89,6 @@ import { ZfsHealthCardComponent } from './components/dashboard-pool/zfs-health-c MatInputModule, MatProgressBarModule, NgxSkeletonLoaderModule, - EntityModule, EmptyComponent, FileSizePipe, FormatDateTimePipe, diff --git a/src/app/pages/system/system.module.ts b/src/app/pages/system/system.module.ts index cedcb67a9fa..87b7e74dcb9 100644 --- a/src/app/pages/system/system.module.ts +++ b/src/app/pages/system/system.module.ts @@ -22,7 +22,6 @@ import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-r import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { OauthButtonModule } from 'app/modules/buttons/oauth-button/oauth-button.module'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { UnusedDiskSelectComponent, } from 'app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component'; @@ -187,7 +186,6 @@ import { routing } from './system.routing'; @NgModule({ imports: [ - EntityModule, FormsModule, TreeModule, SchedulerModule, diff --git a/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.ts b/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.ts index a756f6dacd0..bc4e814ad3b 100644 --- a/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.ts +++ b/src/app/pages/system/update/components/manual-update-form/manual-update-form.component.ts @@ -1,4 +1,3 @@ -import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; @@ -6,26 +5,29 @@ import { FormBuilder, Validators } from '@angular/forms'; import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import { - BehaviorSubject, noop, Observable, of, + BehaviorSubject, finalize, noop, Observable, of, } from 'rxjs'; import { - filter, take, tap, + filter, tap, } from 'rxjs/operators'; import { JobState } from 'app/enums/job-state.enum'; import { Role } from 'app/enums/role.enum'; +import { observeJob } from 'app/helpers/operators/observe-job.operator'; import { helptextSystemUpdate as helptext } from 'app/helptext/system/update'; +import { ApiJobMethod } from 'app/interfaces/api/api-job-directory.interface'; import { Job } from 'app/interfaces/job.interface'; import { Option } from 'app/interfaces/option.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { EntityJobComponent } from 'app/modules/entity/entity-job/entity-job.component'; +import { selectJob } from 'app/modules/jobs/store/job.selectors'; import { systemManualUpdateFormElements } from 'app/pages/system/update/components/manual-update-form/manual-update-form.elements'; import { updateAgainCode } from 'app/pages/system/update/utils/update-again-code.constant'; import { AuthService } from 'app/services/auth/auth.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { SystemGeneralService } from 'app/services/system-general.service'; +import { UploadOptions, UploadService } from 'app/services/upload.service'; import { WebSocketService } from 'app/services/ws.service'; import { AppsState } from 'app/store'; import { selectIsHaLicensed } from 'app/store/ha-info/ha-info.selectors'; @@ -71,6 +73,7 @@ export class ManualUpdateFormComponent implements OnInit { private translate: TranslateService, private store$: Store, private cdr: ChangeDetectorRef, + private upload: UploadService, ) { this.authService.authToken$.pipe( tap((token) => { @@ -149,20 +152,28 @@ export class ManualUpdateFormComponent implements OnInit { }); } + // TODO: Same code as in update-actions-card showRunningUpdate(jobId: number): void { - const dialogRef = this.matDialog.open(EntityJobComponent, { data: { title: this.translate.instant('Update') } }); - if (this.isHaLicensed) { - dialogRef.componentInstance.disableProgressValue(true); - } - dialogRef.componentInstance.jobId = jobId; - dialogRef.componentInstance.wsshow(); - dialogRef.componentInstance.success.pipe(untilDestroyed(this)).subscribe(() => { - this.router.navigate(['/system-tasks/reboot'], { skipLocationChange: true }); - }); - dialogRef.componentInstance.failure.pipe(untilDestroyed(this)).subscribe((err) => { - this.dialogService.error(this.errorHandler.parseError(err)); - }); - this.cdr.markForCheck(); + const job$ = this.store$.pipe( + select(selectJob(jobId)), + observeJob(), + ) as Observable>; + + this.dialogService.jobDialog( + job$, + { + title: this.translate.instant('Update'), + canMinimize: true, + }, + ) + .afterClosed() + .pipe( + this.errorHandler.catchError(), + untilDestroyed(this), + ) + .subscribe(() => { + this.router.navigate(['/system-tasks/reboot'], { skipLocationChange: true }); + }); } onSubmit(): void { @@ -181,56 +192,33 @@ export class ManualUpdateFormComponent implements OnInit { if (!files.length) { return; } - const dialogRef = this.matDialog.open(EntityJobComponent, { - data: { title: helptext.manual_update_action }, - disableClose: true, - }); - if (this.isHaLicensed) { - dialogRef.componentInstance.disableProgressValue(true); - } - - dialogRef.componentInstance.changeAltMessage(helptext.manual_update_description); - - const formData: FormData = this.generateFormData(files, fileLocation); - - dialogRef.componentInstance.wspostWithProgressUpdates(this.apiEndPoint, formData); - dialogRef.componentInstance.success.pipe(untilDestroyed(this)).subscribe(() => { - dialogRef.close(false); - this.handleUpdateSuccess(); - }); - - dialogRef.componentInstance.prefailure.pipe( - tap(() => dialogRef.close(false)), - untilDestroyed(this), - ).subscribe((error) => this.handleUpdatePreFailure(error)); - - dialogRef.componentInstance.failure.pipe( - take(1), - tap(() => dialogRef.close(false)), - untilDestroyed(this), - ).subscribe((error) => this.handleUpdateFailure(error)); - - dialogRef.afterClosed().pipe(untilDestroyed(this)).subscribe(() => { - this.isFormLoading$.next(false); - this.cdr.markForCheck(); - }); - this.cdr.markForCheck(); - } - generateFormData(files: FileList, fileLocation: string): FormData { - const formData = new FormData(); - if (this.isHaLicensed) { - formData.append('data', JSON.stringify({ + const params: UploadOptions = this.isHaLicensed + ? { method: 'failover.upgrade', - })); - } else { - formData.append('data', JSON.stringify({ + file: files[0], + } + : { method: 'update.file', params: [{ destination: fileLocation }], - })); - } - formData.append('file', files[0]); - return formData; + file: files[0], + }; + + const job$ = this.upload.uploadAsJob(params); + this.dialogService + .jobDialog(job$, { title: this.translate.instant(helptext.manual_update_action) }) + .afterClosed() + .pipe( + finalize(() => { + this.isFormLoading$.next(false); + this.cdr.markForCheck(); + }), + untilDestroyed(this), + ) + .subscribe({ + next: () => this.handleUpdateSuccess(), + error: (job: Job) => this.handleUpdateFailure(job), + }); } finishNonHaUpdate(): void { @@ -269,15 +257,6 @@ export class ManualUpdateFormComponent implements OnInit { } } - handleUpdatePreFailure(prefailure: HttpErrorResponse): void { - this.isFormLoading$.next(false); - this.dialogService.error({ - title: helptext.manual_update_error_dialog.message, - message: `${prefailure.status.toString()} ${prefailure.statusText}`, - }); - this.cdr.markForCheck(); - } - handleUpdateFailure = (failure: Job): void => { this.isFormLoading$.next(false); this.cdr.markForCheck(); @@ -298,33 +277,17 @@ export class ManualUpdateFormComponent implements OnInit { }; private resumeUpdateAfterFailure(): void { - const dialogRef = this.matDialog.open(EntityJobComponent, { - data: { title: helptext.manual_update_action }, - disableClose: true, - }); - if (this.isHaLicensed) { - dialogRef.componentInstance.setCall('failover.upgrade', [{ resume: true, resume_manual: true }]); - dialogRef.componentInstance.disableProgressValue(true); - } else { - dialogRef.componentInstance.setCall('update.file', [{ resume: true }]); - } - - dialogRef.componentInstance.success.pipe(untilDestroyed(this)).subscribe(() => { - dialogRef.close(false); - this.handleUpdateSuccess(); - }); - - dialogRef.componentInstance.prefailure.pipe( - tap(() => dialogRef.close(false)), - untilDestroyed(this), - ).subscribe((error) => this.handleUpdatePreFailure(error)); - - dialogRef.componentInstance.failure.pipe( - take(1), - tap(() => dialogRef.close(false)), - untilDestroyed(this), - ).subscribe((error) => this.handleUpdateFailure(error)); - - dialogRef.componentInstance.submit(); + const job$: Observable = this.isHaLicensed + ? this.ws.job('failover.upgrade', [{ resume: true, resume_manual: true }]) + : this.ws.job('update.file', [{ resume: true }]); + + this.dialogService + .jobDialog(job$, { title: helptext.manual_update_action }) + .afterClosed() + .pipe(untilDestroyed(this)) + .subscribe({ + next: () => this.handleUpdateSuccess(), + error: (job: Job) => this.handleUpdateFailure(job), + }); } } diff --git a/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.spec.ts b/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.spec.ts index 495d5b42bea..680b2b4961e 100644 --- a/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.spec.ts +++ b/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.spec.ts @@ -7,14 +7,12 @@ import { Router } from '@angular/router'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; import { provideMockStore } from '@ngrx/store/testing'; import { BehaviorSubject, of } from 'rxjs'; -import { fakeSuccessfulJob } from 'app/core/testing/utils/fake-job.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; -import { mockCall, mockWebSocket } from 'app/core/testing/utils/mock-websocket.utils'; +import { mockCall, mockJob, mockWebSocket } from 'app/core/testing/utils/mock-websocket.utils'; import { JobState } from 'app/enums/job-state.enum'; import { SystemUpdateStatus } from 'app/enums/system-update.enum'; import { SystemUpdate } from 'app/interfaces/system-update.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { EntityJobComponent } from 'app/modules/entity/entity-job/entity-job.component'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { SaveConfigDialogComponent } from 'app/pages/system/general-settings/save-config-dialog/save-config-dialog.component'; import { UpdateActionsCardComponent } from 'app/pages/system/update/components/update-actions-card/update-actions-card.component'; @@ -29,17 +27,9 @@ describe('UpdateActionsCardComponent', () => { let loader: HarnessLoader; const mockDialogRef = { - componentInstance: { - setDescription: jest.fn(), - setCall: jest.fn(), - submit: jest.fn(), - success: of(fakeSuccessfulJob(true)), - failure: of(), - wspost: jest.fn(), - }, close: jest.fn(), afterClosed: () => of(true), - } as unknown as MatDialogRef; + } as unknown as MatDialogRef; const createComponent = createComponentFactory({ component: UpdateActionsCardComponent, @@ -51,6 +41,7 @@ describe('UpdateActionsCardComponent', () => { status: SystemUpdateStatus.Available, changes: [], } as SystemUpdate), + mockJob('update.update'), ]), mockProvider(Router), mockProvider(TrainService), @@ -109,8 +100,7 @@ describe('UpdateActionsCardComponent', () => { title: 'Apply Pending Updates', }); - expect(mockDialogRef.componentInstance.setCall).toHaveBeenCalledWith('update.update', [{ reboot: true, resume: false }]); - expect(mockDialogRef.componentInstance.submit).toHaveBeenCalled(); + expect(spectator.inject(WebSocketService).job).toHaveBeenCalledWith('update.update', [{ reboot: true, resume: false }]); }); it('shows save configuration dialog and runs update when Download Updates button is pressed', async () => { @@ -140,8 +130,7 @@ describe('UpdateActionsCardComponent', () => { title: 'Download Update', }); - expect(mockDialogRef.componentInstance.setCall).toHaveBeenCalledWith('update.update', [{ reboot: true, resume: false }]); - expect(mockDialogRef.componentInstance.submit).toHaveBeenCalled(); + expect(spectator.inject(WebSocketService).job).toHaveBeenCalledWith('update.update', [{ reboot: true, resume: false }]); }); it('shows save configuration dialog and redirects to the manual update page when Install Manual Update File button is pressed', async () => { diff --git a/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.ts b/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.ts index 54f8188bb7d..8ff1fc7795e 100644 --- a/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.ts +++ b/src/app/pages/system/update/components/update-actions-card/update-actions-card.component.ts @@ -4,14 +4,16 @@ import { import { MatDialog } from '@angular/material/dialog'; import { Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { Store } from '@ngrx/store'; +import { select, Store } from '@ngrx/store'; import { TranslateService } from '@ngx-translate/core'; import { - Observable, of, filter, tap, combineLatest, map, + Observable, of, filter, tap, combineLatest, map, switchMap, + take, } from 'rxjs'; import { JobState } from 'app/enums/job-state.enum'; import { Role } from 'app/enums/role.enum'; import { SystemUpdateOperationType, SystemUpdateStatus } from 'app/enums/system-update.enum'; +import { observeJob } from 'app/helpers/operators/observe-job.operator'; import { WINDOW } from 'app/helpers/window.helper'; import { helptextGlobal } from 'app/helptext/global-helptext'; import { helptextSystemUpdate as helptext } from 'app/helptext/system/update'; @@ -19,7 +21,7 @@ import { ApiJobMethod } from 'app/interfaces/api/api-job-directory.interface'; import { Job } from 'app/interfaces/job.interface'; import { WebSocketError } from 'app/interfaces/websocket-error.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { EntityJobComponent } from 'app/modules/entity/entity-job/entity-job.component'; +import { selectJob } from 'app/modules/jobs/store/job.selectors'; import { AppLoaderService } from 'app/modules/loader/app-loader.service'; import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { @@ -118,18 +120,26 @@ export class UpdateActionsCardComponent implements OnInit { // Shows an update in progress as a job dialog on the update page showRunningUpdate(jobId: number): void { - const dialogRef = this.matDialog.open(EntityJobComponent, { data: { title: this.updateTitle } }); - if (this.isHaLicensed) { - dialogRef.componentInstance.disableProgressValue(true); - } - dialogRef.componentInstance.jobId = jobId; - dialogRef.componentInstance.wsshow(); - dialogRef.componentInstance.success.pipe(untilDestroyed(this)).subscribe(() => { - this.router.navigate(['/system-tasks/reboot'], { skipLocationChange: true }); - }); - dialogRef.componentInstance.failure.pipe(untilDestroyed(this)).subscribe((err) => { - this.dialogService.error(this.errorHandler.parseError(err)); - }); + const job$ = this.store$.pipe( + select(selectJob(jobId)), + observeJob(), + ) as Observable>; + + this.dialogService.jobDialog( + job$, + { + title: this.updateTitle, + canMinimize: true, + }, + ) + .afterClosed() + .pipe( + this.errorHandler.catchError(), + untilDestroyed(this), + ) + .subscribe(() => { + this.router.navigate(['/system-tasks/reboot'], { skipLocationChange: true }); + }); } downloadUpdate(): void { @@ -266,38 +276,39 @@ export class UpdateActionsCardComponent implements OnInit { this.window.sessionStorage.removeItem('updateLastChecked'); this.window.sessionStorage.removeItem('updateAvailable'); this.sysGenService.updateRunningNoticeSent.emit(); - const dialogRef = this.matDialog.open(EntityJobComponent, { data: { title: this.updateTitle } }); - dialogRef.componentInstance.failure.pipe(untilDestroyed(this)).subscribe((error) => { - dialogRef.close(); - this.handleUpdateError(error); - }); - if (!this.isHaLicensed) { - dialogRef.componentInstance.setCall('update.update', [{ resume, reboot: true }]); - dialogRef.componentInstance.submit(); + + let job$: Observable; + if (this.isHaLicensed) { + job$ = this.trainService.trainValue$.pipe( + take(1), + switchMap((trainValue) => this.ws.call('update.set_train', [trainValue])), + switchMap(() => this.ws.job('failover.upgrade', [{ resume }])), + ); } else { - this.trainService.trainValue$.pipe( - tap((trainValue) => this.ws.call('update.set_train', [trainValue])), - untilDestroyed(this), - ).subscribe(() => { - dialogRef.componentInstance.setCall('failover.upgrade', [{ resume }]); - dialogRef.componentInstance.disableProgressValue(true); - dialogRef.componentInstance.submit(); - dialogRef.componentInstance.success.pipe(untilDestroyed(this)).subscribe(() => { + job$ = this.ws.job('update.update', [{ resume, reboot: true }]); + } + + this.dialogService + .jobDialog(job$, { title: this.translate.instant(this.updateTitle) }) + .afterClosed() + .pipe( + switchMap(() => { this.dialogService.closeAllDialogs(); this.isUpdateRunning = false; this.sysGenService.updateDone(); // Send 'finished' signal to topbar this.cdr.markForCheck(); - this.router.navigate(['/']); - this.dialogService.confirm({ + return this.dialogService.confirm({ title: helptext.ha_update.complete_title, message: helptext.ha_update.complete_msg, hideCheckbox: true, buttonText: helptext.ha_update.complete_action, hideCancel: true, - }).pipe(untilDestroyed(this)).subscribe(); - }); - }); - } + }); + }), + this.errorHandler.catchError(), + untilDestroyed(this), + ) + .subscribe(); } // Continues the update (based on its type) after the Save Config dialog is closed diff --git a/src/app/pages/vm/vm.module.ts b/src/app/pages/vm/vm.module.ts index 187f5ce15e9..67b14e501a5 100644 --- a/src/app/pages/vm/vm.module.ts +++ b/src/app/pages/vm/vm.module.ts @@ -14,7 +14,6 @@ import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; import { EmptyComponent } from 'app/modules/empty/empty.component'; -import { EntityModule } from 'app/modules/entity/entity.module'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; import { IxComboboxComponent } from 'app/modules/forms/ix-forms/components/ix-combobox/ix-combobox.component'; @@ -74,7 +73,6 @@ import { routing } from './vm.routing'; @NgModule({ imports: [ - EntityModule, IxIconComponent, MatButtonModule, MatCardModule, diff --git a/src/app/services/session-timeout.service.ts b/src/app/services/session-timeout.service.ts index 89e8b7d08c2..91ab192795e 100644 --- a/src/app/services/session-timeout.service.ts +++ b/src/app/services/session-timeout.service.ts @@ -11,9 +11,9 @@ import { } from 'rxjs'; import { WINDOW } from 'app/helpers/window.helper'; import { Timeout } from 'app/interfaces/timeout.interface'; +import { JobProgressDialogComponent } from 'app/modules/dialog/components/job-progress/job-progress-dialog.component'; import { SessionExpiringDialogComponent } from 'app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { EntityJobComponent } from 'app/modules/entity/entity-job/entity-job.component'; import { AuthService } from 'app/services/auth/auth.service'; import { TokenLastUsedService } from 'app/services/token-last-used.service'; import { AppsState } from 'app/store'; @@ -26,6 +26,7 @@ import { selectPreferences } from 'app/store/preferences/preferences.selectors'; export class SessionTimeoutService { protected actionWaitTimeout: Timeout; protected terminateCancelTimeout: Timeout; + // TODO: Just make resume an arrow function. private resumeBound; constructor( @@ -42,9 +43,9 @@ export class SessionTimeoutService { this.resumeBound = this.resume.bind(this); this.matDialog.afterOpened.pipe(untilDestroyed(this)).subscribe((dialog) => { - if (dialog.componentInstance instanceof EntityJobComponent) { + if (dialog.componentInstance instanceof JobProgressDialogComponent) { this.stop(); - dialog.componentInstance.dialogRef.afterClosed().pipe(untilDestroyed(this)).subscribe(() => { + dialog.afterClosed().pipe(untilDestroyed(this)).subscribe(() => { this.start(); }); } diff --git a/src/app/services/upload.service.ts b/src/app/services/upload.service.ts index 63eda8c85a5..c003cb2e857 100644 --- a/src/app/services/upload.service.ts +++ b/src/app/services/upload.service.ts @@ -12,7 +12,7 @@ import { selectJob } from 'app/modules/jobs/store/job.selectors'; import { AuthService } from 'app/services/auth/auth.service'; import { AppsState } from 'app/store'; -interface UploadOptions { +export interface UploadOptions { file: File; method: M; params?: unknown[]; diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 0ebb1c15aa7..a03be9e0f32 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -509,7 +509,6 @@ "Clone to New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1390,7 +1389,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index ffa49d98d3e..3e0f6dbd438 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -596,7 +596,6 @@ "Clone to New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1264,7 +1263,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File ID": "", "File Inherit": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 0a23e5f33ac..64e162b6d9b 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -411,7 +411,6 @@ "Client ID": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close scheduler": "", "Close the form": "", "Close {formType} Form": "", @@ -920,7 +919,6 @@ "Fenced is not running.": "", "Fetch DataStores": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "File ID": "", "File Mask": "", "File Permissions": "", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index f254b88e614..c7c517bd27b 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -760,7 +760,6 @@ "Clone to New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1676,7 +1675,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 1ee8e9f37e4..54477879518 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -1642,7 +1642,6 @@ "Close": "Fermer", "Close Feedback Dialog": "Fermer la boîte de dialogue de commentaires", "Close Inspect VDEVs Dialog": "Fermer la boîte de dialogue Inspecter les VDEV", - "Close Job": "Fermer la tâche", "Close panel": "Fermer le panneau", "Close scheduler": "Fermer le planificateur", "Close the form": "Fermer le formulaire", @@ -2519,7 +2518,6 @@ "Fetch DataStores": "Récupérer les datastores", "Fetching Encryption Summary": "Récupération du résumé du chiffrement", "Fetching Encryption Summary for {dataset}": "Récupération du résumé de chiffrement pour {dataset}", - "Fetching data...": "Récupération des données...", "Field is required": "Champ requis", "File": "Fichier", "File Inherit": "Héritage du fichier", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index d05e19fee5f..94535feb7f1 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -917,7 +917,6 @@ "Close": "Dún", "Close Feedback Dialog": "Dún Dialóg Aiseolais", "Close Inspect VDEVs Dialog": "Dún Inspect VDEVs Dialóg", - "Close Job": "Dún Job", "Close panel": "Painéal a dhúnadh", "Close scheduler": "Dún an sceidealóir", "Close the form": "Dún an fhoirm", @@ -1905,7 +1904,6 @@ "Fetch DataStores": "Faigh Stórais Sonraí", "Fetching Encryption Summary": "Ag fáil Achoimre Criptithe", "Fetching Encryption Summary for {dataset}": "Achoimre Criptithe á fáil le haghaidh {dataset}", - "Fetching data...": "Sonraí á bhfáil...", "Field is required": "Réimse ag teastáil", "File": "Comhad", "File ID": "Aitheantas an chomhaid", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index 0baceb55139..aa64a49d546 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -730,7 +730,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1648,7 +1647,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 7a1593ffb3d..aa910d2e3b0 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -693,7 +693,6 @@ "Clone To New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1567,7 +1566,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index b8365770d1a..1a81c8d4063 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -406,7 +406,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1413,7 +1412,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index 3814abd7842..c1b9a47ae5a 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -824,7 +824,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1831,7 +1830,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index e064f6ba0ca..928bb3efe19 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -182,7 +182,6 @@ "Click Add to add first VDEV.": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close scheduler": "", "Close {formType} Form": "", "Cloud Backup": "", @@ -444,7 +443,6 @@ "Features": "", "Feedback Type": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "File Mask": "", "File Permissions": "", "First Page": "", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 75dd1b69814..3d032c81df2 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -784,7 +784,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1784,7 +1783,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index f810ec45120..67c2e224363 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -771,7 +771,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1778,7 +1777,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index af32d2adf19..c0497ee5fdf 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -324,7 +324,6 @@ "Clicking Continue allows TrueNAS to finish the update in the background while Abort stops the process and reverts the dataset ACL to the previously active ACL.": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close scheduler": "", "Close {formType} Form": "", "Cloud Backup": "", @@ -923,7 +922,6 @@ "Feature Request": "", "Features": "", "Feedback Type": "", - "Fetching data...": "", "File Mask": "", "File Permissions": "", "First Page": "", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 8e7a911e626..b9391cf4d30 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -479,7 +479,6 @@ "Clone To New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1085,7 +1084,6 @@ "Fenced is not running.": "", "Fetch DataStores": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index f0c984579bf..fad19708d77 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -282,7 +282,6 @@ "Client ID": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close scheduler": "", "Close the form": "", "Close {formType} Form": "", @@ -664,7 +663,6 @@ "Features": "", "Feedback Type": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "File ID": "", "File Mask": "", "File Permissions": "", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 7cab7a671f2..a9a659e029b 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -830,7 +830,6 @@ "Close": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1837,7 +1836,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index cd2cca2ceb8..00ae7136f7a 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -188,7 +188,6 @@ "Click to give {index} star rating.": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close scheduler": "", "Close {formType} Form": "", "Cloud Backup": "", @@ -458,7 +457,6 @@ "Features": "", "Feedback Type": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "File Mask": "", "File Permissions": "", "First Page": "", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 2017096bc0c..da2ac8b98e0 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -685,7 +685,6 @@ "Clone To New Dataset": "", "Close Feedback Dialog": "", "Close Inspect VDEVs Dialog": "", - "Close Job": "", "Close panel": "", "Close scheduler": "", "Close the form": "", @@ -1520,7 +1519,6 @@ "Fetch DataStores": "", "Fetching Encryption Summary": "", "Fetching Encryption Summary for {dataset}": "", - "Fetching data...": "", "Field is required": "", "File": "", "File ID": "", diff --git a/tsconfig.strictNullChecks.json b/tsconfig.strictNullChecks.json index 410763fe92b..1ef5c40273b 100644 --- a/tsconfig.strictNullChecks.json +++ b/tsconfig.strictNullChecks.json @@ -412,7 +412,6 @@ "./src/app/modules/dialog/components/redirect-dialog/redirect-dialog.component.ts", "./src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts", "./src/app/modules/empty/empty.service.ts", - "./src/app/modules/entity/entity-job/entity-job-config.interface.ts", "./src/app/modules/forms/toolbar-slider/toolbar-slider.component.ts", "./src/app/modules/feedback/interfaces/feedback.interface.ts", "./src/app/modules/feedback/interfaces/file-ticket.interface.ts",