diff --git a/.vscode/settings.json b/.vscode/settings.json index 3bb36b72b95..11525f20d01 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,10 +1,6 @@ { - "vsicons.presets.angular": true, "typescript.updateImportsOnFileMove.enabled": "always", "typescript.preferences.importModuleSpecifier": "non-relative", - "eslint.options": { - "extensions": [".ts", ".html"] - }, "eslint.validate": [ "typescript", "html" diff --git a/eslint/eslint-ts-rules-extra.mjs b/eslint/eslint-ts-rules-extra.mjs index e7f5387b995..571fb6c9be9 100644 --- a/eslint/eslint-ts-rules-extra.mjs +++ b/eslint/eslint-ts-rules-extra.mjs @@ -113,6 +113,10 @@ export const extraRules = { "importNames": ["NgIf"], "message": "Use built-in control flow syntax instead" }, + { + "name": "@angular/core", + "importNames": ["CUSTOM_ELEMENTS_SCHEMA"], + }, { "name": "@angular/common", "importNames": ["CommonModule"], diff --git a/src/app/enums/boot-environment-action.enum.ts b/src/app/enums/boot-environment-action.enum.ts deleted file mode 100644 index ad8a19eb282..00000000000 --- a/src/app/enums/boot-environment-action.enum.ts +++ /dev/null @@ -1,6 +0,0 @@ -export enum BootEnvironmentAction { - Create = 'create', - Rename = 'update', - Clone = 'clone', - Delete = 'delete', -} diff --git a/src/app/enums/boot-environment-active.enum.ts b/src/app/enums/boot-environment-active.enum.ts deleted file mode 100644 index b6daee83993..00000000000 --- a/src/app/enums/boot-environment-active.enum.ts +++ /dev/null @@ -1,7 +0,0 @@ -export enum BootEnvironmentActive { - Now = 'N', - Restart = 'R', - NowRestart = 'NR', - Dash = '-', - Empty = '', -} diff --git a/src/app/enums/cloudsync-transfer-setting.enum.ts b/src/app/enums/cloudsync-transfer-setting.enum.ts new file mode 100644 index 00000000000..b07348f4399 --- /dev/null +++ b/src/app/enums/cloudsync-transfer-setting.enum.ts @@ -0,0 +1,13 @@ +import { marker as T } from '@biesbjerg/ngx-translate-extract-marker'; + +export enum CloudsyncTransferSetting { + Default = 'DEFAULT', + Performance = 'PERFORMANCE', + FastStorage = 'FAST_STORAGE', +} + +export const cloudsyncTransferSettingLabels = new Map([ + [CloudsyncTransferSetting.Default, T('Default')], + [CloudsyncTransferSetting.Performance, T('Performance')], + [CloudsyncTransferSetting.FastStorage, T('Fast Storage')], +]); diff --git a/src/app/enums/virtualization.enum.ts b/src/app/enums/virtualization.enum.ts index 63142da9ec6..d082e3ca9f7 100644 --- a/src/app/enums/virtualization.enum.ts +++ b/src/app/enums/virtualization.enum.ts @@ -15,7 +15,7 @@ export enum VirtualizationStatus { Stopped = 'STOPPED', } -export const virtualizationStatusMap = new Map([ +export const virtualizationStatusLabels = new Map([ [VirtualizationStatus.Running, T('Running')], [VirtualizationStatus.Stopped, T('Stopped')], ]); diff --git a/src/app/interfaces/api/api-call-directory.interface.ts b/src/app/interfaces/api/api-call-directory.interface.ts index bdf560c6559..c05fff52c4c 100644 --- a/src/app/interfaces/api/api-call-directory.interface.ts +++ b/src/app/interfaces/api/api-call-directory.interface.ts @@ -1,4 +1,5 @@ import { AlertPolicy } from 'app/enums/alert-policy.enum'; +import { CloudsyncTransferSetting } from 'app/enums/cloudsync-transfer-setting.enum'; import { DatasetRecordSize, DatasetType } from 'app/enums/dataset.enum'; import { DeviceType } from 'app/enums/device-type.enum'; import { DockerConfig, DockerStatusData } from 'app/enums/docker-config.interface'; @@ -36,12 +37,7 @@ import { AuditConfig, AuditEntry, AuditQueryParams } from 'app/interfaces/audit/ import { AuthSession } from 'app/interfaces/auth-session.interface'; import { LoginExOtpTokenQuery, LoginExQuery, LoginExResponse } from 'app/interfaces/auth.interface'; import { AvailableApp } from 'app/interfaces/available-app.interface'; -import { - Bootenv, - CreateBootenvParams, - SetBootenvAttributeParams, - UpdateBootenvParams, -} from 'app/interfaces/bootenv.interface'; +import { BootenvCloneParams, BootEnvironment, BootenvKeepParams } from 'app/interfaces/boot-environment.interface'; import { CatalogConfig, CatalogApp, CatalogUpdate, GetItemDetailsParams, @@ -349,12 +345,12 @@ export interface ApiCallDirectory { 'boot.get_state': { params: void; response: PoolInstance }; 'boot.set_scrub_interval': { params: [number]; response: number }; - // Bootenv - 'bootenv.activate': { params: [string]; response: boolean }; - 'bootenv.create': { params: CreateBootenvParams; response: string }; - 'bootenv.query': { params: QueryParams; response: Bootenv[] }; - 'bootenv.set_attribute': { params: SetBootenvAttributeParams; response: boolean }; - 'bootenv.update': { params: UpdateBootenvParams; response: string }; + // Boot Environment + 'boot.environment.query': { params: QueryParams; response: BootEnvironment[] }; + 'boot.environment.activate': { params: [{ id: string }]; response: unknown }; + 'boot.environment.destroy': { params: [{ id: string }]; response: unknown }; + 'boot.environment.clone': { params: BootenvCloneParams; response: unknown }; + 'boot.environment.keep': { params: BootenvKeepParams; response: unknown }; // Catalog 'catalog.get_app_details': { params: [name: string, params: GetItemDetailsParams]; response: CatalogApp }; @@ -384,6 +380,7 @@ export interface ApiCallDirectory { 'cloud_backup.delete': { params: [id: number]; response: boolean }; 'cloud_backup.list_snapshots': { params: [id: number]; response: CloudBackupSnapshot[] }; 'cloud_backup.list_snapshot_directory': { params: CloudBackupSnapshotDirectoryParams; response: CloudBackupSnapshotDirectoryListing[] }; + 'cloud_backup.transfer_setting_choices': { params: void; response: CloudsyncTransferSetting[] }; 'cloud_backup.query': { params: [id?: QueryParams]; response: CloudBackup[] }; 'cloud_backup.update': { params: [id: number, update: CloudBackupUpdate]; response: CloudBackup }; diff --git a/src/app/interfaces/api/api-event-directory.interface.ts b/src/app/interfaces/api/api-event-directory.interface.ts index d04e8cf7ce1..62f0927dda9 100644 --- a/src/app/interfaces/api/api-event-directory.interface.ts +++ b/src/app/interfaces/api/api-event-directory.interface.ts @@ -2,6 +2,7 @@ import { DockerStatusData } from 'app/enums/docker-config.interface'; import { FailoverStatus } from 'app/enums/failover-status.enum'; import { Alert } from 'app/interfaces/alert.interface'; import { App, AppStats } from 'app/interfaces/app.interface'; +import { BootEnvironment } from 'app/interfaces/boot-environment.interface'; import { ContainerImage } from 'app/interfaces/container-image.interface'; import { DirectoryServicesState } from 'app/interfaces/directory-services-state.interface'; import { Disk } from 'app/interfaces/disk.interface'; @@ -43,4 +44,5 @@ export interface ApiEventDirectory { 'vm.query': { response: VirtualMachine }; 'zfs.pool.scan': { response: PoolScan }; 'zfs.snapshot.query': { response: ZfsSnapshot }; + 'boot.environment.query': { response: BootEnvironment }; } diff --git a/src/app/interfaces/boot-environment.interface.ts b/src/app/interfaces/boot-environment.interface.ts new file mode 100644 index 00000000000..1cff143c97b --- /dev/null +++ b/src/app/interfaces/boot-environment.interface.ts @@ -0,0 +1,59 @@ +import { ApiTimestamp } from 'app/interfaces/api-date.interface'; + +export interface BootEnvironment { + /** + * The name of the boot environment. + */ + id: string; + + /** + * The name of the dataset representing the boot environment. + */ + dataset: string; + + /** + * If `true`, represents the `currently` running boot environment. + */ + active: boolean; + + /** + * If `true`, represents the boot environment that will become the running boot environment at `next boot`. + */ + activated: boolean; + + /** + * Represents when the boot environment was created. + */ + created: ApiTimestamp; + + /** + * An integer representing the number of bytes used by the boot environment. + */ + used_bytes: number; + + /** + * A human-readable string representing the total number of space used by the boot environment. + */ + used: string; + + /** + * When set to `false`, will be automatically deleted during an upgrade procedure + * if there isn’t enough room on the boot drive to apply said update. + */ + keep: boolean; + + /** + * If `true` indicates whether the boot environment may be `activated`. + */ + can_activate: boolean; +} + +export type BootenvCloneParams = [{ + id: string; + target: string; +}]; + +export type BootenvKeepParams = [{ + id: string; + value: boolean; +}]; diff --git a/src/app/interfaces/bootenv.interface.ts b/src/app/interfaces/bootenv.interface.ts deleted file mode 100644 index ead5063872d..00000000000 --- a/src/app/interfaces/bootenv.interface.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { BootEnvironmentActive } from 'app/enums/boot-environment-active.enum'; -import { ApiTimestamp } from 'app/interfaces/api-date.interface'; - -export interface Bootenv { - activated: boolean; - active: BootEnvironmentActive; - can_activate: boolean; - created: ApiTimestamp; - id: string; - keep: boolean; - mountpoint: string; - name: string; - rawspace: number; - realname: string; - space: string; -} - -export type SetBootenvAttributeParams = [ - name: string, - attributes: Partial, -]; - -export type CreateBootenvParams = [{ - name: string; - source?: string; -}]; - -export type UpdateBootenvParams = [ - name: string, - updates: { name: string }, -]; - -export interface BootenvTooltip { - name: string; - source?: string; -} diff --git a/src/app/interfaces/cloud-backup.interface.ts b/src/app/interfaces/cloud-backup.interface.ts index b53f0665782..444b9d21726 100644 --- a/src/app/interfaces/cloud-backup.interface.ts +++ b/src/app/interfaces/cloud-backup.interface.ts @@ -1,7 +1,8 @@ import { marker as T } from '@biesbjerg/ngx-translate-extract-marker'; +import { CloudsyncTransferSetting } from 'app/enums/cloudsync-transfer-setting.enum'; import { ApiTimestamp } from 'app/interfaces/api-date.interface'; import { Job } from 'app/interfaces/job.interface'; -import { BwLimit, BwLimitUpdate, CloudCredential } from './cloud-sync-task.interface'; +import { CloudCredential } from './cloud-sync-task.interface'; import { Schedule } from './schedule.interface'; export interface CloudBackup { @@ -15,7 +16,6 @@ export interface CloudBackup { snapshot: boolean; include: string[]; exclude: string[]; - transfers: number | null; args: string; enabled: boolean; password: string; @@ -23,12 +23,11 @@ export interface CloudBackup { job: Job | null; locked: boolean; keep_last?: number; - bwlimit?: BwLimit[]; + transfer_setting: CloudsyncTransferSetting; } -export interface CloudBackupUpdate extends Omit { +export interface CloudBackupUpdate extends Omit { credentials: number; - bwlimit: BwLimitUpdate[]; } export interface CloudBackupSnapshot { diff --git a/src/app/modules/alerts/store/alert.effects.ts b/src/app/modules/alerts/store/alert.effects.ts index 8239d32d492..42ba6cf6341 100644 --- a/src/app/modules/alerts/store/alert.effects.ts +++ b/src/app/modules/alerts/store/alert.effects.ts @@ -35,7 +35,7 @@ export class AlertEffects { loadAlerts$ = createEffect(() => this.actions$.pipe( ofType(adminUiInitialized, alertIndicatorPressed, alertReceivedWhenPanelIsOpen), switchMap(() => { - return this.ws.call('alert.list').pipe( + return this.api.call('alert.list').pipe( map((alerts) => alertsLoaded({ alerts })), catchError((error) => { console.error(error); @@ -51,7 +51,7 @@ export class AlertEffects { subscribeToUpdates$ = createEffect(() => this.actions$.pipe( ofType(adminUiInitialized), switchMap(() => { - return this.ws.subscribe('alert.list').pipe( + return this.api.subscribe('alert.list').pipe( switchMap((event) => { return this.store$.select(selectIsAlertPanelOpen).pipe( switchMap((isAlertsPanelOpen) => { @@ -80,7 +80,7 @@ export class AlertEffects { dismissAlert$ = createEffect(() => this.actions$.pipe( ofType(dismissAlertPressed), mergeMap(({ id }) => { - return this.ws.call('alert.dismiss', [id]).pipe( + return this.api.call('alert.dismiss', [id]).pipe( catchError((error) => { this.errorHandler.showErrorModal(error); this.store$.dispatch(alertChanged({ alert: { id, dismissed: false } as Alert })); @@ -93,7 +93,7 @@ export class AlertEffects { reopenAlert$ = createEffect(() => this.actions$.pipe( ofType(reopenAlertPressed), mergeMap(({ id }) => { - return this.ws.call('alert.restore', [id]).pipe( + return this.api.call('alert.restore', [id]).pipe( catchError((error) => { this.errorHandler.showErrorModal(error); this.store$.dispatch(alertChanged({ alert: { id, dismissed: true } as Alert })); @@ -107,7 +107,7 @@ export class AlertEffects { ofType(dismissAllAlertsPressed), withLatestFrom(this.store$.select(selectUnreadAlerts).pipe(pairwise())), mergeMap(([, [unreadAlerts]]) => { - const requests = unreadAlerts.map((alert) => this.ws.call('alert.dismiss', [alert.id])); + const requests = unreadAlerts.map((alert) => this.api.call('alert.dismiss', [alert.id])); return forkJoin(requests).pipe( catchError((error) => { this.errorHandler.showErrorModal(error); @@ -123,7 +123,7 @@ export class AlertEffects { ofType(reopenAllAlertsPressed), withLatestFrom(this.store$.select(selectDismissedAlerts).pipe(pairwise())), mergeMap(([, [dismissedAlerts]]) => { - const requests = dismissedAlerts.map((alert) => this.ws.call('alert.restore', [alert.id])); + const requests = dismissedAlerts.map((alert) => this.api.call('alert.restore', [alert.id])); return forkJoin(requests).pipe( catchError((error) => { this.errorHandler.showErrorModal(error); @@ -136,7 +136,7 @@ export class AlertEffects { constructor( private actions$: Actions, - private ws: ApiService, + private api: ApiService, private store$: Store, private translate: TranslateService, private errorHandler: ErrorHandlerService, diff --git a/src/app/modules/buttons/export-button/export-button.component.ts b/src/app/modules/buttons/export-button/export-button.component.ts index 209e6e9f50a..817df42d988 100644 --- a/src/app/modules/buttons/export-button/export-button.component.ts +++ b/src/app/modules/buttons/export-button/export-button.component.ts @@ -57,7 +57,7 @@ export class ExportButtonComponent { protected readonly isHaLicensed = toSignal(this.store$.select(selectIsHaLicensed)); constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -67,7 +67,7 @@ export class ExportButtonComponent { onExport(): void { this.isLoading = true; - this.ws.job(this.jobMethod, this.getExportParams( + this.api.job(this.jobMethod, this.getExportParams( this.getQueryFilters(this.searchQuery), this.getQueryOptions(this.sorting), )).pipe( @@ -89,7 +89,7 @@ export class ExportButtonComponent { customArguments.report_name = url; } - return this.ws.call('core.download', [downloadMethod, [customArguments], url]); + return this.api.call('core.download', [downloadMethod, [customArguments], url]); }), switchMap(([, url]) => this.download.downloadUrl(url, `${this.filename}.${this.fileType}`, this.fileMimeType)), catchError((error) => { diff --git a/src/app/modules/buttons/mobile-back-button/mobile-back-button.component.ts b/src/app/modules/buttons/mobile-back-button/mobile-back-button.component.ts index fbd1dfaa74c..ab385d073af 100644 --- a/src/app/modules/buttons/mobile-back-button/mobile-back-button.component.ts +++ b/src/app/modules/buttons/mobile-back-button/mobile-back-button.component.ts @@ -1,7 +1,6 @@ import { Component, output, ChangeDetectionStrategy, } from '@angular/core'; -import { MatButton } from '@angular/material/button'; import { TranslateModule } from '@ngx-translate/core'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { TestDirective } from 'app/modules/test-id/test.directive'; @@ -10,7 +9,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - MatButton, IxIconComponent, TranslateModule, TestDirective, diff --git a/src/app/modules/dialog/components/confirm-dialog/confirm-dialog.component.ts b/src/app/modules/dialog/components/confirm-dialog/confirm-dialog.component.ts index 5155b4bb57b..2ee4e9e5a2e 100644 --- a/src/app/modules/dialog/components/confirm-dialog/confirm-dialog.component.ts +++ b/src/app/modules/dialog/components/confirm-dialog/confirm-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, @@ -22,7 +21,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatCheckbox, ReactiveFormsModule, diff --git a/src/app/modules/dialog/components/error-dialog/error-dialog.component.ts b/src/app/modules/dialog/components/error-dialog/error-dialog.component.ts index 45b3cab8113..005bf572d83 100644 --- a/src/app/modules/dialog/components/error-dialog/error-dialog.component.ts +++ b/src/app/modules/dialog/components/error-dialog/error-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectionStrategy, Component, ElementRef, ViewChild, @@ -28,7 +27,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; imports: [ MatDialogTitle, IxIconComponent, - CdkScrollable, MatDialogContent, CopyButtonComponent, MatDialogActions, @@ -52,7 +50,7 @@ export class ErrorDialogComponent { constructor( public dialogRef: MatDialogRef, - private ws: ApiService, + private api: ApiService, private download: DownloadService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -63,7 +61,7 @@ export class ErrorDialogComponent { } downloadLogs(): void { - this.ws.call('core.job_download_logs', [this.logs.id, `${this.logs.id}.log`]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('core.job_download_logs', [this.logs.id, `${this.logs.id}.log`]).pipe(untilDestroyed(this)).subscribe({ next: (url) => { const mimetype = 'text/plain'; this.download.streamDownloadFile(url, `${this.logs.id}.log`, mimetype).pipe(untilDestroyed(this)).subscribe({ diff --git a/src/app/modules/dialog/components/general-dialog/general-dialog.component.ts b/src/app/modules/dialog/components/general-dialog/general-dialog.component.ts index 556d9850759..53adfab64cd 100644 --- a/src/app/modules/dialog/components/general-dialog/general-dialog.component.ts +++ b/src/app/modules/dialog/components/general-dialog/general-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -35,7 +34,6 @@ export interface GeneralDialogConfig { imports: [ MatDialogTitle, IxIconComponent, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/dialog/components/info-dialog/info-dialog.component.ts b/src/app/modules/dialog/components/info-dialog/info-dialog.component.ts index e7627815a2b..dcb13ef2286 100644 --- a/src/app/modules/dialog/components/info-dialog/info-dialog.component.ts +++ b/src/app/modules/dialog/components/info-dialog/info-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -17,7 +16,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; imports: [ MatDialogTitle, IxIconComponent, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/dialog/components/job-progress/job-progress-dialog.component.ts b/src/app/modules/dialog/components/job-progress/job-progress-dialog.component.ts index 4c9151d88da..44e7a5e8e7a 100644 --- a/src/app/modules/dialog/components/job-progress/job-progress-dialog.component.ts +++ b/src/app/modules/dialog/components/job-progress/job-progress-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { DecimalPipe } from '@angular/common'; import { AfterViewChecked, ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, output, @@ -53,7 +52,6 @@ export interface JobProgressDialogConfig { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatProgressBar, MatDialogActions, @@ -109,7 +107,7 @@ export class JobProgressDialogComponent implements OnInit, AfterViewChecked { constructor( private dialogRef: MatDialogRef, MatDialogConfig>, @Inject(MAT_DIALOG_DATA) public data: JobProgressDialogConfig, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, ) { } @@ -199,7 +197,7 @@ export class JobProgressDialogComponent implements OnInit, AfterViewChecked { } abortJob(): void { - this.ws.call('core.job_abort', [this.job.id]).pipe( + this.api.call('core.job_abort', [this.job.id]).pipe( this.errorHandler.catchError(), untilDestroyed(this), ) @@ -218,7 +216,7 @@ export class JobProgressDialogComponent implements OnInit, AfterViewChecked { this.realtimeLogsSubscribed = true; const subName = 'filesystem.file_tail_follow:' + this.job.logs_path; this.cdr.markForCheck(); - return this.ws.subscribeToLogs(subName) + return this.api.subscribeToLogs(subName) .pipe(map((apiEvent) => apiEvent.fields), untilDestroyed(this)) .subscribe((logs) => { if (logs?.data && typeof logs.data === 'string') { diff --git a/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts b/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts index 11cbf36fbe3..277e0e5b913 100644 --- a/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts +++ b/src/app/modules/dialog/components/multi-error-dialog/error-template/error-template.component.ts @@ -43,7 +43,7 @@ export class ErrorTemplateComponent { @Input() logs: Job; constructor( - private ws: ApiService, + private api: ApiService, private download: DownloadService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -68,7 +68,7 @@ export class ErrorTemplateComponent { } downloadLogs(): void { - this.ws.call('core.job_download_logs', [this.logs.id, `${this.logs.id}.log`]) + this.api.call('core.job_download_logs', [this.logs.id, `${this.logs.id}.log`]) .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe((url) => { const mimetype = 'text/plain'; diff --git a/src/app/modules/dialog/components/multi-error-dialog/multi-error-dialog.component.ts b/src/app/modules/dialog/components/multi-error-dialog/multi-error-dialog.component.ts index e4e21733030..164ea98ff45 100644 --- a/src/app/modules/dialog/components/multi-error-dialog/multi-error-dialog.component.ts +++ b/src/app/modules/dialog/components/multi-error-dialog/multi-error-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -18,7 +17,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, ErrorTemplateComponent, MatDivider, diff --git a/src/app/modules/dialog/components/redirect-dialog/redirect-dialog.component.ts b/src/app/modules/dialog/components/redirect-dialog/redirect-dialog.component.ts index 285073c6467..008bab379ec 100644 --- a/src/app/modules/dialog/components/redirect-dialog/redirect-dialog.component.ts +++ b/src/app/modules/dialog/components/redirect-dialog/redirect-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, ElementRef, Inject, ViewChild, } from '@angular/core'; @@ -20,7 +19,6 @@ import { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts b/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts index 208316d7f62..ba5e980d2df 100644 --- a/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts +++ b/src/app/modules/dialog/components/session-expiring-dialog/session-expiring-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, @@ -20,7 +19,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.ts b/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.ts index 1b33326eb95..27697bb27a2 100644 --- a/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.ts +++ b/src/app/modules/dialog/components/show-logs-dialog/show-logs-dialog.component.ts @@ -34,7 +34,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; }) export class ShowLogsDialogComponent { constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private download: DownloadService, private dialogService: DialogService, @@ -42,7 +42,7 @@ export class ShowLogsDialogComponent { ) { } downloadLogs(): void { - this.ws.call('core.job_download_logs', [this.job.id, `${this.job.id}.log`]).pipe( + this.api.call('core.job_download_logs', [this.job.id, `${this.job.id}.log`]).pipe( switchMap((url) => this.download.downloadUrl(url, `${this.job.id}.log`, 'text/plain')), catchError((error: HttpErrorResponse | Job) => { this.dialogService.error(this.errorHandler.parseError(error)); diff --git a/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts b/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts index f3d5b6a228c..53fdc241b8a 100644 --- a/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts +++ b/src/app/modules/dialog/components/start-service-dialog/start-service-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, } from '@angular/core'; @@ -37,7 +36,6 @@ export interface StartServiceDialogResult { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxSlideToggleComponent, ReactiveFormsModule, @@ -63,7 +61,7 @@ export class StartServiceDialogComponent implements OnInit { } constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private translate: TranslateService, private snackbar: SnackbarService, @@ -94,11 +92,11 @@ export class StartServiceDialogComponent implements OnInit { }; if (result.start && result.startAutomatically && this.isDisabled) { - requests.push(this.ws.call('service.update', [this.service.id, { enable: result.startAutomatically }])); + requests.push(this.api.call('service.update', [this.service.id, { enable: result.startAutomatically }])); } if (result.start) { - requests.push(this.ws.call('service.start', [this.serviceName, { silent: false }])); + requests.push(this.api.call('service.start', [this.serviceName, { silent: false }])); } forkJoin(requests) diff --git a/src/app/modules/dialog/components/update-dialog/update-dialog.component.ts b/src/app/modules/dialog/components/update-dialog/update-dialog.component.ts index 431765ad522..73dd16083eb 100644 --- a/src/app/modules/dialog/components/update-dialog/update-dialog.component.ts +++ b/src/app/modules/dialog/components/update-dialog/update-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component } from '@angular/core'; import { MatDialogContent, MatDialogTitle } from '@angular/material/dialog'; @@ -18,7 +17,6 @@ import { selectUpdateJob } from 'app/modules/jobs/store/job.selectors'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatDialogTitle, TranslateModule, diff --git a/src/app/modules/feedback/components/file-review/file-review.component.ts b/src/app/modules/feedback/components/file-review/file-review.component.ts index 91cbb1e3a16..08d69aaad06 100644 --- a/src/app/modules/feedback/components/file-review/file-review.component.ts +++ b/src/app/modules/feedback/components/file-review/file-review.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, Input, output, @@ -36,7 +35,6 @@ export const maxFileSizeBytes = 5 * MiB; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxStarRatingComponent, diff --git a/src/app/modules/feedback/components/file-ticket-licensed/file-ticket-licensed.component.ts b/src/app/modules/feedback/components/file-ticket-licensed/file-ticket-licensed.component.ts index 5c4af0cc34f..45cdc5c1e37 100644 --- a/src/app/modules/feedback/components/file-ticket-licensed/file-ticket-licensed.component.ts +++ b/src/app/modules/feedback/components/file-ticket-licensed/file-ticket-licensed.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, Input, output, @@ -47,7 +46,6 @@ import { ApiService } from 'app/services/api.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxInputComponent, @@ -121,7 +119,7 @@ export class FileTicketLicensedComponent { private imageValidator: ImageValidatorService, private formErrorHandler: FormErrorHandlerService, @Inject(WINDOW) private window: Window, - private ws: ApiService, + private api: ApiService, ) { this.getSystemFileSizeLimit(); } @@ -154,7 +152,7 @@ export class FileTicketLicensedComponent { } private getSystemFileSizeLimit(): void { - this.ws.call('support.attach_ticket_max_size').pipe(untilDestroyed(this)).subscribe((size) => { + this.api.call('support.attach_ticket_max_size').pipe(untilDestroyed(this)).subscribe((size) => { this.form.controls.images.addAsyncValidators( this.imageValidator.getImagesValidator(size * MiB), ); diff --git a/src/app/modules/feedback/components/file-ticket/file-ticket.component.ts b/src/app/modules/feedback/components/file-ticket/file-ticket.component.ts index b7747b0c576..f447ab7c7e4 100644 --- a/src/app/modules/feedback/components/file-ticket/file-ticket.component.ts +++ b/src/app/modules/feedback/components/file-ticket/file-ticket.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Input, output, @@ -34,7 +33,6 @@ import { ApiService } from 'app/services/api.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxInputComponent, @@ -83,7 +81,7 @@ export class FileTicketComponent { private feedbackService: FeedbackService, private imageValidator: ImageValidatorService, private formErrorHandler: FormErrorHandlerService, - private ws: ApiService, + private api: ApiService, ) { this.getSystemFileSizeLimit(); } @@ -106,7 +104,7 @@ export class FileTicketComponent { } private getSystemFileSizeLimit(): void { - this.ws.call('support.attach_ticket_max_size').pipe(untilDestroyed(this)).subscribe((size) => { + this.api.call('support.attach_ticket_max_size').pipe(untilDestroyed(this)).subscribe((size) => { this.form.controls.images.addAsyncValidators(this.imageValidator.getImagesValidator(size * MiB)); this.form.controls.images.updateValueAndValidity(); }); diff --git a/src/app/modules/feedback/services/feedback.service.ts b/src/app/modules/feedback/services/feedback.service.ts index fcd4cec7f42..ac55e714f00 100644 --- a/src/app/modules/feedback/services/feedback.service.ts +++ b/src/app/modules/feedback/services/feedback.service.ts @@ -47,7 +47,7 @@ export class FeedbackService { constructor( private httpClient: HttpClient, - private ws: ApiService, + private api: ApiService, private store$: Store, private systemGeneralService: SystemGeneralService, private sentryService: SentryService, @@ -157,7 +157,7 @@ export class FeedbackService { } getSimilarIssues(query: string): Observable { - return this.ws.call('support.similar_issues', [query]); + return this.api.call('support.similar_issues', [query]); } addDebugInfoToMessage(message: string): Observable { @@ -261,12 +261,12 @@ export class FeedbackService { filter((systemInfoState) => Boolean(systemInfoState.systemInfo)), take(1), ), - this.ws.call('system.host_id'), + this.api.call('system.host_id'), ]); } private addTicket(ticket: CreateNewTicket): Observable { - return this.ws.job('support.new_ticket', [ticket]).pipe( + return this.api.job('support.new_ticket', [ticket]).pipe( filter((job) => job.state === JobState.Success), map((job) => job.result), ); diff --git a/src/app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component.ts b/src/app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component.ts index 4fd955b7618..7e4589f96ca 100644 --- a/src/app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component.ts +++ b/src/app/modules/forms/custom-selects/unused-disk-select/unused-disk-select.component.ts @@ -73,7 +73,7 @@ export class UnusedDiskSelectComponent implements OnInit, AfterViewInit { return getNonUniqueSerialDisksWarning(this.nonUniqueSerialDisks(), this.translate); }); - private unusedDisks$ = this.ws.call('disk.details').pipe( + private unusedDisks$ = this.api.call('disk.details').pipe( map((diskDetails) => { return [ ...diskDetails.unused, @@ -105,7 +105,7 @@ export class UnusedDiskSelectComponent implements OnInit, AfterViewInit { constructor( private dialogService: DialogService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, ) {} ngOnInit(): void { diff --git a/src/app/modules/forms/ix-forms/components/ix-explorer/create-dataset-dialog/create-dataset-dialog.component.ts b/src/app/modules/forms/ix-forms/components/ix-explorer/create-dataset-dialog/create-dataset-dialog.component.ts index 1c0a2c76811..2adff7a7fcb 100644 --- a/src/app/modules/forms/ix-forms/components/ix-explorer/create-dataset-dialog/create-dataset-dialog.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-explorer/create-dataset-dialog/create-dataset-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { AsyncPipe } from '@angular/common'; import { Component, ChangeDetectionStrategy, Inject, ChangeDetectorRef, OnInit, @@ -6,7 +5,7 @@ import { import { Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { - MatDialogRef, MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose, + MatDialogRef, MAT_DIALOG_DATA, MatDialogTitle, MatDialogActions, MatDialogClose, } from '@angular/material/dialog'; import { MatProgressBar } from '@angular/material/progress-bar'; import { FormBuilder } from '@ngneat/reactive-forms'; @@ -37,8 +36,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; imports: [ MatDialogTitle, MatProgressBar, - CdkScrollable, - MatDialogContent, FormsModule, ReactiveFormsModule, IxInputComponent, @@ -68,7 +65,7 @@ export class CreateDatasetDialogComponent implements OnInit { constructor( private fb: FormBuilder, private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private dialog: DialogService, private errorHandler: ErrorHandlerService, private dialogRef: MatDialogRef, @@ -89,7 +86,7 @@ export class CreateDatasetDialogComponent implements OnInit { createDataset(): void { this.isLoading$.next(true); - this.ws.call('pool.dataset.create', [{ ...this.data.dataset, name: `${this.parent.name}/${this.form.value.name}` }]) + this.api.call('pool.dataset.create', [{ ...this.data.dataset, name: `${this.parent.name}/${this.form.value.name}` }]) .pipe(untilDestroyed(this)).subscribe({ next: (dataset) => { this.isLoading$.next(false); @@ -105,7 +102,7 @@ export class CreateDatasetDialogComponent implements OnInit { loadParentDataset(): void { this.isLoading$.next(true); const normalizedParentId = this.data.parentId.replace(/\/$/, ''); - this.ws.call('pool.dataset.query', [[['id', '=', normalizedParentId]]]).pipe( + this.api.call('pool.dataset.query', [[['id', '=', normalizedParentId]]]).pipe( tap((parent) => { if (!parent.length) { throw new Error(`Parent dataset ${normalizedParentId} not found`); diff --git a/src/app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component.ts b/src/app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component.ts index c6e7e127a19..b6007d8413e 100644 --- a/src/app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component.ts +++ b/src/app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component.ts @@ -1,7 +1,6 @@ import { ChangeDetectionStrategy, Component, input, } from '@angular/core'; -import { MatDivider } from '@angular/material/divider'; import { TranslateModule } from '@ngx-translate/core'; import { TooltipComponent } from 'app/modules/tooltip/tooltip.component'; @@ -13,7 +12,6 @@ import { TooltipComponent } from 'app/modules/tooltip/tooltip.component'; standalone: true, imports: [ TooltipComponent, - MatDivider, TranslateModule, ], }) diff --git a/src/app/modules/ix-table/classes/api-data-provider/api-data-provider.ts b/src/app/modules/ix-table/classes/api-data-provider/api-data-provider.ts index 8d8917ff98d..da14bf2174b 100644 --- a/src/app/modules/ix-table/classes/api-data-provider/api-data-provider.ts +++ b/src/app/modules/ix-table/classes/api-data-provider/api-data-provider.ts @@ -19,7 +19,7 @@ export class ApiDataProvider extends BaseDataProvider[] = []; constructor( - protected ws: ApiService, + protected api: ApiService, protected method: T, protected params: ApiCallParams = [], ) { @@ -38,7 +38,7 @@ export class ApiDataProvider extends BaseDataProvider { this.totalRows = count; - return this.ws.call(this.method, this.prepareParams(this.params)) as Observable[]>; + return this.api.call(this.method, this.prepareParams(this.params)) as Observable[]>; }), ).subscribe({ next: (rows: ApiCallResponseType[]) => { @@ -80,7 +80,7 @@ export class ApiDataProvider extends BaseDataProvider; - return this.ws.call(this.method, params) as unknown as Observable; + return this.api.call(this.method, params) as unknown as Observable; } protected prepareParams(params: ApiCallParams): ApiCallParams { diff --git a/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.ts b/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.ts index bb79017cea7..39dc5aa8c44 100644 --- a/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.ts +++ b/src/app/modules/jobs/components/jobs-panel/jobs-panel.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { AsyncPipe } from '@angular/common'; import { Component, ChangeDetectionStrategy, @@ -40,7 +39,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatTooltip, IxIconComponent, diff --git a/src/app/modules/jobs/store/job.effects.ts b/src/app/modules/jobs/store/job.effects.ts index 70adf95d33b..59e94bb3473 100644 --- a/src/app/modules/jobs/store/job.effects.ts +++ b/src/app/modules/jobs/store/job.effects.ts @@ -19,8 +19,8 @@ export class JobEffects { loadJobs$ = createEffect(() => this.actions$.pipe( ofType(adminUiInitialized), switchMap(() => { - const getNotCompletedJobs$ = this.ws.call('core.get_jobs', [[['state', '!=', JobState.Success]]]); - const getCompletedJobs$ = this.ws.call('core.get_jobs', [[['state', '=', JobState.Success]], { order_by: ['-id'], limit: 30 }]); + const getNotCompletedJobs$ = this.api.call('core.get_jobs', [[['state', '!=', JobState.Success]]]); + const getCompletedJobs$ = this.api.call('core.get_jobs', [[['state', '=', JobState.Success]], { order_by: ['-id'], limit: 30 }]); return forkJoin([ getNotCompletedJobs$, @@ -43,7 +43,7 @@ export class JobEffects { subscribeToUpdates$ = createEffect(() => this.actions$.pipe( ofType(jobsLoaded), switchMap(() => { - return this.ws.subscribe('core.get_jobs').pipe( + return this.api.subscribe('core.get_jobs').pipe( filter((event) => event.msg !== IncomingApiMessageType.Removed), switchMap((event) => { switch (event.msg) { @@ -62,7 +62,7 @@ export class JobEffects { subscribeToRemoval$ = createEffect(() => this.actions$.pipe( ofType(jobsLoaded), switchMap(() => { - return this.ws.subscribe('core.get_jobs').pipe( + return this.api.subscribe('core.get_jobs').pipe( filter((event) => event.msg === IncomingApiMessageType.Removed), map((event) => jobRemoved({ id: event.id as number })), ); @@ -72,7 +72,7 @@ export class JobEffects { abortJob$ = createEffect(() => this.actions$.pipe( ofType(abortJobPressed), switchMap(({ job }) => { - return this.ws.call('core.job_abort', [job.id]).pipe( + return this.api.call('core.job_abort', [job.id]).pipe( map(() => jobAborted({ job })), ); }), @@ -80,7 +80,7 @@ export class JobEffects { constructor( private actions$: Actions, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, ) {} } diff --git a/src/app/modules/layout/admin-layout/admin-layout.component.ts b/src/app/modules/layout/admin-layout/admin-layout.component.ts index e4ee841623f..72ab7175fff 100644 --- a/src/app/modules/layout/admin-layout/admin-layout.component.ts +++ b/src/app/modules/layout/admin-layout/admin-layout.component.ts @@ -1,4 +1,4 @@ -import { NgClass, AsyncPipe, LowerCasePipe } from '@angular/common'; +import { AsyncPipe } from '@angular/common'; import { AfterViewInit, ChangeDetectionStrategy, @@ -31,7 +31,6 @@ import { NavigationComponent } from 'app/modules/layout/navigation/navigation.co import { SecondaryMenuComponent } from 'app/modules/layout/secondary-menu/secondary-menu.component'; import { TopbarComponent } from 'app/modules/layout/topbar/topbar.component'; import { DefaultPageHeaderComponent } from 'app/modules/page-header/default-page-header/default-page-header.component'; -import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; import { ChainedSlideInComponent } from 'app/modules/slide-ins/components/chained-slide-in/chained-slide-in.component'; import { SlideInComponent } from 'app/modules/slide-ins/slide-in.component'; import { TestDirective } from 'app/modules/test-id/test.directive'; @@ -56,7 +55,6 @@ import { imports: [ MatSidenavContainer, MatSidenav, - NgClass, RouterLink, IxIconComponent, NavigationComponent, @@ -72,9 +70,7 @@ import { SlideInComponent, ChainedSlideInComponent, AsyncPipe, - LowerCasePipe, TranslateModule, - MapValuePipe, TestDirective, ], }) diff --git a/src/app/modules/layout/console-footer/console-messages.store.ts b/src/app/modules/layout/console-footer/console-messages.store.ts index 73522607da3..db7145057c5 100644 --- a/src/app/modules/layout/console-footer/console-messages.store.ts +++ b/src/app/modules/layout/console-footer/console-messages.store.ts @@ -33,13 +33,13 @@ export class ConsoleMessagesStore extends ComponentStore i }); constructor( - private ws: ApiService, + private api: ApiService, ) { super(initialConsoleMessagesState); } subscribeToMessageUpdates(): void { - this.ws.subscribeToLogs(this.logPath) + this.api.subscribeToLogs(this.logPath) .pipe( map((event) => event.fields), filter((log) => typeof log?.data === 'string'), diff --git a/src/app/modules/layout/console-footer/console-panel/console-panel-dialog.component.ts b/src/app/modules/layout/console-footer/console-panel/console-panel-dialog.component.ts index 48bfabd71bc..b71e38f497b 100644 --- a/src/app/modules/layout/console-footer/console-panel/console-panel-dialog.component.ts +++ b/src/app/modules/layout/console-footer/console-panel/console-panel-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, ElementRef, OnInit, ViewChild, @@ -18,7 +17,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/layout/topbar/about-dialog/about-dialog.component.ts b/src/app/modules/layout/topbar/about-dialog/about-dialog.component.ts index 6d749107e31..7561cdb47c7 100644 --- a/src/app/modules/layout/topbar/about-dialog/about-dialog.component.ts +++ b/src/app/modules/layout/topbar/about-dialog/about-dialog.component.ts @@ -6,11 +6,9 @@ import { MatDialogRef, MatDialogContent, MatDialogActions } from '@angular/mater import { Store } from '@ngrx/store'; import { TranslateModule } from '@ngx-translate/core'; import { map } from 'rxjs'; -import { LetDirective } from 'app/directives/app-let.directive'; import { helptextAbout } from 'app/helptext/about'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { CopyrightLineComponent } from 'app/modules/layout/copyright-line/copyright-line.component'; -import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { AppState } from 'app/store'; import { selectIsEnterprise, selectSystemInfoState } from 'app/store/system-info/system-info.selectors'; @@ -28,8 +26,6 @@ import { selectIsEnterprise, selectSystemInfoState } from 'app/store/system-info CopyrightLineComponent, MatButton, TranslateModule, - MapValuePipe, - LetDirective, TestDirective, AsyncPipe, ], diff --git a/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts b/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts index cd7595750df..d0421a30690 100644 --- a/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts +++ b/src/app/modules/layout/topbar/change-password-dialog/change-password-dialog.component.ts @@ -68,7 +68,7 @@ export class ChangePasswordDialogComponent { private translate: TranslateService, private dialogRef: MatDialogRef, private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private authService: AuthService, private loader: AppLoaderService, private formErrorHandler: FormErrorHandlerService, @@ -80,7 +80,7 @@ export class ChangePasswordDialogComponent { } onSubmit(): void { - this.ws.call('user.set_password', [{ + this.api.call('user.set_password', [{ old_password: this.form.value.old_password, new_password: this.form.value.new_password, username: this.loggedInUser.pw_name, diff --git a/src/app/modules/layout/topbar/directory-services-indicator/directory-services-indicator.component.ts b/src/app/modules/layout/topbar/directory-services-indicator/directory-services-indicator.component.ts index 4b56d00d68f..44795d6a0a3 100644 --- a/src/app/modules/layout/topbar/directory-services-indicator/directory-services-indicator.component.ts +++ b/src/app/modules/layout/topbar/directory-services-indicator/directory-services-indicator.component.ts @@ -41,7 +41,7 @@ export class DirectoryServicesIndicatorComponent implements OnInit, OnDestroy { private statusSubscription: Subscription; constructor( - private ws: ApiService, + private api: ApiService, private matDialog: MatDialog, private cdr: ChangeDetectorRef, ) { } @@ -72,10 +72,10 @@ export class DirectoryServicesIndicatorComponent implements OnInit, OnDestroy { private loadDirectoryServicesStatus(): void { // TODO: Sync endpoints - this.ws.call('directoryservices.get_state').pipe(untilDestroyed(this)).subscribe((state) => { + this.api.call('directoryservices.get_state').pipe(untilDestroyed(this)).subscribe((state) => { this.updateIconVisibility(state); }); - this.statusSubscription = this.ws.subscribe('directoryservices.status').pipe(untilDestroyed(this)).subscribe((event) => { + this.statusSubscription = this.api.subscribe('directoryservices.status').pipe(untilDestroyed(this)).subscribe((event) => { this.updateIconVisibility(event.fields); }); } diff --git a/src/app/modules/layout/topbar/directory-services-indicator/directory-services-monitor/directory-services-monitor.component.ts b/src/app/modules/layout/topbar/directory-services-indicator/directory-services-monitor/directory-services-monitor.component.ts index 2788e9605b4..ae0283f0198 100644 --- a/src/app/modules/layout/topbar/directory-services-indicator/directory-services-monitor/directory-services-monitor.component.ts +++ b/src/app/modules/layout/topbar/directory-services-indicator/directory-services-monitor/directory-services-monitor.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, OnInit, signal, @@ -25,7 +24,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatIconButton, IxIconComponent, @@ -46,7 +44,7 @@ export class DirectoryServicesMonitorComponent implements OnInit { protected readonly directoryServiceStateLabels = directoryServiceStateLabels; constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, ) {} @@ -56,7 +54,7 @@ export class DirectoryServicesMonitorComponent implements OnInit { getStatus(): void { this.isLoading.set(true); - this.ws.call('directoryservices.get_state') + this.api.call('directoryservices.get_state') .pipe( this.errorHandler.catchError(), finalize(() => this.isLoading.set(false)), diff --git a/src/app/modules/layout/topbar/resilvering-indicator/resilver-progress/resilver-progress.component.ts b/src/app/modules/layout/topbar/resilvering-indicator/resilver-progress/resilver-progress.component.ts index e854ca35fc4..c528c165c0b 100644 --- a/src/app/modules/layout/topbar/resilvering-indicator/resilver-progress/resilver-progress.component.ts +++ b/src/app/modules/layout/topbar/resilvering-indicator/resilver-progress/resilver-progress.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { DecimalPipe } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, @@ -25,7 +24,6 @@ import { ApiService } from 'app/services/api.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatProgressBar, MatDialogActions, @@ -52,12 +50,12 @@ export class ResilverProgressDialogComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, ) {} ngOnInit(): void { - this.ws.subscribe('zfs.pool.scan').pipe(untilDestroyed(this)).subscribe((event) => { + this.api.subscribe('zfs.pool.scan').pipe(untilDestroyed(this)).subscribe((event) => { // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (!event || !event.fields.scan.function.includes(PoolScanFunction.Resilver)) { return; diff --git a/src/app/modules/layout/topbar/resilvering-indicator/resilvering-indicator.component.ts b/src/app/modules/layout/topbar/resilvering-indicator/resilvering-indicator.component.ts index 3b2c855d1e8..35aa6a0c695 100644 --- a/src/app/modules/layout/topbar/resilvering-indicator/resilvering-indicator.component.ts +++ b/src/app/modules/layout/topbar/resilvering-indicator/resilvering-indicator.component.ts @@ -31,7 +31,7 @@ import { ApiService } from 'app/services/api.service'; ], }) export class ResilveringIndicatorComponent { - protected isResilvering$ = this.ws.subscribe('zfs.pool.scan').pipe( + protected isResilvering$ = this.api.subscribe('zfs.pool.scan').pipe( map((event) => { const scan = event.fields.scan; return scan.function === PoolScanFunction.Resilver && scan.state !== PoolScanState.Finished; @@ -42,7 +42,7 @@ export class ResilveringIndicatorComponent { constructor( private matDialog: MatDialog, - private ws: ApiService, + private api: ApiService, ) {} showDetails(): void { diff --git a/src/app/modules/lists/dual-listbox/dual-listbox.component.html b/src/app/modules/lists/dual-listbox/dual-listbox.component.html index 217e6060872..05cbc345ad9 100644 --- a/src/app/modules/lists/dual-listbox/dual-listbox.component.html +++ b/src/app/modules/lists/dual-listbox/dual-listbox.component.html @@ -38,6 +38,7 @@ type="button" color="primary" ixTest="move-selected-right" + matTooltipPosition="right" [attr.aria-label]="'Move selected items to the right side list' | translate" [matTooltip]="'Move selected items to the right side list' | translate" [disabled]="available.pick.length === 0" @@ -51,6 +52,7 @@ type="button" color="primary" ixTest="move-all-right" + matTooltipPosition="right" [disabled]="isAllSelected(available)" [attr.aria-label]="'Move all items to the right side list' | translate" [matTooltip]="'Move all items to the right side list' | translate" @@ -64,6 +66,7 @@ type="button" color="primary" ixTest="move-selected-left" + matTooltipPosition="right" [attr.aria-label]="'Move selected items to the left side list' | translate" [matTooltip]="'Move selected items to the left side list' | translate" [disabled]="confirmed.pick.length === 0" @@ -77,6 +80,7 @@ type="button" color="primary" ixTest="move-all-left" + matTooltipPosition="right" [attr.aria-label]="'Move all items to the left side list' | translate" [matTooltip]="'Move all items to the left side list' | translate" [disabled]="isAllSelected(confirmed)" diff --git a/src/app/modules/lists/dual-listbox/dual-listbox.component.ts b/src/app/modules/lists/dual-listbox/dual-listbox.component.ts index 5cced10135e..09380cd2fe6 100644 --- a/src/app/modules/lists/dual-listbox/dual-listbox.component.ts +++ b/src/app/modules/lists/dual-listbox/dual-listbox.component.ts @@ -1,6 +1,6 @@ import { NgClass, NgStyle } from '@angular/common'; import { Component, ChangeDetectionStrategy, input } from '@angular/core'; -import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatIconButton } from '@angular/material/button'; import { MatListModule } from '@angular/material/list'; import { MatTooltip } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; @@ -18,7 +18,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; imports: [ NgClass, NgStyle, - MatButton, AngularDualListBoxModule, IxIconComponent, MatIconButton, diff --git a/src/app/modules/loader/components/app-loader/app-loader.component.ts b/src/app/modules/loader/components/app-loader/app-loader.component.ts index 4d9199021eb..03a4b893403 100644 --- a/src/app/modules/loader/components/app-loader/app-loader.component.ts +++ b/src/app/modules/loader/components/app-loader/app-loader.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { Component, Input, ChangeDetectionStrategy, } from '@angular/core'; @@ -13,7 +12,6 @@ import { TranslateModule } from '@ngx-translate/core'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatProgressSpinner, TranslateModule, diff --git a/src/app/modules/terminal/components/copy-paste-message/copy-paste-message.component.ts b/src/app/modules/terminal/components/copy-paste-message/copy-paste-message.component.ts index 1bdb69c656c..8b39730699f 100644 --- a/src/app/modules/terminal/components/copy-paste-message/copy-paste-message.component.ts +++ b/src/app/modules/terminal/components/copy-paste-message/copy-paste-message.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -15,7 +14,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/modules/terminal/components/terminal/terminal.component.ts b/src/app/modules/terminal/components/terminal/terminal.component.ts index 4d0ef946b00..0b0bfd8ea7f 100644 --- a/src/app/modules/terminal/components/terminal/terminal.component.ts +++ b/src/app/modules/terminal/components/terminal/terminal.component.ts @@ -76,7 +76,7 @@ export class TerminalComponent implements OnInit, OnDestroy { Kill process shortcut is Ctrl+C.`); constructor( - private ws: ApiService, + private api: ApiService, private shellService: ShellService, private matDialog: MatDialog, private translate: TranslateService, @@ -187,7 +187,7 @@ export class TerminalComponent implements OnInit, OnDestroy { this.fitAddon.fit(); const size = this.fitAddon.proposeDimensions(); if (size) { - this.ws.call('core.resize_shell', [this.connectionId, size.cols, size.rows]).pipe(untilDestroyed(this)).subscribe(() => { + this.api.call('core.resize_shell', [this.connectionId, size.cols, size.rows]).pipe(untilDestroyed(this)).subscribe(() => { this.xterm.focus(); }); } diff --git a/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.spec.ts b/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.spec.ts index a9efb8e86cc..2a461a1b2a1 100644 --- a/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.spec.ts +++ b/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.spec.ts @@ -33,7 +33,7 @@ function getFakeConfig(overrides: Partial): TrueCommandConfig describe('TruecommandConnectModalComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; function createComponentWithData( config: Partial, @@ -101,7 +101,7 @@ describe('TruecommandConnectModalComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it(`it has title '${expectedTitle}'`, () => { @@ -142,7 +142,7 @@ describe('TruecommandConnectModalComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends an update payload', async () => { @@ -156,7 +156,7 @@ describe('TruecommandConnectModalComponent', () => { expect(await submitButton.isDisabled()).toBeFalsy(); await submitButton.click(); - expect(ws.call).toHaveBeenCalledWith('truecommand.update', [{ + expect(api.call).toHaveBeenCalledWith('truecommand.update', [{ api_key: '1234567890123456', enabled: true, }]); @@ -182,7 +182,7 @@ describe('TruecommandConnectModalComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends an update payload', async () => { @@ -196,7 +196,7 @@ describe('TruecommandConnectModalComponent', () => { expect(await submitButton.isDisabled()).toBeFalsy(); await submitButton.click(); - expect(ws.call).toHaveBeenCalledWith('truecommand.update', [{ + expect(api.call).toHaveBeenCalledWith('truecommand.update', [{ api_key: 'qwertyuiopasdfgh', enabled: false, }]); @@ -228,7 +228,7 @@ describe('TruecommandConnectModalComponent', () => { jest.spyOn(dialogServiceMock, 'generalDialog').mockReturnValue(of(true)); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends an update payload', async () => { @@ -236,7 +236,7 @@ describe('TruecommandConnectModalComponent', () => { expect(await deregisterButton.isDisabled()).toBeFalsy(); await deregisterButton.click(); - expect(ws.call).toHaveBeenCalledWith('truecommand.update', [{ + expect(api.call).toHaveBeenCalledWith('truecommand.update', [{ api_key: null, enabled: false, }]); diff --git a/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.ts b/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.ts index 635910fc226..2ab8539b3b0 100644 --- a/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.ts +++ b/src/app/modules/truecommand/components/truecommand-connect-modal/truecommand-connect-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, } from '@angular/core'; @@ -38,7 +37,6 @@ export type TruecommandSignupModalResult = boolean | { deregistered: boolean }; imports: [ MatDialogTitle, ReactiveFormsModule, - CdkScrollable, MatDialogContent, IxInputComponent, IxCheckboxComponent, @@ -71,7 +69,7 @@ export class TruecommandConnectModalComponent implements OnInit { private dialogRef: MatDialogRef, private fb: FormBuilder, private loader: AppLoaderService, - private ws: ApiService, + private api: ApiService, ) {} ngOnInit(): void { @@ -102,7 +100,7 @@ export class TruecommandConnectModalComponent implements OnInit { params.api_key = this.form.value.api_key; } - this.ws.call('truecommand.update', [params]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('truecommand.update', [params]).pipe(untilDestroyed(this)).subscribe({ next: () => { this.loader.close(); this.dialogRef.close(); @@ -133,7 +131,7 @@ export class TruecommandConnectModalComponent implements OnInit { } this.loader.open(); - this.ws.call('truecommand.update', [{ api_key: null, enabled: false }]) + this.api.call('truecommand.update', [{ api_key: null, enabled: false }]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/modules/truecommand/components/truecommand-signup-modal/truecommand-signup-modal.component.ts b/src/app/modules/truecommand/components/truecommand-signup-modal/truecommand-signup-modal.component.ts index dcaf104a98b..d93cbd2b9c4 100644 --- a/src/app/modules/truecommand/components/truecommand-signup-modal/truecommand-signup-modal.component.ts +++ b/src/app/modules/truecommand/components/truecommand-signup-modal/truecommand-signup-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -22,7 +21,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, FormActionsComponent, MatDialogActions, diff --git a/src/app/modules/truecommand/components/truecommand-status-modal/truecommand-status-modal.component.ts b/src/app/modules/truecommand/components/truecommand-status-modal/truecommand-status-modal.component.ts index 6fcd4c0514d..40beba54266 100644 --- a/src/app/modules/truecommand/components/truecommand-status-modal/truecommand-status-modal.component.ts +++ b/src/app/modules/truecommand/components/truecommand-status-modal/truecommand-status-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, } from '@angular/core'; @@ -28,7 +27,6 @@ import { TruecommandButtonComponent } from 'app/modules/truecommand/truecommand- imports: [ MatDialogTitle, MatDivider, - CdkScrollable, MatDialogContent, IxIconComponent, MatDialogActions, diff --git a/src/app/pages/apps/components/app-detail-view/app-details-header/app-details-header.component.ts b/src/app/pages/apps/components/app-detail-view/app-details-header/app-details-header.component.ts index 1de39be5cd4..dee571712d3 100644 --- a/src/app/pages/apps/components/app-detail-view/app-details-header/app-details-header.component.ts +++ b/src/app/pages/apps/components/app-detail-view/app-details-header/app-details-header.component.ts @@ -60,7 +60,7 @@ export class AppDetailsHeaderComponent { private authService: AuthService, private dialogService: DialogService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private viewContainerRef: ViewContainerRef, ) { } @@ -108,7 +108,7 @@ export class AppDetailsHeaderComponent { disableClose: true, }).pipe( filter(Boolean), - switchMap(() => this.ws.call('auth.set_attribute', ['appsAgreement', true])), + switchMap(() => this.api.call('auth.set_attribute', ['appsAgreement', true])), switchMap(() => this.authService.refreshUser()), ); }), diff --git a/src/app/pages/apps/components/app-detail-view/app-resources-card/app-resources-card.component.ts b/src/app/pages/apps/components/app-detail-view/app-resources-card/app-resources-card.component.ts index 5c89d59fed8..d732244b2a8 100644 --- a/src/app/pages/apps/components/app-detail-view/app-resources-card/app-resources-card.component.ts +++ b/src/app/pages/apps/components/app-detail-view/app-resources-card/app-resources-card.component.ts @@ -32,11 +32,11 @@ export class AppResourcesCardComponent implements OnInit { readonly cpuPercentage = signal(0); readonly memoryUsed = signal(0); readonly memoryTotal = signal(0); - readonly availableSpace$ = this.ws.call('app.available_space'); + readonly availableSpace$ = this.api.call('app.available_space'); readonly selectedPool = toSignal(this.dockerStore.selectedPool$); constructor( - private ws: ApiService, + private api: ApiService, private dockerStore: DockerStore, ) {} @@ -45,7 +45,7 @@ export class AppResourcesCardComponent implements OnInit { } getResourcesUsageUpdates(): void { - this.ws.subscribe('reporting.realtime').pipe( + this.api.subscribe('reporting.realtime').pipe( map((event) => event.fields), throttleTime(2000), untilDestroyed(this), diff --git a/src/app/pages/apps/components/app-wizard/app-wizard.component.ts b/src/app/pages/apps/components/app-wizard/app-wizard.component.ts index 79064b8501c..63337e2abac 100644 --- a/src/app/pages/apps/components/app-wizard/app-wizard.component.ts +++ b/src/app/pages/apps/components/app-wizard/app-wizard.component.ts @@ -156,7 +156,7 @@ export class AppWizardComponent implements OnInit, OnDestroy { private router: Router, private errorHandler: ErrorHandlerService, private dockerStore: DockerStore, - private ws: ApiService, + private api: ApiService, private authService: AuthService, private matDialog: MatDialog, ) {} @@ -268,7 +268,7 @@ export class AppWizardComponent implements OnInit, OnDestroy { if (this.isNew) { const version = data.version; delete data.version; - job$ = this.ws.job('app.create', [ + job$ = this.api.job('app.create', [ { values: data, catalog_app: this.catalogApp.name, @@ -279,7 +279,7 @@ export class AppWizardComponent implements OnInit, OnDestroy { ]); } else { delete data.release_name; - job$ = this.ws.job('app.update', [ + job$ = this.api.job('app.update', [ this.config.release_name as string, { values: data }, ]); @@ -561,7 +561,7 @@ export class AppWizardComponent implements OnInit, OnDestroy { } private getDockerHubRateLimitInfo(): void { - this.ws.call('app.image.dockerhub_rate_limit').pipe(untilDestroyed(this)).subscribe((info) => { + this.api.call('app.image.dockerhub_rate_limit').pipe(untilDestroyed(this)).subscribe((info) => { if (info.remaining_pull_limit < 5) { this.matDialog.open(DockerHubRateInfoDialogComponent, { data: info, diff --git a/src/app/pages/apps/components/available-apps/available-apps-header/available-apps-header.component.ts b/src/app/pages/apps/components/available-apps/available-apps-header/available-apps-header.component.ts index 6263725c5f1..3150f0b8bb0 100644 --- a/src/app/pages/apps/components/available-apps/available-apps-header/available-apps-header.component.ts +++ b/src/app/pages/apps/components/available-apps/available-apps-header/available-apps-header.component.ts @@ -88,7 +88,7 @@ export class AvailableAppsHeaderComponent implements OnInit, AfterViewInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private cdr: ChangeDetectorRef, private dialogService: DialogService, @@ -147,7 +147,7 @@ export class AvailableAppsHeaderComponent implements OnInit, AfterViewInit { refreshCatalog(): void { this.dialogService.jobDialog( - this.ws.job('catalog.sync'), + this.api.job('catalog.sync'), { title: this.translate.instant(helptextApps.refreshing), canMinimize: true, diff --git a/src/app/pages/apps/components/catalog-settings/apps-settings.component.ts b/src/app/pages/apps/components/catalog-settings/apps-settings.component.ts index f4dd90f41cc..f89d01d3531 100644 --- a/src/app/pages/apps/components/catalog-settings/apps-settings.component.ts +++ b/src/app/pages/apps/components/catalog-settings/apps-settings.component.ts @@ -82,7 +82,7 @@ export class AppsSettingsComponent implements OnInit { }>>([]), }); - protected allTrains$ = this.ws.call('catalog.trains').pipe( + protected allTrains$ = this.api.call('catalog.trains').pipe( singleArrayToOptions(), ); @@ -95,7 +95,7 @@ export class AppsSettingsComponent implements OnInit { constructor( private dockerStore: DockerStore, - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, private errorHandler: FormErrorHandlerService, private fb: FormBuilder, @@ -108,7 +108,7 @@ export class AppsSettingsComponent implements OnInit { setupForm(): void { combineLatest([ - this.ws.call('catalog.config'), + this.api.call('catalog.config'), this.dockerStore.dockerConfig$.pipe(filter(Boolean), take(1)), ]) .pipe(untilDestroyed(this)) @@ -149,8 +149,8 @@ export class AppsSettingsComponent implements OnInit { this.isFormLoading.set(true); forkJoin([ - this.ws.call('catalog.update', [{ preferred_trains: values.preferred_trains } as CatalogUpdate]), - this.ws.job('docker.update', [{ + this.api.call('catalog.update', [{ preferred_trains: values.preferred_trains } as CatalogUpdate]), + this.api.job('docker.update', [{ enable_image_updates: values.enable_image_updates, address_pools: values.address_pools, }]), diff --git a/src/app/pages/apps/components/custom-app-form/custom-app-form.component.ts b/src/app/pages/apps/components/custom-app-form/custom-app-form.component.ts index 33625712fb8..b55d9d8b126 100644 --- a/src/app/pages/apps/components/custom-app-form/custom-app-form.component.ts +++ b/src/app/pages/apps/components/custom-app-form/custom-app-form.component.ts @@ -65,7 +65,7 @@ export class CustomAppFormComponent implements OnInit { constructor( private fb: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, private appService: ApplicationsService, @@ -103,7 +103,7 @@ export class CustomAppFormComponent implements OnInit { this.isLoading.set(true); const data = this.form.value; - const appCreate$ = this.ws.job( + const appCreate$ = this.api.job( 'app.create', [{ custom_app: true, @@ -112,7 +112,7 @@ export class CustomAppFormComponent implements OnInit { } as AppCreate], ); - const appUpdate$ = this.ws.job('app.update', [ + const appUpdate$ = this.api.job('app.update', [ data.release_name, { custom_compose_config_string: data.custom_compose_config_string }, ]); diff --git a/src/app/pages/apps/components/docker-images/docker-image-delete-dialog/docker-image-delete-dialog.component.ts b/src/app/pages/apps/components/docker-images/docker-image-delete-dialog/docker-image-delete-dialog.component.ts index 3edef092327..e4896421faf 100644 --- a/src/app/pages/apps/components/docker-images/docker-image-delete-dialog/docker-image-delete-dialog.component.ts +++ b/src/app/pages/apps/components/docker-images/docker-image-delete-dialog/docker-image-delete-dialog.component.ts @@ -67,7 +67,7 @@ export class DockerImageDeleteDialogComponent { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public images: ContainerImage[], @@ -86,7 +86,7 @@ export class DockerImageDeleteDialogComponent { this.bulkItems.set(image.id, { state: BulkListItemState.Running, item: image }); }); - this.ws.job('core.bulk', ['app.image.delete', deleteParams]).pipe( + this.api.job('core.bulk', ['app.image.delete', deleteParams]).pipe( filter((job: Job[], DeleteContainerImageParams[]>) => !!job.result), untilDestroyed(this), ).subscribe((response) => { diff --git a/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.component.ts b/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.component.ts index b5391a3fade..73c20def5e9 100644 --- a/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.component.ts +++ b/src/app/pages/apps/components/docker-images/docker-images-list/docker-images-list.component.ts @@ -51,7 +51,6 @@ export interface ContainerImageUi extends ContainerImage { standalone: true, imports: [ TranslateModule, - FileSizePipe, PageHeaderComponent, SearchInput1Component, MatButton, @@ -133,7 +132,7 @@ export class DockerImagesListComponent implements OnInit { constructor( public emptyService: EmptyService, public formatter: IxFormatterService, - private ws: ApiService, + private api: ApiService, private matDialog: MatDialog, private slideInService: SlideInService, private translate: TranslateService, @@ -142,7 +141,7 @@ export class DockerImagesListComponent implements OnInit { } ngOnInit(): void { - const containerImages$ = this.ws.call('app.image.query').pipe( + const containerImages$ = this.api.call('app.image.query').pipe( map((images) => images.map((image) => ({ ...image, selected: false }))), tap((images) => this.containerImages = images), ); diff --git a/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.spec.ts b/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.spec.ts index 89e05bf43bd..bb4c30936e3 100644 --- a/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.spec.ts +++ b/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.spec.ts @@ -18,7 +18,7 @@ import { SlideInService } from 'app/services/slide-in.service'; describe('PullImageFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: PullImageFormComponent, imports: [ @@ -44,7 +44,7 @@ describe('PullImageFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('pulls docker image when form is submitted', async () => { @@ -60,7 +60,7 @@ describe('PullImageFormComponent', () => { await saveButton.click(); expect(spectator.inject(DialogService).jobDialog).toHaveBeenCalled(); - expect(ws.job).toHaveBeenCalledWith('app.image.pull', [{ + expect(api.job).toHaveBeenCalledWith('app.image.pull', [{ auth_config: { username: 'john', password: '12345678', diff --git a/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.ts b/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.ts index dfab91ad1a5..e512e4c2a5c 100644 --- a/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.ts +++ b/src/app/pages/apps/components/docker-images/pull-image-form/pull-image-form.component.ts @@ -60,7 +60,7 @@ export class PullImageFormComponent { }; constructor( - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -88,7 +88,7 @@ export class PullImageFormComponent { this.isFormLoading = true; this.dialogService.jobDialog( - this.ws.job('app.image.pull', [params]), + this.api.job('app.image.pull', [params]), { title: this.translate.instant('Pulling...') }, ) .afterClosed() diff --git a/src/app/pages/apps/components/installed-apps/app-bulk-upgrade/app-bulk-upgrade.component.ts b/src/app/pages/apps/components/installed-apps/app-bulk-upgrade/app-bulk-upgrade.component.ts index d928661dd65..b167feb9002 100644 --- a/src/app/pages/apps/components/installed-apps/app-bulk-upgrade/app-bulk-upgrade.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-bulk-upgrade/app-bulk-upgrade.component.ts @@ -82,7 +82,7 @@ export class AppBulkUpgradeComponent { constructor( private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private dialogRef: MatDialogRef, private appService: ApplicationsService, @@ -154,7 +154,7 @@ export class AppBulkUpgradeComponent { return params; }); - this.ws + this.api .job('core.bulk', ['app.upgrade', payload]) .pipe(untilDestroyed(this)) .subscribe(() => { diff --git a/src/app/pages/apps/components/installed-apps/app-details-panel/app-details-panel.component.ts b/src/app/pages/apps/components/installed-apps/app-details-panel/app-details-panel.component.ts index b1adf97ff00..db15d162a9b 100644 --- a/src/app/pages/apps/components/installed-apps/app-details-panel/app-details-panel.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-details-panel/app-details-panel.component.ts @@ -4,7 +4,6 @@ import { import { TranslateModule } from '@ngx-translate/core'; import { App } from 'app/interfaces/app.interface'; import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { AppInfoCardComponent } from 'app/pages/apps/components/installed-apps/app-info-card/app-info-card.component'; import { AppMetadataCardComponent } from 'app/pages/apps/components/installed-apps/app-metadata-card/app-metadata-card.component'; import { AppNotesCardComponent } from 'app/pages/apps/components/installed-apps/app-notes-card/app-notes-card.component'; @@ -20,7 +19,6 @@ import { AppWorkloadsCardComponent } from 'app/pages/apps/components/installed-a TranslateModule, AppInfoCardComponent, AppWorkloadsCardComponent, - IxIconComponent, AppNotesCardComponent, MobileBackButtonComponent, AppMetadataCardComponent, diff --git a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts index ff979566896..427025a8ad3 100644 --- a/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-info-card/app-info-card.component.ts @@ -91,7 +91,7 @@ export class AppInfoCardComponent { }); constructor( - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private redirect: RedirectService, private errorHandler: ErrorHandlerService, @@ -133,7 +133,7 @@ export class AppInfoCardComponent { filter(Boolean), switchMap( (version: string) => this.dialogService.jobDialog( - this.ws.job('app.upgrade', [name, { app_version: version }]), + this.api.job('app.upgrade', [name, { app_version: version }]), { title: helptextApps.apps.upgrade_dialog.job }, ).afterClosed(), ), @@ -172,7 +172,7 @@ export class AppInfoCardComponent { executeDelete(name: string, removeIxVolumes = false): void { this.dialogService.jobDialog( - this.ws.job('app.delete', [name, { remove_images: true, remove_ix_volumes: removeIxVolumes }]), + this.api.job('app.delete', [name, { remove_images: true, remove_ix_volumes: removeIxVolumes }]), { title: helptextApps.apps.delete_dialog.job }, ) .afterClosed() @@ -202,7 +202,7 @@ export class AppInfoCardComponent { } private updateRollbackSetup(appName: string): void { - this.ws.call('app.rollback_versions', [appName]).pipe( + this.api.call('app.rollback_versions', [appName]).pipe( tap((versions) => this.isRollbackPossible.set(versions.length > 0)), untilDestroyed(this), ).subscribe(); diff --git a/src/app/pages/apps/components/installed-apps/app-rollback-modal/app-rollback-modal.component.ts b/src/app/pages/apps/components/installed-apps/app-rollback-modal/app-rollback-modal.component.ts index 328d1ae7d93..1bbaaaea8df 100644 --- a/src/app/pages/apps/components/installed-apps/app-rollback-modal/app-rollback-modal.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-rollback-modal/app-rollback-modal.component.ts @@ -57,7 +57,7 @@ export class AppRollbackModalComponent { constructor( private dialogRef: MatDialogRef, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private formBuilder: FormBuilder, private errorHandler: ErrorHandlerService, @@ -70,7 +70,7 @@ export class AppRollbackModalComponent { const rollbackParams = [this.app.name, this.form.value] as Required; this.dialogService.jobDialog( - this.ws.job('app.rollback', rollbackParams), + this.api.job('app.rollback', rollbackParams), { title: helptextApps.apps.rollback_dialog.job }, ) .afterClosed() @@ -79,7 +79,7 @@ export class AppRollbackModalComponent { } private setVersionOptions(): void { - this.ws.call('app.rollback_versions', [this.app.name]).pipe( + this.api.call('app.rollback_versions', [this.app.name]).pipe( tap((versions) => { const options = versions.map((version) => ({ label: version, diff --git a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts index 509077db82a..eefa6e48c99 100644 --- a/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-row/app-row.component.ts @@ -2,7 +2,7 @@ import { ChangeDetectionStrategy, Component, computed, input, output, } from '@angular/core'; -import { MatButton, MatIconButton } from '@angular/material/button'; +import { MatIconButton } from '@angular/material/button'; import { MatCheckbox } from '@angular/material/checkbox'; import { MatTooltip } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; @@ -37,7 +37,6 @@ import { AppUpdateCellComponent } from 'app/pages/apps/components/installed-apps FileSizePipe, AppUpdateCellComponent, RequiresRolesDirective, - MatButton, MatIconButton, IxIconComponent, ], diff --git a/src/app/pages/apps/components/installed-apps/app-update-cell/app-update-cell.component.ts b/src/app/pages/apps/components/installed-apps/app-update-cell/app-update-cell.component.ts index a27c7010fa1..a86e9b28344 100644 --- a/src/app/pages/apps/components/installed-apps/app-update-cell/app-update-cell.component.ts +++ b/src/app/pages/apps/components/installed-apps/app-update-cell/app-update-cell.component.ts @@ -8,7 +8,6 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { App } from 'app/interfaces/app.interface'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; import { AppVersionPipe } from 'app/pages/dashboard/widgets/apps/common/utils/app-version.pipe'; @Component({ @@ -17,7 +16,7 @@ import { AppVersionPipe } from 'app/pages/dashboard/widgets/apps/common/utils/ap styleUrls: ['./app-update-cell.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, - imports: [TranslateModule, MapValuePipe, MatTooltipModule, IxIconComponent, AppVersionPipe], + imports: [TranslateModule, MatTooltipModule, IxIconComponent, AppVersionPipe], }) export class AppUpdateCellComponent { app = input.required(); diff --git a/src/app/pages/apps/components/installed-apps/container-logs/container-logs.component.ts b/src/app/pages/apps/components/installed-apps/container-logs/container-logs.component.ts index c555294cd92..696d210d1f4 100644 --- a/src/app/pages/apps/components/installed-apps/container-logs/container-logs.component.ts +++ b/src/app/pages/apps/components/installed-apps/container-logs/container-logs.component.ts @@ -61,7 +61,7 @@ export class ContainerLogsComponent implements OnInit { logs: ContainerLogEvent[] = []; constructor( - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, protected aroute: ActivatedRoute, protected loader: AppLoaderService, @@ -105,7 +105,7 @@ export class ContainerLogsComponent implements OnInit { this.logs = []; this.isLoading = true; }), - switchMap(() => this.ws.subscribeToLogs(this.subscriptionMethod)), + switchMap(() => this.api.subscribeToLogs(this.subscriptionMethod)), map((apiEvent) => apiEvent.fields), untilDestroyed(this), ).subscribe({ diff --git a/src/app/pages/apps/components/installed-apps/installed-apps.component.ts b/src/app/pages/apps/components/installed-apps/installed-apps.component.ts index 2c753684f50..d30e23b5b29 100644 --- a/src/app/pages/apps/components/installed-apps/installed-apps.component.ts +++ b/src/app/pages/apps/components/installed-apps/installed-apps.component.ts @@ -200,7 +200,7 @@ export class InstalledAppsComponent implements OnInit, AfterViewInit { protected readonly requiredRoles = [Role.AppsWrite]; constructor( - private ws: ApiService, + private api: ApiService, private appService: ApplicationsService, private cdr: ChangeDetectorRef, private activatedRoute: ActivatedRoute, @@ -487,7 +487,7 @@ export class InstalledAppsComponent implements OnInit, AfterViewInit { ]); return this.dialogService.jobDialog( - this.ws.job('core.bulk', ['app.delete', bulkDeletePayload]), + this.api.job('core.bulk', ['app.delete', bulkDeletePayload]), { title: helptextApps.apps.delete_dialog.job }, ).afterClosed(); } diff --git a/src/app/pages/apps/services/applications.service.ts b/src/app/pages/apps/services/applications.service.ts index 7f3006ee5eb..91667b468e5 100644 --- a/src/app/pages/apps/services/applications.service.ts +++ b/src/app/pages/apps/services/applications.service.ts @@ -28,22 +28,25 @@ export function filterIgnoredApps(): OperatorFunction { - return this.ws.call('app.ix_volume.exists', [appName]); + return this.api.call('app.ix_volume.exists', [appName]); } getPoolList(): Observable { - return this.ws.call('pool.query'); + return this.api.call('pool.query'); } getCatalogAppDetails(name: string, train: string): Observable { - return this.ws.call('catalog.get_app_details', [name, { train }]); + return this.api.call('catalog.get_app_details', [name, { train }]); } getAllAppsCategories(): Observable { - return this.ws.call('app.categories'); + return this.api.call('app.categories'); } getLatestApps(filters?: AppsFiltersValues): Observable { @@ -55,15 +58,15 @@ export class ApplicationsService { } getSimilarApps(app: AvailableApp): Observable { - return this.ws.call('app.similar', [app.name, app.train]); + return this.api.call('app.similar', [app.name, app.train]); } getAllApps(): Observable { - return this.ws.call('app.query', [[], { extra: { retrieve_config: true } }]); + return this.api.call('app.query', [[], { extra: { retrieve_config: true } }]); } getApp(name: string): Observable { - return this.ws.call('app.query', [[['name', '=', name]], { + return this.api.call('app.query', [[['name', '=', name]], { extra: { include_app_schema: true, retrieve_config: true, @@ -72,11 +75,11 @@ export class ApplicationsService { } getInstalledAppsUpdates(): Observable> { - return this.ws.subscribe('app.query'); + return this.api.subscribe('app.query'); } getInstalledAppsStatusUpdates(): Observable>> { - return this.ws.subscribe('core.get_jobs').pipe( + return this.api.subscribe('core.get_jobs').pipe( filter((event: ApiEvent>) => { return ['app.start', 'app.stop'].includes(event.fields.method); }), @@ -88,19 +91,19 @@ export class ApplicationsService { if (version) { payload.push({ app_version: version }); } - return this.ws.call('app.upgrade_summary', payload); + return this.api.call('app.upgrade_summary', payload); } startApplication(name: string): Observable> { - return this.ws.job('app.start', [name]); + return this.api.job('app.start', [name]); } stopApplication(name: string): Observable> { - return this.ws.job('app.stop', [name]); + return this.api.job('app.stop', [name]); } restartApplication(name: string): Observable> { - return this.ws.job('app.redeploy', [name]); + return this.api.job('app.redeploy', [name]); } convertDateToRelativeDate(date: Date): string { @@ -127,7 +130,7 @@ export class ApplicationsService { delete filters.sort; } if (!filters || (filters && !Object.keys(filters).length)) { - return this.ws.call(endPoint).pipe(filterIgnoredApps()); + return this.api.call(endPoint).pipe(filterIgnoredApps()); } const firstOption: QueryFilters = []; @@ -146,6 +149,6 @@ export class ApplicationsService { const secondOption = filters.sort ? { order_by: [filters.sort] } : {}; - return this.ws.call(endPoint, [firstOption, secondOption]).pipe(filterIgnoredApps()); + return this.api.call(endPoint, [firstOption, secondOption]).pipe(filterIgnoredApps()); } } diff --git a/src/app/pages/apps/store/apps-stats.service.ts b/src/app/pages/apps/store/apps-stats.service.ts index 0f0ea02eddd..e283b2728cb 100644 --- a/src/app/pages/apps/store/apps-stats.service.ts +++ b/src/app/pages/apps/store/apps-stats.service.ts @@ -12,7 +12,7 @@ type State = Record; @Injectable() export class AppsStatsService extends ComponentStore { constructor( - private ws: ApiService, + private api: ApiService, ) { super({}); } @@ -22,7 +22,7 @@ export class AppsStatsService extends ComponentStore { } subscribeToUpdates(): void { - this.ws.subscribe('app.stats') + this.api.subscribe('app.stats') .pipe(untilDestroyed(this)) .subscribe((event) => this.onStatisticsReceived(event.fields)); } diff --git a/src/app/pages/apps/store/docker.store.ts b/src/app/pages/apps/store/docker.store.ts index e5b71d6e6e1..d5b58ec8641 100644 --- a/src/app/pages/apps/store/docker.store.ts +++ b/src/app/pages/apps/store/docker.store.ts @@ -49,7 +49,7 @@ export class DockerStore extends ComponentStore { readonly statusDescription$ = this.select((state) => state.statusData.description); constructor( - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private translate: TranslateService, private errorHandler: ErrorHandlerService, @@ -80,20 +80,20 @@ export class DockerStore extends ComponentStore { }); private getDockerConfig(): Observable { - return this.ws.call('docker.config'); + return this.api.call('docker.config'); } private getDockerNvidiaStatus(): Observable { - return this.ws.call('docker.nvidia_status').pipe(map(({ status }) => status)); + return this.api.call('docker.nvidia_status').pipe(map(({ status }) => status)); } private getDockerStatus(): Observable { - return this.ws.call('docker.status'); + return this.api.call('docker.status'); } setDockerPool(poolName: string): Observable> { return this.dialogService.jobDialog( - this.ws.job('docker.update', [{ pool: poolName }]), + this.api.job('docker.update', [{ pool: poolName }]), { title: this.translate.instant('Configuring...') }, ) .afterClosed() @@ -118,7 +118,7 @@ export class DockerStore extends ComponentStore { setDockerNvidia(nvidiaDriversInstalled: boolean): Observable> { return this.dialogService.jobDialog( - this.ws.job('docker.update', [{ nvidia: nvidiaDriversInstalled }]), + this.api.job('docker.update', [{ nvidia: nvidiaDriversInstalled }]), { title: this.translate.instant('Configuring...') }, ) .afterClosed() @@ -138,7 +138,7 @@ export class DockerStore extends ComponentStore { * stay alive until the component subscription stays alive i.e., until the component is destroyed */ dockerStatusEventUpdates(): Observable { - return this.ws.subscribe('docker.state').pipe( + return this.api.subscribe('docker.state').pipe( map((event) => event.fields), tap((statusData) => { this.patchState({ statusData }); @@ -147,7 +147,7 @@ export class DockerStore extends ComponentStore { } dockerConfigEventUpdates(): Observable { - return this.ws.subscribe('core.get_jobs') + return this.api.subscribe('core.get_jobs') .pipe( filter((event) => event.fields.method === 'docker.update' && !!event.fields.result), map((event) => event.fields.result), diff --git a/src/app/pages/audit/audit.component.ts b/src/app/pages/audit/audit.component.ts index 0de104c86c6..916913a4007 100644 --- a/src/app/pages/audit/audit.component.ts +++ b/src/app/pages/audit/audit.component.ts @@ -158,7 +158,7 @@ export class AuditComponent implements OnInit, OnDestroy { protected searchProperties: SearchProperty[] = []; - private userSuggestions$ = this.ws.call('user.query').pipe( + private userSuggestions$ = this.api.call('user.query').pipe( map((users) => this.mapUsersForSuggestions(users)), take(1), shareReplay({ refCount: true, bufferSize: 1 }), @@ -168,7 +168,7 @@ export class AuditComponent implements OnInit, OnDestroy { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, protected emptyService: EmptyService, private breakpointObserver: BreakpointObserver, private cdr: ChangeDetectorRef, @@ -187,7 +187,7 @@ export class AuditComponent implements OnInit, OnDestroy { } ngOnInit(): void { - this.dataProvider = new AuditApiDataProvider(this.ws); + this.dataProvider = new AuditApiDataProvider(this.api); this.dataProvider.paginationStrategy = new PaginationServerSide(); this.dataProvider.sortingStrategy = new SortingServerSide(); this.setDefaultSort(); diff --git a/src/app/pages/audit/components/log-details-panel/log-details-panel.component.ts b/src/app/pages/audit/components/log-details-panel/log-details-panel.component.ts index e24688e1fc1..2794f662080 100644 --- a/src/app/pages/audit/components/log-details-panel/log-details-panel.component.ts +++ b/src/app/pages/audit/components/log-details-panel/log-details-panel.component.ts @@ -4,8 +4,6 @@ import { import { TranslateModule } from '@ngx-translate/core'; import { AuditEntry } from 'app/interfaces/audit/audit.interface'; import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { TestDirective } from 'app/modules/test-id/test.directive'; import { EventDataDetailsCardComponent, } from 'app/pages/audit/components/event-data-details-card/event-data-details-card.component'; @@ -21,10 +19,8 @@ import { changeDetection: ChangeDetectionStrategy.OnPush, imports: [ EventDataDetailsCardComponent, - IxIconComponent, MetadataDetailsCardComponent, TranslateModule, - TestDirective, MobileBackButtonComponent, ], }) diff --git a/src/app/pages/audit/utils/audit-api-data-provider.ts b/src/app/pages/audit/utils/audit-api-data-provider.ts index b5a6b845f66..d93556ee0e5 100644 --- a/src/app/pages/audit/utils/audit-api-data-provider.ts +++ b/src/app/pages/audit/utils/audit-api-data-provider.ts @@ -20,8 +20,8 @@ export class AuditApiDataProvider extends ApiDataProvider<'audit.query'> { return this.totalRows && !this.isLastOffset && isEqual(this.lastParams, this.params[0]); } - constructor(ws: ApiService) { - super(ws, 'audit.query'); + constructor(api: ApiService) { + super(api, 'audit.query'); } protected override countRows(): Observable { @@ -39,7 +39,7 @@ export class AuditApiDataProvider extends ApiDataProvider<'audit.query'> { }), }]; - return this.ws.call(this.method, params) as unknown as Observable; + return this.api.call(this.method, params) as unknown as Observable; } protected override prepareParams(params: ApiCallParams<'audit.query'>): ApiCallParams<'audit.query'> { diff --git a/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.ts b/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.ts index 9d02d14ddb8..27487a8e30c 100644 --- a/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.ts +++ b/src/app/pages/credentials/backup-credentials/cloud-credentials-card/cloud-credentials-card.component.ts @@ -95,7 +95,7 @@ export class CloudCredentialsCardComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private translate: TranslateService, protected emptyService: EmptyService, private chainedSlideinService: ChainedSlideInService, @@ -104,7 +104,7 @@ export class CloudCredentialsCardComponent implements OnInit { ) {} ngOnInit(): void { - const credentials$ = this.ws.call('cloudsync.credentials.query').pipe( + const credentials$ = this.api.call('cloudsync.credentials.query').pipe( tap((credentials) => this.credentials = credentials), untilDestroyed(this), ); @@ -164,7 +164,7 @@ export class CloudCredentialsCardComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('cloudsync.credentials.delete', [credential.id])), + switchMap(() => this.api.call('cloudsync.credentials.delete', [credential.id])), untilDestroyed(this), ) .subscribe(() => { diff --git a/src/app/pages/credentials/backup-credentials/cloud-credentials-form/cloud-credentials-form.component.ts b/src/app/pages/credentials/backup-credentials/cloud-credentials-form/cloud-credentials-form.component.ts index 80cb6c55bf3..ca146d51049 100644 --- a/src/app/pages/credentials/backup-credentials/cloud-credentials-form/cloud-credentials-form.component.ts +++ b/src/app/pages/credentials/backup-credentials/cloud-credentials-form/cloud-credentials-form.component.ts @@ -90,7 +90,7 @@ export class CloudCredentialsFormComponent implements OnInit { readonly helptext = helptext; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -153,8 +153,8 @@ export class CloudCredentialsFormComponent implements OnInit { switchMap(() => { const payload = this.preparePayload(); return this.isNew - ? this.ws.call('cloudsync.credentials.create', [payload]) - : this.ws.call('cloudsync.credentials.update', [this.existingCredential.id, payload]); + ? this.api.call('cloudsync.credentials.create', [payload]) + : this.api.call('cloudsync.credentials.update', [this.existingCredential.id, payload]); }), untilDestroyed(this), ) @@ -188,7 +188,7 @@ export class CloudCredentialsFormComponent implements OnInit { switchMap(() => { const { name, ...payload } = this.preparePayload(); - return this.ws.call('cloudsync.credentials.verify', [payload]); + return this.api.call('cloudsync.credentials.verify', [payload]); }), untilDestroyed(this), ) diff --git a/src/app/pages/credentials/backup-credentials/cloud-credentials-form/provider-forms/sftp-provider-form/sftp-provider-form.component.ts b/src/app/pages/credentials/backup-credentials/cloud-credentials-form/provider-forms/sftp-provider-form/sftp-provider-form.component.ts index 203bf9c0cef..f45db69c1de 100644 --- a/src/app/pages/credentials/backup-credentials/cloud-credentials-form/provider-forms/sftp-provider-form/sftp-provider-form.component.ts +++ b/src/app/pages/credentials/backup-credentials/cloud-credentials-form/provider-forms/sftp-provider-form/sftp-provider-form.component.ts @@ -56,7 +56,7 @@ export class SftpProviderFormComponent extends BaseProviderFormComponent impleme override readonly helptext = helptext; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private translate: TranslateService, private cdr: ChangeDetectorRef, @@ -76,7 +76,7 @@ export class SftpProviderFormComponent extends BaseProviderFormComponent impleme } private loadPrivateKeys(): void { - this.privateKeys$ = this.ws.call('keychaincredential.query', [[['type', '=', KeychainCredentialType.SshKeyPair]]]) + this.privateKeys$ = this.api.call('keychaincredential.query', [[['type', '=', KeychainCredentialType.SshKeyPair]]]) .pipe( idNameArrayToOptions(), map((options) => { @@ -92,7 +92,7 @@ export class SftpProviderFormComponent extends BaseProviderFormComponent impleme } private makeNewKeypair(): Observable { - return this.ws.call('keychaincredential.generate_ssh_key_pair').pipe( + return this.api.call('keychaincredential.generate_ssh_key_pair').pipe( switchMap((keypair) => { const createCredential = { name: this.translate.instant('{key} Key', { @@ -102,7 +102,7 @@ export class SftpProviderFormComponent extends BaseProviderFormComponent impleme attributes: keypair, }; - return this.ws.call('keychaincredential.create', [createCredential]).pipe( + return this.api.call('keychaincredential.create', [createCredential]).pipe( tap((createdKey) => { this.loadPrivateKeys(); this.form.patchValue({ diff --git a/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.ts b/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.ts index cf87bc26dba..9863434a1ab 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-connection-card/ssh-connection-card.component.ts @@ -88,7 +88,7 @@ export class SshConnectionCardComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private chainedSlideInService: ChainedSlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -139,7 +139,7 @@ export class SshConnectionCardComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('keychaincredential.delete', [credential.id])), + switchMap(() => this.api.call('keychaincredential.delete', [credential.id])), untilDestroyed(this), ) .subscribe(() => { diff --git a/src/app/pages/credentials/backup-credentials/ssh-connection-form/ssh-connection-form.component.ts b/src/app/pages/credentials/backup-credentials/ssh-connection-form/ssh-connection-form.component.ts index 0dca0346e4b..8f87dfde182 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-connection-form/ssh-connection-form.component.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-connection-form/ssh-connection-form.component.ts @@ -163,7 +163,7 @@ export class SshConnectionFormComponent implements OnInit { constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private formErrorHandler: FormErrorHandlerService, private errorHandler: ErrorHandlerService, @@ -205,7 +205,7 @@ export class SshConnectionFormComponent implements OnInit { connect_timeout: this.form.controls.connect_timeout.value, }; - this.ws.call('keychaincredential.remote_ssh_host_key_scan', [requestParams]) + this.api.call('keychaincredential.remote_ssh_host_key_scan', [requestParams]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: (remoteHostKey) => { @@ -273,7 +273,7 @@ export class SshConnectionFormComponent implements OnInit { }; } - return this.ws.call('keychaincredential.setup_ssh_connection', [params]).pipe( + return this.api.call('keychaincredential.setup_ssh_connection', [params]).pipe( catchError((error: ApiError) => { if (error.errname.includes(sslCertificationError) || error.reason.includes(sslCertificationError)) { return this.dialogService.error(this.errorHandler.parseError(error)).pipe( @@ -286,7 +286,7 @@ export class SshConnectionFormComponent implements OnInit { switchMap((retry) => { if (retry) { params.semi_automatic_setup.verify_ssl = false; - return this.ws.call('keychaincredential.setup_ssh_connection', [params]); + return this.api.call('keychaincredential.setup_ssh_connection', [params]); } return throwError(() => error); }), @@ -311,6 +311,6 @@ export class SshConnectionFormComponent implements OnInit { } as SshCredentials, }; - return this.ws.call('keychaincredential.update', [this.existingConnection.id, params]); + return this.api.call('keychaincredential.update', [this.existingConnection.id, params]); } } diff --git a/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.ts b/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.ts index 2a0971322cb..b95a7261d47 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-keypair-card/ssh-keypair-card.component.ts @@ -96,7 +96,7 @@ export class SshKeypairCardComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -152,7 +152,7 @@ export class SshKeypairCardComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('keychaincredential.delete', [credential.id])), + switchMap(() => this.api.call('keychaincredential.delete', [credential.id])), untilDestroyed(this), ) .subscribe(() => { diff --git a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.spec.ts b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.spec.ts index bd65d6bae8a..4ec71486021 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.spec.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.spec.ts @@ -24,7 +24,7 @@ import { DownloadService } from 'app/services/download.service'; describe('SshKeypairFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const fakeSshKeyPair = { id: 23, name: 'existing key', @@ -61,7 +61,7 @@ describe('SshKeypairFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends a create payload to websocket and closes modal when save is pressed', async () => { @@ -75,7 +75,7 @@ describe('SshKeypairFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('keychaincredential.create', [{ + expect(api.call).toHaveBeenCalledWith('keychaincredential.create', [{ name: 'new', type: KeychainCredentialType.SshKeyPair, attributes: { @@ -93,7 +93,7 @@ describe('SshKeypairFormComponent', () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenLastCalledWith('keychaincredential.generate_ssh_key_pair'); + expect(api.call).toHaveBeenLastCalledWith('keychaincredential.generate_ssh_key_pair'); expect(values).toMatchObject({ 'Private Key': 'Generated private key', 'Public Key': 'Generated public key', @@ -144,7 +144,7 @@ describe('SshKeypairFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); spectator.component.setKeypairForEditing(); }); @@ -170,7 +170,7 @@ describe('SshKeypairFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('keychaincredential.update', [ + expect(api.call).toHaveBeenCalledWith('keychaincredential.update', [ 23, { name: 'new', diff --git a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts index c1927e39880..e42e154e197 100644 --- a/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts +++ b/src/app/pages/credentials/backup-credentials/ssh-keypair-form/ssh-keypair-form.component.ts @@ -89,7 +89,7 @@ export class SshKeypairFormComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, private cdr: ChangeDetectorRef, private translate: TranslateService, @@ -116,7 +116,7 @@ export class SshKeypairFormComponent implements OnInit { } onGenerateButtonPressed(): void { - this.ws.call('keychaincredential.generate_ssh_key_pair') + this.api.call('keychaincredential.generate_ssh_key_pair') .pipe( this.loader.withLoader(), this.errorHandler.catchError(), @@ -151,12 +151,12 @@ export class SshKeypairFormComponent implements OnInit { this.isFormLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('keychaincredential.create', [{ + request$ = this.api.call('keychaincredential.create', [{ ...commonBody, type: KeychainCredentialType.SshKeyPair, }]); } else { - request$ = this.ws.call('keychaincredential.update', [ + request$ = this.api.call('keychaincredential.update', [ this.editingKeypair.id, commonBody, ]); diff --git a/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.ts b/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.ts index 9365a3db4b0..5b2072e7ecb 100644 --- a/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.ts +++ b/src/app/pages/credentials/certificates-dash/acme-dns-authenticator-list/acme-dns-authenticator-list.component.ts @@ -92,7 +92,7 @@ export class AcmeDnsAuthenticatorListComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -100,7 +100,7 @@ export class AcmeDnsAuthenticatorListComponent implements OnInit { ) {} ngOnInit(): void { - const authenticators$ = this.ws.call('acme.dns.authenticator.query').pipe( + const authenticators$ = this.api.call('acme.dns.authenticator.query').pipe( tap((authenticators) => this.authenticators = authenticators), untilDestroyed(this), ); @@ -146,7 +146,7 @@ export class AcmeDnsAuthenticatorListComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('acme.dns.authenticator.delete', [authenticator.id])), + switchMap(() => this.api.call('acme.dns.authenticator.delete', [authenticator.id])), untilDestroyed(this), ) .subscribe(() => { diff --git a/src/app/pages/credentials/certificates-dash/certificate-acme-add/certificate-acme-add.component.ts b/src/app/pages/credentials/certificates-dash/certificate-acme-add/certificate-acme-add.component.ts index 03a80afaeff..7059a753473 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-acme-add/certificate-acme-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-acme-add/certificate-acme-add.component.ts @@ -76,8 +76,8 @@ export class CertificateAcmeAddComponent { isLoading = false; domains: string[] = []; - readonly acmeDirectoryUris$ = this.ws.call('certificate.acme_server_choices').pipe(choicesToOptions()); - readonly authenticators$ = this.ws.call('acme.dns.authenticator.query').pipe(idNameArrayToOptions()); + readonly acmeDirectoryUris$ = this.api.call('certificate.acme_server_choices').pipe(choicesToOptions()); + readonly authenticators$ = this.api.call('acme.dns.authenticator.query').pipe(idNameArrayToOptions()); readonly helptext = helptextSystemCertificates; @@ -86,7 +86,7 @@ export class CertificateAcmeAddComponent { private validatorsService: IxValidatorsService, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private dialogService: DialogService, private slideInRef: SlideInRef, @@ -121,7 +121,7 @@ export class CertificateAcmeAddComponent { this.cdr.markForCheck(); this.dialogService.jobDialog( - this.ws.job('certificate.create', [payload]), + this.api.job('certificate.create', [payload]), { title: this.translate.instant('Creating ACME Certificate'), }, @@ -149,7 +149,7 @@ export class CertificateAcmeAddComponent { this.isLoading = true; this.cdr.markForCheck(); - this.ws.call('webui.crypto.get_certificate_domain_names', [this.csr.id]) + this.api.call('webui.crypto.get_certificate_domain_names', [this.csr.id]) .pipe(untilDestroyed(this)) .subscribe({ next: (domains) => { diff --git a/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts b/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts index 2663ef25b12..163efd12b11 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-authority-add/certificate-authority-add.component.ts @@ -97,7 +97,7 @@ export class CertificateAuthorityAddComponent implements AfterViewInit { summary: SummarySection[]; constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private translate: TranslateService, private snackbar: SnackbarService, @@ -155,7 +155,7 @@ export class CertificateAuthorityAddComponent implements AfterViewInit { this.cdr.markForCheck(); const payload = this.preparePayload(); - this.ws.call('certificateauthority.create', [payload]) + this.api.call('certificateauthority.create', [payload]) .pipe(untilDestroyed(this)) .subscribe({ complete: () => { diff --git a/src/app/pages/credentials/certificates-dash/certificate-authority-add/steps/ca-identifier-and-type/ca-identifier-and-type.component.ts b/src/app/pages/credentials/certificates-dash/certificate-authority-add/steps/ca-identifier-and-type/ca-identifier-and-type.component.ts index 961ccaf7546..39d55f8b727 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-authority-add/steps/ca-identifier-and-type/ca-identifier-and-type.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-authority-add/steps/ca-identifier-and-type/ca-identifier-and-type.component.ts @@ -74,7 +74,7 @@ export class CaIdentifierAndTypeComponent implements OnInit, SummaryProvider { private formBuilder: FormBuilder, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private validators: IxValidatorsService, ) {} @@ -93,7 +93,7 @@ export class CaIdentifierAndTypeComponent implements OnInit, SummaryProvider { } private loadProfiles(): void { - this.ws.call('webui.crypto.certificateauthority_profiles') + this.api.call('webui.crypto.certificateauthority_profiles') .pipe( this.errorHandler.catchError(), untilDestroyed(this), diff --git a/src/app/pages/credentials/certificates-dash/certificate-authority-edit/certificate-authority-edit.component.ts b/src/app/pages/credentials/certificates-dash/certificate-authority-edit/certificate-authority-edit.component.ts index 07658cfb307..96240bc5753 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-authority-edit/certificate-authority-edit.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-authority-edit/certificate-authority-edit.component.ts @@ -65,7 +65,7 @@ export class CertificateAuthorityEditComponent implements OnInit { readonly helptext = helptextSystemCertificates; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private matDialog: MatDialog, private errorHandler: FormErrorHandlerService, @@ -107,7 +107,7 @@ export class CertificateAuthorityEditComponent implements OnInit { onSubmit(): void { this.isLoading = true; - this.ws.call('certificateauthority.update', [this.certificateAuthority.id, this.form.value]) + this.api.call('certificateauthority.update', [this.certificateAuthority.id, this.form.value]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/credentials/certificates-dash/certificate-authority-list/certificate-authority-list.component.ts b/src/app/pages/credentials/certificates-dash/certificate-authority-list/certificate-authority-list.component.ts index bb5dc395dea..0a1f6301e59 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-authority-list/certificate-authority-list.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-authority-list/certificate-authority-list.component.ts @@ -146,7 +146,7 @@ export class CertificateAuthorityListComponent implements OnInit { constructor( private matDialog: MatDialog, - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -156,7 +156,7 @@ export class CertificateAuthorityListComponent implements OnInit { ) {} ngOnInit(): void { - const authorities$ = this.ws.call('certificateauthority.query').pipe( + const authorities$ = this.api.call('certificateauthority.query').pipe( map((authorities) => { return authorities.map((authority) => { if (isObject(authority.issuer)) { @@ -219,7 +219,7 @@ export class CertificateAuthorityListComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('certificateauthority.delete', [authority.id])), + switchMap(() => this.api.call('certificateauthority.delete', [authority.id])), untilDestroyed(this), ) .subscribe(() => { @@ -232,7 +232,7 @@ export class CertificateAuthorityListComponent implements OnInit { const isCsr = certificate.cert_type_CSR; const path = isCsr ? certificate.csr_path : certificate.certificate_path; const fileName = `${certificate.name}.${isCsr ? 'csr' : 'crt'}`; - this.ws + this.api .call('core.download', ['filesystem.get', [path], fileName]) .pipe(untilDestroyed(this)) .subscribe({ @@ -259,7 +259,7 @@ export class CertificateAuthorityListComponent implements OnInit { }, }); const keyName = `${certificate.name}.key`; - this.ws + this.api .call('core.download', ['filesystem.get', [certificate.privatekey_path], keyName]) .pipe(untilDestroyed(this)) .subscribe({ @@ -301,7 +301,7 @@ export class CertificateAuthorityListComponent implements OnInit { .pipe( filter(Boolean), switchMap(() => { - return this.ws.call('certificateauthority.update', [certificate.id, { revoked: true }]).pipe( + return this.api.call('certificateauthority.update', [certificate.id, { revoked: true }]).pipe( catchError((error) => { this.dialogService.error(this.errorHandler.parseError(error)); return EMPTY; diff --git a/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts b/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts index a8229fb141b..6629f61bcec 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-edit/certificate-edit.component.ts @@ -79,7 +79,7 @@ export class CertificateEditComponent implements OnInit { constructor( private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private slideInService: SlideInService, private slideInRef: SlideInRef, @@ -141,7 +141,7 @@ export class CertificateEditComponent implements OnInit { onSubmit(): void { this.isLoading = true; - this.ws.job('certificate.update', [this.certificate.id, this.form.value]) + this.api.job('certificate.update', [this.certificate.id, this.form.value]) .pipe(untilDestroyed(this)) .subscribe({ complete: () => { diff --git a/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.ts b/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.ts index 0429fc78b1f..5b066585d05 100644 --- a/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.ts +++ b/src/app/pages/credentials/certificates-dash/certificate-list/certificate-list.component.ts @@ -5,7 +5,6 @@ import { } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; -import { MatDialog } from '@angular/material/dialog'; import { MatToolbarRow } from '@angular/material/toolbar'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService, TranslateModule } from '@ngx-translate/core'; @@ -137,8 +136,7 @@ export class CertificateListComponent implements OnInit { }); constructor( - private matDialog: MatDialog, - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -148,7 +146,7 @@ export class CertificateListComponent implements OnInit { ) {} ngOnInit(): void { - const certificates$ = this.ws.call('certificate.query').pipe( + const certificates$ = this.api.call('certificate.query').pipe( map((certificates) => { return certificates .map((certificate) => { @@ -211,7 +209,7 @@ export class CertificateListComponent implements OnInit { const force = confirmation.secondaryCheckbox; const jobDialogRef = this.dialogService.jobDialog( - this.ws.job('certificate.delete', [certificate.id, force]), + this.api.job('certificate.delete', [certificate.id, force]), { title: this.translate.instant('Deleting...') }, ); @@ -229,7 +227,7 @@ export class CertificateListComponent implements OnInit { const isCsr = certificate.cert_type_CSR; const path = isCsr ? certificate.csr_path : certificate.certificate_path; const fileName = `${certificate.name}.${isCsr ? 'csr' : 'crt'}`; - this.ws + this.api .call('core.download', ['filesystem.get', [path], fileName]) .pipe(untilDestroyed(this)) .subscribe({ @@ -256,7 +254,7 @@ export class CertificateListComponent implements OnInit { }, }); const keyName = `${certificate.name}.key`; - this.ws + this.api .call('core.download', ['filesystem.get', [certificate.privatekey_path], keyName]) .pipe(untilDestroyed(this)) .subscribe({ @@ -299,7 +297,7 @@ export class CertificateListComponent implements OnInit { filter(Boolean), switchMap(() => { return this.dialogService.jobDialog( - this.ws.job('certificate.update', [certificate.id, { revoked: true }]), + this.api.job('certificate.update', [certificate.id, { revoked: true }]), { title: this.translate.instant('Revoking Certificate') }, ).afterClosed(); }), diff --git a/src/app/pages/credentials/certificates-dash/csr-add/csr-add.component.ts b/src/app/pages/credentials/certificates-dash/csr-add/csr-add.component.ts index 74c61bc8f0b..0239f676b9f 100644 --- a/src/app/pages/credentials/certificates-dash/csr-add/csr-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/csr-add/csr-add.component.ts @@ -89,7 +89,7 @@ export class CsrAddComponent { summary: SummarySection[]; constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private translate: TranslateService, private errorHandler: ErrorHandlerService, @@ -143,7 +143,7 @@ export class CsrAddComponent { this.cdr.markForCheck(); const payload = this.preparePayload(); - this.ws.job('certificate.create', [payload]) + this.api.job('certificate.create', [payload]) .pipe(untilDestroyed(this)) .subscribe({ complete: () => { diff --git a/src/app/pages/credentials/certificates-dash/csr-add/steps/csr-identifier-and-type/csr-identifier-and-type.component.ts b/src/app/pages/credentials/certificates-dash/csr-add/steps/csr-identifier-and-type/csr-identifier-and-type.component.ts index e22bc6437c7..341bd7791d8 100644 --- a/src/app/pages/credentials/certificates-dash/csr-add/steps/csr-identifier-and-type/csr-identifier-and-type.component.ts +++ b/src/app/pages/credentials/certificates-dash/csr-add/steps/csr-identifier-and-type/csr-identifier-and-type.component.ts @@ -71,7 +71,7 @@ export class CsrIdentifierAndTypeComponent implements OnInit, SummaryProvider { constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, private cdr: ChangeDetectorRef, @@ -107,7 +107,7 @@ export class CsrIdentifierAndTypeComponent implements OnInit, SummaryProvider { } private loadProfiles(): void { - this.ws.call('webui.crypto.csr_profiles') + this.api.call('webui.crypto.csr_profiles') .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe((profiles) => { this.profiles = profiles; diff --git a/src/app/pages/credentials/certificates-dash/csr-list/csr-list.component.ts b/src/app/pages/credentials/certificates-dash/csr-list/csr-list.component.ts index a823c4d269c..87d0e393c11 100644 --- a/src/app/pages/credentials/certificates-dash/csr-list/csr-list.component.ts +++ b/src/app/pages/credentials/certificates-dash/csr-list/csr-list.component.ts @@ -124,7 +124,7 @@ export class CertificateSigningRequestsListComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, @@ -135,7 +135,7 @@ export class CertificateSigningRequestsListComponent implements OnInit { ) {} ngOnInit(): void { - const certificates$ = this.ws.call('certificate.query').pipe( + const certificates$ = this.api.call('certificate.query').pipe( map((certificates) => certificates.filter((certificate) => certificate.CSR !== null)), tap((certificates) => this.certificates = certificates), untilDestroyed(this), @@ -189,7 +189,7 @@ export class CertificateSigningRequestsListComponent implements OnInit { const force = confirmation.secondaryCheckbox; const jobDialogRef = this.dialogService.jobDialog( - this.ws.job('certificate.delete', [certificate.id, force]), + this.api.job('certificate.delete', [certificate.id, force]), { title: this.translate.instant('Deleting...') }, ); @@ -209,7 +209,7 @@ export class CertificateSigningRequestsListComponent implements OnInit { const isCsr = certificate.cert_type_CSR; const path = isCsr ? certificate.csr_path : certificate.certificate_path; const fileName = `${certificate.name}.${isCsr ? 'csr' : 'crt'}`; - this.ws + this.api .call('core.download', ['filesystem.get', [path], fileName]) .pipe(untilDestroyed(this)) .subscribe({ @@ -236,7 +236,7 @@ export class CertificateSigningRequestsListComponent implements OnInit { }, }); const keyName = `${certificate.name}.key`; - this.ws + this.api .call('core.download', ['filesystem.get', [certificate.privatekey_path], keyName]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts b/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts index 1cee5b74e21..e633a919ed1 100644 --- a/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/acmedns-form/acmedns-form.component.ts @@ -91,7 +91,7 @@ export class AcmednsFormComponent implements OnInit { readonly helptext = helptext; getAuthenticatorSchemas(): Observable { - return this.ws.call('acme.dns.authenticator.authenticator_schemas'); + return this.api.call('acme.dns.authenticator.authenticator_schemas'); } authenticatorOptions$: Observable; @@ -103,7 +103,7 @@ export class AcmednsFormComponent implements OnInit { private slideInRef: SlideInRef, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private changeDetectorRef: ChangeDetectorRef, @Inject(SLIDE_IN_DATA) private acmedns: DnsAuthenticator, ) {} @@ -208,9 +208,9 @@ export class AcmednsFormComponent implements OnInit { let request$: Observable; if (this.isNew) { - request$ = this.ws.call('acme.dns.authenticator.create', [values]); + request$ = this.api.call('acme.dns.authenticator.create', [values]); } else { - request$ = this.ws.call('acme.dns.authenticator.update', [ + request$ = this.api.call('acme.dns.authenticator.update', [ this.editingAcmedns.id, values, ]); diff --git a/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts b/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts index 2917f22c9d8..21d5abd6878 100644 --- a/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/certificate-add/certificate-add.component.ts @@ -89,7 +89,7 @@ export class CertificateAddComponent { summary: SummarySection[]; constructor( - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private cdr: ChangeDetectorRef, private dialogService: DialogService, @@ -120,7 +120,7 @@ export class CertificateAddComponent { this.cdr.markForCheck(); const payload = this.preparePayload(); - this.ws.job('certificate.create', [payload]) + this.api.job('certificate.create', [payload]) .pipe(untilDestroyed(this)) .subscribe({ complete: () => { diff --git a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts index 52f4768915e..cbeccf17a9d 100644 --- a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-identifier-and-type/certificate-identifier-and-type.component.ts @@ -13,7 +13,6 @@ import { mapToOptions } from 'app/helpers/options.helper'; import { helptextSystemCertificates } from 'app/helptext/system/certificates'; import { CertificateProfile, CertificateProfiles } from 'app/interfaces/certificate.interface'; import { Option } from 'app/interfaces/option.interface'; -import { DialogService } from 'app/modules/dialog/dialog.service'; 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'; @@ -74,8 +73,7 @@ export class CertificateIdentifierAndTypeComponent implements OnInit, SummaryPro private formBuilder: FormBuilder, private errorHandler: ErrorHandlerService, private translate: TranslateService, - private ws: ApiService, - private dialogService: DialogService, + private api: ApiService, private cdr: ChangeDetectorRef, private validators: IxValidatorsService, ) {} @@ -90,7 +88,7 @@ export class CertificateIdentifierAndTypeComponent implements OnInit, SummaryPro } private loadProfiles(): void { - this.ws.call('webui.crypto.certificate_profiles') + this.api.call('webui.crypto.certificate_profiles') .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe((profiles) => { this.profiles = profiles; diff --git a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-import/certificate-import.component.ts b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-import/certificate-import.component.ts index bc22e2b470c..b1b5bc7c21e 100644 --- a/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-import/certificate-import.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/certificate-add/steps/certificate-import/certificate-import.component.ts @@ -71,7 +71,7 @@ export class CertificateImportComponent implements OnInit, SummaryProvider { private formBuilder: FormBuilder, private errorHandler: ErrorHandlerService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private cdr: ChangeDetectorRef, ) {} @@ -129,7 +129,7 @@ export class CertificateImportComponent implements OnInit, SummaryProvider { } private loadCsrs(): void { - this.ws.call('certificate.query', [[['CSR', '!=', null]]]) + this.api.call('certificate.query', [[['CSR', '!=', null]]]) .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe((csrs) => { this.csrs = csrs; diff --git a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts index f5843ce8245..bd74985ef92 100644 --- a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-constraints/certificate-constraints.component.ts @@ -92,7 +92,7 @@ export class CertificateConstraintsComponent implements OnInit, SummaryProvider constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, ) {} @@ -300,7 +300,7 @@ export class CertificateConstraintsComponent implements OnInit, SummaryProvider } private loadKeyUsageOptions(): void { - this.ws.call('certificate.extended_key_usage_choices') + this.api.call('certificate.extended_key_usage_choices') .pipe( choicesToOptions(), untilDestroyed(this), diff --git a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts index aca2e0fc115..d5fe132a839 100644 --- a/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts +++ b/src/app/pages/credentials/certificates-dash/forms/common-steps/certificate-options/certificate-options.component.ts @@ -68,12 +68,12 @@ export class CertificateOptionsComponent implements OnInit, OnChanges, SummaryPr readonly keyTypes$ = of(mapToOptions(certificateKeyTypeLabels, this.translate)); readonly digestAlgorithms$ = of(mapToOptions(certificateDigestAlgorithmLabels, this.translate)); readonly keyLengths$ = of(certificateKeyLengths); - readonly ecCurves$ = this.ws.call('certificate.ec_curve_choices').pipe(choicesToOptions()); + readonly ecCurves$ = this.api.call('certificate.ec_curve_choices').pipe(choicesToOptions()); constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private systemGeneralService: SystemGeneralService, private cdr: ChangeDetectorRef, ) { } diff --git a/src/app/pages/credentials/certificates-dash/sign-csr-dialog/sign-csr-dialog.component.ts b/src/app/pages/credentials/certificates-dash/sign-csr-dialog/sign-csr-dialog.component.ts index 5eb97907343..26cd88aab26 100644 --- a/src/app/pages/credentials/certificates-dash/sign-csr-dialog/sign-csr-dialog.component.ts +++ b/src/app/pages/credentials/certificates-dash/sign-csr-dialog/sign-csr-dialog.component.ts @@ -60,7 +60,7 @@ export class SignCsrDialogComponent { private loader: AppLoaderService, private snackbar: SnackbarService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private errorHandler: FormErrorHandlerService, @Inject(MAT_DIALOG_DATA) private caId: number, ) {} @@ -71,7 +71,7 @@ export class SignCsrDialogComponent { ca_id: this.caId, }; - this.ws.call('certificateauthority.ca_sign_csr', [params as CertificateAuthoritySignRequest]) + this.api.call('certificateauthority.ca_sign_csr', [params as CertificateAuthoritySignRequest]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/credentials/groups/group-details-row/delete-group-dialog/delete-group-dialog.component.ts b/src/app/pages/credentials/groups/group-details-row/delete-group-dialog/delete-group-dialog.component.ts index 70e4624c14d..4fbcde12d42 100644 --- a/src/app/pages/credentials/groups/group-details-row/delete-group-dialog/delete-group-dialog.component.ts +++ b/src/app/pages/credentials/groups/group-details-row/delete-group-dialog/delete-group-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -30,7 +29,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxCheckboxComponent, ReactiveFormsModule, @@ -52,7 +50,7 @@ export class DeleteGroupDialogComponent { constructor( private loader: AppLoaderService, - private ws: ApiService, + private api: ApiService, private snackbar: SnackbarService, private translate: TranslateService, private dialogRef: MatDialogRef, @@ -68,7 +66,7 @@ export class DeleteGroupDialogComponent { } onDelete(): void { - this.ws.call('group.delete', [this.group.id, { delete_users: this.deleteUsersCheckbox.value }]) + this.api.call('group.delete', [this.group.id, { delete_users: this.deleteUsersCheckbox.value }]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/credentials/groups/group-form/group-form.component.spec.ts b/src/app/pages/credentials/groups/group-form/group-form.component.spec.ts index 5d8f82221b9..2417c7d8c66 100644 --- a/src/app/pages/credentials/groups/group-form/group-form.component.spec.ts +++ b/src/app/pages/credentials/groups/group-form/group-form.component.spec.ts @@ -23,7 +23,7 @@ import { ApiService } from 'app/services/api.service'; describe('GroupFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const fakePrivilegeDataSource: Privilege[] = [ { @@ -80,14 +80,14 @@ describe('GroupFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads names of existing groups and makes sure new name is unique', async () => { const nameInput = await loader.getHarness(IxInputHarness.with({ label: 'Name' })); await nameInput.setValue('existing'); - expect(ws.call).toHaveBeenCalledWith('group.query'); + expect(api.call).toHaveBeenCalledWith('group.query'); expect(await nameInput.getErrorText()).toBe('The name "existing" is already in use.'); }); @@ -95,7 +95,7 @@ describe('GroupFormComponent', () => { const gidInput = await loader.getHarness(IxInputHarness.with({ label: 'GID' })); const value = await gidInput.getValue(); - expect(ws.call).toHaveBeenCalledWith('group.get_next_gid'); + expect(api.call).toHaveBeenCalledWith('group.get_next_gid'); expect(value).toBe('1234'); }); @@ -111,7 +111,7 @@ describe('GroupFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('group.create', [{ + expect(api.call).toHaveBeenCalledWith('group.create', [{ gid: 1234, name: 'new', smb: true, @@ -129,7 +129,7 @@ describe('GroupFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('does not show Allow Duplicate Gid on edit', async () => { @@ -165,7 +165,7 @@ describe('GroupFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('group.update', [ + expect(api.call).toHaveBeenCalledWith('group.update', [ 13, { name: 'updated', @@ -175,7 +175,7 @@ describe('GroupFormComponent', () => { }, ]); - expect(ws.call).toHaveBeenCalledWith('privilege.update', [1, { + expect(api.call).toHaveBeenCalledWith('privilege.update', [1, { ds_groups: [1223], local_groups: [2222], name: 'Privilege 1', roles: ['SHARING_ADMIN'], web_shell: true, }]); }); @@ -192,7 +192,7 @@ describe('GroupFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('privilege.update', [1, { + expect(api.call).toHaveBeenCalledWith('privilege.update', [1, { ds_groups: [1223], local_groups: [2222], name: 'Privilege 1', roles: ['SHARING_ADMIN'], web_shell: true, }]); }); diff --git a/src/app/pages/credentials/groups/group-form/group-form.component.ts b/src/app/pages/credentials/groups/group-form/group-form.component.ts index 903e19c49ea..4afee64f819 100644 --- a/src/app/pages/credentials/groups/group-form/group-form.component.ts +++ b/src/app/pages/credentials/groups/group-form/group-form.component.ts @@ -92,13 +92,13 @@ export class GroupFormComponent implements OnInit { smb: helptextGroups.smb_tooltip, }; - readonly privilegeOptions$ = this.ws.call('privilege.query').pipe( + readonly privilegeOptions$ = this.api.call('privilege.query').pipe( map((privileges) => privileges.map((privilege) => ({ label: privilege.name, value: privilege.id }))), ); constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, @@ -114,7 +114,7 @@ export class GroupFormComponent implements OnInit { } readonly privilegesProvider: ChipsProvider = (query: string) => { - return this.ws.call('privilege.query', []).pipe( + return this.api.call('privilege.query', []).pipe( map((privileges) => { const chips = privileges.map((privilege) => privilege.name); return chips.filter((item) => item.trim().toLowerCase().includes(query.trim().toLowerCase())); @@ -126,7 +126,7 @@ export class GroupFormComponent implements OnInit { this.setFormRelations(); if (this.isNew) { - this.ws.call('group.get_next_gid').pipe(untilDestroyed(this)).subscribe((nextId) => { + this.api.call('group.get_next_gid').pipe(untilDestroyed(this)).subscribe((nextId) => { this.form.patchValue({ gid: nextId, }); @@ -162,19 +162,19 @@ export class GroupFormComponent implements OnInit { this.isFormLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('group.create', [{ + request$ = this.api.call('group.create', [{ ...commonBody, gid: values.gid, }]); } else { - request$ = this.ws.call('group.update', [ + request$ = this.api.call('group.update', [ this.editingGroup.id, commonBody, ]); } request$.pipe( - switchMap((id) => this.ws.call('group.query', [[['id', '=', id]]])), + switchMap((id) => this.api.call('group.query', [[['id', '=', id]]])), map((groups) => groups[0]), switchMap((group) => this.togglePrivilegesForGroup(group.gid).pipe(map(() => group))), untilDestroyed(this), @@ -213,7 +213,7 @@ export class GroupFormComponent implements OnInit { privileges.forEach((privilege) => { requests$.push( - this.ws.call('privilege.update', [ + this.api.call('privilege.update', [ privilege.id, this.mapPrivilegeToPrivilegeUpdate( privilege, @@ -230,7 +230,7 @@ export class GroupFormComponent implements OnInit { privileges.forEach((privilege) => { requests$.push( - this.ws.call('privilege.update', [ + this.api.call('privilege.update', [ privilege.id, this.mapPrivilegeToPrivilegeUpdate( privilege, @@ -245,7 +245,7 @@ export class GroupFormComponent implements OnInit { } private getPrivilegesList(): void { - this.ws.call('privilege.query', []) + this.api.call('privilege.query', []) .pipe(untilDestroyed(this)).subscribe((privileges) => { this.initialGroupRelatedPrivilegesList = privileges.filter((privilege) => { return privilege.local_groups.map((group) => group.gid).includes(this.editingGroup?.gid); @@ -260,7 +260,7 @@ export class GroupFormComponent implements OnInit { } private setNamesInUseValidator(currentName?: string): void { - this.ws.call('group.query').pipe(untilDestroyed(this)).subscribe((groups) => { + this.api.call('group.query').pipe(untilDestroyed(this)).subscribe((groups) => { let forbiddenNames = groups.map((group) => group.group); if (currentName) { forbiddenNames = forbiddenNames.filter((name) => name !== currentName); diff --git a/src/app/pages/credentials/groups/group-members/group-members.component.html b/src/app/pages/credentials/groups/group-members/group-members.component.html index 6d62e57f479..1f5181d168c 100644 --- a/src/app/pages/credentials/groups/group-members/group-members.component.html +++ b/src/app/pages/credentials/groups/group-members/group-members.component.html @@ -1,11 +1,11 @@ - @if (isFormLoading) { + @if (isLoading()) { } - @if (group?.group) { + @if (group()?.group) { - {{ 'Manage members of {name} group' | translate: { name: group.group } }} + {{ 'Manage members of {name} group' | translate: { name: group().group } }} @if (requiredRoles?.length && !(hasRequiredRoles | async)) { } @@ -13,7 +13,7 @@ } - @if (users.length) { + @if (users().length) { } @@ -34,7 +34,7 @@ mat-button color="primary" ixTest="save" - [disabled]="isFormLoading" + [disabled]="isLoading()" (click)="onSubmit()" > {{ 'Save' | translate }} diff --git a/src/app/pages/credentials/groups/group-members/group-members.component.spec.ts b/src/app/pages/credentials/groups/group-members/group-members.component.spec.ts index b7c1d912b7a..50d6608aece 100644 --- a/src/app/pages/credentials/groups/group-members/group-members.component.spec.ts +++ b/src/app/pages/credentials/groups/group-members/group-members.component.spec.ts @@ -27,7 +27,7 @@ const fakeGroupDataSource = [{ describe('GroupMembersComponent', () => { let spectator: SpectatorRouting; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createRoutingFactory({ component: GroupMembersComponent, imports: [ @@ -51,7 +51,11 @@ describe('GroupMembersComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); + }); + + it('loads local users to show in available users', () => { + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('user.query', [[['local', '=', true]]]); }); it('shows current group values when form is being edited', async () => { @@ -63,8 +67,7 @@ describe('GroupMembersComponent', () => { expect(await userList.getItems()).toHaveLength(1); expect(await memberList.getItems()).toHaveLength(1); - expect(ws.call).toHaveBeenCalledWith('user.query'); - expect(ws.call).toHaveBeenCalledWith('group.query', [[['id', '=', 1]]]); + expect(api.call).toHaveBeenCalledWith('group.query', [[['id', '=', 1]]]); }); it('redirects to Group List page when Cancel button is pressed', async () => { @@ -95,7 +98,7 @@ describe('GroupMembersComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('group.update', [1, { users: [41, 42] }]); + expect(api.call).toHaveBeenCalledWith('group.update', [1, { users: [41, 42] }]); expect(spectator.inject(Router).navigate).toHaveBeenCalledWith(['/', 'credentials', 'groups']); }); }); diff --git a/src/app/pages/credentials/groups/group-members/group-members.component.ts b/src/app/pages/credentials/groups/group-members/group-members.component.ts index 6135ab3db57..b19c1ac02d5 100644 --- a/src/app/pages/credentials/groups/group-members/group-members.component.ts +++ b/src/app/pages/credentials/groups/group-members/group-members.component.ts @@ -1,17 +1,16 @@ import { AsyncPipe } from '@angular/common'; import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, + ChangeDetectionStrategy, Component, OnInit, signal, } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardTitle, MatCardContent, MatCardActions, } from '@angular/material/card'; -import { MatListItemIcon, MatListItemLine } from '@angular/material/list'; import { MatProgressBar } from '@angular/material/progress-bar'; import { ActivatedRoute, Router } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule } from '@ngx-translate/core'; -import { Observable } from 'rxjs'; +import { forkJoin, Observable } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { Role } from 'app/enums/role.enum'; @@ -20,7 +19,6 @@ import { User } from 'app/interfaces/user.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { ReadOnlyComponent } from 'app/modules/forms/ix-forms/components/readonly-badge/readonly-badge.component'; import { iconMarker } from 'app/modules/ix-icon/icon-marker.util'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { DualListBoxComponent } from 'app/modules/lists/dual-listbox/dual-listbox.component'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/services/api.service'; @@ -42,9 +40,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; ReadOnlyComponent, MatCardContent, DualListBoxComponent, - IxIconComponent, - MatListItemIcon, - MatListItemLine, MatCardActions, RequiresRolesDirective, MatButton, @@ -56,44 +51,38 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; export class GroupMembersComponent implements OnInit { protected readonly requiredRoles = [Role.AccountWrite]; protected readonly iconMarker = iconMarker; + protected selectedMembers: User[] = []; + protected readonly users = signal([]); - selectedMembers: User[] = []; - users: User[] = []; - - isFormLoading = false; - group: Group; + protected readonly isLoading = signal(false); + protected readonly group = signal(null); get hasRequiredRoles(): Observable { return this.authService.hasRole(this.requiredRoles); } constructor( - private ws: ApiService, + private api: ApiService, private activatedRoute: ActivatedRoute, private router: Router, private dialog: DialogService, private errorHandler: ErrorHandlerService, - private cdr: ChangeDetectorRef, private authService: AuthService, ) {} ngOnInit(): void { - this.isFormLoading = true; + this.isLoading.set(true); this.activatedRoute.params.pipe( - switchMap((params) => { - return this.ws.call('group.query', [[['id', '=', parseInt(params.pk as string)]]]); - }), - switchMap((groups) => { - this.group = groups[0]; - this.cdr.markForCheck(); - return this.ws.call('user.query'); - }), + switchMap((params) => forkJoin([ + this.api.call('group.query', [[['id', '=', parseInt(params.pk as string)]]]), + this.api.call('user.query', [[['local', '=', true]]]), + ])), untilDestroyed(this), - ).subscribe((users) => { - this.users = users; - this.selectedMembers = users.filter((user) => this.group.users.includes(user.id)); - this.isFormLoading = false; - this.cdr.markForCheck(); + ).subscribe(([groups, users]) => { + this.group.set(groups[0]); + this.users.set(users); + this.selectedMembers = users.filter((user) => this.group().users.includes(user.id)); + this.isLoading.set(false); }); } @@ -102,20 +91,18 @@ export class GroupMembersComponent implements OnInit { } onSubmit(): void { - this.isFormLoading = true; - this.cdr.markForCheck(); + this.isLoading.set(true); const userIds = this.selectedMembers.map((user) => user.id); - this.ws.call('group.update', [this.group.id, { users: userIds }]).pipe( + this.api.call('group.update', [this.group().id, { users: userIds }]).pipe( untilDestroyed(this), ).subscribe({ next: () => { - this.isFormLoading = false; + this.isLoading.set(false); this.router.navigate(['/', 'credentials', 'groups']); }, error: (error) => { - this.isFormLoading = false; - this.cdr.markForCheck(); + this.isLoading.set(false); this.dialog.error(this.errorHandler.parseError(error)); }, }); diff --git a/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.spec.ts b/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.spec.ts index 8e318d97d22..3528f0be648 100644 --- a/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.spec.ts +++ b/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.spec.ts @@ -18,7 +18,7 @@ import { ApiService } from 'app/services/api.service'; describe('PrivilegeFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const fakeDataPrivilege = { id: 10, @@ -65,7 +65,7 @@ describe('PrivilegeFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows roles sorted alphabetically with compound (non-builtin) roles on top', async () => { @@ -91,7 +91,7 @@ describe('PrivilegeFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('privilege.create', [{ + expect(api.call).toHaveBeenLastCalledWith('privilege.create', [{ ds_groups: [], local_groups: [], name: 'new privilege', @@ -109,7 +109,7 @@ describe('PrivilegeFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows current privilege values when form is being edited', async () => { @@ -136,7 +136,7 @@ describe('PrivilegeFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('privilege.update', [10, { + expect(api.call).toHaveBeenLastCalledWith('privilege.update', [10, { ds_groups: [], local_groups: [111, 222], name: 'updated privilege', @@ -154,7 +154,7 @@ describe('PrivilegeFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends an update payload to websocket and closes modal when save is pressed', async () => { @@ -175,7 +175,7 @@ describe('PrivilegeFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('privilege.update', [10, { + expect(api.call).toHaveBeenLastCalledWith('privilege.update', [10, { ds_groups: [], local_groups: [111, 222], web_shell: false, diff --git a/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.ts b/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.ts index 902a8e18e88..981ba084065 100644 --- a/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.ts +++ b/src/app/pages/credentials/groups/privilege/privilege-form/privilege-form.component.ts @@ -77,7 +77,7 @@ export class PrivilegeFormComponent implements OnInit { : this.translate.instant('Edit Privilege'); } - readonly rolesOptions$ = this.ws.call('privilege.roles').pipe( + readonly rolesOptions$ = this.api.call('privilege.roles').pipe( map((roles) => { const sortedRoles = roles.toSorted((a, b) => { // Show compound roles first, then sort by name. @@ -96,7 +96,7 @@ export class PrivilegeFormComponent implements OnInit { ); readonly localGroupsProvider: ChipsProvider = (query: string) => { - return this.ws.call('group.query', [[['local', '=', true]]]).pipe( + return this.api.call('group.query', [[['local', '=', true]]]).pipe( map((groups) => { this.localGroups = groups; const chips = groups.map((group) => group.group); @@ -106,7 +106,7 @@ export class PrivilegeFormComponent implements OnInit { }; readonly dsGroupsProvider: ChipsProvider = (query: string) => { - return this.ws.call('group.query', [[['local', '=', false]]]).pipe( + return this.api.call('group.query', [[['local', '=', false]]]).pipe( map((groups) => { this.dsGroups = groups; const chips = groups.map((group) => group.group); @@ -118,7 +118,7 @@ export class PrivilegeFormComponent implements OnInit { constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, private slideInRef: SlideInRef, @@ -156,9 +156,9 @@ export class PrivilegeFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('privilege.create', [values]); + request$ = this.api.call('privilege.create', [values]); } else { - request$ = this.ws.call('privilege.update', [this.existingPrivilege.id, values]); + request$ = this.api.call('privilege.update', [this.existingPrivilege.id, values]); } request$.pipe(untilDestroyed(this)).subscribe({ diff --git a/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.component.ts b/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.component.ts index fbb943240eb..0e088b2cd47 100644 --- a/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.component.ts +++ b/src/app/pages/credentials/groups/privilege/privilege-list/privilege-list.component.ts @@ -126,7 +126,7 @@ export class PrivilegeListComponent implements OnInit { pageNumber: 1, }; - private groupsSuggestions$ = this.ws.call('group.query', [[['local', '=', true]]]).pipe( + private groupsSuggestions$ = this.api.call('group.query', [[['local', '=', true]]]).pipe( map((groups) => groups.map((group) => ({ label: group.group, value: `"${group.group}"`, @@ -144,7 +144,7 @@ export class PrivilegeListComponent implements OnInit { constructor( private slideInService: SlideInService, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private dialogService: DialogService, protected emptyService: EmptyService, @@ -152,7 +152,7 @@ export class PrivilegeListComponent implements OnInit { ) { } ngOnInit(): void { - this.dataProvider = new ApiDataProvider(this.ws, 'privilege.query'); + this.dataProvider = new ApiDataProvider(this.api, 'privilege.query'); this.dataProvider.paginationStrategy = new PaginationServerSide(); this.dataProvider.sortingStrategy = new SortingServerSide(); @@ -178,7 +178,7 @@ export class PrivilegeListComponent implements OnInit { }) .pipe( filter(Boolean), - switchMap(() => this.ws.call('privilege.delete', [privilege.id])), + switchMap(() => this.api.call('privilege.delete', [privilege.id])), untilDestroyed(this), ) .subscribe({ diff --git a/src/app/pages/credentials/groups/store/group.effects.ts b/src/app/pages/credentials/groups/store/group.effects.ts index 12eb1386b99..4bfd3fc6b38 100644 --- a/src/app/pages/credentials/groups/store/group.effects.ts +++ b/src/app/pages/credentials/groups/store/group.effects.ts @@ -30,7 +30,7 @@ export class GroupEffects { if (preferences.hideBuiltinGroups) { params = [[['builtin', '=', false]]]; } - return this.ws.call('group.query', params).pipe( + return this.api.call('group.query', params).pipe( map((groups) => groupsLoaded({ groups })), catchError((error) => { console.error(error); @@ -48,7 +48,7 @@ export class GroupEffects { subscribeToRemoval$ = createEffect(() => this.actions$.pipe( ofType(groupsLoaded), switchMap(() => { - return this.ws.subscribe('group.query').pipe( + return this.api.subscribe('group.query').pipe( filter((event) => event.msg === IncomingApiMessageType.Removed), map((event) => groupRemoved({ id: event.id as number })), ); @@ -57,7 +57,7 @@ export class GroupEffects { constructor( private actions$: Actions, - private ws: ApiService, + private api: ApiService, private store$: Store, private translate: TranslateService, ) {} diff --git a/src/app/pages/credentials/kmip/kmip.component.ts b/src/app/pages/credentials/kmip/kmip.component.ts index 4371088ba33..35cd1f64167 100644 --- a/src/app/pages/credentials/kmip/kmip.component.ts +++ b/src/app/pages/credentials/kmip/kmip.component.ts @@ -79,7 +79,7 @@ export class KmipComponent implements OnInit { readonly certificateAuthorities$ = this.systemGeneralService.getCertificateAuthorities().pipe(idNameArrayToOptions()); constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -95,7 +95,7 @@ export class KmipComponent implements OnInit { onSyncKeysPressed(): void { this.isLoading = true; - this.ws.call('kmip.sync_keys').pipe(untilDestroyed(this)).subscribe({ + this.api.call('kmip.sync_keys').pipe(untilDestroyed(this)).subscribe({ next: () => { this.dialogService.info( helptextSystemKmip.syncInfoDialog.title, @@ -114,7 +114,7 @@ export class KmipComponent implements OnInit { onClearSyncKeysPressed(): void { this.isLoading = true; - this.ws.call('kmip.clear_sync_pending_keys').pipe(untilDestroyed(this)).subscribe({ + this.api.call('kmip.clear_sync_pending_keys').pipe(untilDestroyed(this)).subscribe({ next: () => { this.dialogService.info( helptextSystemKmip.clearSyncKeyInfoDialog.title, @@ -133,7 +133,7 @@ export class KmipComponent implements OnInit { onSubmit(): void { this.dialogService.jobDialog( - this.ws.job('kmip.update', [this.form.value as KmipConfigUpdate]), + this.api.job('kmip.update', [this.form.value as KmipConfigUpdate]), { title: this.translate.instant(helptextSystemKmip.jobDialog.title) }, ) .afterClosed() @@ -149,8 +149,8 @@ export class KmipComponent implements OnInit { private loadKmipConfig(): void { this.isLoading = true; forkJoin([ - this.ws.call('kmip.config'), - this.ws.call('kmip.kmip_sync_pending'), + this.api.call('kmip.config'), + this.api.call('kmip.kmip_sync_pending'), ]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/credentials/users/store/user.effects.ts b/src/app/pages/credentials/users/store/user.effects.ts index 9aee297dff2..9634e2b0b39 100644 --- a/src/app/pages/credentials/users/store/user.effects.ts +++ b/src/app/pages/credentials/users/store/user.effects.ts @@ -30,7 +30,7 @@ export class UserEffects { if (preferences.hideBuiltinUsers) { params = [[['OR', [['builtin', '=', false], ['username', '=', 'root']]]]] as QueryParams; } - return this.ws.call('user.query', params).pipe( + return this.api.call('user.query', params).pipe( map((users) => usersLoaded({ users })), catchError((error) => { console.error(error); @@ -48,7 +48,7 @@ export class UserEffects { subscribeToRemoval$ = createEffect(() => this.actions$.pipe( ofType(usersLoaded), switchMap(() => { - return this.ws.subscribe('user.query').pipe( + return this.api.subscribe('user.query').pipe( filter((event) => event.msg === IncomingApiMessageType.Removed), map((event) => userRemoved({ id: event.id as number })), ); @@ -57,7 +57,7 @@ export class UserEffects { constructor( private actions$: Actions, - private ws: ApiService, + private api: ApiService, private store$: Store, private translate: TranslateService, ) {} diff --git a/src/app/pages/credentials/users/user-api-keys/components/api-key-form-dialog/api-key-form-dialog.component.ts b/src/app/pages/credentials/users/user-api-keys/components/api-key-form-dialog/api-key-form-dialog.component.ts index 80865bfbe21..ae5cf65b0fd 100644 --- a/src/app/pages/credentials/users/user-api-keys/components/api-key-form-dialog/api-key-form-dialog.component.ts +++ b/src/app/pages/credentials/users/user-api-keys/components/api-key-form-dialog/api-key-form-dialog.component.ts @@ -92,13 +92,13 @@ export class ApiKeyFormComponent implements OnInit { .setOptions({ select: ['username'], order_by: ['username'] }) .getParams(); - protected readonly usernames$ = this.ws.call('user.query', this.userQueryParams).pipe( + protected readonly usernames$ = this.api.call('user.query', this.userQueryParams).pipe( map((users) => users.map((user) => ({ label: user.username, value: user.username }))), ); protected readonly userProvider = new SimpleAsyncComboboxProvider(this.usernames$); - protected readonly forbiddenNames$ = this.ws.call('api_key.query', [ + protected readonly forbiddenNames$ = this.api.call('api_key.query', [ [], { select: ['name'], order_by: ['name'] }, ]).pipe(map((keys) => keys.map((key) => key.name))); @@ -108,7 +108,7 @@ export class ApiKeyFormComponent implements OnInit { private fb: FormBuilder, private slideInRef: SlideInRef, private matDialog: MatDialog, - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private errorHandler: FormErrorHandlerService, private authService: AuthService, @@ -137,8 +137,8 @@ export class ApiKeyFormComponent implements OnInit { const expiresAtTimestamp = nonExpiring ? null : { $date: +expiresAt } as ApiTimestamp; const request$ = this.isNew() - ? this.ws.call('api_key.create', [{ name, username, expires_at: expiresAtTimestamp }]) - : this.ws.call('api_key.update', [this.editingRow().id, { name, reset, expires_at: expiresAtTimestamp }]); + ? this.api.call('api_key.create', [{ name, username, expires_at: expiresAtTimestamp }]) + : this.api.call('api_key.update', [this.editingRow().id, { name, reset, expires_at: expiresAtTimestamp }]); request$ .pipe(this.loader.withLoader(), untilDestroyed(this)) diff --git a/src/app/pages/credentials/users/user-api-keys/components/key-created-dialog/key-created-dialog.component.ts b/src/app/pages/credentials/users/user-api-keys/components/key-created-dialog/key-created-dialog.component.ts index 66b9ab0969f..a7779139283 100644 --- a/src/app/pages/credentials/users/user-api-keys/components/key-created-dialog/key-created-dialog.component.ts +++ b/src/app/pages/credentials/users/user-api-keys/components/key-created-dialog/key-created-dialog.component.ts @@ -1,5 +1,4 @@ import { Clipboard } from '@angular/cdk/clipboard'; -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, inject, signal, } from '@angular/core'; @@ -23,7 +22,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; imports: [ ReactiveFormsModule, MatDialogTitle, - CdkScrollable, MatDialogContent, FormActionsComponent, MatDialogActions, diff --git a/src/app/pages/credentials/users/user-api-keys/user-api-keys.component.ts b/src/app/pages/credentials/users/user-api-keys/user-api-keys.component.ts index 65c46d8d645..ac30cb7e76c 100644 --- a/src/app/pages/credentials/users/user-api-keys/user-api-keys.component.ts +++ b/src/app/pages/credentials/users/user-api-keys/user-api-keys.component.ts @@ -32,7 +32,6 @@ import { yesNoColumn } from 'app/modules/ix-table/components/ix-table-body/cells import { IxTableBodyComponent } from 'app/modules/ix-table/components/ix-table-body/ix-table-body.component'; import { IxTableHeadComponent } from 'app/modules/ix-table/components/ix-table-head/ix-table-head.component'; import { IxTablePagerComponent } from 'app/modules/ix-table/components/ix-table-pager/ix-table-pager.component'; -import { IxTableDetailsRowDirective } from 'app/modules/ix-table/directives/ix-table-details-row.directive'; import { IxTableEmptyDirective } from 'app/modules/ix-table/directives/ix-table-empty.directive'; import { SortDirection } from 'app/modules/ix-table/enums/sort-direction.enum'; import { TablePagination } from 'app/modules/ix-table/interfaces/table-pagination.interface'; @@ -64,7 +63,6 @@ import { SlideInService } from 'app/services/slide-in.service'; IxTableEmptyDirective, IxTableHeadComponent, IxTableBodyComponent, - IxTableDetailsRowDirective, IxTablePagerComponent, TranslateModule, AsyncPipe, @@ -140,7 +138,7 @@ export class UserApiKeysComponent implements OnInit { pageNumber: 1, }; - private readonly apiKeys$ = this.ws.call('api_key.query').pipe(shareReplay({ bufferSize: 1, refCount: true })); + private readonly apiKeys$ = this.api.call('api_key.query').pipe(shareReplay({ bufferSize: 1, refCount: true })); protected readonly nameSuggestions$ = this.apiKeys$.pipe( map((keys) => uniq(keys.map((key) => ({ label: key.name, value: key.name })))), @@ -153,7 +151,7 @@ export class UserApiKeysComponent implements OnInit { constructor( protected emptyService: EmptyService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private dialog: DialogService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, @@ -163,7 +161,7 @@ export class UserApiKeysComponent implements OnInit { ) { } ngOnInit(): void { - this.dataProvider = new ApiDataProvider(this.ws, 'api_key.query'); + this.dataProvider = new ApiDataProvider(this.api, 'api_key.query'); this.dataProvider.paginationStrategy = new PaginationServerSide(); this.dataProvider.sortingStrategy = new SortingServerSide(); this.setDefaultSort(); @@ -197,7 +195,7 @@ export class UserApiKeysComponent implements OnInit { }).pipe( filter(Boolean), tap(() => this.loader.open()), - switchMap(() => this.ws.call('api_key.delete', [apiKey.id])), + switchMap(() => this.api.call('api_key.delete', [apiKey.id])), untilDestroyed(this), ).subscribe({ next: () => this.dataProvider.load(), diff --git a/src/app/pages/credentials/users/user-details-row/delete-user-dialog/delete-user-dialog.component.ts b/src/app/pages/credentials/users/user-details-row/delete-user-dialog/delete-user-dialog.component.ts index 78bf588ae0e..5a4f521776a 100644 --- a/src/app/pages/credentials/users/user-details-row/delete-user-dialog/delete-user-dialog.component.ts +++ b/src/app/pages/credentials/users/user-details-row/delete-user-dialog/delete-user-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, } from '@angular/core'; @@ -31,7 +30,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxCheckboxComponent, TestOverrideDirective, @@ -55,7 +53,7 @@ export class DeleteUserDialogComponent implements OnInit { constructor( private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, @Inject(MAT_DIALOG_DATA) public user: User, private dialogRef: MatDialogRef, @@ -69,7 +67,7 @@ export class DeleteUserDialogComponent implements OnInit { } onDelete(): void { - this.ws.call('user.delete', [this.user.id, { delete_group: this.deleteGroupCheckbox.value }]) + this.api.call('user.delete', [this.user.id, { delete_group: this.deleteGroupCheckbox.value }]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), @@ -82,7 +80,7 @@ export class DeleteUserDialogComponent implements OnInit { } private checkIfLastGroupMember(): void { - this.ws.call('group.query', [[['id', '=', this.user.group.id]]]) + this.api.call('group.query', [[['id', '=', this.user.group.id]]]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/credentials/users/user-form/user-form.component.spec.ts b/src/app/pages/credentials/users/user-form/user-form.component.spec.ts index c1f5706e7ac..246de34146f 100644 --- a/src/app/pages/credentials/users/user-form/user-form.component.spec.ts +++ b/src/app/pages/credentials/users/user-form/user-form.component.spec.ts @@ -63,7 +63,7 @@ describe('UserFormComponent', () => { const builtinUser = { ...mockUser, builtin: true, immutable: true }; let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: UserFormComponent, imports: [ @@ -115,7 +115,7 @@ describe('UserFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); spectator.component.setupForm(); }); @@ -123,13 +123,13 @@ describe('UserFormComponent', () => { const uidInput = await loader.getHarness(IxInputHarness.with({ label: 'UID' })); const value = await uidInput.getValue(); - expect(ws.call).toHaveBeenCalledWith('user.get_next_uid'); + expect(api.call).toHaveBeenCalledWith('user.get_next_uid'); expect(value).toBe('1234'); }); it('loads home share path and puts it in home field', async () => { const homeInput = await loader.getHarness(IxExplorerHarness.with({ label: 'Home Directory' })); - expect(ws.call).toHaveBeenCalledWith('sharing.smb.query', [[['enabled', '=', true], ['home', '=', true]]]); + expect(api.call).toHaveBeenCalledWith('sharing.smb.query', [[['enabled', '=', true], ['home', '=', true]]]); expect(await homeInput.getValue()).toBe('/mnt/users'); const usernameInput = await loader.getHarness(IxInputHarness.with({ label: 'Username' })); @@ -153,7 +153,7 @@ describe('UserFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('user.create', [expect.objectContaining({ + expect(api.call).toHaveBeenCalledWith('user.create', [expect.objectContaining({ full_name: 'John Smith', group_create: true, password: 'test-pass', @@ -185,7 +185,7 @@ describe('UserFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); spectator.component.setupForm(); }); @@ -204,7 +204,7 @@ describe('UserFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('user.update', [69, expect.objectContaining({ + expect(api.call).toHaveBeenCalledWith('user.update', [69, expect.objectContaining({ password: 'changepwd', })]); }); @@ -278,11 +278,11 @@ describe('UserFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('user.update', [ + expect(api.call).toHaveBeenCalledWith('user.update', [ 69, { home: '/home/updated', home_create: true }, ]); - expect(ws.call).toHaveBeenLastCalledWith('user.update', [ + expect(api.call).toHaveBeenLastCalledWith('user.update', [ 69, { email: null, @@ -312,7 +312,7 @@ describe('UserFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); spectator.component.setupForm(); }); diff --git a/src/app/pages/credentials/users/user-form/user-form.component.ts b/src/app/pages/credentials/users/user-form/user-form.component.ts index 4a683155905..59e0eb2397b 100644 --- a/src/app/pages/credentials/users/user-form/user-form.component.ts +++ b/src/app/pages/credentials/users/user-form/user-form.component.ts @@ -172,7 +172,7 @@ export class UserFormComponent implements OnInit { smbBuiltin: helptextUsers.smbBuiltin, }; - readonly groupOptions$ = this.ws.call('group.query').pipe( + readonly groupOptions$ = this.api.call('group.query').pipe( map((groups) => groups.map((group) => ({ label: group.group, value: group.id }))), ); @@ -217,7 +217,7 @@ export class UserFormComponent implements OnInit { } constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private fb: FormBuilder, @@ -353,7 +353,7 @@ export class UserFormComponent implements OnInit { let request$: Observable; let nextRequest$: Observable; if (this.isNewUser) { - request$ = this.ws.call('user.create', [{ + request$ = this.api.call('user.create', [{ ...body, group_create: values.group_create, password: values.password, @@ -365,19 +365,19 @@ export class UserFormComponent implements OnInit { body.password = values.password; } if (body.home_create) { - request$ = this.ws.call('user.update', [this.editingUser.id, { home_create: true, home: body.home }]); + request$ = this.api.call('user.update', [this.editingUser.id, { home_create: true, home: body.home }]); delete body.home_create; delete body.home; - nextRequest$ = this.ws.call('user.update', [this.editingUser.id, body]); + nextRequest$ = this.api.call('user.update', [this.editingUser.id, body]); } else { - request$ = this.ws.call('user.update', [this.editingUser.id, body]); + request$ = this.api.call('user.update', [this.editingUser.id, body]); } } request$.pipe( switchMap((id) => nextRequest$ || of(id)), filter(Boolean), - switchMap((id) => this.ws.call('user.query', [[['id', '=', id]]])), + switchMap((id) => this.api.call('user.query', [[['id', '=', id]]])), map((users) => users[0]), untilDestroyed(this), ).subscribe({ @@ -478,7 +478,7 @@ export class UserFormComponent implements OnInit { } private setHomeSharePath(): void { - this.ws.call('sharing.smb.query', [[ + this.api.call('sharing.smb.query', [[ ['enabled', '=', true], ['home', '=', true], ]]).pipe( @@ -491,13 +491,13 @@ export class UserFormComponent implements OnInit { } private setNextUserId(): void { - this.ws.call('user.get_next_uid').pipe(untilDestroyed(this)).subscribe((nextUid) => { + this.api.call('user.get_next_uid').pipe(untilDestroyed(this)).subscribe((nextUid) => { this.form.patchValue({ uid: nextUid }); }); } private setFirstShellOption(): void { - this.ws.call('user.shell_choices', [this.form.value.groups]).pipe( + this.api.call('user.shell_choices', [this.form.value.groups]).pipe( choicesToOptions(), filter((shells) => !!shells.length), map((shells) => shells[0].value), @@ -538,7 +538,7 @@ export class UserFormComponent implements OnInit { ids.add(group); } - this.ws.call('user.shell_choices', [Array.from(ids)]) + this.api.call('user.shell_choices', [Array.from(ids)]) .pipe(choicesToOptions(), take(1), untilDestroyed(this)) .subscribe((options) => { this.shellOptions$ = of(options); diff --git a/src/app/pages/dashboard/services/dashboard.store.ts b/src/app/pages/dashboard/services/dashboard.store.ts index 1a6689dcede..9f34dc6ea52 100644 --- a/src/app/pages/dashboard/services/dashboard.store.ts +++ b/src/app/pages/dashboard/services/dashboard.store.ts @@ -51,7 +51,7 @@ export class DashboardStore extends ComponentStore { constructor( private authService: AuthService, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private store$: Store, ) { @@ -92,7 +92,7 @@ export class DashboardStore extends ComponentStore { save(groups: WidgetGroup[]): Observable { this.toggleLoadingState(true); - return this.ws.call('auth.set_attribute', ['dashState', groups]).pipe( + return this.api.call('auth.set_attribute', ['dashState', groups]).pipe( switchMap(() => this.authService.refreshUser()), finalize(() => this.toggleLoadingState(false)), ); diff --git a/src/app/pages/dashboard/services/widget-resources.service.ts b/src/app/pages/dashboard/services/widget-resources.service.ts index 15db6d7c873..fb22263c905 100644 --- a/src/app/pages/dashboard/services/widget-resources.service.ts +++ b/src/app/pages/dashboard/services/widget-resources.service.ts @@ -35,20 +35,20 @@ import { waitForSystemInfo } from 'app/store/system-info/system-info.selectors'; }) export class WidgetResourcesService { // TODO: nosub is emitted for some reason - readonly realtimeUpdates$ = this.ws.subscribe('reporting.realtime'); + readonly realtimeUpdates$ = this.api.subscribe('reporting.realtime'); readonly refreshInterval$ = timer(0, 5000); private readonly triggerRefreshSystemInfo$ = new Subject(); readonly backups$ = forkJoin([ - this.ws.call('replication.query'), - this.ws.call('rsynctask.query'), - this.ws.call('cloudsync.query'), + this.api.call('replication.query'), + this.api.call('rsynctask.query'), + this.api.call('cloudsync.query'), ]).pipe( shareReplay({ bufferSize: 1, refCount: true }), ); - readonly systemInfo$ = this.ws.call('webui.main.dashboard.sys_info').pipe( + readonly systemInfo$ = this.api.call('webui.main.dashboard.sys_info').pipe( repeat({ delay: () => this.triggerRefreshSystemInfo$ }), debounceTime(300), toLoadingState(), @@ -62,13 +62,13 @@ export class WidgetResourcesService { shareReplay({ bufferSize: 1, refCount: true }), ); - readonly networkInterfaces$ = this.ws.call('interface.query').pipe( + readonly networkInterfaces$ = this.api.call('interface.query').pipe( map((interfaces) => processNetworkInterfaces(interfaces)), toLoadingState(), shareReplay({ bufferSize: 1, refCount: true }), ); - readonly installedApps$ = this.ws.callAndSubscribe('app.query').pipe( + readonly installedApps$ = this.api.callAndSubscribe('app.query').pipe( shareReplay({ bufferSize: 1, refCount: true }), ); @@ -77,11 +77,11 @@ export class WidgetResourcesService { ); readonly volumesData$ = this.pools$.pipe( - switchMap(() => this.ws.call('pool.dataset.query', [[], { extra: { retrieve_children: false } }])), + switchMap(() => this.api.call('pool.dataset.query', [[], { extra: { retrieve_children: false } }])), map((datasets) => this.parseVolumeData(datasets)), ); - readonly updateAvailable$ = this.ws.call('update.check_available').pipe( + readonly updateAvailable$ = this.api.call('update.check_available').pipe( map((update) => update.status === SystemUpdateStatus.Available), catchError(() => of(false)), shareReplay({ refCount: false, bufferSize: 1 }), @@ -104,7 +104,7 @@ export class WidgetResourcesService { const end = Math.floor(serverTime.getTime() / 1000); const start = Math.floor(subMinutes(serverTime, minutes).getTime() / 1000); - return this.ws.call('reporting.netdata_get_data', [[{ name: 'cpu' }], { end, start }]); + return this.api.call('reporting.netdata_get_data', [[{ name: 'cpu' }], { end, start }]); }), shareReplay({ bufferSize: 1, refCount: true }), ); @@ -116,7 +116,7 @@ export class WidgetResourcesService { switchMap((serverTime) => { const end = Math.floor(serverTime.getTime() / 1000); const start = Math.floor(subHours(serverTime, 1).getTime() / 1000); - return this.ws.call('reporting.netdata_get_data', [[{ + return this.api.call('reporting.netdata_get_data', [[{ identifier: interfaceName, name: 'interface', }], { end, start }]); @@ -133,14 +133,14 @@ export class WidgetResourcesService { } getDatasetById(datasetId: string): Observable { - return this.ws.call('pool.dataset.query', [[['id', '=', datasetId]]]).pipe( + return this.api.call('pool.dataset.query', [[['id', '=', datasetId]]]).pipe( map((response) => response[0]), shareReplay({ bufferSize: 1, refCount: true }), ); } getDisksByPoolId(poolId: string): Observable { - return this.ws.call('disk.query', [[], { extra: { pools: true } }]).pipe( + return this.api.call('disk.query', [[], { extra: { pools: true } }]).pipe( map((response) => response.filter((disk: Disk) => disk.pool === poolId)), shareReplay({ bufferSize: 1, refCount: true }), ); @@ -161,7 +161,7 @@ export class WidgetResourcesService { } getAppStats(appName: string): Observable> { - return this.ws.subscribe('app.stats').pipe( + return this.api.subscribe('app.stats').pipe( filter(() => Boolean(appName)), map((event) => event.fields.find((stats) => stats.app_name === appName)), throttleTime(500), @@ -170,7 +170,7 @@ export class WidgetResourcesService { } getAppStatusUpdates(appName: string): Observable> { - return this.ws.subscribe('core.get_jobs').pipe( + return this.api.subscribe('core.get_jobs').pipe( filter((event) => ['app.start', 'app.stop'].includes(event.fields.method)), filter((event: ApiEvent>) => event.fields.arguments[0] === appName), map((event) => event.fields), @@ -179,7 +179,7 @@ export class WidgetResourcesService { } constructor( - private ws: ApiService, + private api: ApiService, private store$: Store, ) {} diff --git a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.spec.ts b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.spec.ts index 7cc5046001d..77603dfcbb0 100644 --- a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.spec.ts +++ b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.spec.ts @@ -1,4 +1,3 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { Spectator, createComponentFactory } from '@ngneat/spectator/jest'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; import { BackupTaskEmptyComponent } from './backup-task-empty.component'; @@ -7,7 +6,6 @@ describe('BackupTaskEmptyComponent', () => { let spectator: Spectator; const createComponent = createComponentFactory({ component: BackupTaskEmptyComponent, - schemas: [CUSTOM_ELEMENTS_SCHEMA], providers: [ mockAuth(), ], diff --git a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.ts b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.ts index 06fdbbfd02f..4682bf751ca 100644 --- a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.ts +++ b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-empty/backup-task-empty.component.ts @@ -20,11 +20,11 @@ import { BackupTaskActionsComponent } from 'app/pages/dashboard/widgets/backup/w standalone: true, imports: [ IxIconComponent, - NgTemplateOutlet, RequiresRolesDirective, TestDirective, NgxSkeletonLoaderModule, TranslateModule, + NgTemplateOutlet, ], }) export class BackupTaskEmptyComponent { diff --git a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-tile/backup-task-tile.component.ts b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-tile/backup-task-tile.component.ts index 2abb464cb68..b25c15cb35e 100644 --- a/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-tile/backup-task-tile.component.ts +++ b/src/app/pages/dashboard/widgets/backup/widget-backup/backup-task-tile/backup-task-tile.component.ts @@ -15,10 +15,10 @@ import { BackupTaskActionsComponent } from 'app/pages/dashboard/widgets/backup/w changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - NgTemplateOutlet, IxIconComponent, TranslateModule, FormatDateTimePipe, + NgTemplateOutlet, ], }) export class BackupTaskTileComponent { diff --git a/src/app/pages/dashboard/widgets/backup/widget-backup/widget-backup.component.ts b/src/app/pages/dashboard/widgets/backup/widget-backup/widget-backup.component.ts index 4e6518b22f3..5988564a332 100644 --- a/src/app/pages/dashboard/widgets/backup/widget-backup/widget-backup.component.ts +++ b/src/app/pages/dashboard/widgets/backup/widget-backup/widget-backup.component.ts @@ -62,10 +62,10 @@ interface BackupRow { MatGridList, MatGridTile, BackupTaskTileComponent, - NgTemplateOutlet, BackupTaskEmptyComponent, BackupTaskActionsComponent, TranslateModule, + NgTemplateOutlet, ], }) export class WidgetBackupComponent implements OnInit { diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.ts index 4b33ae7d97c..539c3debd5b 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-card/cloud-backup-card.component.ts @@ -136,7 +136,7 @@ export class CloudBackupCardComponent implements OnInit { constructor( private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private chainedSlideInService: ChainedSlideInService, private dialogService: DialogService, @@ -149,7 +149,7 @@ export class CloudBackupCardComponent implements OnInit { ) {} ngOnInit(): void { - const cloudBackups$ = this.ws.call('cloud_backup.query').pipe( + const cloudBackups$ = this.api.call('cloud_backup.query').pipe( tap((cloudBackups) => this.cloudBackups = cloudBackups), ); this.dataProvider = new AsyncDataProvider(cloudBackups$); @@ -179,7 +179,7 @@ export class CloudBackupCardComponent implements OnInit { tapOnce(() => { this.snackbar.success(this.translate.instant('Cloud Backup «{name}» has started.', { name: row.description })); }), - switchMap(() => this.ws.job('cloud_backup.sync', [row.id])), + switchMap(() => this.api.job('cloud_backup.sync', [row.id])), untilDestroyed(this), ).subscribe({ next: (job: Job) => { @@ -213,7 +213,7 @@ export class CloudBackupCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('cloud_backup.delete', [row.id]).pipe(this.appLoader.withLoader())), + switchMap(() => this.api.call('cloud_backup.delete', [row.id]).pipe(this.appLoader.withLoader())), untilDestroyed(this), ).subscribe({ next: () => { @@ -226,7 +226,7 @@ export class CloudBackupCardComponent implements OnInit { } private onChangeEnabledState(cloudBackup: CloudBackup): void { - this.ws + this.api .call('cloud_backup.update', [cloudBackup.id, { enabled: !cloudBackup.enabled } as CloudBackupUpdate]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-details.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-details.component.ts index a4dd8a1aadb..4e0e0841e2f 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-details.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-details.component.ts @@ -4,8 +4,6 @@ import { import { TranslateModule } from '@ngx-translate/core'; import { CloudBackup } from 'app/interfaces/cloud-backup.interface'; import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { TestDirective } from 'app/modules/test-id/test.directive'; import { CloudBackupExcludedPathsComponent } from './cloud-backup-excluded-paths/cloud-backup-excluded-paths.component'; import { CloudBackupScheduleComponent } from './cloud-backup-schedule/cloud-backup-schedule.component'; import { CloudBackupSnapshotsComponent } from './cloud-backup-snapshots/cloud-backup-snapshots.component'; @@ -18,8 +16,6 @@ import { CloudBackupStatsComponent } from './cloud-backup-stats/cloud-backup-sta changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - TestDirective, - IxIconComponent, CloudBackupScheduleComponent, CloudBackupStatsComponent, CloudBackupExcludedPathsComponent, diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts index 55bb3ca230b..ef33831f2fb 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-restore-form-snapshot-form/cloud-backup-restore-from-snapshot-form.component.ts @@ -110,7 +110,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { constructor( private translate: TranslateService, private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private snackbar: SnackbarService, private errorHandler: FormErrorHandlerService, @@ -133,7 +133,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { const params = this.prepareParams(); this.dialogService.jobDialog( - this.ws.job('cloud_backup.restore', params), + this.api.job('cloud_backup.restore', params), { title: this.translate.instant('Restoring backup'), canMinimize: true, @@ -157,7 +157,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit { getSnapshotNodeProvider(): TreeNodeProvider { return (node: TreeNode) => { - return this.ws.call( + return this.api.call( 'cloud_backup.list_snapshot_directory', [this.data.backup.id, this.data.snapshot?.id, node.data.path], ).pipe( diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-snapshots/cloud-backup-snapshots.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-snapshots/cloud-backup-snapshots.component.ts index 449d5cb5719..6c5577ac87f 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-snapshots/cloud-backup-snapshots.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-snapshots/cloud-backup-snapshots.component.ts @@ -99,7 +99,7 @@ export class CloudBackupSnapshotsComponent implements OnChanges { protected emptyService: EmptyService, private slideIn: SlideInService, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private dialog: DialogService, private errorHandler: ErrorHandlerService, private loader: AppLoaderService, @@ -111,7 +111,7 @@ export class CloudBackupSnapshotsComponent implements OnChanges { return; } - const cloudBackupSnapshots$ = this.ws.call('cloud_backup.list_snapshots', [this.backup.id]).pipe( + const cloudBackupSnapshots$ = this.api.call('cloud_backup.list_snapshots', [this.backup.id]).pipe( map((snapshots) => [...snapshots].sort((a, b) => b.time.$date - a.time.$date)), untilDestroyed(this), ); @@ -152,7 +152,7 @@ export class CloudBackupSnapshotsComponent implements OnChanges { }) .pipe( filter(Boolean), - switchMap(() => this.ws.job('cloud_backup.delete_snapshot', [this.backup.id, row.id])), + switchMap(() => this.api.job('cloud_backup.delete_snapshot', [this.backup.id, row.id])), tapOnce(() => this.loader.open()), catchError((error) => { this.dialog.error(this.errorHandler.parseError(error)); diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.html b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.html index 3d67ffaaace..2cb65573972 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.html +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.html @@ -11,7 +11,10 @@

{{ 'Bucket' | translate }}: {{ backup().attributes.bucket || '-' }}

{{ 'Folder' | translate }}: {{ backup().attributes.folder || '-' }}

{{ 'Keep Last' | translate }}: {{ backup().keep_last || '-' }}

-

{{ 'Transfers' | translate }}: {{ backup().transfers || '-' }}

+

+ {{ 'Transfer Setting' | translate }}: + {{ (backup().transfer_setting | mapValue: cloudsyncTransferSettingLabels) || '-' }} +

{{ 'Post Script' | translate }}: {{ backup().post_script || '-' }}

{{ 'Pre Script' | translate }}: {{ backup().pre_script || '-' }}

diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.spec.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.spec.ts index 1cbb5fe0be2..efcf7bec43f 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.spec.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.spec.ts @@ -1,6 +1,10 @@ import { createComponentFactory, Spectator } from '@ngneat/spectator/jest'; +import { CloudsyncTransferSetting } from 'app/enums/cloudsync-transfer-setting.enum'; import { CloudBackup } from 'app/interfaces/cloud-backup.interface'; -import { CloudBackupStatsComponent } from 'app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component'; +import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; +import { + CloudBackupStatsComponent, +} from 'app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component'; const testBackup = { path: '/mnt/test', @@ -9,19 +13,22 @@ const testBackup = { attributes: { folder: '/ix', bucket: 'ixsystems', - }, - transfers: 22, + } as Record, keep_last: 5, credentials: { name: 'Storj', }, -} as unknown as CloudBackup; + transfer_setting: CloudsyncTransferSetting.FastStorage, +} as CloudBackup; describe('CloudBackupStatsComponent', () => { let spectator: Spectator; const createComponent = createComponentFactory({ component: CloudBackupStatsComponent, + imports: [ + MapValuePipe, + ], providers: [], }); @@ -46,7 +53,7 @@ describe('CloudBackupStatsComponent', () => { expect(chartExtra[2]).toHaveText('Bucket: ixsystems'); expect(chartExtra[3]).toHaveText('Folder: /ix'); expect(chartExtra[4]).toHaveText('Keep Last: 5'); - expect(chartExtra[5]).toHaveText('Transfers: 22'); + expect(chartExtra[5]).toHaveText('Transfer Setting: Fast Storage'); expect(chartExtra[6]).toHaveText('Post Script: test'); expect(chartExtra[7]).toHaveText('Pre Script: test'); }); diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.ts index 8cf7b961ab7..d32af789de7 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-details/cloud-backup-stats/cloud-backup-stats.component.ts @@ -5,7 +5,9 @@ import { MatCard, MatCardHeader, MatCardTitle, MatCardContent, } from '@angular/material/card'; import { TranslateModule } from '@ngx-translate/core'; +import { cloudsyncTransferSettingLabels } from 'app/enums/cloudsync-transfer-setting.enum'; import { CloudBackup } from 'app/interfaces/cloud-backup.interface'; +import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; @Component({ selector: 'ix-cloud-backup-stats', @@ -19,8 +21,10 @@ import { CloudBackup } from 'app/interfaces/cloud-backup.interface'; MatCardTitle, MatCardContent, TranslateModule, + MapValuePipe, ], }) export class CloudBackupStatsComponent { readonly backup = input.required(); + protected readonly cloudsyncTransferSettingLabels = cloudsyncTransferSettingLabels; } diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.html b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.html index 529fca185ab..bc6dcc81d94 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.html +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.html @@ -138,17 +138,12 @@ class="fieldset" [title]="helptext.fieldset_advanced_remote_options | translate" > - - + diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.spec.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.spec.ts index 791055d8087..1bff71438df 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.spec.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.spec.ts @@ -7,6 +7,7 @@ import { of } from 'rxjs'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; import { CloudSyncProviderName } from 'app/enums/cloudsync-provider.enum'; +import { CloudsyncTransferSetting } from 'app/enums/cloudsync-transfer-setting.enum'; import { CloudBackup } from 'app/interfaces/cloud-backup.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { @@ -14,8 +15,14 @@ import { } from 'app/modules/forms/custom-selects/cloud-credentials-select/cloud-credentials-select.component'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; import { ChainedRef } from 'app/modules/slide-ins/chained-component-ref'; -import { CloudBackupFormComponent } from 'app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component'; -import { googlePhotosCreds, googlePhotosProvider, storjProvider } from 'app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.testing.utils'; +import { + CloudBackupFormComponent, +} from 'app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component'; +import { + googlePhotosCreds, + googlePhotosProvider, + storjProvider, +} from 'app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.testing.utils'; import { TransferModeExplanationComponent, } from 'app/pages/data-protection/cloudsync/transfer-mode-explanation/transfer-mode-explanation.component'; @@ -47,10 +54,9 @@ describe('CloudBackupFormComponent', () => { pre_script: '', post_script: '', snapshot: false, - bwlimit: [], include: [], exclude: [], - transfers: 5, + transfer_setting: CloudsyncTransferSetting.Performance, args: '', enabled: true, job: null, @@ -88,6 +94,12 @@ describe('CloudBackupFormComponent', () => { mockApi([ mockCall('cloud_backup.create', existingTask), mockCall('cloud_backup.update', existingTask), + mockCall('cloudsync.create_bucket'), + mockCall('cloud_backup.transfer_setting_choices', [ + CloudsyncTransferSetting.Default, + CloudsyncTransferSetting.Performance, + CloudsyncTransferSetting.FastStorage, + ]), ]), mockProvider(ChainedSlideInService, { open: jest.fn(() => of()), @@ -128,7 +140,6 @@ describe('CloudBackupFormComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('cloud_backup.create', [{ args: '', attributes: { folder: '/', bucket: 'brand-new-bucket' }, - bwlimit: [], credentials: 2, description: 'Cloud Backup Task With New Bucket', enabled: true, @@ -147,7 +158,7 @@ describe('CloudBackupFormComponent', () => { month: '*', }, snapshot: false, - transfers: null, + transfer_setting: CloudsyncTransferSetting.Default, }]); expect(chainedComponentRef.close).toHaveBeenCalledWith({ response: existingTask, error: null }); }); @@ -162,10 +173,10 @@ describe('CloudBackupFormComponent', () => { 'Keep Last': 3, Folder: '/', Enabled: false, - Transfers: 22, Bucket: 'bucket1', 'Take Snapshot': true, Exclude: ['/test'], + 'Transfer Setting': 'Fast Storage', }); const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); @@ -174,7 +185,6 @@ describe('CloudBackupFormComponent', () => { expect(spectator.inject(ApiService).call).toHaveBeenLastCalledWith('cloud_backup.create', [{ args: '', attributes: { folder: '/', bucket: 'path_to_bucket1' }, - bwlimit: [], credentials: 2, description: 'New Cloud Backup Task', enabled: false, @@ -193,7 +203,7 @@ describe('CloudBackupFormComponent', () => { month: '*', }, snapshot: true, - transfers: 22, + transfer_setting: CloudsyncTransferSetting.FastStorage, }]); expect(chainedComponentRef.close).toHaveBeenCalledWith({ response: existingTask, error: null }); }); @@ -215,7 +225,6 @@ describe('CloudBackupFormComponent', () => { it('shows values for an existing cloud backup task when it is open for edit', async () => { const form = await loader.getHarness(IxFormHarness); expect(await form.getValues()).toEqual({ - 'Bandwidth Limit': [], Bucket: '', Credentials: 'Storj iX (Storj)', Enabled: true, @@ -229,26 +238,7 @@ describe('CloudBackupFormComponent', () => { Schedule: 'Weekly (0 0 * * sun)  On Sundays at 00:00 (12:00 AM)', 'Source Path': '/mnt/my pool', 'Take Snapshot': false, - Transfers: '5', - }); - - expect(spectator.component.form.value).toEqual({ - args: '', - bucket: '', - bwlimit: [], - credentials: 2, - description: 'sdf', - enabled: true, - exclude: [], - folder: '/My Folder', - keep_last: 2, - password: '1234', - path: '/mnt/my pool', - post_script: '', - pre_script: '', - schedule: '0 0 * * sun', - snapshot: false, - transfers: 5, + 'Transfer Setting': 'Performance', }); }); @@ -259,7 +249,6 @@ describe('CloudBackupFormComponent', () => { Password: 'qwerty123', Bucket: 'bucket1', 'Source Path': '/mnt/path1', - 'Bandwidth Limit': ['00:00,10G', '12:00,20M', '18:00,10K', '20:00,off'], }); const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); @@ -271,24 +260,6 @@ describe('CloudBackupFormComponent', () => { folder: '/My Folder', bucket: 'path_to_bucket1', }, - bwlimit: [ - { - bandwidth: '10737418240', - time: '00:00', - }, - { - bandwidth: '20971520', - time: '12:00', - }, - { - bandwidth: '10240', - time: '18:00', - }, - { - bandwidth: null, - time: '20:00', - }, - ], credentials: 2, description: 'Edited description', enabled: true, @@ -307,7 +278,7 @@ describe('CloudBackupFormComponent', () => { month: '*', }, snapshot: false, - transfers: 5, + transfer_setting: CloudsyncTransferSetting.Performance, }]); expect(chainedComponentRef.close).toHaveBeenCalledWith({ response: existingTask, error: null }); }); diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.ts index 7a8c032d126..8d3a485621e 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-form/cloud-backup-form.component.ts @@ -12,10 +12,10 @@ import { } from 'rxjs'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { CloudSyncProviderName } from 'app/enums/cloudsync-provider.enum'; +import { CloudsyncTransferSetting, cloudsyncTransferSettingLabels } from 'app/enums/cloudsync-transfer-setting.enum'; import { ExplorerNodeType } from 'app/enums/explorer-type.enum'; import { Role } from 'app/enums/role.enum'; -import { prepareBwlimit } from 'app/helpers/bwlimit.utils'; -import { buildNormalizedFileSize } from 'app/helpers/file-size.utils'; +import { mapToOptions } from 'app/helpers/options.helper'; import { helptextCloudBackup } from 'app/helptext/data-protection/cloud-backup/cloud-backup'; import { CloudBackup, CloudBackupUpdate } from 'app/interfaces/cloud-backup.interface'; import { SelectOption, newOption } from 'app/interfaces/option.interface'; @@ -94,7 +94,7 @@ export class CloudBackupFormComponent implements OnInit { disabled: false, }; - form = this.fb.group({ + protected form = this.fb.group({ path: ['', [Validators.required]], credentials: [null as number, [Validators.required]], schedule: [CronPresetValue.Daily, [Validators.required]], @@ -103,8 +103,7 @@ export class CloudBackupFormComponent implements OnInit { post_script: [''], description: ['', [Validators.required]], snapshot: [false], - bwlimit: [[] as string[]], - transfers: [null as number], + transfer_setting: [CloudsyncTransferSetting.Default], args: [''], enabled: [true], password: ['', [Validators.required]], @@ -119,6 +118,12 @@ export class CloudBackupFormComponent implements OnInit { editingTask: CloudBackup; bucketOptions$ = of([]); + transferSettings$ = this.api.call('cloud_backup.transfer_setting_choices').pipe( + map((availableSettings) => { + const allOptions = mapToOptions(cloudsyncTransferSettingLabels, this.translate); + return allOptions.filter((option) => availableSettings.includes(option.value as CloudsyncTransferSetting)); + }), + ); fileNodeProvider: TreeNodeProvider; bucketNodeProvider: TreeNodeProvider; @@ -132,7 +137,7 @@ export class CloudBackupFormComponent implements OnInit { constructor( private translate: TranslateService, private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, private snackbar: SnackbarService, @@ -241,7 +246,7 @@ export class CloudBackupFormComponent implements OnInit { delete data.attributes.bucket; } - return this.ws.call('cloudsync.list_directory', [data]).pipe( + return this.api.call('cloudsync.list_directory', [data]).pipe( map((listing) => { const nodes: ExplorerNodeData[] = []; @@ -270,22 +275,17 @@ export class CloudBackupFormComponent implements OnInit { credentials: this.editingTask.credentials.id, folder: this.editingTask.attributes.folder as string, bucket: this.editingTask.attributes.bucket === newOption ? '' : this.editingTask.attributes.bucket as string || '', - bwlimit: this.editingTask.bwlimit.map((bwlimit) => { - return bwlimit.bandwidth - ? `${bwlimit.time}, ${buildNormalizedFileSize(bwlimit.bandwidth, 'B', 2)}/s` - : `${bwlimit.time}, off`; - }), }); } onSubmit(): void { const payload = this.prepareData(this.form.value); - let request$ = this.ws.call('cloud_backup.create', [payload]); + let request$ = this.api.call('cloud_backup.create', [payload]); this.isLoading = true; if (!this.isNew) { - request$ = this.ws.call('cloud_backup.update', [this.editingTask.id, payload]); + request$ = this.api.call('cloud_backup.update', [this.editingTask.id, payload]); } request$.pipe(untilDestroyed(this)).subscribe({ @@ -324,7 +324,6 @@ export class CloudBackupFormComponent implements OnInit { ...restOfValues, attributes, include: [], - bwlimit: prepareBwlimit(formValue.bwlimit), schedule: crontabToSchedule(formValue.schedule), }; diff --git a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.ts b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.ts index df473a156ea..aed1d90b639 100644 --- a/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.ts +++ b/src/app/pages/data-protection/cloud-backup/cloud-backup-list/cloud-backup-list.component.ts @@ -140,7 +140,7 @@ export class CloudBackupListComponent implements OnInit { constructor( private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private chainedSlideInService: ChainedSlideInService, private dialogService: DialogService, @@ -191,7 +191,7 @@ export class CloudBackupListComponent implements OnInit { tapOnce(() => { this.snackbar.success(this.translate.instant('Cloud Backup «{name}» has started.', { name: row.description })); }), - switchMap(() => this.ws.job('cloud_backup.sync', [row.id])), + switchMap(() => this.api.job('cloud_backup.sync', [row.id])), untilDestroyed(this), ).subscribe({ next: (job: Job) => { @@ -229,7 +229,7 @@ export class CloudBackupListComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('cloud_backup.delete', [row.id]).pipe(this.appLoader.withLoader())), + switchMap(() => this.api.call('cloud_backup.delete', [row.id]).pipe(this.appLoader.withLoader())), untilDestroyed(this), ).subscribe({ next: () => { @@ -262,7 +262,7 @@ export class CloudBackupListComponent implements OnInit { } private loadCloudBackups(id?: string): void { - const cloudBackups$ = this.ws.call('cloud_backup.query').pipe( + const cloudBackups$ = this.api.call('cloud_backup.query').pipe( tap((cloudBackups) => { this.cloudBackups = cloudBackups; @@ -280,7 +280,7 @@ export class CloudBackupListComponent implements OnInit { } private onChangeEnabledState(cloudBackup: CloudBackup): void { - this.ws + this.api .call('cloud_backup.update', [cloudBackup.id, { enabled: !cloudBackup.enabled } as CloudBackupUpdate]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts index af1b206a79d..bb3f6719202 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-form/cloudsync-form.component.ts @@ -213,7 +213,7 @@ export class CloudSyncFormComponent implements OnInit { constructor( private translate: TranslateService, private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, protected router: Router, private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, @@ -463,7 +463,7 @@ export class CloudSyncFormComponent implements OnInit { delete data.attributes.bucket; } - return this.ws.call('cloudsync.list_directory', [data]).pipe( + return this.api.call('cloudsync.list_directory', [data]).pipe( map((listing) => { const nodes: ExplorerNodeData[] = []; @@ -704,7 +704,7 @@ export class CloudSyncFormComponent implements OnInit { onDryRun(): void { const payload = this.prepareData(this.form.value); this.dialog.jobDialog( - this.ws.job('cloudsync.sync_onetime', [payload, { dry_run: true }]), + this.api.job('cloudsync.sync_onetime', [payload, { dry_run: true }]), { title: this.translate.instant(helptextCloudSync.job_dialog_title_dry_run) }, ) .afterClosed() @@ -721,9 +721,9 @@ export class CloudSyncFormComponent implements OnInit { let request$: Observable; if (this.isNew) { - request$ = this.ws.call('cloudsync.create', [payload]); + request$ = this.api.call('cloudsync.create', [payload]); } else { - request$ = this.ws.call('cloudsync.update', [this.editingTask.id, payload]); + request$ = this.api.call('cloudsync.update', [this.editingTask.id, payload]); } request$.pipe(untilDestroyed(this)).subscribe({ diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.ts index 653a462af1e..42f844b499b 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-list/cloudsync-list.component.ts @@ -160,7 +160,7 @@ export class CloudSyncListComponent implements OnInit { constructor( private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private taskService: TaskService, private chainedSlideIn: ChainedSlideInService, @@ -173,7 +173,7 @@ export class CloudSyncListComponent implements OnInit { ) {} ngOnInit(): void { - const cloudSyncTasks$ = this.ws.call('cloudsync.query').pipe( + const cloudSyncTasks$ = this.api.call('cloudsync.query').pipe( map((cloudSyncTasks) => this.transformCloudSyncData(cloudSyncTasks)), tap((cloudSyncTasks) => this.cloudSyncTasks = cloudSyncTasks), ); @@ -196,7 +196,7 @@ export class CloudSyncListComponent implements OnInit { }).pipe( filter(Boolean), tap(() => this.updateRowStateAndJob(row, JobState.Running, row.job)), - switchMap(() => this.ws.job('cloudsync.sync', [row.id])), + switchMap(() => this.api.job('cloudsync.sync', [row.id])), tapOnce(() => this.snackbar.success( this.translate.instant('Cloud Sync «{name}» has started.', { name: row.description }), )), @@ -222,7 +222,7 @@ export class CloudSyncListComponent implements OnInit { .pipe( filter(Boolean), switchMap(() => { - return this.ws.call('cloudsync.abort', [row.id]).pipe( + return this.api.call('cloudsync.abort', [row.id]).pipe( this.errorHandler.catchError(), ); }), @@ -242,7 +242,7 @@ export class CloudSyncListComponent implements OnInit { hideCheckbox: true, }).pipe( filter(Boolean), - switchMap(() => this.ws.job('cloudsync.sync', [row.id, { dry_run: true }])), + switchMap(() => this.api.job('cloudsync.sync', [row.id, { dry_run: true }])), tapOnce(() => this.snackbar.success( this.translate.instant('Cloud Sync «{name}» has started.', { name: row.description }), )), @@ -300,7 +300,7 @@ export class CloudSyncListComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('cloudsync.delete', [row.id])), + switchMap(() => this.api.call('cloudsync.delete', [row.id])), untilDestroyed(this), ).subscribe({ next: () => { diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-restore-dialog/cloudsync-restore-dialog.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-restore-dialog/cloudsync-restore-dialog.component.ts index ae9372502cf..b5e7926e99e 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-restore-dialog/cloudsync-restore-dialog.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-restore-dialog/cloudsync-restore-dialog.component.ts @@ -71,7 +71,7 @@ export class CloudSyncRestoreDialogComponent { ]); constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private filesystem: FilesystemService, private translate: TranslateService, @@ -82,7 +82,7 @@ export class CloudSyncRestoreDialogComponent { ) { } onSubmit(): void { - this.ws.call('cloudsync.restore', [this.parentTaskId, this.form.value] as CloudSyncRestoreParams) + this.api.call('cloudsync.restore', [this.parentTaskId, this.form.value] as CloudSyncRestoreParams) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.ts index a5d283775d6..4b5a8eacf18 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-task-card/cloudsync-task-card.component.ts @@ -158,7 +158,7 @@ export class CloudSyncTaskCardComponent implements OnInit { constructor( private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private slideIn: ChainedSlideInService, private cdr: ChangeDetectorRef, @@ -170,7 +170,7 @@ export class CloudSyncTaskCardComponent implements OnInit { ) {} ngOnInit(): void { - const cloudSyncTasks$ = this.ws.call('cloudsync.query').pipe( + const cloudSyncTasks$ = this.api.call('cloudsync.query').pipe( map((cloudSyncTasks: CloudSyncTaskUi[]) => this.transformCloudSyncTasks(cloudSyncTasks)), tap((cloudSyncTasks) => this.cloudSyncTasks = cloudSyncTasks), untilDestroyed(this), @@ -191,7 +191,7 @@ export class CloudSyncTaskCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('cloudsync.delete', [cloudsyncTask.id])), + switchMap(() => this.api.call('cloudsync.delete', [cloudsyncTask.id])), untilDestroyed(this), ).subscribe({ next: () => { @@ -232,7 +232,7 @@ export class CloudSyncTaskCardComponent implements OnInit { }).pipe( filter(Boolean), tap(() => this.updateRowStateAndJob(row, JobState.Running, row.job)), - switchMap(() => this.ws.job('cloudsync.sync', [row.id])), + switchMap(() => this.api.job('cloudsync.sync', [row.id])), tapOnce(() => this.snackbar.success( this.translate.instant('Cloud Sync «{name}» has started.', { name: row.description }), )), @@ -261,7 +261,7 @@ export class CloudSyncTaskCardComponent implements OnInit { .pipe( filter(Boolean), switchMap(() => { - return this.ws.call('cloudsync.abort', [row.id]).pipe( + return this.api.call('cloudsync.abort', [row.id]).pipe( this.errorHandler.catchError(), ); }), @@ -281,7 +281,7 @@ export class CloudSyncTaskCardComponent implements OnInit { hideCheckbox: true, }).pipe( filter(Boolean), - switchMap(() => this.ws.job('cloudsync.sync', [row.id, { dry_run: true }])), + switchMap(() => this.api.job('cloudsync.sync', [row.id, { dry_run: true }])), tapOnce(() => this.snackbar.success( this.translate.instant('Cloud Sync «{name}» has started.', { name: row.description }), )), @@ -337,7 +337,7 @@ export class CloudSyncTaskCardComponent implements OnInit { } private onChangeEnabledState(cloudsyncTask: CloudSyncTaskUi): void { - this.ws + this.api .call('cloudsync.update', [cloudsyncTask.id, { enabled: !cloudsyncTask.enabled } as CloudSyncTaskUpdate]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.component.ts index 6dd0aa1e780..c8e4897a1d8 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/cloudsync-wizard.component.ts @@ -55,7 +55,7 @@ export class CloudSyncWizardComponent { constructor( private chainedRef: ChainedRef, - private ws: ApiService, + private api: ApiService, private snackbarService: SnackbarService, private cdr: ChangeDetectorRef, private translate: TranslateService, @@ -64,7 +64,7 @@ export class CloudSyncWizardComponent { ) {} createTask(payload: CloudSyncTaskUpdate): Observable { - return this.ws.call('cloudsync.create', [payload]); + return this.api.call('cloudsync.create', [payload]); } onProviderSaved(credential: CloudSyncCredential): void { diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.ts index e420b8d0fa7..1169b77b4a1 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-provider/cloudsync-provider.component.ts @@ -60,7 +60,7 @@ export class CloudSyncProviderComponent implements OnInit { readonly helptext = helptext; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private chainedComponentRef: ChainedRef, private cdr: ChangeDetectorRef, @@ -108,7 +108,7 @@ export class CloudSyncProviderComponent implements OnInit { provider: this.existingCredential.provider, attributes: { ...this.existingCredential.attributes }, }; - this.ws.call('cloudsync.credentials.verify', [payload]).pipe( + this.api.call('cloudsync.credentials.verify', [payload]).pipe( untilDestroyed(this), ).subscribe({ next: (response) => { diff --git a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.ts b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.ts index 25a30871aa1..42d275108a8 100644 --- a/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.ts +++ b/src/app/pages/data-protection/cloudsync/cloudsync-wizard/steps/cloudsync-what-and-when/cloudsync-what-and-when.component.ts @@ -153,7 +153,7 @@ export class CloudSyncWhatAndWhenComponent implements OnInit, OnChanges { } constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private chainedRef: ChainedRef, private dialog: DialogService, @@ -519,7 +519,7 @@ export class CloudSyncWhatAndWhenComponent implements OnInit, OnChanges { delete data.attributes.bucket; } - return this.ws.call('cloudsync.list_directory', [data]).pipe( + return this.api.call('cloudsync.list_directory', [data]).pipe( map((listing) => { const nodes: ExplorerNodeData[] = []; diff --git a/src/app/pages/data-protection/cloudsync/create-storj-bucket-dialog/create-storj-bucket-dialog.component.ts b/src/app/pages/data-protection/cloudsync/create-storj-bucket-dialog/create-storj-bucket-dialog.component.ts index 81b0abab829..bc5cfd839fd 100644 --- a/src/app/pages/data-protection/cloudsync/create-storj-bucket-dialog/create-storj-bucket-dialog.component.ts +++ b/src/app/pages/data-protection/cloudsync/create-storj-bucket-dialog/create-storj-bucket-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, Optional, } from '@angular/core'; @@ -28,7 +27,6 @@ import { ApiService } from 'app/services/api.service'; imports: [ MatDialogTitle, ReactiveFormsModule, - CdkScrollable, MatDialogContent, IxInputComponent, FormActionsComponent, @@ -50,14 +48,14 @@ export class CreateStorjBucketDialogComponent { constructor( private formBuilder: FormBuilder, private dialogRef: MatDialogRef, - private ws: ApiService, + private api: ApiService, private appLoader: AppLoaderService, @Optional() @Inject(MAT_DIALOG_DATA) public data: { credentialsId: number }, private formErrorHandler: FormErrorHandlerService, ) {} onSubmit(): void { - this.ws.call('cloudsync.create_bucket', [this.data.credentialsId, this.form.controls.bucket.value]) + this.api.call('cloudsync.create_bucket', [this.data.credentialsId, this.form.controls.bucket.value]) .pipe( this.appLoader.withLoader(), untilDestroyed(this), diff --git a/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts b/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts index f5f8654125a..7da9085ade3 100644 --- a/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts +++ b/src/app/pages/data-protection/replication/replication-form/replication-form.component.ts @@ -96,7 +96,7 @@ export class ReplicationFormComponent implements OnInit { protected existingReplication: ReplicationTask; constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private translate: TranslateService, public formatter: IxFormatterService, @@ -167,8 +167,8 @@ export class ReplicationFormComponent implements OnInit { const payload = this.getPayload(); const operation$ = this.isNew - ? this.ws.call('replication.create', [payload]) - : this.ws.call('replication.update', [this.existingReplication.id, payload]); + ? this.api.call('replication.create', [payload]) + : this.api.call('replication.update', [this.existingReplication.id, payload]); this.isLoading = true; operation$ @@ -257,7 +257,7 @@ export class ReplicationFormComponent implements OnInit { this.authService.hasRole(this.requiredRoles).pipe( switchMap((hasRole) => { if (hasRole) { - return this.ws.call('replication.count_eligible_manual_snapshots', [payload]); + return this.api.call('replication.count_eligible_manual_snapshots', [payload]); } return of({ eligible: 0, total: 0 }); }), diff --git a/src/app/pages/data-protection/replication/replication-form/sections/source-section/source-section.component.ts b/src/app/pages/data-protection/replication/replication-form/sections/source-section/source-section.component.ts index 579bab97115..b1dd801cf86 100644 --- a/src/app/pages/data-protection/replication/replication-form/sections/source-section/source-section.component.ts +++ b/src/app/pages/data-protection/replication/replication-form/sections/source-section/source-section.component.ts @@ -77,7 +77,7 @@ export class SourceSectionComponent implements OnChanges { readonly timeOptions$ = of(this.taskService.getTimeOptions()); readonly snapshotNamingOptions$ = of(mapToOptions(snapshotNamingOptionNames, this.translate)); - readonly periodicSnapshotTasks$ = this.ws.call('pool.snapshottask.query').pipe(map((tasks) => { + readonly periodicSnapshotTasks$ = this.api.call('pool.snapshottask.query').pipe(map((tasks) => { return tasks.map((task) => { const enabledMessage = task.enabled ? this.translate.instant('Enabled') @@ -94,7 +94,7 @@ export class SourceSectionComponent implements OnChanges { protected readonly CronPresetValue = CronPresetValue; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private taskService: TaskService, private translate: TranslateService, diff --git a/src/app/pages/data-protection/replication/replication-list/replication-list.component.ts b/src/app/pages/data-protection/replication/replication-list/replication-list.component.ts index 6d8bdb45bf2..d3da3ae1948 100644 --- a/src/app/pages/data-protection/replication/replication-list/replication-list.component.ts +++ b/src/app/pages/data-protection/replication/replication-list/replication-list.component.ts @@ -172,7 +172,7 @@ export class ReplicationListComponent implements OnInit { constructor( private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private chainedSlideIn: ChainedSlideInService, private dialogService: DialogService, @@ -185,7 +185,7 @@ export class ReplicationListComponent implements OnInit { ) {} ngOnInit(): void { - const replicationTasks$ = this.ws.call('replication.query', [[], { + const replicationTasks$ = this.api.call('replication.query', [[], { extra: { check_dataset_encryption_keys: true, }, @@ -217,7 +217,7 @@ export class ReplicationListComponent implements OnInit { }).pipe( filter(Boolean), tap(() => this.updateRowStateAndJob(row, JobState.Running, row.job)), - switchMap(() => this.ws.job('replication.run', [row.id])), + switchMap(() => this.api.job('replication.run', [row.id])), untilDestroyed(this), ).subscribe({ next: (job: Job) => { @@ -271,7 +271,7 @@ export class ReplicationListComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('replication.delete', [row.id]).pipe(this.appLoader.withLoader())), + switchMap(() => this.api.call('replication.delete', [row.id]).pipe(this.appLoader.withLoader())), untilDestroyed(this), ).subscribe({ next: () => { @@ -296,7 +296,7 @@ export class ReplicationListComponent implements OnInit { downloadKeys(row: ReplicationTask): void { const fileName = `${row.name}_encryption_keys.json`; - this.ws.call('core.download', ['pool.dataset.export_keys_for_replication', [row.id], fileName]) + this.api.call('core.download', ['pool.dataset.export_keys_for_replication', [row.id], fileName]) .pipe(this.appLoader.withLoader(), untilDestroyed(this)) .subscribe({ next: ([, url]) => { @@ -317,7 +317,7 @@ export class ReplicationListComponent implements OnInit { } private onChangeEnabledState(replicationTask: ReplicationTask): void { - this.ws + this.api .call('replication.update', [replicationTask.id, { enabled: !replicationTask.enabled }]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/replication/replication-restore-dialog/replication-restore-dialog.component.ts b/src/app/pages/data-protection/replication/replication-restore-dialog/replication-restore-dialog.component.ts index fd653df053b..af5f6210014 100644 --- a/src/app/pages/data-protection/replication/replication-restore-dialog/replication-restore-dialog.component.ts +++ b/src/app/pages/data-protection/replication/replication-restore-dialog/replication-restore-dialog.component.ts @@ -53,7 +53,7 @@ export class ReplicationRestoreDialogComponent { readonly helptext = helptextReplication; constructor( - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private formBuilder: FormBuilder, private datasetService: DatasetService, @@ -63,7 +63,7 @@ export class ReplicationRestoreDialogComponent { ) {} onSubmit(): void { - this.ws.call('replication.restore', [this.parentTaskId, this.form.value]) + this.api.call('replication.restore', [this.parentTaskId, this.form.value]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts index b85954e8866..602998a471a 100644 --- a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts +++ b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.spec.ts @@ -28,7 +28,7 @@ describe('ReplicationTaskCardComponent', () => { let spectator: Spectator; let loader: HarnessLoader; let table: IxTableHarness; - let ws: ApiService; + let api: ApiService; const replicationTasks = [ { @@ -108,7 +108,7 @@ describe('ReplicationTaskCardComponent', () => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); table = await loader.getHarness(IxTableHarness); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('should show table rows', async () => { @@ -170,7 +170,7 @@ describe('ReplicationTaskCardComponent', () => { const downloadButton = await table.getHarnessInCell(IxIconHarness.with({ name: 'mdi-download' }), 1, 5); await downloadButton.click(); - expect(ws.call).toHaveBeenCalledWith('core.download', [ + expect(api.call).toHaveBeenCalledWith('core.download', [ 'pool.dataset.export_keys_for_replication', [1], 'APPS/test2 - APPS/test3_encryption_keys.json', diff --git a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.ts b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.ts index 44a5cbc0541..573811cd283 100644 --- a/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.ts +++ b/src/app/pages/data-protection/replication/replication-task-card/replication-task-card.component.ts @@ -157,7 +157,7 @@ export class ReplicationTaskCardComponent implements OnInit { private chainedSlideIn: ChainedSlideInService, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private snackbar: SnackbarService, private matDialog: MatDialog, @@ -166,7 +166,7 @@ export class ReplicationTaskCardComponent implements OnInit { ) {} ngOnInit(): void { - const replicationTasks$ = this.ws.call('replication.query', [[], { + const replicationTasks$ = this.api.call('replication.query', [[], { extra: { check_dataset_encryption_keys: true }, }]).pipe(untilDestroyed(this)); this.dataProvider = new AsyncDataProvider(replicationTasks$); @@ -185,7 +185,7 @@ export class ReplicationTaskCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('replication.delete', [replicationTask.id])), + switchMap(() => this.api.call('replication.delete', [replicationTask.id])), untilDestroyed(this), ).subscribe({ next: () => { @@ -220,7 +220,7 @@ export class ReplicationTaskCardComponent implements OnInit { }).pipe( filter(Boolean), tap(() => row.state.state = JobState.Running), - switchMap(() => this.ws.job('replication.run', [row.id])), + switchMap(() => this.api.job('replication.run', [row.id])), tapOnce(() => { this.snackbar.success( this.translate.instant('Replication «{name}» has started.', { name: row.name }), @@ -252,7 +252,7 @@ export class ReplicationTaskCardComponent implements OnInit { } downloadKeys(row: ReplicationTask): void { - this.ws.call('core.download', [ + this.api.call('core.download', [ 'pool.dataset.export_keys_for_replication', [row.id], `${row.name}_encryption_keys.json`, @@ -279,7 +279,7 @@ export class ReplicationTaskCardComponent implements OnInit { } private onChangeEnabledState(replicationTask: ReplicationTask): void { - this.ws + this.api .call('replication.update', [replicationTask.id, { enabled: !replicationTask.enabled }]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/replication/replication-wizard/replication-wizard.component.ts b/src/app/pages/data-protection/replication/replication-wizard/replication-wizard.component.ts index 997b36170ec..ae8fde9b093 100644 --- a/src/app/pages/data-protection/replication/replication-wizard/replication-wizard.component.ts +++ b/src/app/pages/data-protection/replication/replication-wizard/replication-wizard.component.ts @@ -86,7 +86,7 @@ export class ReplicationWizardComponent { createdReplication: ReplicationTask; constructor( - private ws: ApiService, + private api: ApiService, private replicationService: ReplicationService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -109,11 +109,11 @@ export class ReplicationWizardComponent { const requests: Observable[] = []; this.createdSnapshots.forEach((snapshot) => { - requests.push(this.ws.call('zfs.snapshot.delete', [snapshot.name])); + requests.push(this.api.call('zfs.snapshot.delete', [snapshot.name])); }); this.createdSnapshotTasks.forEach((task) => { - requests.push(this.ws.call('pool.snapshottask.delete', [task.id])); + requests.push(this.api.call('pool.snapshottask.delete', [task.id])); }); if (requests.length) { @@ -171,7 +171,7 @@ export class ReplicationWizardComponent { private runReplicationOnce(createdReplication: ReplicationTask): Observable { this.appLoader.open(this.translate.instant('Starting task')); - return this.ws.startJob('replication.run', [createdReplication.id]).pipe( + return this.api.startJob('replication.run', [createdReplication.id]).pipe( switchMap(() => { this.appLoader.close(); return this.dialogService.info( @@ -200,7 +200,7 @@ export class ReplicationWizardComponent { ]).pipe( switchMap((hasRole) => { if (hasRole) { - return this.ws.call('replication.count_eligible_manual_snapshots', [payload]); + return this.api.call('replication.count_eligible_manual_snapshots', [payload]); } return of({ eligible: 0, total: 0 }); }), @@ -208,19 +208,19 @@ export class ReplicationWizardComponent { } getUnmatchedSnapshots(payload: TargetUnmatchedSnapshotsParams): Observable> { - return this.ws.call('replication.target_unmatched_snapshots', payload); + return this.api.call('replication.target_unmatched_snapshots', payload); } createPeriodicSnapshotTask(payload: PeriodicSnapshotTaskCreate): Observable { - return this.ws.call('pool.snapshottask.create', [payload]); + return this.api.call('pool.snapshottask.create', [payload]); } createSnapshot(payload: CreateZfsSnapshot): Observable { - return this.ws.call('zfs.snapshot.create', [payload]); + return this.api.call('zfs.snapshot.create', [payload]); } createReplication(payload: ReplicationCreate): Observable { - return this.ws.call('replication.create', [payload]); + return this.api.call('replication.create', [payload]); } getSnapshotsCountPayload(value: ReplicationWizardData): CountManualSnapshotsParams { @@ -352,7 +352,7 @@ export class ReplicationWizardComponent { schedule: Schedule; naming_schema?: string; }): Observable { - return this.ws.call('pool.snapshottask.query', [[ + return this.api.call('pool.snapshottask.query', [[ ['dataset', '=', payload.dataset], ['schedule.minute', '=', payload.schedule.minute], ['schedule.hour', '=', payload.schedule.hour], diff --git a/src/app/pages/data-protection/replication/replication-wizard/steps/replication-what-and-where/replication-what-and-where.component.ts b/src/app/pages/data-protection/replication/replication-wizard/steps/replication-what-and-where/replication-what-and-where.component.ts index 20a779975b9..4a321b7b4fd 100644 --- a/src/app/pages/data-protection/replication/replication-wizard/steps/replication-what-and-where/replication-what-and-where.component.ts +++ b/src/app/pages/data-protection/replication/replication-wizard/steps/replication-what-and-where/replication-what-and-where.component.ts @@ -112,7 +112,7 @@ export class ReplicationWhatAndWhereComponent implements OnInit, SummaryProvider sudo: [false], name: ['', [Validators.required], forbiddenAsyncValues( - this.ws.call('replication.query').pipe( + this.api.call('replication.query').pipe( map((replications) => replications.map((replication) => replication.name)), ), ), @@ -171,7 +171,7 @@ export class ReplicationWhatAndWhereComponent implements OnInit, SummaryProvider private authService: AuthService, private datasetService: DatasetService, private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, ) {} @@ -420,7 +420,7 @@ export class ReplicationWhatAndWhereComponent implements OnInit, SummaryProvider ]).pipe( switchMap((hasRole) => { if (hasRole) { - return this.ws.call('replication.count_eligible_manual_snapshots', [payload]); + return this.api.call('replication.count_eligible_manual_snapshots', [payload]); } return of({ eligible: 0, total: 0 }); }), diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.ts b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.ts index fb8f773e124..ef51b3596b9 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.ts +++ b/src/app/pages/data-protection/rsync-task/rsync-task-card/rsync-task-card.component.ts @@ -140,7 +140,7 @@ export class RsyncTaskCardComponent implements OnInit { constructor( private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private taskService: TaskService, private store$: Store, @@ -150,7 +150,7 @@ export class RsyncTaskCardComponent implements OnInit { ) {} ngOnInit(): void { - const rsyncTasks$ = this.ws.call('rsynctask.query').pipe( + const rsyncTasks$ = this.api.call('rsynctask.query').pipe( map((rsyncTasks: RsyncTaskUi[]) => this.transformRsyncTasks(rsyncTasks)), tap((rsyncTasks) => this.rsyncTasks = rsyncTasks), untilDestroyed(this), @@ -171,7 +171,7 @@ export class RsyncTaskCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('rsynctask.delete', [row.id])), + switchMap(() => this.api.call('rsynctask.delete', [row.id])), untilDestroyed(this), ).subscribe({ next: () => { @@ -200,7 +200,7 @@ export class RsyncTaskCardComponent implements OnInit { }).pipe( filter(Boolean), tap(() => row.state = { state: JobState.Running }), - switchMap(() => this.ws.job('rsynctask.run', [row.id])), + switchMap(() => this.api.job('rsynctask.run', [row.id])), tapOnce(() => this.snackbar.success( this.translate.instant('Rsync task «{name}» has started.', { name: `${row.remotehost || row.path} ${row.remotemodule ? '- ' + row.remotemodule : ''}`, @@ -241,7 +241,7 @@ export class RsyncTaskCardComponent implements OnInit { } private onChangeEnabledState(rsyncTask: RsyncTaskUi): void { - this.ws + this.api .call('rsynctask.update', [rsyncTask.id, { enabled: !rsyncTask.enabled } as RsyncTaskUpdate]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-form/rsync-task-form.component.ts b/src/app/pages/data-protection/rsync-task/rsync-task-form/rsync-task-form.component.ts index 66f93bffb0d..ec4eedf9cbf 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-form/rsync-task-form.component.ts +++ b/src/app/pages/data-protection/rsync-task/rsync-task-form/rsync-task-form.component.ts @@ -142,7 +142,7 @@ export class RsyncTaskFormComponent implements OnInit { constructor( private translate: TranslateService, private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: FormErrorHandlerService, private userService: UserService, @@ -208,9 +208,9 @@ export class RsyncTaskFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('rsynctask.create', [values as RsyncTaskUpdate]); + request$ = this.api.call('rsynctask.create', [values as RsyncTaskUpdate]); } else { - request$ = this.ws.call('rsynctask.update', [ + request$ = this.api.call('rsynctask.update', [ this.editingTask.id, values as RsyncTaskUpdate, ]); diff --git a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.ts b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.ts index acb13b9208f..1ed22a8a7cc 100644 --- a/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.ts +++ b/src/app/pages/data-protection/rsync-task/rsync-task-list/rsync-task-list.component.ts @@ -189,7 +189,7 @@ export class RsyncTaskListComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private chainedSlideIn: ChainedSlideInService, private dialogService: DialogService, private errorHandler: ErrorHandlerService, @@ -205,7 +205,7 @@ export class RsyncTaskListComponent implements OnInit { ngOnInit(): void { this.filterString = this.route.snapshot.paramMap.get('dataset') || ''; - const request$ = this.ws.call('rsynctask.query'); + const request$ = this.api.call('rsynctask.query'); this.dataProvider = new AsyncDataProvider(request$); this.refresh(); this.dataProvider.emptyType$.pipe(untilDestroyed(this)).subscribe(() => { @@ -239,7 +239,7 @@ export class RsyncTaskListComponent implements OnInit { this.translate.instant('Rsync task has started.'), ); }), - switchMap(() => this.ws.job('rsynctask.run', [row.id])), + switchMap(() => this.api.job('rsynctask.run', [row.id])), untilDestroyed(this), ) .subscribe(() => this.refresh()); @@ -266,7 +266,7 @@ export class RsyncTaskListComponent implements OnInit { .pipe( filter(Boolean), switchMap(() => { - return this.ws.call('rsynctask.delete', [row.id]).pipe( + return this.api.call('rsynctask.delete', [row.id]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), ); diff --git a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts index ff6e41c2efb..307d5f2fe1e 100644 --- a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts +++ b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.spec.ts @@ -19,7 +19,7 @@ import { ResilverConfigComponent } from './resilver-config.component'; describe('ResilverConfigComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: ResilverConfigComponent, imports: [ @@ -48,7 +48,7 @@ describe('ResilverConfigComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads and shows current resilver settings when form is opened', async () => { @@ -75,7 +75,7 @@ describe('ResilverConfigComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.resilver.update', [{ enabled: false, diff --git a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.ts b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.ts index 2f91dd42fe8..f50841f7ba6 100644 --- a/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.ts +++ b/src/app/pages/data-protection/scrub-task/resilver-config/resilver-config.component.ts @@ -83,7 +83,7 @@ export class ResilverConfigComponent implements OnInit { constructor( private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private fb: FormBuilder, @@ -98,7 +98,7 @@ export class ResilverConfigComponent implements OnInit { ngOnInit(): void { this.isFormLoading = true; - this.ws.call('pool.resilver.config') + this.api.call('pool.resilver.config') .pipe(untilDestroyed(this)) .subscribe({ next: (config) => { @@ -118,7 +118,7 @@ export class ResilverConfigComponent implements OnInit { const values = this.form.value; this.isFormLoading = true; - this.ws.call('pool.resilver.update', [values as ResilverConfigUpdate]) + this.api.call('pool.resilver.update', [values as ResilverConfigUpdate]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.ts b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.ts index f7729516952..c13365d17e0 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.ts +++ b/src/app/pages/data-protection/scrub-task/scrub-list/scrub-list.component.ts @@ -129,7 +129,7 @@ export class ScrubListComponent implements OnInit { private translate: TranslateService, private crontabExplanation: CrontabExplanationPipe, private taskService: TaskService, - private ws: ApiService, + private api: ApiService, private slideIn: SlideInService, private dialogService: DialogService, private loader: AppLoaderService, @@ -139,7 +139,7 @@ export class ScrubListComponent implements OnInit { ) {} ngOnInit(): void { - this.dataProvider = new AsyncDataProvider(this.ws.call('pool.scrub.query')); + this.dataProvider = new AsyncDataProvider(this.api.call('pool.scrub.query')); this.dataProvider.load(); } @@ -172,7 +172,7 @@ export class ScrubListComponent implements OnInit { .pipe( filter(Boolean), switchMap(() => { - return this.ws.call('pool.scrub.delete', [row.id]).pipe( + return this.api.call('pool.scrub.delete', [row.id]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), ); diff --git a/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.ts b/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.ts index 371e21caa36..d77e700009a 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.ts +++ b/src/app/pages/data-protection/scrub-task/scrub-task-card/scrub-task-card.component.ts @@ -113,14 +113,14 @@ export class ScrubTaskCardComponent implements OnInit { private slideInService: SlideInService, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private taskService: TaskService, protected emptyService: EmptyService, ) {} ngOnInit(): void { - const scrubTasks$ = this.ws.call('pool.scrub.query'); + const scrubTasks$ = this.api.call('pool.scrub.query'); this.dataProvider = new AsyncDataProvider(scrubTasks$); this.getScrubTasks(); } @@ -135,7 +135,7 @@ export class ScrubTaskCardComponent implements OnInit { message: this.translate.instant('Delete Scrub Task "{name}"?', { name: scrubTask.pool_name }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('pool.scrub.delete', [scrubTask.id])), + switchMap(() => this.api.call('pool.scrub.delete', [scrubTask.id])), untilDestroyed(this), ).subscribe({ next: () => { @@ -156,7 +156,7 @@ export class ScrubTaskCardComponent implements OnInit { } private onChangeEnabledState(scrubTask: PoolScrubTask): void { - this.ws + this.api .call('pool.scrub.update', [scrubTask.id, { enabled: !scrubTask.enabled } as PoolScrubTask]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/scrub-task/scrub-task-form/scrub-task-form.component.ts b/src/app/pages/data-protection/scrub-task/scrub-task-form/scrub-task-form.component.ts index 886cd526888..e140856aa3a 100644 --- a/src/app/pages/data-protection/scrub-task/scrub-task-form/scrub-task-form.component.ts +++ b/src/app/pages/data-protection/scrub-task/scrub-task-form/scrub-task-form.component.ts @@ -76,7 +76,7 @@ export class ScrubTaskFormComponent implements OnInit { isLoading = false; - poolOptions$ = this.ws.call('pool.query').pipe( + poolOptions$ = this.api.call('pool.query').pipe( map((pools) => { return pools.map((pool) => ({ label: pool.name, value: pool.id })); }), @@ -93,7 +93,7 @@ export class ScrubTaskFormComponent implements OnInit { constructor( private translate: TranslateService, private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private snackbar: SnackbarService, private errorHandler: FormErrorHandlerService, @@ -123,9 +123,9 @@ export class ScrubTaskFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('pool.scrub.create', [values as CreatePoolScrubTask]); + request$ = this.api.call('pool.scrub.create', [values as CreatePoolScrubTask]); } else { - request$ = this.ws.call('pool.scrub.update', [ + request$ = this.api.call('pool.scrub.update', [ this.editingTask.id, values as CreatePoolScrubTask, ]); diff --git a/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.ts b/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.ts index eb1cd57fbf3..29d3bf3af7f 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.ts +++ b/src/app/pages/data-protection/smart-task/smart-task-card/smart-task-card.component.ts @@ -113,7 +113,7 @@ export class SmartTaskCardComponent implements OnInit { private slideInService: SlideInService, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private taskService: TaskService, private storageService: StorageService, @@ -125,7 +125,7 @@ export class SmartTaskCardComponent implements OnInit { } ngOnInit(): void { - const smartTasks$ = this.ws.call('smart.test.query').pipe( + const smartTasks$ = this.api.call('smart.test.query').pipe( map((smartTasks: SmartTestTaskUi[]) => this.transformSmartTasks(smartTasks)), tap((smartTasks) => this.smartTasks = smartTasks), untilDestroyed(this), @@ -154,7 +154,7 @@ export class SmartTaskCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('smart.test.delete', [smartTask.id])), + switchMap(() => this.api.call('smart.test.delete', [smartTask.id])), untilDestroyed(this), ).subscribe({ next: () => { diff --git a/src/app/pages/data-protection/smart-task/smart-task-form/smart-task-form.component.ts b/src/app/pages/data-protection/smart-task/smart-task-form/smart-task-form.component.ts index 6ac03cb2a18..a2cab0a7ded 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-form/smart-task-form.component.ts +++ b/src/app/pages/data-protection/smart-task/smart-task-form/smart-task-form.component.ts @@ -90,12 +90,12 @@ export class SmartTaskFormComponent implements OnInit { schedule: helptextSmart.smarttest_picker_tooltip, }; - readonly diskOptions$ = this.ws.call('smart.test.disk_choices').pipe(choicesToOptions()); + readonly diskOptions$ = this.api.call('smart.test.disk_choices').pipe(choicesToOptions()); readonly typeOptions$ = of(mapToOptions(smartTestTypeLabels, this.translate)); constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private cdr: ChangeDetectorRef, private snackbar: SnackbarService, @@ -127,9 +127,9 @@ export class SmartTaskFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('smart.test.create', [values]); + request$ = this.api.call('smart.test.create', [values]); } else { - request$ = this.ws.call('smart.test.update', [ + request$ = this.api.call('smart.test.update', [ this.editingTest.id, values, ]); diff --git a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.ts b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.ts index dbdb29dd863..f60fee91bbd 100644 --- a/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.ts +++ b/src/app/pages/data-protection/smart-task/smart-task-list/smart-task-list.component.ts @@ -122,7 +122,7 @@ export class SmartTaskListComponent implements OnInit { private taskService: TaskService, private translate: TranslateService, private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, ) { @@ -132,7 +132,7 @@ export class SmartTaskListComponent implements OnInit { } ngOnInit(): void { - const smartTasks$ = this.ws.call('smart.test.query').pipe( + const smartTasks$ = this.api.call('smart.test.query').pipe( map((smartTasks: SmartTestTaskUi[]) => this.transformSmartTasks(smartTasks)), tap((smartTasks) => this.smartTasks = smartTasks), untilDestroyed(this), @@ -175,7 +175,7 @@ export class SmartTaskListComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('smart.test.delete', [smartTask.id])), + switchMap(() => this.api.call('smart.test.delete', [smartTask.id])), untilDestroyed(this), ).subscribe({ next: () => { diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.ts b/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.ts index 67a5b8c9143..be06e047839 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.ts +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-card/snapshot-task-card.component.ts @@ -128,14 +128,14 @@ export class SnapshotTaskCardComponent implements OnInit { private slideInService: SlideInService, private translate: TranslateService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private taskService: TaskService, protected emptyService: EmptyService, ) {} ngOnInit(): void { - const snapshotTasks$ = this.ws.call('pool.snapshottask.query').pipe( + const snapshotTasks$ = this.api.call('pool.snapshottask.query').pipe( map((snapshotTasks) => snapshotTasks as PeriodicSnapshotTaskUi[]), untilDestroyed(this), ); @@ -155,7 +155,7 @@ export class SnapshotTaskCardComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('pool.snapshottask.delete', [snapshotTask.id])), + switchMap(() => this.api.call('pool.snapshottask.delete', [snapshotTask.id])), untilDestroyed(this), ).subscribe({ next: () => { @@ -176,7 +176,7 @@ export class SnapshotTaskCardComponent implements OnInit { } private onChangeEnabledState(snapshotTask: PeriodicSnapshotTaskUi): void { - this.ws + this.api .call('pool.snapshottask.update', [snapshotTask.id, { enabled: !snapshotTask.enabled } as PeriodicSnapshotTaskUi]) .pipe(untilDestroyed(this)) .subscribe({ diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-form/snapshot-task-form.component.ts b/src/app/pages/data-protection/snapshot-task/snapshot-task-form/snapshot-task-form.component.ts index bf0e0077c05..73836f83f9e 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-form/snapshot-task-form.component.ts +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-form/snapshot-task-form.component.ts @@ -122,7 +122,7 @@ export class SnapshotTaskFormComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, @@ -171,9 +171,9 @@ export class SnapshotTaskFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('pool.snapshottask.create', [params as PeriodicSnapshotTaskCreate]); + request$ = this.api.call('pool.snapshottask.create', [params as PeriodicSnapshotTaskCreate]); } else { - request$ = this.ws.call('pool.snapshottask.update', [ + request$ = this.api.call('pool.snapshottask.update', [ this.editingTask.id, params as PeriodicSnapshotTaskUpdate, ]); diff --git a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.ts b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.ts index e747c515af6..f1498b9b55c 100644 --- a/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.ts +++ b/src/app/pages/data-protection/snapshot-task/snapshot-task-list/snapshot-task-list.component.ts @@ -169,7 +169,7 @@ export class SnapshotTaskListComponent implements OnInit { constructor( protected emptyService: EmptyService, private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, private taskService: TaskService, private translate: TranslateService, private errorHandler: ErrorHandlerService, @@ -181,7 +181,7 @@ export class SnapshotTaskListComponent implements OnInit { } ngOnInit(): void { - const tasks$ = this.ws.call('pool.snapshottask.query').pipe( + const tasks$ = this.api.call('pool.snapshottask.query').pipe( tap((tasks) => { this.snapshotTasks = tasks as PeriodicSnapshotTaskUi[]; }), @@ -232,7 +232,7 @@ export class SnapshotTaskListComponent implements OnInit { }), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('pool.snapshottask.delete', [snapshotTask.id])), + switchMap(() => this.api.call('pool.snapshottask.delete', [snapshotTask.id])), untilDestroyed(this), ).subscribe({ next: () => { diff --git a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-form/vmware-snapshot-form.component.ts b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-form/vmware-snapshot-form.component.ts index 2cb487e6db6..65d88e50c4c 100644 --- a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-form/vmware-snapshot-form.component.ts +++ b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-form/vmware-snapshot-form.component.ts @@ -96,7 +96,7 @@ export class VmwareSnapshotFormComponent implements OnInit { constructor( private errorHandler: ErrorHandlerService, private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, @@ -136,7 +136,7 @@ export class VmwareSnapshotFormComponent implements OnInit { } this.isLoading = true; - this.ws.call('vmware.match_datastores_with_datasets', [{ + this.api.call('vmware.match_datastores_with_datasets', [{ hostname, username, password, @@ -183,9 +183,9 @@ export class VmwareSnapshotFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('vmware.create', [values]); + request$ = this.api.call('vmware.create', [values]); } else { - request$ = this.ws.call('vmware.update', [ + request$ = this.api.call('vmware.update', [ this.editingSnapshot.id, values, ]); diff --git a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.ts b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.ts index 5816388c9d6..f49db834c8c 100644 --- a/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.ts +++ b/src/app/pages/data-protection/vmware-snapshot/vmware-snapshot-list/vmware-snapshot-list.component.ts @@ -96,13 +96,13 @@ export class VmwareSnapshotListComponent implements OnInit { protected translate: TranslateService, private slideInService: SlideInService, protected emptyService: EmptyService, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private errorHandler: ErrorHandlerService, ) {} ngOnInit(): void { - const snapshots$ = this.ws.call('vmware.query').pipe( + const snapshots$ = this.api.call('vmware.query').pipe( tap((snapshots) => this.snapshots = snapshots), untilDestroyed(this), ); @@ -142,7 +142,7 @@ export class VmwareSnapshotListComponent implements OnInit { hideCheckbox: true, }).pipe( filter(Boolean), - switchMap(() => this.ws.call('vmware.delete', [snapshot.id])), + switchMap(() => this.api.call('vmware.delete', [snapshot.id])), untilDestroyed(this), ).subscribe({ next: () => { diff --git a/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-management-card.component.ts b/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-management-card.component.ts index 6a70cc9e3ba..53e3ecda23f 100644 --- a/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-management-card.component.ts +++ b/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-management-card.component.ts @@ -91,7 +91,7 @@ export class DatasetCapacityManagementCardComponent implements OnChanges, OnInit } constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private cdr: ChangeDetectorRef, private datasetStore: DatasetTreeStore, @@ -121,8 +121,8 @@ export class DatasetCapacityManagementCardComponent implements OnChanges, OnInit this.cdr.markForCheck(); }), switchMap(() => forkJoin([ - this.ws.call('pool.dataset.get_quota', [this.dataset.id, DatasetQuotaType.User, []]), - this.ws.call('pool.dataset.get_quota', [this.dataset.id, DatasetQuotaType.Group, []]), + this.api.call('pool.dataset.get_quota', [this.dataset.id, DatasetQuotaType.User, []]), + this.api.call('pool.dataset.get_quota', [this.dataset.id, DatasetQuotaType.Group, []]), ])), untilDestroyed(this), ).subscribe({ diff --git a/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-settings/dataset-capacity-settings.component.ts b/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-settings/dataset-capacity-settings.component.ts index eae83b8b36e..fa1aa9f5c0b 100644 --- a/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-settings/dataset-capacity-settings.component.ts +++ b/src/app/pages/datasets/components/dataset-capacity-management-card/dataset-capacity-settings/dataset-capacity-settings.component.ts @@ -103,7 +103,7 @@ export class DatasetCapacitySettingsComponent implements OnInit { } as const; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, public formatter: IxFormatterService, private cdr: ChangeDetectorRef, @@ -165,7 +165,7 @@ export class DatasetCapacitySettingsComponent implements OnInit { this.cdr.markForCheck(); const payload = this.getChangedFormValues(); - this.ws.call('pool.dataset.update', [this.dataset.id, payload]) + this.api.call('pool.dataset.update', [this.dataset.id, payload]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/datasets/components/dataset-details-card/dataset-details-card.component.ts b/src/app/pages/datasets/components/dataset-details-card/dataset-details-card.component.ts index 553d6437fc1..f8c09b490f2 100644 --- a/src/app/pages/datasets/components/dataset-details-card/dataset-details-card.component.ts +++ b/src/app/pages/datasets/components/dataset-details-card/dataset-details-card.component.ts @@ -64,7 +64,7 @@ export class DatasetDetailsCardComponent { private slideInService: SlideInService, private errorHandler: ErrorHandlerService, private router: Router, - private ws: ApiService, + private api: ApiService, private snackbar: SnackbarService, ) { } @@ -100,7 +100,7 @@ export class DatasetDetailsCardComponent { } promoteDataset(): void { - this.ws.call('pool.dataset.promote', [this.dataset().id]) + this.api.call('pool.dataset.promote', [this.dataset().id]) .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe(() => { this.snackbar.success(this.translate.instant('Dataset promoted successfully.')); diff --git a/src/app/pages/datasets/components/dataset-details-panel/dataset-details-panel.component.ts b/src/app/pages/datasets/components/dataset-details-panel/dataset-details-panel.component.ts index 5d51706c76b..85e1c5d7e71 100644 --- a/src/app/pages/datasets/components/dataset-details-panel/dataset-details-panel.component.ts +++ b/src/app/pages/datasets/components/dataset-details-panel/dataset-details-panel.component.ts @@ -14,7 +14,6 @@ import { DatasetType } from 'app/enums/dataset.enum'; import { Role } from 'app/enums/role.enum'; import { DatasetDetails } from 'app/interfaces/dataset.interface'; import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { SlideInRef } from 'app/modules/slide-ins/slide-in-ref'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { DataProtectionCardComponent } from 'app/pages/datasets/components/data-protection-card/data-protection-card.component'; @@ -42,7 +41,6 @@ import { SlideInService } from 'app/services/slide-in.service'; TestDirective, AsyncPipe, MobileBackButtonComponent, - IxIconComponent, TranslateModule, DatasetIconComponent, MatTooltip, diff --git a/src/app/pages/datasets/components/dataset-form/dataset-form.component.ts b/src/app/pages/datasets/components/dataset-form/dataset-form.component.ts index 43929af649a..d45651d5470 100644 --- a/src/app/pages/datasets/components/dataset-form/dataset-form.component.ts +++ b/src/app/pages/datasets/components/dataset-form/dataset-form.component.ts @@ -129,7 +129,7 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { } constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private dialog: DialogService, private datasetFormService: DatasetFormService, @@ -223,8 +223,8 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { const payload = this.preparePayload(); const request$ = this.isNew - ? this.ws.call('pool.dataset.create', [payload as DatasetCreate]) - : this.ws.call('pool.dataset.update', [this.existingDataset.id, payload as DatasetUpdate]); + ? this.api.call('pool.dataset.create', [payload as DatasetCreate]) + : this.api.call('pool.dataset.update', [this.existingDataset.id, payload as DatasetUpdate]); request$.pipe( switchMap((dataset) => this.createSmb(dataset)), @@ -283,7 +283,7 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { } const parentPath = `/mnt/${this.parentDataset.id}`; - return this.ws.call('filesystem.stat', [parentPath]).pipe(map((stat) => stat.acl)); + return this.api.call('filesystem.stat', [parentPath]).pipe(map((stat) => stat.acl)); } private aclDialog(): Observable { @@ -301,7 +301,7 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { if (!this.isNew || !datasetPresetFormValue.create_smb || !this.nameAndOptionsSection.canCreateSmb) { return of(dataset); } - return this.ws.call('sharing.smb.create', [{ + return this.api.call('sharing.smb.create', [{ name: datasetPresetFormValue.smb_name, path: `${mntPath}/${dataset.id}`, }]).pipe( @@ -315,7 +315,7 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { if (!this.isNew || !datasetPresetFormValue.create_nfs || !this.nameAndOptionsSection.canCreateNfs) { return of(dataset); } - return this.ws.call('sharing.nfs.create', [{ + return this.api.call('sharing.nfs.create', [{ path: `${mntPath}/${dataset.id}`, }]).pipe( switchMap(() => of(dataset)), @@ -324,7 +324,7 @@ export class DatasetFormComponent implements OnInit, AfterViewInit { } private rollBack(dataset: Dataset, error: unknown): Observable { - return this.ws.call('pool.dataset.delete', [dataset.id, { recursive: true, force: true }]).pipe( + return this.api.call('pool.dataset.delete', [dataset.id, { recursive: true, force: true }]).pipe( switchMap(() => { throw error; }), diff --git a/src/app/pages/datasets/components/dataset-form/sections/encryption-section/encryption-section.component.ts b/src/app/pages/datasets/components/dataset-form/sections/encryption-section/encryption-section.component.ts index 8b2f42561ed..7aa536864bb 100644 --- a/src/app/pages/datasets/components/dataset-form/sections/encryption-section/encryption-section.component.ts +++ b/src/app/pages/datasets/components/dataset-form/sections/encryption-section/encryption-section.component.ts @@ -75,12 +75,12 @@ export class EncryptionSectionComponent implements OnChanges, OnInit { { label: T('Passphrase'), value: DatasetEncryptionType.Passphrase }, ]); - algorithmOptions$ = this.ws.call('pool.dataset.encryption_algorithm_choices').pipe(choicesToOptions()); + algorithmOptions$ = this.api.call('pool.dataset.encryption_algorithm_choices').pipe(choicesToOptions()); constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, ) {} get hasEncryption(): boolean { diff --git a/src/app/pages/datasets/components/dataset-form/sections/other-options-section/other-options-section.component.ts b/src/app/pages/datasets/components/dataset-form/sections/other-options-section/other-options-section.component.ts index b75ac39afd9..a926d62dee9 100644 --- a/src/app/pages/datasets/components/dataset-form/sections/other-options-section/other-options-section.component.ts +++ b/src/app/pages/datasets/components/dataset-form/sections/other-options-section/other-options-section.component.ts @@ -136,16 +136,16 @@ export class OtherOptionsSectionComponent implements OnInit, OnChanges { aclModeOptions$ = of(mapToOptions(aclModeLabels, this.translate)); private readonly defaultSyncOptions$ = of(mapToOptions(datasetSyncLabels, this.translate)); - private readonly defaultCompressionOptions$ = this.ws.call('pool.dataset.compression_choices').pipe(choicesToOptions()); + private readonly defaultCompressionOptions$ = this.api.call('pool.dataset.compression_choices').pipe(choicesToOptions()); private readonly defaultAtimeOptions$ = of(mapToOptions(onOffLabels, this.translate)); private defaultDeduplicationOptions$ = of(mapToOptions(deduplicationSettingLabels, this.translate)); - private defaultChecksumOptions$ = this.ws.call('pool.dataset.checksum_choices').pipe( + private defaultChecksumOptions$ = this.api.call('pool.dataset.checksum_choices').pipe( choicesToOptions(), ); private onOffOptions$ = of(mapToOptions(onOffLabels, this.translate)); private defaultSnapdevOptions$ = of(mapToOptions(datasetSnapdevLabels, this.translate)); - private defaultRecordSizeOptions$ = this.ws.call('pool.dataset.recordsize_choices').pipe( + private defaultRecordSizeOptions$ = this.api.call('pool.dataset.recordsize_choices').pipe( singleArrayToOptions(), ); @@ -161,7 +161,7 @@ export class OtherOptionsSectionComponent implements OnInit, OnChanges { private systemGeneralService: SystemGeneralService, private dialogService: DialogService, private formatter: IxFormatterService, - private ws: ApiService, + private api: ApiService, private datasetFormService: DatasetFormService, ) {} @@ -477,7 +477,7 @@ export class OtherOptionsSectionComponent implements OnInit, OnChanges { const root = this.parent.id.split('/')[0]; combineLatest([ this.form.controls.recordsize.valueChanges.pipe(startWith(this.form.controls.recordsize.value)), - this.ws.call('pool.dataset.recommended_zvol_blocksize', [root]), + this.api.call('pool.dataset.recommended_zvol_blocksize', [root]), ]) .pipe(untilDestroyed(this)) .subscribe(([recordsizeValue, recommendedAsString]) => { diff --git a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts index 2c3156b6980..fbe87d6fc93 100644 --- a/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts +++ b/src/app/pages/datasets/components/dataset-form/utils/dataset-form.service.ts @@ -19,7 +19,7 @@ import { SlideInService } from 'app/services/slide-in.service'; export class DatasetFormService { constructor( private dialog: DialogService, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private slideInService: SlideInService, ) {} @@ -54,7 +54,7 @@ export class DatasetFormService { } loadDataset(datasetId: string): Observable { - return this.ws.call('pool.dataset.query', [[['id', '=', datasetId]]]).pipe( + return this.api.call('pool.dataset.query', [[['id', '=', datasetId]]]).pipe( map((response) => response[0]), ); } diff --git a/src/app/pages/datasets/components/dataset-management/dataset-management.component.ts b/src/app/pages/datasets/components/dataset-management/dataset-management.component.ts index 4785ffd8c18..a08f222c4ae 100644 --- a/src/app/pages/datasets/components/dataset-management/dataset-management.component.ts +++ b/src/app/pages/datasets/components/dataset-management/dataset-management.component.ts @@ -108,7 +108,7 @@ export class DatasetsManagementComponent implements OnInit, AfterViewInit, OnDes selectedDataset$ = this.datasetStore.selectedDataset$; @HostBinding('class.details-overlay') showMobileDetails = false; isMobileView = false; - systemDataset = toSignal(this.ws.call('systemdataset.config').pipe(map((config) => config.pool))); + systemDataset = toSignal(this.api.call('systemdataset.config').pipe(map((config) => config.pool))); isLoading = true; subscription = new Subscription(); ixTreeHeaderWidth: number | null = null; @@ -171,7 +171,7 @@ export class DatasetsManagementComponent implements OnInit, AfterViewInit, OnDes readonly hasChild = (_: number, dataset: DatasetDetails): boolean => dataset?.children?.length > 0; constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private activatedRoute: ActivatedRoute, private datasetStore: DatasetTreeStore, diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.spec.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.spec.ts index 599e4ed854c..9f8dd17da99 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.spec.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.spec.ts @@ -20,7 +20,7 @@ import { UserService } from 'app/services/user.service'; describe('DatasetQuotaAddFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: DatasetQuotaAddFormComponent, @@ -59,7 +59,7 @@ describe('DatasetQuotaAddFormComponent', () => { }, ], }); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); loader = TestbedHarnessEnvironment.loader(spectator.fixture); }); @@ -77,7 +77,7 @@ describe('DatasetQuotaAddFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('pool.dataset.set_quota', [ + expect(api.call).toHaveBeenCalledWith('pool.dataset.set_quota', [ 'my-dataset', [ { id: 'john', quota_type: DatasetQuotaType.User, quota_value: 524288000 }, @@ -101,7 +101,7 @@ describe('DatasetQuotaAddFormComponent', () => { }, ], }); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); loader = TestbedHarnessEnvironment.loader(spectator.fixture); }); @@ -116,7 +116,7 @@ describe('DatasetQuotaAddFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('pool.dataset.set_quota', [ + expect(api.call).toHaveBeenCalledWith('pool.dataset.set_quota', [ 'my-dataset', [ { id: 'sys', quota_type: DatasetQuotaType.Group, quota_value: 524288000 }, diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.ts index ef418262eaf..af97fa310ee 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-add-form/dataset-quota-add-form.component.ts @@ -130,7 +130,7 @@ export class DatasetQuotaAddFormComponent implements OnInit { constructor( private authService: AuthService, private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private snackbar: SnackbarService, private translate: TranslateService, public formatter: IxFormatterService, @@ -155,7 +155,7 @@ export class DatasetQuotaAddFormComponent implements OnInit { this.isLoading = true; const quotas = this.getQuotas(); - this.ws.call('pool.dataset.set_quota', [this.datasetId, quotas]) + this.api.call('pool.dataset.set_quota', [this.datasetId, quotas]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.spec.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.spec.ts index abab4ff5488..bc03b673d35 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.spec.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.spec.ts @@ -19,7 +19,7 @@ import { SlideInService } from 'app/services/slide-in.service'; describe('DatasetQuotaEditFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: DatasetQuotaEditFormComponent, @@ -62,7 +62,7 @@ describe('DatasetQuotaEditFormComponent', () => { }, ], }); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); loader = TestbedHarnessEnvironment.loader(spectator.fixture); }); @@ -70,7 +70,7 @@ describe('DatasetQuotaEditFormComponent', () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.dataset.get_quota', ['Test', DatasetQuotaType.User, [['id', '=', 1]]], ); @@ -92,7 +92,7 @@ describe('DatasetQuotaEditFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('pool.dataset.set_quota', ['Test', [ + expect(api.call).toHaveBeenCalledWith('pool.dataset.set_quota', ['Test', [ { quota_type: DatasetQuotaType.User, id: '1', @@ -122,7 +122,7 @@ describe('DatasetQuotaEditFormComponent', () => { }, ], }); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); loader = TestbedHarnessEnvironment.loader(spectator.fixture); }); @@ -130,7 +130,7 @@ describe('DatasetQuotaEditFormComponent', () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.dataset.get_quota', ['Test', DatasetQuotaType.Group, [['id', '=', 1]]], ); @@ -152,7 +152,7 @@ describe('DatasetQuotaEditFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('pool.dataset.set_quota', ['Test', [ + expect(api.call).toHaveBeenCalledWith('pool.dataset.set_quota', ['Test', [ { quota_type: DatasetQuotaType.Group, id: '1', diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.ts index 603b9289141..37396556a08 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quota-edit-form/dataset-quota-edit-form.component.ts @@ -128,7 +128,7 @@ export class DatasetQuotaEditFormComponent implements OnInit { constructor( private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, public formatter: IxFormatterService, private cdr: ChangeDetectorRef, @@ -175,7 +175,7 @@ export class DatasetQuotaEditFormComponent implements OnInit { getQuota(id: number): Observable { const params = [['id', '=', id] as QueryFilter] as QueryParams; - return this.ws.call('pool.dataset.get_quota', [this.datasetId, this.quotaType, params]); + return this.api.call('pool.dataset.get_quota', [this.datasetId, this.quotaType, params]); } onSubmit(): void { @@ -207,7 +207,7 @@ export class DatasetQuotaEditFormComponent implements OnInit { filter(Boolean), switchMap(() => { this.isFormLoading = true; - return this.ws.call('pool.dataset.set_quota', [this.datasetId, payload]); + return this.api.call('pool.dataset.set_quota', [this.datasetId, payload]); }), untilDestroyed(this), ).subscribe({ diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.spec.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.spec.ts index 885248f1da4..b096de5a7e7 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.spec.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.spec.ts @@ -46,7 +46,7 @@ const fakeQuotas = [{ describe('DatasetQuotasListComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; let table: IxTableHarness; const createComponent = createComponentFactory({ @@ -96,17 +96,17 @@ describe('DatasetQuotasListComponent', () => { beforeEach(async () => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); table = await loader.getHarness(IxTableHarness); }); it('should show table rows', async () => { - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.dataset.get_quota', ['Test', DatasetQuotaType.User, []], ); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.dataset.get_quota', ['Test', DatasetQuotaType.User, [['name', '=', null]]], ); @@ -131,7 +131,7 @@ describe('DatasetQuotasListComponent', () => { title: 'Delete User Quota', }), ); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'pool.dataset.set_quota', ['Test', [{ id: '1', diff --git a/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.ts b/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.ts index cb140742539..eb7476a86a9 100644 --- a/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.ts +++ b/src/app/pages/datasets/components/dataset-quotas/dataset-quotas-list/dataset-quotas-list.component.ts @@ -194,7 +194,7 @@ export class DatasetQuotasListComponent implements OnInit { } constructor( - protected ws: ApiService, + protected api: ApiService, protected formatter: IxFormatterService, protected dialogService: DialogService, private errorHandler: ErrorHandlerService, @@ -232,7 +232,7 @@ export class DatasetQuotasListComponent implements OnInit { getQuotas(): void { this.isLoading = true; - this.ws.call('pool.dataset.get_quota', [this.datasetId, this.quotaType, []]) + this.api.call('pool.dataset.get_quota', [this.datasetId, this.quotaType, []]) .pipe(untilDestroyed(this)).subscribe({ next: (quotas: DatasetQuota[]) => { this.isLoading = false; @@ -259,7 +259,7 @@ export class DatasetQuotasListComponent implements OnInit { }; checkInvalidQuotas(): void { - this.ws.call( + this.api.call( 'pool.dataset.get_quota', [this.datasetId, this.quotaType, this.invalidFilter], ).pipe(untilDestroyed(this)).subscribe({ @@ -313,7 +313,7 @@ export class DatasetQuotasListComponent implements OnInit { } setQuota(quotas: SetDatasetQuota[]): Observable { - return this.ws.call('pool.dataset.set_quota', [this.datasetId, quotas]); + return this.api.call('pool.dataset.set_quota', [this.datasetId, quotas]); } doAdd(): void { diff --git a/src/app/pages/datasets/components/delete-dataset-dialog/delete-dataset-dialog.component.ts b/src/app/pages/datasets/components/delete-dataset-dialog/delete-dataset-dialog.component.ts index f9e17eaf5fa..024b6e18118 100644 --- a/src/app/pages/datasets/components/delete-dataset-dialog/delete-dataset-dialog.component.ts +++ b/src/app/pages/datasets/components/delete-dataset-dialog/delete-dataset-dialog.component.ts @@ -73,7 +73,7 @@ export class DeleteDatasetDialogComponent implements OnInit { private loader: AppLoaderService, private fb: FormBuilder, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private dialog: DialogService, private dialogRef: MatDialogRef, private translate: TranslateService, @@ -107,11 +107,11 @@ export class DeleteDatasetDialogComponent implements OnInit { } private deleteDataset(): Observable { - return this.ws.call('pool.dataset.delete', [this.dataset.id, { recursive: true }]); + return this.api.call('pool.dataset.delete', [this.dataset.id, { recursive: true }]); } private forceDeleteDataset(): Observable { - return this.ws.call('pool.dataset.delete', [this.dataset.id, { recursive: true, force: true }]); + return this.api.call('pool.dataset.delete', [this.dataset.id, { recursive: true, force: true }]); } private askToForceDelete(): Observable { @@ -146,8 +146,8 @@ export class DeleteDatasetDialogComponent implements OnInit { private loadDatasetRelatedEntities(): void { combineLatest([ - this.ws.call('pool.dataset.attachments', [this.dataset.id]), - this.ws.call('pool.dataset.processes', [this.dataset.id]), + this.api.call('pool.dataset.attachments', [this.dataset.id]), + this.api.call('pool.dataset.processes', [this.dataset.id]), ]).pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: ([attachments, processes]) => { diff --git a/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts b/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts index 8e1e048b2af..9427f307223 100644 --- a/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts +++ b/src/app/pages/datasets/components/zvol-form/zvol-form.component.ts @@ -214,7 +214,7 @@ export class ZvolFormComponent implements OnInit { readonly snapdevOptions$ = of(this.snapdevOptions); readonly encryptionTypeOptions$ = of(this.encryptionTypeOptions); - readonly algorithmOptions$ = this.ws.call('pool.dataset.encryption_algorithm_choices').pipe( + readonly algorithmOptions$ = this.api.call('pool.dataset.encryption_algorithm_choices').pipe( map((algorithms) => Object.keys(algorithms).map((algorithm) => ({ label: algorithm, value: algorithm }))), ); @@ -222,7 +222,7 @@ export class ZvolFormComponent implements OnInit { public formatter: IxFormatterService, private translate: TranslateService, private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private cdr: ChangeDetectorRef, private formErrorHandler: FormErrorHandlerService, @@ -256,7 +256,7 @@ export class ZvolFormComponent implements OnInit { } this.isLoading = true; - this.ws.call('pool.dataset.query', [[['id', '=', this.parentId]]]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('pool.dataset.query', [[['id', '=', this.parentId]]]).pipe(untilDestroyed(this)).subscribe({ next: (parents) => { const parent = parents[0]; if (parent.encrypted) { @@ -285,7 +285,7 @@ export class ZvolFormComponent implements OnInit { parentDatasetId.pop(); parentDatasetId = parentDatasetId.join('/'); - this.ws.call('pool.dataset.query', [[['id', '=', parentDatasetId]]]).pipe( + this.api.call('pool.dataset.query', [[['id', '=', parentDatasetId]]]).pipe( this.errorHandler.catchError(), untilDestroyed(this), ).subscribe({ @@ -626,7 +626,7 @@ export class ZvolFormComponent implements OnInit { delete data.encryption_type; delete data.algorithm; - this.ws.call('pool.dataset.create', [data as DatasetCreate]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('pool.dataset.create', [data as DatasetCreate]).pipe(untilDestroyed(this)).subscribe({ next: (dataset) => this.handleZvolCreateUpdate(dataset), error: (error: unknown) => { this.isLoading = false; @@ -638,7 +638,7 @@ export class ZvolFormComponent implements OnInit { editSubmit(): void { this.isLoading = true; - this.ws.call('pool.dataset.query', [[['id', '=', this.parentId]]]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('pool.dataset.query', [[['id', '=', this.parentId]]]).pipe(untilDestroyed(this)).subscribe({ next: (datasets) => { const data: ZvolFormData = this.sendAsBasicOrAdvanced(this.form.value); @@ -686,7 +686,7 @@ export class ZvolFormComponent implements OnInit { } if (!data.volsize || data.volsize >= roundedVolSize) { - this.ws.call('pool.dataset.update', [this.parentId, data as DatasetUpdate]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('pool.dataset.update', [this.parentId, data as DatasetUpdate]).pipe(untilDestroyed(this)).subscribe({ next: (dataset) => this.handleZvolCreateUpdate(dataset), error: (error: unknown) => { this.isLoading = false; @@ -721,7 +721,7 @@ export class ZvolFormComponent implements OnInit { private loadRecommendedBlocksize(): void { const root = this.parentId.split('/')[0]; - this.ws.call('pool.dataset.recommended_zvol_blocksize', [root]).pipe( + this.api.call('pool.dataset.recommended_zvol_blocksize', [root]).pipe( this.errorHandler.catchError(), untilDestroyed(this), ).subscribe((recommendedSize) => { diff --git a/src/app/pages/datasets/modules/encryption/components/dataset-unlock/dataset-unlock.component.ts b/src/app/pages/datasets/modules/encryption/components/dataset-unlock/dataset-unlock.component.ts index d77c9ec61f9..fba03484c12 100644 --- a/src/app/pages/datasets/modules/encryption/components/dataset-unlock/dataset-unlock.component.ts +++ b/src/app/pages/datasets/modules/encryption/components/dataset-unlock/dataset-unlock.component.ts @@ -100,7 +100,7 @@ export class DatasetUnlockComponent implements OnInit { private apiEndPoint: string; constructor( - private ws: ApiService, + private api: ApiService, private formBuilder: FormBuilder, private aroute: ActivatedRoute, private authService: AuthService, @@ -143,7 +143,7 @@ export class DatasetUnlockComponent implements OnInit { getEncryptionSummary(): void { this.dialogService.jobDialog( - this.ws.job('pool.dataset.encryption_summary', [this.pk]), + this.api.job('pool.dataset.encryption_summary', [this.pk]), { title: this.translate.instant(helptextUnlock.fetching_encryption_summary_title), description: this.translate.instant(helptextUnlock.fetching_encryption_summary_message, { dataset: this.pk }), @@ -212,7 +212,7 @@ export class DatasetUnlockComponent implements OnInit { method: 'pool.dataset.unlock', params: [this.pk, payload], }) - : this.ws.job('pool.dataset.unlock', [this.pk, payload]); + : this.api.job('pool.dataset.unlock', [this.pk, payload]); this.dialogService.jobDialog(job$, { title: this.translate.instant(helptextUnlock.unlocking_datasets_title), @@ -254,7 +254,7 @@ export class DatasetUnlockComponent implements OnInit { method: 'pool.dataset.encryption_summary', params: [this.pk, payload], }) - : this.ws.job('pool.dataset.encryption_summary', [this.pk, payload]); + : this.api.job('pool.dataset.encryption_summary', [this.pk, payload]); this.dialogService.jobDialog(job$, { title: this.translate.instant(helptextUnlock.fetching_encryption_summary_title), diff --git a/src/app/pages/datasets/modules/encryption/components/encryption-options-dialog/encryption-options-dialog.component.ts b/src/app/pages/datasets/modules/encryption/components/encryption-options-dialog/encryption-options-dialog.component.ts index 9193d633761..43b25c665f7 100644 --- a/src/app/pages/datasets/modules/encryption/components/encryption-options-dialog/encryption-options-dialog.component.ts +++ b/src/app/pages/datasets/modules/encryption/components/encryption-options-dialog/encryption-options-dialog.component.ts @@ -108,7 +108,7 @@ export class EncryptionOptionsDialogComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private loader: AppLoaderService, private dialog: DialogService, @@ -157,7 +157,7 @@ export class EncryptionOptionsDialogComponent implements OnInit { } private setToInherit(): void { - this.ws.call('pool.dataset.inherit_parent_encryption_properties', [this.data.dataset.id]) + this.api.call('pool.dataset.inherit_parent_encryption_properties', [this.data.dataset.id]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: () => { @@ -185,7 +185,7 @@ export class EncryptionOptionsDialogComponent implements OnInit { } this.dialog.jobDialog( - this.ws.job('pool.dataset.change_key', [this.data.dataset.id, body]), + this.api.job('pool.dataset.change_key', [this.data.dataset.id, body]), { title: this.translate.instant('Updating key type') }, ) .afterClosed() @@ -206,7 +206,7 @@ export class EncryptionOptionsDialogComponent implements OnInit { } private loadPbkdf2iters(): void { - this.ws.call('pool.dataset.query', [[['id', '=', this.data.dataset.id]]]) + this.api.call('pool.dataset.query', [[['id', '=', this.data.dataset.id]]]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: (datasets: Dataset[]) => { diff --git a/src/app/pages/datasets/modules/encryption/components/export-all-keys-dialog/export-all-keys-dialog.component.ts b/src/app/pages/datasets/modules/encryption/components/export-all-keys-dialog/export-all-keys-dialog.component.ts index 148af703185..b3b88d4f989 100644 --- a/src/app/pages/datasets/modules/encryption/components/export-all-keys-dialog/export-all-keys-dialog.component.ts +++ b/src/app/pages/datasets/modules/encryption/components/export-all-keys-dialog/export-all-keys-dialog.component.ts @@ -35,7 +35,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; export class ExportAllKeysDialogComponent { constructor( private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private dialogRef: MatDialogRef, private download: DownloadService, @@ -45,7 +45,7 @@ export class ExportAllKeysDialogComponent { onDownload(): void { const fileName = 'dataset_' + this.dataset.name + '_keys.json'; const mimetype = 'application/json'; - this.ws.call('core.download', ['pool.dataset.export_keys', [this.dataset.name], fileName]) + this.api.call('core.download', ['pool.dataset.export_keys', [this.dataset.name], fileName]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/datasets/modules/encryption/components/export-dataset-key-dialog/export-dataset-key-dialog.component.ts b/src/app/pages/datasets/modules/encryption/components/export-dataset-key-dialog/export-dataset-key-dialog.component.ts index c657b7ce256..33daeaadf09 100644 --- a/src/app/pages/datasets/modules/encryption/components/export-dataset-key-dialog/export-dataset-key-dialog.component.ts +++ b/src/app/pages/datasets/modules/encryption/components/export-dataset-key-dialog/export-dataset-key-dialog.component.ts @@ -43,7 +43,7 @@ export class ExportDatasetKeyDialogComponent implements OnInit { key: string; constructor( - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, private dialogRef: MatDialogRef, @@ -61,7 +61,7 @@ export class ExportDatasetKeyDialogComponent implements OnInit { const fileName = `dataset_${this.dataset.name}_key.json`; const mimetype = 'application/json'; - this.ws.call('core.download', ['pool.dataset.export_key', [this.dataset.id, true], fileName]) + this.api.call('core.download', ['pool.dataset.export_key', [this.dataset.id, true], fileName]) .pipe( this.loader.withLoader(), switchMap(([, url]) => this.storageService.downloadUrl(url, fileName, mimetype)), @@ -78,7 +78,7 @@ export class ExportDatasetKeyDialogComponent implements OnInit { } private loadKey(): void { - this.ws.job('pool.dataset.export_key', [this.dataset.id]) + this.api.job('pool.dataset.export_key', [this.dataset.id]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: (job) => { diff --git a/src/app/pages/datasets/modules/encryption/components/lock-dataset-dialog/lock-dataset-dialog.component.ts b/src/app/pages/datasets/modules/encryption/components/lock-dataset-dialog/lock-dataset-dialog.component.ts index 91928ac8f00..0a7bef031cd 100644 --- a/src/app/pages/datasets/modules/encryption/components/lock-dataset-dialog/lock-dataset-dialog.component.ts +++ b/src/app/pages/datasets/modules/encryption/components/lock-dataset-dialog/lock-dataset-dialog.component.ts @@ -45,7 +45,7 @@ export class LockDatasetDialogComponent { forceCheckbox = new FormControl(false); constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private translate: TranslateService, private snackbar: SnackbarService, @@ -59,7 +59,7 @@ export class LockDatasetDialogComponent { const force = this.forceCheckbox.value; this.dialogService.jobDialog( - this.ws.job('pool.dataset.lock', [this.dataset.id, { force_umount: force }]), + this.api.job('pool.dataset.lock', [this.dataset.id, { force_umount: force }]), { title: this.translate.instant(helptextVolumes.lock_dataset_dialog.locking_dataset) }, ) .afterClosed() diff --git a/src/app/pages/datasets/modules/permissions/components/save-as-preset-modal/save-as-preset-modal.component.ts b/src/app/pages/datasets/modules/permissions/components/save-as-preset-modal/save-as-preset-modal.component.ts index aaa8321d24d..8e691ab610a 100644 --- a/src/app/pages/datasets/modules/permissions/components/save-as-preset-modal/save-as-preset-modal.component.ts +++ b/src/app/pages/datasets/modules/permissions/components/save-as-preset-modal/save-as-preset-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { NgClass } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, @@ -43,7 +42,6 @@ import { UserService } from 'app/services/user.service'; imports: [ MatDialogTitle, ReactiveFormsModule, - CdkScrollable, MatDialogContent, NgClass, MatIconButton, @@ -68,7 +66,7 @@ export class SaveAsPresetModalComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -96,7 +94,7 @@ export class SaveAsPresetModalComponent implements OnInit { } private loadOptions(): void { - this.ws.call('filesystem.acltemplate.by_path', [{ + this.api.call('filesystem.acltemplate.by_path', [{ path: this.data.datasetPath, 'format-options': { resolve_names: true, @@ -132,7 +130,7 @@ export class SaveAsPresetModalComponent implements OnInit { }) as NfsAclItem[] | PosixAclItem[], }; - return this.ws.call('filesystem.acltemplate.create', [payload]); + return this.api.call('filesystem.acltemplate.create', [payload]); }), this.loader.withLoader(), this.errorHandler.catchError(), @@ -143,7 +141,7 @@ export class SaveAsPresetModalComponent implements OnInit { } onRemovePreset(preset: AclTemplateByPath): void { - this.ws.call('filesystem.acltemplate.delete', [preset.id]) + this.api.call('filesystem.acltemplate.delete', [preset.id]) .pipe( this.errorHandler.catchError(), this.loader.withLoader(), diff --git a/src/app/pages/datasets/modules/permissions/components/select-preset-modal/select-preset-modal.component.ts b/src/app/pages/datasets/modules/permissions/components/select-preset-modal/select-preset-modal.component.ts index 1b39d020902..908efdf5754 100644 --- a/src/app/pages/datasets/modules/permissions/components/select-preset-modal/select-preset-modal.component.ts +++ b/src/app/pages/datasets/modules/permissions/components/select-preset-modal/select-preset-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, OnInit, } from '@angular/core'; @@ -36,7 +35,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxRadioGroupComponent, @@ -76,7 +74,7 @@ export class SelectPresetModalComponent implements OnInit { constructor( private dialogRef: MatDialogRef, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private loader: AppLoaderService, private aclEditorStore: DatasetAclEditorStore, @@ -96,7 +94,7 @@ export class SelectPresetModalComponent implements OnInit { } private loadOptions(): void { - this.ws.call('filesystem.acltemplate.by_path', [{ + this.api.call('filesystem.acltemplate.by_path', [{ path: this.data.datasetPath, 'format-options': { resolve_names: true, diff --git a/src/app/pages/datasets/modules/permissions/components/strip-acl-modal/strip-acl-modal.component.ts b/src/app/pages/datasets/modules/permissions/components/strip-acl-modal/strip-acl-modal.component.ts index 42071f39260..ace41427c19 100644 --- a/src/app/pages/datasets/modules/permissions/components/strip-acl-modal/strip-acl-modal.component.ts +++ b/src/app/pages/datasets/modules/permissions/components/strip-acl-modal/strip-acl-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -30,7 +29,6 @@ export interface StripAclModalData { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxCheckboxComponent, ReactiveFormsModule, @@ -48,7 +46,7 @@ export class StripAclModalComponent { readonly helptext = helptextAcl; constructor( - private ws: ApiService, + private api: ApiService, private dialog: DialogService, private errorHandler: ErrorHandlerService, private dialogRef: MatDialogRef, @@ -57,7 +55,7 @@ export class StripAclModalComponent { ) { } onStrip(): void { - const job$ = this.ws.job('filesystem.setacl', [{ + const job$ = this.api.job('filesystem.setacl', [{ path: this.data.path, dacl: [], options: { diff --git a/src/app/pages/datasets/modules/permissions/containers/dataset-acl-editor/acl-editor-save-controls/acl-editor-save-controls.component.ts b/src/app/pages/datasets/modules/permissions/containers/dataset-acl-editor/acl-editor-save-controls/acl-editor-save-controls.component.ts index 082736008bd..e46a5cb4422 100644 --- a/src/app/pages/datasets/modules/permissions/containers/dataset-acl-editor/acl-editor-save-controls/acl-editor-save-controls.component.ts +++ b/src/app/pages/datasets/modules/permissions/containers/dataset-acl-editor/acl-editor-save-controls/acl-editor-save-controls.component.ts @@ -55,7 +55,7 @@ export class AclEditorSaveControlsComponent implements OnInit { private formBuilder: FormBuilder, private store: DatasetAclEditorStore, private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, ) {} ngOnInit(): void { @@ -63,7 +63,7 @@ export class AclEditorSaveControlsComponent implements OnInit { } // TODO: Move here and in other places to global store. - protected hasValidateAclCheckbox = toSignal(this.ws.call('directoryservices.get_state').pipe( + protected hasValidateAclCheckbox = toSignal(this.api.call('directoryservices.get_state').pipe( map((state) => { return state.activedirectory !== DirectoryServiceState.Disabled || state.ldap !== DirectoryServiceState.Disabled; diff --git a/src/app/pages/datasets/modules/permissions/containers/dataset-trivial-permissions/dataset-trivial-permissions.component.ts b/src/app/pages/datasets/modules/permissions/containers/dataset-trivial-permissions/dataset-trivial-permissions.component.ts index 3cbfa9ca483..3f4b67477ba 100644 --- a/src/app/pages/datasets/modules/permissions/containers/dataset-trivial-permissions/dataset-trivial-permissions.component.ts +++ b/src/app/pages/datasets/modules/permissions/containers/dataset-trivial-permissions/dataset-trivial-permissions.component.ts @@ -111,7 +111,7 @@ export class DatasetTrivialPermissionsComponent implements OnInit { private formBuilder: FormBuilder, private router: Router, private activatedRoute: ActivatedRoute, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private storageService: StorageService, private translate: TranslateService, @@ -153,7 +153,7 @@ export class DatasetTrivialPermissionsComponent implements OnInit { const payload = this.preparePayload(); this.dialog.jobDialog( - this.ws.job('filesystem.setperm', [payload]), + this.api.job('filesystem.setperm', [payload]), { title: this.translate.instant('Saving Permissions') }, ) .afterClosed() @@ -172,7 +172,7 @@ export class DatasetTrivialPermissionsComponent implements OnInit { private loadPermissionsInformation(): void { this.isLoading.set(true); forkJoin([ - this.ws.call('pool.dataset.query', [[['id', '=', this.datasetId]]]), + this.api.call('pool.dataset.query', [[['id', '=', this.datasetId]]]), this.storageService.filesystemStat(this.datasetPath), ]) .pipe(untilDestroyed(this)) diff --git a/src/app/pages/datasets/modules/permissions/stores/dataset-acl-editor.store.ts b/src/app/pages/datasets/modules/permissions/stores/dataset-acl-editor.store.ts index eb1bea8db62..5ae18790c8b 100644 --- a/src/app/pages/datasets/modules/permissions/stores/dataset-acl-editor.store.ts +++ b/src/app/pages/datasets/modules/permissions/stores/dataset-acl-editor.store.ts @@ -25,7 +25,6 @@ import { newNfsAce, newPosixAce } from 'app/pages/datasets/modules/permissions/u import { ApiService } from 'app/services/api.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { StorageService } from 'app/services/storage.service'; -import { UserService } from 'app/services/user.service'; const initialState: DatasetAclEditorState = { isLoading: false, @@ -42,13 +41,12 @@ const initialState: DatasetAclEditorState = { }) export class DatasetAclEditorStore extends ComponentStore { constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, private router: Router, private translate: TranslateService, private storageService: StorageService, - private userService: UserService, ) { super(initialState); } @@ -64,8 +62,8 @@ export class DatasetAclEditorStore extends ComponentStore }), switchMap((mountpoint) => { return forkJoin([ - this.ws.call('filesystem.getacl', [mountpoint, true, true]), - this.ws.call('filesystem.stat', [mountpoint]), + this.api.call('filesystem.getacl', [mountpoint, true, true]), + this.api.call('filesystem.stat', [mountpoint]), ]).pipe( tap(([acl, stat]) => { this.patchState({ @@ -214,7 +212,7 @@ export class DatasetAclEditorStore extends ComponentStore }); }), switchMap(() => { - return this.ws.call('filesystem.acltemplate.by_path', [{ + return this.api.call('filesystem.acltemplate.by_path', [{ path: this.get().mountpoint, 'format-options': { resolve_names: true, @@ -243,7 +241,7 @@ export class DatasetAclEditorStore extends ComponentStore private makeSaveRequest(setAcl: SetAcl): Observable { return this.dialogService.jobDialog( - this.ws.job('filesystem.setacl', [setAcl]), + this.api.job('filesystem.setacl', [setAcl]), { title: this.translate.instant(helptextAcl.save_dialog.title), description: this.translate.instant(helptextAcl.save_dialog.message), diff --git a/src/app/pages/datasets/modules/permissions/stores/permissions-card.store.ts b/src/app/pages/datasets/modules/permissions/stores/permissions-card.store.ts index 53ffa58d8b6..0517c083bfa 100644 --- a/src/app/pages/datasets/modules/permissions/stores/permissions-card.store.ts +++ b/src/app/pages/datasets/modules/permissions/stores/permissions-card.store.ts @@ -20,7 +20,7 @@ const initialState: PermissionsCardState = { @Injectable() export class PermissionsCardStore extends ComponentStore { constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private dialogService: DialogService, ) { @@ -37,8 +37,8 @@ export class PermissionsCardStore extends ComponentStore { }), switchMap((mountpoint) => { return forkJoin([ - this.ws.call('filesystem.stat', [mountpoint]), - this.ws.call('filesystem.getacl', [mountpoint, true, true]), + this.api.call('filesystem.stat', [mountpoint]), + this.api.call('filesystem.getacl', [mountpoint, true, true]), ]).pipe( tap(([stat, acl]) => { this.patchState({ diff --git a/src/app/pages/datasets/modules/snapshots/snapshot-add-form/snapshot-add-form.component.ts b/src/app/pages/datasets/modules/snapshots/snapshot-add-form/snapshot-add-form.component.ts index 4c6e6574451..5b6e99ad17c 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshot-add-form/snapshot-add-form.component.ts +++ b/src/app/pages/datasets/modules/snapshots/snapshot-add-form/snapshot-add-form.component.ts @@ -95,7 +95,7 @@ export class SnapshotAddFormComponent implements OnInit { constructor( private fb: FormBuilder, private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private authService: AuthService, private errorHandler: FormErrorHandlerService, @@ -158,7 +158,7 @@ export class SnapshotAddFormComponent implements OnInit { } this.isFormLoading = true; - this.ws.call('zfs.snapshot.create', [params]).pipe( + this.api.call('zfs.snapshot.create', [params]).pipe( untilDestroyed(this), ).subscribe({ next: () => { @@ -181,7 +181,7 @@ export class SnapshotAddFormComponent implements OnInit { } private getDatasetOptions(): Observable { - return this.ws.call('pool.dataset.query', [ + return this.api.call('pool.dataset.query', [ snapshotExcludeBootQueryFilter as QueryFilters, { extra: { flat: true } }, ]).pipe( @@ -196,7 +196,7 @@ export class SnapshotAddFormComponent implements OnInit { return of([]); } - return this.ws.call('replication.list_naming_schemas').pipe( + return this.api.call('replication.list_naming_schemas').pipe( singleArrayToOptions(), ); }), @@ -205,7 +205,7 @@ export class SnapshotAddFormComponent implements OnInit { private checkForVmsInDataset(): void { this.isFormLoading = true; - this.ws.call('vmware.dataset_has_vms', [this.form.controls.dataset.value, this.form.controls.recursive.value]) + this.api.call('vmware.dataset_has_vms', [this.form.controls.dataset.value, this.form.controls.recursive.value]) .pipe(untilDestroyed(this)) .subscribe({ next: (hasVmsInDataset) => { diff --git a/src/app/pages/datasets/modules/snapshots/snapshot-clone-dialog/snapshot-clone-dialog.component.ts b/src/app/pages/datasets/modules/snapshots/snapshot-clone-dialog/snapshot-clone-dialog.component.ts index bd81dcf032a..ea6680c2b48 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshot-clone-dialog/snapshot-clone-dialog.component.ts +++ b/src/app/pages/datasets/modules/snapshots/snapshot-clone-dialog/snapshot-clone-dialog.component.ts @@ -52,7 +52,7 @@ export class SnapshotCloneDialogComponent implements OnInit { }; constructor( - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private fb: FormBuilder, private errorHandler: FormErrorHandlerService, @@ -69,7 +69,7 @@ export class SnapshotCloneDialogComponent implements OnInit { } onSubmit(): void { - this.ws.call('zfs.snapshot.clone', [{ + this.api.call('zfs.snapshot.clone', [{ snapshot: this.snapshotName, dataset_dst: this.datasetName, }]) diff --git a/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.spec.ts b/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.spec.ts index ff93b9ac0b8..fc8ee59cc3f 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.spec.ts +++ b/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.spec.ts @@ -22,7 +22,7 @@ import { ApiService } from 'app/services/api.service'; describe('SnapshotDetailsRowComponent', () => { let spectator: SpectatorRouting; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createRoutingFactory({ component: SnapshotDetailsRowComponent, @@ -55,7 +55,7 @@ describe('SnapshotDetailsRowComponent', () => { }, }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('renders details rows', () => { @@ -93,11 +93,11 @@ describe('SnapshotDetailsRowComponent', () => { expect(await holdCheckbox.getValue()).toBeTruthy(); await holdCheckbox.toggle(); - expect(ws.call).toHaveBeenCalledWith('zfs.snapshot.release', [fakeZfsSnapshot.name]); + expect(api.call).toHaveBeenCalledWith('zfs.snapshot.release', [fakeZfsSnapshot.name]); expect(await holdCheckbox.getValue()).toBeFalsy(); await holdCheckbox.toggle(); - expect(ws.call).toHaveBeenCalledWith('zfs.snapshot.hold', [fakeZfsSnapshot.name]); + expect(api.call).toHaveBeenCalledWith('zfs.snapshot.hold', [fakeZfsSnapshot.name]); }); it('should delete snapshot when `Delete` button click', async () => { @@ -110,6 +110,6 @@ describe('SnapshotDetailsRowComponent', () => { message: `Delete snapshot ${fakeZfsSnapshot.name}?`, }), ); - expect(ws.call).toHaveBeenCalledWith('zfs.snapshot.delete', [fakeZfsSnapshot.name]); + expect(api.call).toHaveBeenCalledWith('zfs.snapshot.delete', [fakeZfsSnapshot.name]); }); }); diff --git a/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.ts b/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.ts index cacf9f1b26a..173c4112955 100644 --- a/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.ts +++ b/src/app/pages/datasets/modules/snapshots/snapshot-details-row/snapshot-details-row.component.ts @@ -65,7 +65,7 @@ export class SnapshotDetailsRowComponent implements OnInit, OnDestroy { constructor( private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, @@ -86,7 +86,7 @@ export class SnapshotDetailsRowComponent implements OnInit, OnDestroy { } getSnapshotInfo(): void { - this.ws.call( + this.api.call( 'zfs.snapshot.query', [ [['id', '=', this.snapshot.name]], { @@ -118,7 +118,7 @@ export class SnapshotDetailsRowComponent implements OnInit, OnDestroy { doHoldOrRelease(): void { const holdOrRelease = this.holdControl.value ? 'zfs.snapshot.hold' : 'zfs.snapshot.release'; - this.ws.call(holdOrRelease, [this.snapshotInfo.name]) + this.api.call(holdOrRelease, [this.snapshotInfo.name]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ error: (error: unknown) => { @@ -144,7 +144,7 @@ export class SnapshotDetailsRowComponent implements OnInit, OnDestroy { }).pipe( filter(Boolean), switchMap(() => { - return this.ws.call('zfs.snapshot.delete', [snapshot.name]).pipe( + return this.api.call('zfs.snapshot.delete', [snapshot.name]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), tap(() => { diff --git a/src/app/pages/datasets/modules/snapshots/store/snapshot.effects.ts b/src/app/pages/datasets/modules/snapshots/store/snapshot.effects.ts index 3774d0d41d5..c489c0e618e 100644 --- a/src/app/pages/datasets/modules/snapshots/store/snapshot.effects.ts +++ b/src/app/pages/datasets/modules/snapshots/store/snapshot.effects.ts @@ -26,7 +26,7 @@ export class SnapshotEffects { switchMap(() => this.store$.pipe(waitForPreferences)), switchMap((preferences) => { const extraColumns = preferences.showSnapshotExtraColumns ? ['properties' as keyof ZfsSnapshot] : []; - return this.ws.call('zfs.snapshot.query', [ + return this.api.call('zfs.snapshot.query', [ snapshotExcludeBootQueryFilter as QueryFilters, { select: ['snapshot_name', 'dataset', 'name', ...extraColumns], @@ -48,7 +48,7 @@ export class SnapshotEffects { subscribeToUpdates$ = createEffect(() => this.actions$.pipe( ofType(snapshotsLoaded), switchMap(() => { - return this.ws.subscribe('zfs.snapshot.query').pipe( + return this.api.subscribe('zfs.snapshot.query').pipe( filter((event) => event.msg !== IncomingApiMessageType.Removed), switchMap((event) => { switch (event.msg) { @@ -67,7 +67,7 @@ export class SnapshotEffects { subscribeToRemoval$ = createEffect(() => this.actions$.pipe( ofType(snapshotsLoaded), switchMap(() => { - return this.ws.subscribe('zfs.snapshot.query').pipe( + return this.api.subscribe('zfs.snapshot.query').pipe( filter((event) => event.msg === IncomingApiMessageType.Removed), map((event) => snapshotRemoved({ id: event.id.toString() })), ); @@ -76,7 +76,7 @@ export class SnapshotEffects { constructor( private actions$: Actions, - private ws: ApiService, + private api: ApiService, private store$: Store, private translate: TranslateService, ) {} diff --git a/src/app/pages/datasets/store/dataset-store.service.ts b/src/app/pages/datasets/store/dataset-store.service.ts index 7149aa9d0bb..45a7a5c0511 100644 --- a/src/app/pages/datasets/store/dataset-store.service.ts +++ b/src/app/pages/datasets/store/dataset-store.service.ts @@ -63,7 +63,7 @@ export class DatasetTreeStore extends ComponentStore { }); }), switchMap(() => { - return this.ws.call('pool.dataset.details') + return this.api.call('pool.dataset.details') .pipe( tap((datasets: DatasetDetails[]) => { this.patchState({ @@ -110,7 +110,7 @@ export class DatasetTreeStore extends ComponentStore { }); constructor( - private ws: ApiService, + private api: ApiService, ) { super(initialState); } diff --git a/src/app/pages/directory-service/components/active-directory/active-directory.component.ts b/src/app/pages/directory-service/components/active-directory/active-directory.component.ts index b9641a982be..a7299fff720 100644 --- a/src/app/pages/directory-service/components/active-directory/active-directory.component.ts +++ b/src/app/pages/directory-service/components/active-directory/active-directory.component.ts @@ -92,7 +92,7 @@ export class ActiveDirectoryComponent implements OnInit { hasKerberosPrincipal$ = this.form.select((values) => values.kerberos_principal); readonly helptext = helptextActiveDirectory; - readonly kerberosRealms$ = this.ws.call('kerberos.realm.query').pipe( + readonly kerberosRealms$ = this.api.call('kerberos.realm.query').pipe( map((realms) => { return realms.map((realm) => ({ label: realm.realm, @@ -101,11 +101,11 @@ export class ActiveDirectoryComponent implements OnInit { }), ); - readonly kerberosPrincipals$ = this.ws.call('kerberos.keytab.kerberos_principal_choices').pipe(singleArrayToOptions()); - readonly nssOptions$ = this.ws.call('activedirectory.nss_info_choices').pipe(singleArrayToOptions()); + readonly kerberosPrincipals$ = this.api.call('kerberos.keytab.kerberos_principal_choices').pipe(singleArrayToOptions()); + readonly nssOptions$ = this.api.call('activedirectory.nss_info_choices').pipe(singleArrayToOptions()); constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, private formBuilder: FormBuilder, @@ -167,7 +167,7 @@ export class ActiveDirectoryComponent implements OnInit { }; this.dialogService.jobDialog( - this.ws.job('activedirectory.update', [values]), + this.api.job('activedirectory.update', [values]), { title: this.translate.instant('Active Directory') }, ) .afterClosed() @@ -206,7 +206,7 @@ export class ActiveDirectoryComponent implements OnInit { } private loadDirectoryState(): Observable { - return this.ws.call('directoryservices.get_state').pipe( + return this.api.call('directoryservices.get_state').pipe( map((adState) => { const isHealthy = adState.activedirectory === DirectoryServiceState.Healthy; this.canLeaveDomain = isHealthy; @@ -220,7 +220,7 @@ export class ActiveDirectoryComponent implements OnInit { } private loadDirectoryConfig(): Observable { - return this.ws.call('activedirectory.config').pipe( + return this.api.call('activedirectory.config').pipe( map((config) => { this.form.patchValue(config); }), diff --git a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts index 363d02ec976..771b2a9015b 100644 --- a/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts +++ b/src/app/pages/directory-service/components/idmap-form/idmap-form.component.ts @@ -186,7 +186,7 @@ export class IdmapFormComponent implements OnInit { constructor( private formBuilder: FormBuilder, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private validationHelpers: IxValidatorsService, private idmapService: IdmapService, private dialogService: DialogService, @@ -236,8 +236,8 @@ export class IdmapFormComponent implements OnInit { const params = this.prepareSubmitParams(); const request$ = this.isNew - ? this.ws.call('idmap.create', [params]) - : this.ws.call('idmap.update', [this.existingIdmap.id, params]); + ? this.api.call('idmap.create', [params]) + : this.api.call('idmap.update', [this.existingIdmap.id, params]); request$ .pipe( @@ -347,7 +347,7 @@ export class IdmapFormComponent implements OnInit { } return this.dialogService.jobDialog( - this.ws.job('idmap.clear_idmap_cache'), + this.api.job('idmap.clear_idmap_cache'), { title: this.translate.instant(helptextIdmap.idmap.clear_cache_dialog.job_title), }, diff --git a/src/app/pages/directory-service/components/idmap-list/idmap-list.component.ts b/src/app/pages/directory-service/components/idmap-list/idmap-list.component.ts index 9d9aac35d48..42d42bf46bd 100644 --- a/src/app/pages/directory-service/components/idmap-list/idmap-list.component.ts +++ b/src/app/pages/directory-service/components/idmap-list/idmap-list.component.ts @@ -129,7 +129,7 @@ export class IdmapListComponent implements OnInit { hideCheckbox: true, }).pipe( filter(Boolean), - switchMap(() => this.ws.call('idmap.delete', [row.id])), + switchMap(() => this.api.call('idmap.delete', [row.id])), untilDestroyed(this), ).subscribe({ error: (error: unknown) => { @@ -150,7 +150,7 @@ export class IdmapListComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, protected idmapService: IdmapService, protected dialogService: DialogService, private errorHandler: ErrorHandlerService, @@ -159,15 +159,15 @@ export class IdmapListComponent implements OnInit { ) { } ngOnInit(): void { - const idmapsRows$ = this.ws.call('directoryservices.get_state').pipe( + const idmapsRows$ = this.api.call('directoryservices.get_state').pipe( switchMap((state) => { if (state.ldap !== DirectoryServiceState.Disabled) { - return this.ws.call('idmap.query', [[['name', '=', IdmapName.DsTypeLdap]]]); + return this.api.call('idmap.query', [[['name', '=', IdmapName.DsTypeLdap]]]); } if (state.activedirectory !== DirectoryServiceState.Disabled) { - return this.ws.call('idmap.query', [[['name', '!=', IdmapName.DsTypeLdap]]]); + return this.api.call('idmap.query', [[['name', '!=', IdmapName.DsTypeLdap]]]); } - return this.ws.call('idmap.query'); + return this.api.call('idmap.query'); }), map((idmaps) => { const transformed = [...idmaps] as IdmapRow[]; diff --git a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts index 03ee000dd23..9a735dcea7f 100644 --- a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts +++ b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-form/kerberos-keytabs-form.component.ts @@ -70,7 +70,7 @@ export class KerberosKeytabsFormComponent implements OnInit { private formBuilder: FormBuilder, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, @Inject(SLIDE_IN_DATA) private editingKerberosKeytab: KerberosKeytab, ) {} @@ -104,9 +104,9 @@ export class KerberosKeytabsFormComponent implements OnInit { this.isLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('kerberos.keytab.create', [payload]); + request$ = this.api.call('kerberos.keytab.create', [payload]); } else { - request$ = this.ws.call('kerberos.keytab.update', [ + request$ = this.api.call('kerberos.keytab.update', [ this.editingKerberosKeytab.id, payload, ]); diff --git a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.ts b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.ts index 5a5d92453a2..4016386074b 100644 --- a/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.ts +++ b/src/app/pages/directory-service/components/kerberos-keytabs/kerberos-keytabs-list/kerberos-keytabs-list.component.ts @@ -1,6 +1,6 @@ import { AsyncPipe } from '@angular/common'; import { - ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, + ChangeDetectionStrategy, Component, Input, OnInit, } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MatToolbarRow } from '@angular/material/toolbar'; @@ -98,7 +98,7 @@ export class KerberosKeytabsListComponent implements OnInit { message: this.translate.instant('Are you sure you want to delete this item?'), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('kerberos.keytab.delete', [row.id])), + switchMap(() => this.api.call('kerberos.keytab.delete', [row.id])), untilDestroyed(this), ).subscribe({ error: (error: unknown) => { @@ -119,16 +119,15 @@ export class KerberosKeytabsListComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, protected dialogService: DialogService, - private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, protected emptyService: EmptyService, private slideInService: SlideInService, ) { } ngOnInit(): void { - const keytabsRows$ = this.ws.call('kerberos.keytab.query').pipe( + const keytabsRows$ = this.api.call('kerberos.keytab.query').pipe( tap((keytabsRows) => this.kerberosRealsm = keytabsRows), untilDestroyed(this), ); diff --git a/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.spec.ts b/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.spec.ts index bfae070f438..193fa4dfe61 100644 --- a/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.spec.ts +++ b/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.spec.ts @@ -17,7 +17,7 @@ import { SlideInService } from 'app/services/slide-in.service'; describe('KerberosRealmsFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: KerberosRealmsFormComponent, imports: [ @@ -40,7 +40,7 @@ describe('KerberosRealmsFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends a create payload to websocket and closes modal form is saved', async () => { @@ -55,7 +55,7 @@ describe('KerberosRealmsFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('kerberos.realm.create', [{ + expect(api.call).toHaveBeenCalledWith('kerberos.realm.create', [{ realm: 'new', kdc: ['kdc1', 'kdc2'], admin_server: ['10.10.12.1', '10.10.12.2'], @@ -81,7 +81,7 @@ describe('KerberosRealmsFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows current group values when form is being edited', async () => { @@ -108,7 +108,7 @@ describe('KerberosRealmsFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('kerberos.realm.update', [ + expect(api.call).toHaveBeenCalledWith('kerberos.realm.update', [ 13, { realm: 'updated', diff --git a/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.ts b/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.ts index beb7979f62d..ce1575cc179 100644 --- a/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.ts +++ b/src/app/pages/directory-service/components/kerberos-realms-form/kerberos-realms-form.component.ts @@ -73,7 +73,7 @@ export class KerberosRealmsFormComponent implements OnInit { } constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private fb: FormBuilder, @@ -100,9 +100,9 @@ export class KerberosRealmsFormComponent implements OnInit { this.isFormLoading = true; let request$: Observable; if (this.isNew) { - request$ = this.ws.call('kerberos.realm.create', [values as KerberosRealmUpdate]); + request$ = this.api.call('kerberos.realm.create', [values as KerberosRealmUpdate]); } else { - request$ = this.ws.call('kerberos.realm.update', [ + request$ = this.api.call('kerberos.realm.update', [ this.editingRealm.id, values as KerberosRealmUpdate, ]); diff --git a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.ts b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.ts index 4b96655bfcc..eef3d3f8a67 100644 --- a/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.ts +++ b/src/app/pages/directory-service/components/kerberos-realms/kerberos-realms-list.component.ts @@ -113,7 +113,7 @@ export class KerberosRealmsListComponent implements OnInit { message: this.translate.instant('Are you sure you want to delete this item?'), }).pipe( filter(Boolean), - switchMap(() => this.ws.call('kerberos.realm.delete', [row.id])), + switchMap(() => this.api.call('kerberos.realm.delete', [row.id])), untilDestroyed(this), ).subscribe({ error: (error: unknown) => { @@ -134,7 +134,7 @@ export class KerberosRealmsListComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, protected dialogService: DialogService, private errorHandler: ErrorHandlerService, protected emptyService: EmptyService, @@ -142,7 +142,7 @@ export class KerberosRealmsListComponent implements OnInit { ) { } ngOnInit(): void { - const kerberosRealsm$ = this.ws.call('kerberos.realm.query').pipe( + const kerberosRealsm$ = this.api.call('kerberos.realm.query').pipe( map((realms) => { return realms.map((realm) => { return { diff --git a/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.spec.ts b/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.spec.ts index f05c2905d6d..ec174b7d321 100644 --- a/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.spec.ts +++ b/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.spec.ts @@ -18,7 +18,7 @@ import { SlideInService } from 'app/services/slide-in.service'; describe('KerberosSettingsComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: KerberosSettingsComponent, imports: [ @@ -44,14 +44,14 @@ describe('KerberosSettingsComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads current kerberos settings and show them', async () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith('kerberos.config'); + expect(api.call).toHaveBeenCalledWith('kerberos.config'); expect(values).toEqual({ 'Appdefaults Auxiliary Parameters': 'testparam', 'Libdefaults Auxiliary Parameters': 'clockskew=2', @@ -68,7 +68,7 @@ describe('KerberosSettingsComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('kerberos.update', [{ + expect(api.call).toHaveBeenCalledWith('kerberos.update', [{ appdefaults_aux: 'newparam', libdefaults_aux: 'clockskew=6', }]); diff --git a/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.ts b/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.ts index 595e3e10862..75727500873 100644 --- a/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.ts +++ b/src/app/pages/directory-service/components/kerberos-settings/kerberos-settings.component.ts @@ -57,7 +57,7 @@ export class KerberosSettingsComponent implements OnInit { }; constructor( - private ws: ApiService, + private api: ApiService, private slideInRef: SlideInRef, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, @@ -69,7 +69,7 @@ export class KerberosSettingsComponent implements OnInit { ngOnInit(): void { this.isFormLoading = true; - this.ws.call('kerberos.config').pipe(untilDestroyed(this)).subscribe({ + this.api.call('kerberos.config').pipe(untilDestroyed(this)).subscribe({ next: (config) => { this.form.patchValue(config); this.isFormLoading = false; @@ -87,7 +87,7 @@ export class KerberosSettingsComponent implements OnInit { const values = this.form.value; this.isFormLoading = true; - this.ws.call('kerberos.update', [values as KerberosConfigUpdate]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('kerberos.update', [values as KerberosConfigUpdate]).pipe(untilDestroyed(this)).subscribe({ next: () => { this.isFormLoading = false; this.cdr.markForCheck(); diff --git a/src/app/pages/directory-service/components/ldap/ldap.component.ts b/src/app/pages/directory-service/components/ldap/ldap.component.ts index 0c4c449ca1d..5bff09fc90e 100644 --- a/src/app/pages/directory-service/components/ldap/ldap.component.ts +++ b/src/app/pages/directory-service/components/ldap/ldap.component.ts @@ -87,7 +87,7 @@ export class LdapComponent implements OnInit { }); readonly helptext = helptextLdap; - readonly kerberosRealms$ = this.ws.call('kerberos.realm.query').pipe( + readonly kerberosRealms$ = this.api.call('kerberos.realm.query').pipe( map((realms) => { return realms.map((realm) => ({ label: realm.realm, @@ -96,14 +96,14 @@ export class LdapComponent implements OnInit { }), ); - readonly kerberosPrincipals$ = this.ws.call('kerberos.keytab.kerberos_principal_choices').pipe(singleArrayToOptions()); - readonly sslOptions$ = this.ws.call('ldap.ssl_choices').pipe(singleArrayToOptions()); + readonly kerberosPrincipals$ = this.api.call('kerberos.keytab.kerberos_principal_choices').pipe(singleArrayToOptions()); + readonly sslOptions$ = this.api.call('ldap.ssl_choices').pipe(singleArrayToOptions()); readonly certificates$ = this.systemGeneralService.getCertificates().pipe(idNameArrayToOptions()); - readonly schemaOptions$ = this.ws.call('ldap.schema_choices').pipe(singleArrayToOptions()); + readonly schemaOptions$ = this.api.call('ldap.schema_choices').pipe(singleArrayToOptions()); readonly isEnabled$ = this.form.select((values) => values.enable); constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private formBuilder: FormBuilder, private systemGeneralService: SystemGeneralService, @@ -149,7 +149,7 @@ export class LdapComponent implements OnInit { const values = this.form.value; this.dialogService.jobDialog( - this.ws.job('ldap.update', [values]), + this.api.job('ldap.update', [values]), { title: 'LDAP', }, @@ -174,7 +174,7 @@ export class LdapComponent implements OnInit { private loadFormValues(): void { this.isLoading = true; - this.ws.call('ldap.config') + this.api.call('ldap.config') .pipe(untilDestroyed(this)) .subscribe({ next: (config) => { diff --git a/src/app/pages/directory-service/components/leave-domain-dialog/leave-domain-dialog.component.ts b/src/app/pages/directory-service/components/leave-domain-dialog/leave-domain-dialog.component.ts index 3e677f24b56..3c061436056 100644 --- a/src/app/pages/directory-service/components/leave-domain-dialog/leave-domain-dialog.component.ts +++ b/src/app/pages/directory-service/components/leave-domain-dialog/leave-domain-dialog.component.ts @@ -49,7 +49,7 @@ export class LeaveDomainDialogComponent { private errorHandler: ErrorHandlerService, private formBuilder: FormBuilder, private loader: AppLoaderService, - private ws: ApiService, + private api: ApiService, private dialogRef: MatDialogRef, private dialogService: DialogService, private snackbar: SnackbarService, @@ -59,7 +59,7 @@ export class LeaveDomainDialogComponent { onSubmit(): void { const params = this.form.value; - this.ws.job('activedirectory.leave', [params as LeaveActiveDirectory]) + this.api.job('activedirectory.leave', [params as LeaveActiveDirectory]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: (job) => { diff --git a/src/app/pages/directory-service/directory-services.component.ts b/src/app/pages/directory-service/directory-services.component.ts index 9aff8e0193a..3f5b23b15af 100644 --- a/src/app/pages/directory-service/directory-services.component.ts +++ b/src/app/pages/directory-service/directory-services.component.ts @@ -90,7 +90,7 @@ export class DirectoryServicesComponent implements OnInit { }; constructor( - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private dialog: DialogService, private loader: AppLoaderService, @@ -105,10 +105,10 @@ export class DirectoryServicesComponent implements OnInit { refreshCards(): void { forkJoin([ - this.ws.call('directoryservices.get_state'), - this.ws.call('activedirectory.config'), - this.ws.call('ldap.config'), - this.ws.call('kerberos.config'), + this.api.call('directoryservices.get_state'), + this.api.call('activedirectory.config'), + this.api.call('ldap.config'), + this.api.call('kerberos.config'), ]) .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe(([servicesState, activeDirectoryConfig, ldapConfig, kerberosSettings]) => { diff --git a/src/app/pages/network/components/configuration/configuration.component.spec.ts b/src/app/pages/network/components/configuration/configuration.component.spec.ts index 138b6ec9276..84cdce37807 100644 --- a/src/app/pages/network/components/configuration/configuration.component.spec.ts +++ b/src/app/pages/network/components/configuration/configuration.component.spec.ts @@ -23,7 +23,7 @@ import { SystemGeneralService } from 'app/services/system-general.service'; describe('NetworkConfigurationComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: NetworkConfigurationComponent, imports: [ @@ -83,7 +83,7 @@ describe('NetworkConfigurationComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads and shows current network global configuration when form is opened', async () => { @@ -137,7 +137,7 @@ describe('NetworkConfigurationComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'network.configuration.update', [{ activity: { @@ -172,7 +172,7 @@ describe('NetworkConfigurationComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith( + expect(api.call).toHaveBeenCalledWith( 'network.configuration.update', [ expect.objectContaining({ diff --git a/src/app/pages/network/components/configuration/configuration.component.ts b/src/app/pages/network/components/configuration/configuration.component.ts index 7036de580bb..3c11f7d77de 100644 --- a/src/app/pages/network/components/configuration/configuration.component.ts +++ b/src/app/pages/network/components/configuration/configuration.component.ts @@ -203,7 +203,7 @@ export class NetworkConfigurationComponent implements OnInit { fcName: 'outbound_network_value', label: helptextNetworkConfiguration.outbound_network_value.placeholder, tooltip: helptextNetworkConfiguration.outbound_network_value.tooltip, - options: this.ws.call('network.configuration.activity_choices').pipe(arrayToOptions()), + options: this.api.call('network.configuration.activity_choices').pipe(arrayToOptions()), hidden: true, }; @@ -220,7 +220,7 @@ export class NetworkConfigurationComponent implements OnInit { }; constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private slideInRef: SlideInRef, private formErrorHandler: FormErrorHandlerService, @@ -264,7 +264,7 @@ export class NetworkConfigurationComponent implements OnInit { } private loadConfig(): void { - this.ws.call('network.configuration.config') + this.api.call('network.configuration.config') .pipe(untilDestroyed(this)) .subscribe({ next: (config: NetworkConfiguration) => { @@ -344,7 +344,7 @@ export class NetworkConfigurationComponent implements OnInit { }; this.isFormLoading = true; - this.ws.call('network.configuration.update', [params] as [NetworkConfigurationUpdate]) + this.api.call('network.configuration.update', [params] as [NetworkConfigurationUpdate]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.spec.ts b/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.spec.ts index 1accc152aef..32d337570f6 100644 --- a/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.spec.ts +++ b/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.spec.ts @@ -15,7 +15,7 @@ import { ApiService } from 'app/services/api.service'; describe('DefaultGatewayDialogComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: DefaultGatewayDialogComponent, @@ -37,7 +37,7 @@ describe('DefaultGatewayDialogComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('checks the header', () => { @@ -53,6 +53,6 @@ describe('DefaultGatewayDialogComponent', () => { const registerGatewayButton = await loader.getHarness(MatButtonHarness.with({ text: 'Register' })); await registerGatewayButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.save_default_route', ['192.168.1.1']); + expect(api.call).toHaveBeenCalledWith('interface.save_default_route', ['192.168.1.1']); }); }); diff --git a/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.ts b/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.ts index 64cef800b0e..ae0193ab91c 100644 --- a/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.ts +++ b/src/app/pages/network/components/default-gateway-dialog/default-gateway-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/core'; import { FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; @@ -34,7 +33,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, WithLoadingStateDirective, ReactiveFormsModule, @@ -68,14 +66,14 @@ export class DefaultGatewayDialogComponent { ], }); - currentGateway$ = this.ws.call('network.general.summary').pipe( + currentGateway$ = this.api.call('network.general.summary').pipe( toLoadingState(), ); readonly helptext = helptextNetworkConfiguration; constructor( - private ws: ApiService, + private api: ApiService, private fb: FormBuilder, public cdr: ChangeDetectorRef, private dialogRef: MatDialogRef, @@ -88,7 +86,7 @@ export class DefaultGatewayDialogComponent { onSubmit(): void { this.dialogRef.close(); const formValues = this.form.value; - this.ws.call('interface.save_default_route', [formValues.defaultGateway]).pipe( + this.api.call('interface.save_default_route', [formValues.defaultGateway]).pipe( catchError((error: unknown) => { this.dialog.error(this.errorHandler.parseError(error)); return EMPTY; diff --git a/src/app/pages/network/components/interface-form/interface-form.component.spec.ts b/src/app/pages/network/components/interface-form/interface-form.component.spec.ts index a4a21d7acb6..ad2d81642e0 100644 --- a/src/app/pages/network/components/interface-form/interface-form.component.spec.ts +++ b/src/app/pages/network/components/interface-form/interface-form.component.spec.ts @@ -43,7 +43,7 @@ import { networkInterfacesChanged } from 'app/store/network-interfaces/network-i describe('InterfaceFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; let form: IxFormHarness; let aliasesList: IxListHarness; const existingInterface = { @@ -144,7 +144,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('saves a new bridge interface when form is submitted for bridge interface', async () => { @@ -166,7 +166,7 @@ describe('InterfaceFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.create', [{ + expect(api.call).toHaveBeenCalledWith('interface.create', [{ type: NetworkInterfaceType.Bridge, name: 'br0', description: 'Bridge interface', @@ -186,7 +186,7 @@ describe('InterfaceFormComponent', () => { const store$ = spectator.inject(Store); expect(store$.dispatch).toHaveBeenCalledWith(networkInterfacesChanged({ commit: false, checkIn: false })); - expect(ws.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); + expect(api.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith( DefaultGatewayDialogComponent, @@ -215,7 +215,7 @@ describe('InterfaceFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.create', [{ + expect(api.call).toHaveBeenCalledWith('interface.create', [{ type: NetworkInterfaceType.LinkAggregation, name: 'bond0', description: 'LAG', @@ -233,7 +233,7 @@ describe('InterfaceFormComponent', () => { expect(store$.dispatch).toHaveBeenCalledWith(networkInterfacesChanged({ commit: false, checkIn: false })); expect(spectator.inject(SlideInRef).close).toHaveBeenCalled(); - expect(ws.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); + expect(api.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith( DefaultGatewayDialogComponent, @@ -258,7 +258,7 @@ describe('InterfaceFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.create', [{ + expect(api.call).toHaveBeenCalledWith('interface.create', [{ type: NetworkInterfaceType.Vlan, name: 'vlan1', description: 'New VLAN', @@ -270,7 +270,7 @@ describe('InterfaceFormComponent', () => { mtu: 1500, aliases: [], }]); - expect(ws.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); + expect(api.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith( DefaultGatewayDialogComponent, @@ -309,7 +309,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows values for a network interface when it is opened for edit', async () => { @@ -342,7 +342,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('disables parent interface fields when VLAN is opened for edit', async () => { @@ -369,7 +369,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('reloads bridge member choices when bridge interface is opened for edit', () => { @@ -399,7 +399,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('reloads lag ports when link aggregation is opened for edit', () => { @@ -413,7 +413,7 @@ describe('InterfaceFormComponent', () => { loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); aliasesList = await loader.getHarness(IxListHarness.with({ label: 'Aliases' })); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); beforeEach(() => { @@ -423,7 +423,7 @@ describe('InterfaceFormComponent', () => { }); it('checks whether failover is licensed for', () => { - expect(ws.call).toHaveBeenCalledWith('failover.node'); + expect(api.call).toHaveBeenCalledWith('failover.node'); }); it('shows and saves additional fields in Aliases when failover is licensed', async () => { @@ -439,13 +439,13 @@ describe('InterfaceFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.create', [ + expect(api.call).toHaveBeenCalledWith('interface.create', [ expect.objectContaining({ failover_critical: true, failover_group: 1, }), ]); - expect(ws.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); + expect(api.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith( DefaultGatewayDialogComponent, @@ -468,7 +468,7 @@ describe('InterfaceFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('interface.create', [ + expect(api.call).toHaveBeenCalledWith('interface.create', [ expect.objectContaining({ aliases: [{ address: '10.2.3.4', @@ -479,7 +479,7 @@ describe('InterfaceFormComponent', () => { failover_virtual_aliases: [{ address: '192.168.1.3' }], }), ]); - expect(ws.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); + expect(api.call).toHaveBeenCalledWith('interface.default_route_will_be_removed'); expect(spectator.inject(MatDialog).open).toHaveBeenCalledWith( DefaultGatewayDialogComponent, diff --git a/src/app/pages/network/components/interface-form/interface-form.component.ts b/src/app/pages/network/components/interface-form/interface-form.component.ts index 8529b5b7a69..f469fd71ac0 100644 --- a/src/app/pages/network/components/interface-form/interface-form.component.ts +++ b/src/app/pages/network/components/interface-form/interface-form.component.ts @@ -149,8 +149,8 @@ export class InterfaceFormComponent implements OnInit { lagProtocols$ = this.networkService.getLaggProtocolChoices().pipe(singleArrayToOptions()); lagPorts$ = this.networkService.getLaggPortsChoices().pipe(choicesToOptions()); - xmitHashPolicies$ = this.ws.call('interface.xmit_hash_policy_choices').pipe(choicesToOptions()); - lacpduRates$ = this.ws.call('interface.lacpdu_rate_choices').pipe(choicesToOptions()); + xmitHashPolicies$ = this.api.call('interface.xmit_hash_policy_choices').pipe(choicesToOptions()); + lacpduRates$ = this.api.call('interface.lacpdu_rate_choices').pipe(choicesToOptions()); vlanPcpOptions$ = of([ { value: 0, label: this.translate.instant('Best effort (default)') }, @@ -172,7 +172,7 @@ export class InterfaceFormComponent implements OnInit { constructor( private formBuilder: FormBuilder, private cdr: ChangeDetectorRef, - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private networkService: NetworkService, private errorHandler: FormErrorHandlerService, @@ -268,14 +268,14 @@ export class InterfaceFormComponent implements OnInit { const params = this.prepareSubmitParams(); const request$ = this.isNew - ? this.ws.call('interface.create', [params]) - : this.ws.call('interface.update', [this.existingInterface.id, params]); + ? this.api.call('interface.create', [params]) + : this.api.call('interface.update', [this.existingInterface.id, params]); request$.pipe(untilDestroyed(this)).subscribe({ next: () => { this.store$.dispatch(networkInterfacesChanged({ commit: false, checkIn: false })); - this.ws.call('interface.default_route_will_be_removed').pipe(untilDestroyed(this)).subscribe((approved) => { + this.api.call('interface.default_route_will_be_removed').pipe(untilDestroyed(this)).subscribe((approved) => { if (approved) { this.matDialog.open(DefaultGatewayDialogComponent, { width: '600px', @@ -323,8 +323,8 @@ export class InterfaceFormComponent implements OnInit { } forkJoin([ - this.ws.call('failover.licensed'), - this.ws.call('failover.node'), + this.api.call('failover.licensed'), + this.api.call('failover.node'), ]) .pipe(untilDestroyed(this)) .subscribe(([isHaLicensed, failoverNode]) => { diff --git a/src/app/pages/network/components/interfaces-card/interfaces-card.component.ts b/src/app/pages/network/components/interfaces-card/interfaces-card.component.ts index 2179315c1dc..83754ace6f6 100644 --- a/src/app/pages/network/components/interfaces-card/interfaces-card.component.ts +++ b/src/app/pages/network/components/interfaces-card/interfaces-card.component.ts @@ -139,7 +139,7 @@ export class InterfacesCardComponent implements OnInit, OnChanges { private translate: TranslateService, private slideInService: SlideInService, private dialogService: DialogService, - private ws: ApiService, + private api: ApiService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, private networkService: NetworkService, @@ -219,7 +219,7 @@ export class InterfacesCardComponent implements OnInit, OnChanges { } private makeDeleteCall(row: NetworkInterface): void { - this.ws.call('interface.delete', [row.id]) + this.api.call('interface.delete', [row.id]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/network/components/ipmi-card/ipmi-card.component.ts b/src/app/pages/network/components/ipmi-card/ipmi-card.component.ts index 49474ac7958..2f918de6b01 100644 --- a/src/app/pages/network/components/ipmi-card/ipmi-card.component.ts +++ b/src/app/pages/network/components/ipmi-card/ipmi-card.component.ts @@ -77,10 +77,10 @@ export class IpmiCardComponent implements OnInit { ariaLabels: (row) => [row.ip_address, this.translate.instant('IPMI')], }); - protected readonly hasIpmi$ = this.ws.call('ipmi.is_loaded'); + protected readonly hasIpmi$ = this.api.call('ipmi.is_loaded'); constructor( - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private matDialog: MatDialog, private translate: TranslateService, @@ -89,7 +89,7 @@ export class IpmiCardComponent implements OnInit { ) { } ngOnInit(): void { - const ipmi$ = this.ws.call('ipmi.lan.query').pipe(untilDestroyed(this)); + const ipmi$ = this.api.call('ipmi.lan.query').pipe(untilDestroyed(this)); this.dataProvider = new AsyncDataProvider(ipmi$); this.loadIpmiEntries(); } diff --git a/src/app/pages/network/components/ipmi-card/ipmi-events-dialog/ipmi-events-dialog.component.ts b/src/app/pages/network/components/ipmi-card/ipmi-events-dialog/ipmi-events-dialog.component.ts index 30671901ea0..a57f65b002a 100644 --- a/src/app/pages/network/components/ipmi-card/ipmi-events-dialog/ipmi-events-dialog.component.ts +++ b/src/app/pages/network/components/ipmi-card/ipmi-events-dialog/ipmi-events-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, } from '@angular/core'; @@ -32,7 +31,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; imports: [ FakeProgressBarComponent, MatDialogTitle, - CdkScrollable, MatDialogContent, EmptyComponent, FormActionsComponent, @@ -54,7 +52,7 @@ export class IpmiEventsDialogComponent implements OnInit { }; constructor( - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, private dialogService: DialogService, @@ -68,7 +66,7 @@ export class IpmiEventsDialogComponent implements OnInit { onClear(): void { this.isLoading = true; this.cdr.markForCheck(); - this.ws.job('ipmi.sel.clear').pipe(untilDestroyed(this)).subscribe({ + this.api.job('ipmi.sel.clear').pipe(untilDestroyed(this)).subscribe({ next: (job) => { if (job.state !== JobState.Success) { return; @@ -97,7 +95,7 @@ export class IpmiEventsDialogComponent implements OnInit { private loadEvents(): void { this.isLoading = true; this.cdr.markForCheck(); - this.ws.job('ipmi.sel.elist').pipe(untilDestroyed(this)).subscribe({ + this.api.job('ipmi.sel.elist').pipe(untilDestroyed(this)).subscribe({ next: (job) => { if (job.state !== JobState.Success) { return; diff --git a/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.spec.ts b/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.spec.ts index fdfe6189a83..d6e91e9a47a 100644 --- a/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.spec.ts +++ b/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.spec.ts @@ -30,7 +30,7 @@ describe('IpmiFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; let form: IxFormHarness; - let ws: ApiService; + let api: ApiService; let productType: ProductType; const createComponent = createComponentFactory({ component: IpmiFormComponent, @@ -111,7 +111,7 @@ describe('IpmiFormComponent', () => { }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); form = await loader.getHarness(IxFormHarness); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); } describe('product type is SCALE_ENTERPRISE', () => { @@ -175,7 +175,7 @@ describe('IpmiFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('ipmi.lan.update', [1, { + expect(api.call).toHaveBeenCalledWith('ipmi.lan.update', [1, { dhcp: false, ipaddress: '10.220.15.114', gateway: '10.220.0.1', @@ -198,7 +198,7 @@ describe('IpmiFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('ipmi.lan.update', [1, { + expect(api.call).toHaveBeenCalledWith('ipmi.lan.update', [1, { dhcp: false, ipaddress: '10.220.15.115', gateway: '10.220.0.2', @@ -238,7 +238,7 @@ describe('IpmiFormComponent', () => { const flashButton = await loader.getHarness(MatButtonHarness.with({ text: 'Flash Identify Light' })); await flashButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('ipmi.chassis.identify', [OnOff.On]); + expect(api.call).toHaveBeenLastCalledWith('ipmi.chassis.identify', [OnOff.On]); }); it('stops flashing IPMI light when Flash Identify Light is pressed again', async () => { @@ -247,7 +247,7 @@ describe('IpmiFormComponent', () => { const stopFlashing = await loader.getHarness(MatButtonHarness.with({ text: 'Stop Flashing' })); await stopFlashing.click(); - expect(ws.call).toHaveBeenLastCalledWith('ipmi.chassis.identify', [OnOff.Off]); + expect(api.call).toHaveBeenLastCalledWith('ipmi.chassis.identify', [OnOff.Off]); }); }); }); diff --git a/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.ts b/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.ts index 80cd4f632d2..1012cda6f2b 100644 --- a/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.ts +++ b/src/app/pages/network/components/ipmi-card/ipmi-form/ipmi-form.component.ts @@ -110,7 +110,7 @@ export class IpmiFormComponent implements OnInit { }); constructor( - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private redirect: RedirectService, private fb: FormBuilder, @@ -142,7 +142,7 @@ export class IpmiFormComponent implements OnInit { } toggleFlashing(): void { - this.ws.call('ipmi.chassis.identify', [this.isFlashing ? OnOff.Off : OnOff.On]) + this.api.call('ipmi.chassis.identify', [this.isFlashing ? OnOff.Off : OnOff.On]) .pipe(this.errorHandler.catchError(), untilDestroyed(this)) .subscribe(() => { this.snackbar.success( @@ -164,7 +164,7 @@ export class IpmiFormComponent implements OnInit { this.cdr.markForCheck(); forkJoin([ - this.ws.call('ipmi.lan.query', this.queryParams), + this.api.call('ipmi.lan.query', this.queryParams), this.loadFlashingStatus(), ]) .pipe( @@ -226,11 +226,11 @@ export class IpmiFormComponent implements OnInit { if (isUsingRemote) { return this.remoteControllerData ? of([this.remoteControllerData]) - : this.ws.call('ipmi.lan.query', this.queryParams); + : this.api.call('ipmi.lan.query', this.queryParams); } return this.defaultControllerData ? of([this.defaultControllerData]) - : this.ws.call('ipmi.lan.query', this.queryParams); + : this.api.call('ipmi.lan.query', this.queryParams); }), untilDestroyed(this), ) @@ -260,7 +260,7 @@ export class IpmiFormComponent implements OnInit { if (!updateParams.vlan) { delete updateParams.vlan; } - this.ws.call('ipmi.lan.update', [this.ipmiId, updateParams]) + this.api.call('ipmi.lan.update', [this.ipmiId, updateParams]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { @@ -293,7 +293,7 @@ export class IpmiFormComponent implements OnInit { } private loadFlashingStatus(): Observable { - return this.ws.call('ipmi.chassis.info').pipe( + return this.api.call('ipmi.chassis.info').pipe( tap((ipmiStatus) => { this.isFlashing = ipmiStatus.chassis_identify_state !== IpmiChassisIdentifyState.Off; this.cdr.markForCheck(); @@ -313,7 +313,7 @@ export class IpmiFormComponent implements OnInit { return of(null); } - return this.ws.call('failover.node').pipe( + return this.api.call('failover.node').pipe( tap((node) => { this.createControllerOptions(node); this.loadDataOnRemoteControllerChange(); diff --git a/src/app/pages/network/components/network-configuration-card/network-configuration-card.component.ts b/src/app/pages/network/components/network-configuration-card/network-configuration-card.component.ts index ca9e34701ea..5a4a1ace45a 100644 --- a/src/app/pages/network/components/network-configuration-card/network-configuration-card.component.ts +++ b/src/app/pages/network/components/network-configuration-card/network-configuration-card.component.ts @@ -57,7 +57,7 @@ export class NetworkConfigurationCardComponent implements OnInit { isLoading = false; constructor( - private ws: ApiService, + private api: ApiService, private translate: TranslateService, private cdr: ChangeDetectorRef, private slideInService: SlideInService, @@ -154,8 +154,8 @@ export class NetworkConfigurationCardComponent implements OnInit { this.cdr.markForCheck(); combineLatest([ - this.ws.call('network.general.summary'), - this.ws.call('network.configuration.config'), + this.api.call('network.general.summary'), + this.api.call('network.configuration.config'), ]) .pipe(untilDestroyed(this)) .subscribe(([summary, config]) => { diff --git a/src/app/pages/network/components/static-route-delete-dialog/static-route-delete-dialog.component.ts b/src/app/pages/network/components/static-route-delete-dialog/static-route-delete-dialog.component.ts index 7a11102df73..5456c73ac26 100644 --- a/src/app/pages/network/components/static-route-delete-dialog/static-route-delete-dialog.component.ts +++ b/src/app/pages/network/components/static-route-delete-dialog/static-route-delete-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -27,7 +26,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, FormActionsComponent, MatDialogActions, @@ -45,7 +43,7 @@ export class StaticRouteDeleteDialogComponent { constructor( private loader: AppLoaderService, - private ws: ApiService, + private api: ApiService, private snackbar: SnackbarService, private translate: TranslateService, private dialogRef: MatDialogRef, @@ -54,7 +52,7 @@ export class StaticRouteDeleteDialogComponent { ) { } onDelete(): void { - this.ws.call('staticroute.delete', [this.route.id]) + this.api.call('staticroute.delete', [this.route.id]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/network/components/static-route-form/static-route-form.component.spec.ts b/src/app/pages/network/components/static-route-form/static-route-form.component.spec.ts index 43332c761f8..4365266914a 100644 --- a/src/app/pages/network/components/static-route-form/static-route-form.component.spec.ts +++ b/src/app/pages/network/components/static-route-form/static-route-form.component.spec.ts @@ -17,7 +17,7 @@ import { SlideInService } from 'app/services/slide-in.service'; describe('StaticRouteFormComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: StaticRouteFormComponent, imports: [ @@ -40,7 +40,7 @@ describe('StaticRouteFormComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('sends a create payload to websocket and closes modal when save is pressed', async () => { @@ -54,7 +54,7 @@ describe('StaticRouteFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('staticroute.create', [{ + expect(api.call).toHaveBeenCalledWith('staticroute.create', [{ destination: '10.24.12.13/16', gateway: '10.24.12.1', description: 'My route', @@ -78,7 +78,7 @@ describe('StaticRouteFormComponent', () => { ], }); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows current group values when form is being edited', async () => { @@ -103,7 +103,7 @@ describe('StaticRouteFormComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('staticroute.update', [ + expect(api.call).toHaveBeenCalledWith('staticroute.update', [ 13, { destination: '15.24.12.13/16', diff --git a/src/app/pages/network/components/static-route-form/static-route-form.component.ts b/src/app/pages/network/components/static-route-form/static-route-form.component.ts index 49f289f4696..12a1cdbbcc3 100644 --- a/src/app/pages/network/components/static-route-form/static-route-form.component.ts +++ b/src/app/pages/network/components/static-route-form/static-route-form.component.ts @@ -72,7 +72,7 @@ export class StaticRouteFormComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private snackbar: SnackbarService, private errorHandler: FormErrorHandlerService, @@ -97,9 +97,9 @@ export class StaticRouteFormComponent implements OnInit { let request$: Observable; if (this.isNew) { - request$ = this.ws.call('staticroute.create', [values]); + request$ = this.api.call('staticroute.create', [values]); } else { - request$ = this.ws.call('staticroute.update', [ + request$ = this.api.call('staticroute.update', [ this.editingRoute.id, values, ]); diff --git a/src/app/pages/network/components/static-routes-card/static-routes-card.component.ts b/src/app/pages/network/components/static-routes-card/static-routes-card.component.ts index dc8c1504d07..349add05c59 100644 --- a/src/app/pages/network/components/static-routes-card/static-routes-card.component.ts +++ b/src/app/pages/network/components/static-routes-card/static-routes-card.component.ts @@ -95,14 +95,14 @@ export class StaticRoutesCardComponent implements OnInit { constructor( private matDialog: MatDialog, - private ws: ApiService, + private api: ApiService, private slideInService: SlideInService, private translate: TranslateService, protected emptyService: EmptyService, ) {} ngOnInit(): void { - const staticRoutes$ = this.ws.call('staticroute.query').pipe( + const staticRoutes$ = this.api.call('staticroute.query').pipe( tap((staticRoutes) => this.staticRoutes = staticRoutes), untilDestroyed(this), ); diff --git a/src/app/pages/network/network.component.ts b/src/app/pages/network/network.component.ts index d5d023ba3d6..226d9151494 100644 --- a/src/app/pages/network/network.component.ts +++ b/src/app/pages/network/network.component.ts @@ -96,7 +96,7 @@ export class NetworkComponent implements OnInit { } constructor( - private ws: ApiService, + private api: ApiService, private router: Router, private dialogService: DialogService, private loader: AppLoaderService, @@ -190,19 +190,19 @@ export class NetworkComponent implements OnInit { private getCheckInWaitingSeconds(): Promise { return lastValueFrom( - this.ws.call('interface.checkin_waiting'), + this.api.call('interface.checkin_waiting'), ); } private getPendingChanges(): Promise { return lastValueFrom( - this.ws.call('interface.has_pending_changes'), + this.api.call('interface.has_pending_changes'), ); } private async cancelCommit(): Promise { await lastValueFrom( - this.ws.call('interface.cancel_rollback'), + this.api.call('interface.cancel_rollback'), ); } @@ -242,7 +242,7 @@ export class NetworkComponent implements OnInit { } commitPendingChanges(): void { - this.ws + this.api .call('interface.services_restarted_on_sync') .pipe(untilDestroyed(this)) .subscribe((services) => { @@ -281,7 +281,7 @@ export class NetworkComponent implements OnInit { return; } - this.ws + this.api .call('interface.commit', [{ checkin_timeout: this.checkinTimeout }]) .pipe( this.loader.withLoader(), @@ -331,7 +331,7 @@ export class NetworkComponent implements OnInit { } finishCheckin(): void { - this.ws + this.api .call('interface.checkin') .pipe( this.loader.withLoader(), @@ -366,7 +366,7 @@ export class NetworkComponent implements OnInit { return; } - this.ws + this.api .call('interface.rollback') .pipe( this.loader.withLoader(), @@ -396,7 +396,7 @@ export class NetworkComponent implements OnInit { return; } - this.ws.call('interface.query', [[['id', '=', state.editInterface]]]) + this.api.call('interface.query', [[['id', '=', state.editInterface]]]) .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/network/stores/interfaces.store.ts b/src/app/pages/network/stores/interfaces.store.ts index 732788134ea..689d410e12f 100644 --- a/src/app/pages/network/stores/interfaces.store.ts +++ b/src/app/pages/network/stores/interfaces.store.ts @@ -19,7 +19,7 @@ const initialState: InterfacesState = { @Injectable() export class InterfacesStore extends ComponentStore { constructor( - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private errorHandler: ErrorHandlerService, ) { @@ -30,7 +30,7 @@ export class InterfacesStore extends ComponentStore { return trigger$.pipe( tap(() => this.patchState({ isLoading: true })), switchMap(() => { - return this.ws.call('interface.query').pipe( + return this.api.call('interface.query').pipe( tap({ next: (interfaces) => this.patchState({ interfaces }), error: (error) => this.dialogService.error(this.errorHandler.parseError(error)), diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts index 61bb69731aa..bcfb21a24a7 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-form/reporting-exporters-form.component.ts @@ -99,7 +99,7 @@ export class ReportingExportersFormComponent implements OnInit { private fb: FormBuilder, private slideInRef: SlideInRef, private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, @@ -147,7 +147,7 @@ export class ReportingExportersFormComponent implements OnInit { } getExportersSchemas(): Observable { - return this.ws.call('reporting.exporters.exporter_schemas'); + return this.api.call('reporting.exporters.exporter_schemas'); } setExporterTypeOptions(schemas: ReportingExporterSchema[]): void { @@ -230,9 +230,9 @@ export class ReportingExportersFormComponent implements OnInit { let request$: Observable; if (this.isNew) { - request$ = this.ws.call('reporting.exporters.create', [values]); + request$ = this.api.call('reporting.exporters.create', [values]); } else { - request$ = this.ws.call('reporting.exporters.update', [ + request$ = this.api.call('reporting.exporters.update', [ this.editingExporter.id, values, ]); diff --git a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts index adbc794a701..f08c68742f7 100644 --- a/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts +++ b/src/app/pages/reports-dashboard/components/exporters/reporting-exporters-list/reporting-exporters-list.component.ts @@ -96,7 +96,7 @@ export class ReportingExporterListComponent implements OnInit { const exporter = { ...row }; delete exporter.type; delete exporter.id; - this.ws.call('reporting.exporters.update', [row.id, { ...exporter, enabled: checked }]).pipe( + this.api.call('reporting.exporters.update', [row.id, { ...exporter, enabled: checked }]).pipe( untilDestroyed(this), ).subscribe({ complete: () => this.appLoader.close(), @@ -148,7 +148,7 @@ export class ReportingExporterListComponent implements OnInit { constructor( private translate: TranslateService, - private ws: ApiService, + private api: ApiService, private cdr: ChangeDetectorRef, private slideInService: SlideInService, private dialogService: DialogService, @@ -179,7 +179,7 @@ export class ReportingExporterListComponent implements OnInit { } private getExporters(): void { - this.ws.call('reporting.exporters.query').pipe(untilDestroyed(this)).subscribe({ + this.api.call('reporting.exporters.query').pipe(untilDestroyed(this)).subscribe({ next: (exporters: ReportingExporter[]) => { this.exporters = exporters; this.onListFiltered(this.filterString); @@ -221,7 +221,7 @@ export class ReportingExporterListComponent implements OnInit { }).pipe( filter(Boolean), tap(() => this.appLoader.open(this.translate.instant('Deleting exporter'))), - switchMap(() => this.ws.call('reporting.exporters.delete', [exporter.id])), + switchMap(() => this.api.call('reporting.exporters.delete', [exporter.id])), untilDestroyed(this), ).subscribe({ next: (deleted) => { diff --git a/src/app/pages/reports-dashboard/components/reports-global-controls/netdata-dialog/netdata-dialog.component.ts b/src/app/pages/reports-dashboard/components/reports-global-controls/netdata-dialog/netdata-dialog.component.ts index e5f618950af..9f7555cc5f8 100644 --- a/src/app/pages/reports-dashboard/components/reports-global-controls/netdata-dialog/netdata-dialog.component.ts +++ b/src/app/pages/reports-dashboard/components/reports-global-controls/netdata-dialog/netdata-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, OnInit, } from '@angular/core'; @@ -33,7 +32,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; MatDialogClose, TestDirective, IxIconComponent, - CdkScrollable, MatDialogContent, IxInputComponent, ReactiveFormsModule, @@ -47,7 +45,7 @@ export class NetdataDialogComponent implements OnInit { protected readonly passwordControl = new FormControl(''); constructor( - private ws: ApiService, + private api: ApiService, private reportsService: ReportsService, private loader: AppLoaderService, private errorHandler: ErrorHandlerService, @@ -79,7 +77,7 @@ export class NetdataDialogComponent implements OnInit { } private generatePassword(): Observable { - return this.ws.call('reporting.netdataweb_generate_password') + return this.api.call('reporting.netdataweb_generate_password') .pipe( this.loader.withLoader(), this.errorHandler.catchError(), diff --git a/src/app/pages/reports-dashboard/reports.service.ts b/src/app/pages/reports-dashboard/reports.service.ts index 6b5bf115e75..eef7e862b65 100644 --- a/src/app/pages/reports-dashboard/reports.service.ts +++ b/src/app/pages/reports-dashboard/reports.service.ts @@ -31,16 +31,16 @@ export class ReportsService { constructor( private authService: AuthService, private errorHandler: ErrorHandlerService, - private ws: ApiService, + private api: ApiService, private http: HttpClient, @Inject(WINDOW) private window: Window, ) { - this.ws.call('reporting.netdata_graphs').subscribe((reportingGraphs) => { + this.api.call('reporting.netdata_graphs').subscribe((reportingGraphs) => { this.hasUps = reportingGraphs.some((graph) => graph.name.startsWith(ReportingGraphName.Ups)); this.reportingGraphs$.next(reportingGraphs); }); - this.ws.call('disk.temperatures').subscribe((values) => { + this.api.call('disk.temperatures').subscribe((values) => { this.hasDiskTemperature = Boolean(Object.values(values).filter(Boolean).length); }); } @@ -57,7 +57,7 @@ export class ReportsService { truncate: boolean; }, ): Observable { - return this.ws.call( + return this.api.call( 'reporting.netdata_get_data', [[queryData.params], queryData.timeFrame], ).pipe( @@ -111,7 +111,7 @@ export class ReportsService { } getDiskDevices(): Observable { - return this.ws.call('disk.query').pipe( + return this.api.call('disk.query').pipe( map((disks) => { return disks .filter((disk) => !disk.devname.includes('multipath')) diff --git a/src/app/pages/services/components/service-ftp/service-ftp.component.ts b/src/app/pages/services/components/service-ftp/service-ftp.component.ts index a26e533163e..8ec777c42d4 100644 --- a/src/app/pages/services/components/service-ftp/service-ftp.component.ts +++ b/src/app/pages/services/components/service-ftp/service-ftp.component.ts @@ -125,7 +125,7 @@ export class ServiceFtpComponent implements OnInit { constructor( private formBuilder: FormBuilder, - private ws: ApiService, + private api: ApiService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -159,7 +159,7 @@ export class ServiceFtpComponent implements OnInit { }; this.isFormLoading = true; - this.ws.call('ftp.update', [values]) + this.api.call('ftp.update', [values]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { @@ -182,7 +182,7 @@ export class ServiceFtpComponent implements OnInit { private loadConfig(): void { this.isFormLoading = true; - this.ws.call('ftp.config') + this.api.call('ftp.config') .pipe(untilDestroyed(this)) .subscribe({ next: (config) => { diff --git a/src/app/pages/services/components/service-nfs/add-spn-dialog/add-spn-dialog.component.ts b/src/app/pages/services/components/service-nfs/add-spn-dialog/add-spn-dialog.component.ts index 18cc3a67554..796880b7959 100644 --- a/src/app/pages/services/components/service-nfs/add-spn-dialog/add-spn-dialog.component.ts +++ b/src/app/pages/services/components/service-nfs/add-spn-dialog/add-spn-dialog.component.ts @@ -43,7 +43,7 @@ export class AddSpnDialogComponent { }); constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private formBuilder: FormBuilder, private translate: TranslateService, @@ -58,7 +58,7 @@ export class AddSpnDialogComponent { password: this.form.value.password, }; - this.ws.call('nfs.add_principal', [payload]) + this.api.call('nfs.add_principal', [payload]) .pipe( this.errorHandler.catchError(), this.loader.withLoader(), diff --git a/src/app/pages/services/components/service-nfs/service-nfs.component.spec.ts b/src/app/pages/services/components/service-nfs/service-nfs.component.spec.ts index 451a7d85515..350d7b2cf75 100644 --- a/src/app/pages/services/components/service-nfs/service-nfs.component.spec.ts +++ b/src/app/pages/services/components/service-nfs/service-nfs.component.spec.ts @@ -28,7 +28,7 @@ import { selectIsEnterprise } from 'app/store/system-info/system-info.selectors' describe('ServiceNfsComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; let form: IxFormHarness; const createComponent = createRoutingFactory({ component: ServiceNfsComponent, @@ -90,13 +90,13 @@ describe('ServiceNfsComponent', () => { beforeEach(async () => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); form = await loader.getHarness(IxFormHarness); }); it('shows current settings for NFS service when form is opened', async () => { const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith('nfs.config'); + expect(api.call).toHaveBeenCalledWith('nfs.config'); expect(values).toEqual({ 'Bind IP Addresses': ['192.168.1.117', '192.168.1.118'], 'Calculate number of threads dynamically': false, @@ -129,7 +129,7 @@ describe('ServiceNfsComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('nfs.update', [{ + expect(api.call).toHaveBeenCalledWith('nfs.update', [{ allow_nonroot: true, bindip: ['192.168.1.119'], protocols: [NfsProtocol.V4], diff --git a/src/app/pages/services/components/service-nfs/service-nfs.component.ts b/src/app/pages/services/components/service-nfs/service-nfs.component.ts index f101010a9e8..838d5a113d8 100644 --- a/src/app/pages/services/components/service-nfs/service-nfs.component.ts +++ b/src/app/pages/services/components/service-nfs/service-nfs.component.ts @@ -1,4 +1,3 @@ -import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, OnInit, signal, } from '@angular/core'; @@ -65,7 +64,7 @@ import { selectIsEnterprise } from 'app/store/system-info/system-info.selectors' TestDirective, TooltipComponent, TranslateModule, - AsyncPipe, + ], }) export class ServiceNfsComponent implements OnInit { @@ -106,7 +105,7 @@ export class ServiceNfsComponent implements OnInit { userd_manage_gids: helptextServiceNfs.userd_manage_gids, }; - readonly ipChoices$ = this.ws.call('nfs.bindip_choices').pipe(choicesToOptions()); + readonly ipChoices$ = this.api.call('nfs.bindip_choices').pipe(choicesToOptions()); readonly protocolOptions$ = of(mapToOptions(nfsProtocolLabels, this.translate)); readonly requiredRoles = [Role.SharingNfsWrite, Role.SharingWrite]; @@ -114,7 +113,7 @@ export class ServiceNfsComponent implements OnInit { private readonly v4SpecificFields = ['v4_domain', 'v4_krb'] as const; constructor( - private ws: ApiService, + private api: ApiService, private errorHandler: ErrorHandlerService, private formErrorHandler: FormErrorHandlerService, private fb: FormBuilder, @@ -154,7 +153,7 @@ export class ServiceNfsComponent implements OnInit { delete params.servers_auto; this.isFormLoading.set(true); - this.ws.call('nfs.update', [params]) + this.api.call('nfs.update', [params]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { @@ -170,7 +169,7 @@ export class ServiceNfsComponent implements OnInit { } private loadConfig(): Observable { - return this.ws.call('nfs.config') + return this.api.call('nfs.config') .pipe( tap((config) => { this.isAddSpnDisabled.set(!config.v4_krb); @@ -185,7 +184,7 @@ export class ServiceNfsComponent implements OnInit { private checkForRdmaSupport(): Observable { return forkJoin([ - this.ws.call('rdma.capable_protocols'), + this.api.call('rdma.capable_protocols'), this.store$.select(selectIsEnterprise).pipe(take(1)), ]).pipe( map(([capableProtocols, isEnterprise]) => { @@ -202,7 +201,7 @@ export class ServiceNfsComponent implements OnInit { } private loadActiveDirectoryState(): Observable { - return this.ws.call('directoryservices.get_state').pipe( + return this.api.call('directoryservices.get_state').pipe( tap(({ activedirectory }) => { this.activeDirectoryState.set(activedirectory); }), diff --git a/src/app/pages/services/components/service-smart/service-smart.component.spec.ts b/src/app/pages/services/components/service-smart/service-smart.component.spec.ts index 6c47d99e5b0..7e01c4e3af3 100644 --- a/src/app/pages/services/components/service-smart/service-smart.component.spec.ts +++ b/src/app/pages/services/components/service-smart/service-smart.component.spec.ts @@ -20,7 +20,7 @@ import { ServiceSmartComponent } from './service-smart.component'; describe('ServiceSmartComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createComponentFactory({ component: ServiceSmartComponent, imports: [ @@ -50,14 +50,14 @@ describe('ServiceSmartComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('shows current settings for SMART service when form is opened', async () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith('smart.config'); + expect(api.call).toHaveBeenCalledWith('smart.config'); expect(values).toEqual({ 'Check Interval': '30', 'Power Mode': 'Never', @@ -80,7 +80,7 @@ describe('ServiceSmartComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('smart.update', [{ + expect(api.call).toHaveBeenCalledWith('smart.update', [{ interval: 60, powermode: SmartPowerMode.Sleep, difference: 20, diff --git a/src/app/pages/services/components/service-smart/service-smart.component.ts b/src/app/pages/services/components/service-smart/service-smart.component.ts index 11b6a5924d7..6c317f3f4cb 100644 --- a/src/app/pages/services/components/service-smart/service-smart.component.ts +++ b/src/app/pages/services/components/service-smart/service-smart.component.ts @@ -76,7 +76,7 @@ export class ServiceSmartComponent implements OnInit { ]); constructor( - private ws: ApiService, + private api: ApiService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -89,7 +89,7 @@ export class ServiceSmartComponent implements OnInit { ngOnInit(): void { this.isFormLoading = true; - this.ws.call('smart.config') + this.api.call('smart.config') .pipe(untilDestroyed(this)) .subscribe({ next: (config) => { @@ -109,7 +109,7 @@ export class ServiceSmartComponent implements OnInit { const values = this.form.value; this.isFormLoading = true; - this.ws.call('smart.update', [values as SmartConfigUpdate]) + this.api.call('smart.update', [values as SmartConfigUpdate]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/services/components/service-smb/service-smb.component.spec.ts b/src/app/pages/services/components/service-smb/service-smb.component.spec.ts index 19537f2d4f3..e0c97025826 100644 --- a/src/app/pages/services/components/service-smb/service-smb.component.spec.ts +++ b/src/app/pages/services/components/service-smb/service-smb.component.spec.ts @@ -24,7 +24,7 @@ import { UserService } from 'app/services/user.service'; describe('ServiceSmbComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createRoutingFactory({ component: ServiceSmbComponent, @@ -98,14 +98,14 @@ describe('ServiceSmbComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads and shows current settings for Smb service when form is opened', async () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith('smb.config'); + expect(api.call).toHaveBeenCalledWith('smb.config'); expect(values).toEqual({ 'NetBIOS Name': 'truenas', 'NetBIOS Alias': [], @@ -159,7 +159,7 @@ describe('ServiceSmbComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('smb.update', [{ + expect(api.call).toHaveBeenLastCalledWith('smb.update', [{ // New basic options netbiosname: 'truenas-scale', netbiosalias: ['truenas-alias', 'truenas-alias2'], @@ -205,7 +205,7 @@ describe('ServiceSmbComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenLastCalledWith('smb.update', [{ + expect(api.call).toHaveBeenLastCalledWith('smb.update', [{ // Old basic options netbiosname: 'truenas', netbiosalias: [], diff --git a/src/app/pages/services/components/service-smb/service-smb.component.ts b/src/app/pages/services/components/service-smb/service-smb.component.ts index 51074c074e8..c6f831d6419 100644 --- a/src/app/pages/services/components/service-smb/service-smb.component.ts +++ b/src/app/pages/services/components/service-smb/service-smb.component.ts @@ -124,8 +124,8 @@ export class ServiceSmbComponent implements OnInit { { label: this.translate.instant('Debug'), value: LogLevel.Debug }, ]); - readonly unixCharsetOptions$ = this.ws.call('smb.unixcharset_choices').pipe(choicesToOptions()); - readonly guestAccountOptions$ = this.ws.call('user.query').pipe( + readonly unixCharsetOptions$ = this.api.call('smb.unixcharset_choices').pipe(choicesToOptions()); + readonly guestAccountOptions$ = this.api.call('user.query').pipe( map((users) => users.map((user) => ({ label: user.username, value: user.username }))), ); @@ -135,11 +135,11 @@ export class ServiceSmbComponent implements OnInit { ), ); - readonly bindIpAddressOptions$ = this.ws.call('smb.bindip_choices').pipe(choicesToOptions()); + readonly bindIpAddressOptions$ = this.api.call('smb.bindip_choices').pipe(choicesToOptions()); readonly encryptionOptions$ = of(mapToOptions(smbEncryptionLabels, this.translate)); constructor( - private ws: ApiService, + private api: ApiService, private formErrorHandler: FormErrorHandlerService, private cdr: ChangeDetectorRef, private errorHandler: ErrorHandlerService, @@ -155,7 +155,7 @@ export class ServiceSmbComponent implements OnInit { ngOnInit(): void { this.isFormLoading = true; - this.ws.call('smb.config').pipe(untilDestroyed(this)).subscribe({ + this.api.call('smb.config').pipe(untilDestroyed(this)).subscribe({ next: (config) => { this.form.patchValue(config); this.isFormLoading = false; @@ -177,7 +177,7 @@ export class ServiceSmbComponent implements OnInit { const values: SmbConfigUpdate = this.form.value; this.isFormLoading = true; - this.ws.call('smb.update', [values]) + this.api.call('smb.update', [values]) .pipe(untilDestroyed(this)) .subscribe({ next: () => { diff --git a/src/app/pages/services/components/service-snmp/service-snmp.component.ts b/src/app/pages/services/components/service-snmp/service-snmp.component.ts index 8c025e9ae3f..fc667604675 100644 --- a/src/app/pages/services/components/service-snmp/service-snmp.component.ts +++ b/src/app/pages/services/components/service-snmp/service-snmp.component.ts @@ -104,7 +104,7 @@ export class ServiceSnmpComponent implements OnInit { constructor( private fb: FormBuilder, - private ws: ApiService, + private api: ApiService, private dialogService: DialogService, private errorHandler: ErrorHandlerService, private cdr: ChangeDetectorRef, @@ -130,7 +130,7 @@ export class ServiceSnmpComponent implements OnInit { values.v3_privpassphrase = ''; } - this.ws.call('snmp.update', [values as SnmpConfigUpdate]).pipe(untilDestroyed(this)).subscribe({ + this.api.call('snmp.update', [values as SnmpConfigUpdate]).pipe(untilDestroyed(this)).subscribe({ next: () => { this.isFormLoading = false; this.snackbar.success(this.translate.instant('Service configuration saved')); @@ -147,7 +147,7 @@ export class ServiceSnmpComponent implements OnInit { private loadCurrentSettings(): void { this.isFormLoading = true; - this.ws.call('snmp.config').pipe(untilDestroyed(this)).subscribe({ + this.api.call('snmp.config').pipe(untilDestroyed(this)).subscribe({ next: (config) => { this.isFormLoading = false; this.form.patchValue(config); diff --git a/src/app/pages/services/components/service-ssh/service-ssh.component.spec.ts b/src/app/pages/services/components/service-ssh/service-ssh.component.spec.ts index 8f7e1ddcff0..fa723a3500f 100644 --- a/src/app/pages/services/components/service-ssh/service-ssh.component.spec.ts +++ b/src/app/pages/services/components/service-ssh/service-ssh.component.spec.ts @@ -29,7 +29,7 @@ const fakeGroupDataSource = [{ describe('ServiceSshComponent', () => { let spectator: Spectator; let loader: HarnessLoader; - let ws: ApiService; + let api: ApiService; const createComponent = createRoutingFactory({ component: ServiceSshComponent, imports: [ @@ -69,14 +69,14 @@ describe('ServiceSshComponent', () => { beforeEach(() => { spectator = createComponent(); loader = TestbedHarnessEnvironment.loader(spectator.fixture); - ws = spectator.inject(ApiService); + api = spectator.inject(ApiService); }); it('loads and shows current settings for S3 service when form is opened', async () => { const form = await loader.getHarness(IxFormHarness); const values = await form.getValues(); - expect(ws.call).toHaveBeenCalledWith('ssh.config'); + expect(api.call).toHaveBeenCalledWith('ssh.config'); expect(values).toEqual({ 'TCP Port': '22', 'Password Login Groups': ['dummy-group'], @@ -121,7 +121,7 @@ describe('ServiceSshComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('ssh.update', [{ + expect(api.call).toHaveBeenCalledWith('ssh.update', [{ // New basic options tcpport: 23, password_login_groups: ['dummy-group'], @@ -157,7 +157,7 @@ describe('ServiceSshComponent', () => { const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('ssh.update', [{ + expect(api.call).toHaveBeenCalledWith('ssh.update', [{ // Old basic options kerberosauth: false, passwordauth: true, diff --git a/src/app/pages/sharing/iscsi/extent/extent-list/delete-extent-dialog/delete-extent-dialog.component.ts b/src/app/pages/sharing/iscsi/extent/extent-list/delete-extent-dialog/delete-extent-dialog.component.ts index 9df28205bf7..f1c33168c71 100644 --- a/src/app/pages/sharing/iscsi/extent/extent-list/delete-extent-dialog/delete-extent-dialog.component.ts +++ b/src/app/pages/sharing/iscsi/extent/extent-list/delete-extent-dialog/delete-extent-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -29,7 +28,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxCheckboxComponent, diff --git a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts index d31d10dcf4a..c5f4e4ab600 100644 --- a/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts +++ b/src/app/pages/sharing/iscsi/initiator/initiator-form/initiator-form.component.ts @@ -5,7 +5,6 @@ import { import { ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent, MatCardActions } from '@angular/material/card'; -import { MatListItemLine } from '@angular/material/list'; import { MatProgressBar } from '@angular/material/progress-bar'; import { ActivatedRoute, Router } from '@angular/router'; import { FormBuilder } from '@ngneat/reactive-forms'; @@ -50,7 +49,6 @@ interface InitiatorItem { MatButton, TestDirective, IxIconComponent, - MatListItemLine, MatCardActions, RequiresRolesDirective, TranslateModule, diff --git a/src/app/pages/sharing/smb/smb-form/restart-smb-dialog/restart-smb-dialog.component.ts b/src/app/pages/sharing/smb/smb-form/restart-smb-dialog/restart-smb-dialog.component.ts index 4331f09074b..3ae379c1b22 100644 --- a/src/app/pages/sharing/smb/smb-form/restart-smb-dialog/restart-smb-dialog.component.ts +++ b/src/app/pages/sharing/smb/smb-form/restart-smb-dialog/restart-smb-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -24,7 +23,6 @@ interface RestartDialogData { changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/pages/sharing/smb/smb-list/smb-list.component.spec.ts b/src/app/pages/sharing/smb/smb-list/smb-list.component.spec.ts index cd695c0d72f..7a3f566caed 100644 --- a/src/app/pages/sharing/smb/smb-list/smb-list.component.spec.ts +++ b/src/app/pages/sharing/smb/smb-list/smb-list.component.spec.ts @@ -155,7 +155,7 @@ describe('SmbListComponent', () => { await toggle.uncheck(); - expect(spectator.inject(WebSocketService).call).toHaveBeenCalledWith( + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith( 'sharing.smb.update', [1, { enabled: false }], ); diff --git a/src/app/pages/signin/set-admin-password-form/set-admin-password-form.component.ts b/src/app/pages/signin/set-admin-password-form/set-admin-password-form.component.ts index 6f6031842d9..b144a8adbb7 100644 --- a/src/app/pages/signin/set-admin-password-form/set-admin-password-form.component.ts +++ b/src/app/pages/signin/set-admin-password-form/set-admin-password-form.component.ts @@ -11,7 +11,6 @@ import { TranslateService, TranslateModule } from '@ngx-translate/core'; import { switchMap } from 'rxjs/operators'; import { LoginResult } from 'app/enums/login-result.enum'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; -import { IxRadioGroupComponent } from 'app/modules/forms/ix-forms/components/ix-radio-group/ix-radio-group.component'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; import { matchOthersFgValidator } from 'app/modules/forms/ix-forms/validators/password-validation/password-validation'; import { TestDirective } from 'app/modules/test-id/test.directive'; @@ -35,7 +34,6 @@ const adminUsername = 'truenas_admin'; AsyncPipe, TranslateModule, IxInputComponent, - IxRadioGroupComponent, TestDirective, ], }) diff --git a/src/app/pages/signin/signin-form/signin-form.component.ts b/src/app/pages/signin/signin-form/signin-form.component.ts index 55fe80db58a..cb82a54c643 100644 --- a/src/app/pages/signin/signin-form/signin-form.component.ts +++ b/src/app/pages/signin/signin-form/signin-form.component.ts @@ -1,4 +1,3 @@ -import { AsyncPipe } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, Inject, input, OnInit, } from '@angular/core'; @@ -38,7 +37,6 @@ import { AuthService } from 'app/services/auth/auth.service'; ReactiveFormsModule, InsecureConnectionComponent, MatButton, - AsyncPipe, TranslateModule, IxInputComponent, AutofocusDirective, diff --git a/src/app/pages/signin/signin.component.ts b/src/app/pages/signin/signin.component.ts index 109f2926c31..655043c4c58 100644 --- a/src/app/pages/signin/signin.component.ts +++ b/src/app/pages/signin/signin.component.ts @@ -7,7 +7,6 @@ import { MatCard, MatCardContent } from '@angular/material/card'; import { MatFormField } from '@angular/material/form-field'; import { MatInput } from '@angular/material/input'; import { MatProgressBar } from '@angular/material/progress-bar'; -import { MatProgressSpinner } from '@angular/material/progress-spinner'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule } from '@ngx-translate/core'; import { combineLatest, Observable, of } from 'rxjs'; @@ -40,7 +39,6 @@ import { WebSocketConnectionService } from 'app/services/websocket-connection.se imports: [ MatFormField, MatInput, - MatProgressSpinner, MatProgressBar, MatCard, MatCardContent, diff --git a/src/app/pages/storage/components/dashboard-pool/export-disconnect-modal/export-disconnect-modal.component.ts b/src/app/pages/storage/components/dashboard-pool/export-disconnect-modal/export-disconnect-modal.component.ts index a9c507c0ca6..00d62d6233f 100644 --- a/src/app/pages/storage/components/dashboard-pool/export-disconnect-modal/export-disconnect-modal.component.ts +++ b/src/app/pages/storage/components/dashboard-pool/export-disconnect-modal/export-disconnect-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, } from '@angular/core'; @@ -49,7 +48,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; MatDialogTitle, MatProgressBar, ReactiveFormsModule, - CdkScrollable, MatDialogContent, IxFieldsetComponent, IxCheckboxComponent, diff --git a/src/app/pages/storage/components/unused-resources/unused-disk-card/manage-unused-disk-dialog/manage-unused-disk-dialog.component.ts b/src/app/pages/storage/components/unused-resources/unused-disk-card/manage-unused-disk-dialog/manage-unused-disk-dialog.component.ts index 325d05c696f..3982b1d03a6 100644 --- a/src/app/pages/storage/components/unused-resources/unused-disk-card/manage-unused-disk-dialog/manage-unused-disk-dialog.component.ts +++ b/src/app/pages/storage/components/unused-resources/unused-disk-card/manage-unused-disk-dialog/manage-unused-disk-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnInit, } from '@angular/core'; @@ -37,7 +36,6 @@ import { AddToPoolType, ManageUnusedDiskDialogResource } from 'app/pages/storage imports: [ MatDialogTitle, ReactiveFormsModule, - CdkScrollable, MatDialogContent, WarningComponent, IxFieldsetComponent, diff --git a/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts b/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts index 33aca2c3742..2e28c000040 100644 --- a/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts +++ b/src/app/pages/storage/modules/devices/components/disk-details-panel/disk-details-panel.component.ts @@ -9,9 +9,7 @@ import { VdevType } from 'app/enums/v-dev-type.enum'; import { Disk } from 'app/interfaces/disk.interface'; import { isTopologyDisk, TopologyItem } from 'app/interfaces/storage.interface'; import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; import { CastPipe } from 'app/modules/pipes/cast/cast.pipe'; -import { TestDirective } from 'app/modules/test-id/test.directive'; import { DiskInfoCardComponent } from 'app/pages/storage/modules/devices/components/disk-info-card/disk-info-card.component'; import { HardwareDiskEncryptionComponent } from 'app/pages/storage/modules/devices/components/hardware-disk-encryption/hardware-disk-encryption.component'; import { SmartInfoCardComponent } from 'app/pages/storage/modules/devices/components/smart-info-card/smart-info-card.component'; @@ -25,8 +23,6 @@ import { ZfsInfoCardComponent } from 'app/pages/storage/modules/devices/componen changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - TestDirective, - IxIconComponent, MatTooltip, TopologyItemIconComponent, ZfsInfoCardComponent, diff --git a/src/app/pages/storage/modules/disks/components/manual-test-dialog/manual-test-dialog.component.ts b/src/app/pages/storage/modules/disks/components/manual-test-dialog/manual-test-dialog.component.ts index 5db4ea2ad20..23af716c9e1 100644 --- a/src/app/pages/storage/modules/disks/components/manual-test-dialog/manual-test-dialog.component.ts +++ b/src/app/pages/storage/modules/disks/components/manual-test-dialog/manual-test-dialog.component.ts @@ -1,4 +1,3 @@ -import { PercentPipe } from '@angular/common'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, signal, @@ -8,7 +7,6 @@ import { MatButton } from '@angular/material/button'; import { MAT_DIALOG_DATA, MatDialogRef, MatDialogTitle, MatDialogClose, } from '@angular/material/dialog'; -import { MatProgressBar } from '@angular/material/progress-bar'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateService, TranslateModule } from '@ngx-translate/core'; import { of } from 'rxjs'; @@ -18,7 +16,6 @@ import { SmartTestType } from 'app/enums/smart-test-type.enum'; import { Disk } from 'app/interfaces/disk.interface'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxSelectComponent } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.component'; -import { FormatDateTimePipe } from 'app/modules/pipes/format-date-time/format-datetime.pipe'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { TestProgressRowComponent } from 'app/pages/storage/modules/disks/components/manual-test-dialog/test-progress-row/test-progress-row.component'; import { ApiService } from 'app/services/api.service'; @@ -44,10 +41,7 @@ export interface ManualTestDialogParams { TestDirective, MatDialogClose, RequiresRolesDirective, - MatProgressBar, TranslateModule, - FormatDateTimePipe, - PercentPipe, TestProgressRowComponent, ], }) diff --git a/src/app/pages/storage/modules/pool-manager/components/download-key-dialog/download-key-dialog.component.ts b/src/app/pages/storage/modules/pool-manager/components/download-key-dialog/download-key-dialog.component.ts index f8efc4b2761..e75901b6eb9 100644 --- a/src/app/pages/storage/modules/pool-manager/components/download-key-dialog/download-key-dialog.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/download-key-dialog/download-key-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { HttpErrorResponse } from '@angular/common/http'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, @@ -35,7 +34,6 @@ export interface DownloadKeyDialogParams { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, FormActionsComponent, MatButton, diff --git a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.ts b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.ts index e0466b1c08f..9f0038ef3e1 100644 --- a/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.ts +++ b/src/app/pages/storage/modules/pool-manager/components/pool-manager-wizard/pool-manager-wizard.component.ts @@ -7,7 +7,7 @@ import { ReactiveFormsModule } from '@angular/forms'; import { MatCard } from '@angular/material/card'; import { MatDialog } from '@angular/material/dialog'; import { - MatStepper, MatStep, MatStepLabel, MatStepperIcon, + MatStepper, MatStep, MatStepLabel, } from '@angular/material/stepper'; import { MatTooltip } from '@angular/material/tooltip'; import { Router } from '@angular/router'; @@ -79,7 +79,6 @@ import { ReviewWizardStepComponent } from './steps/9-review-wizard-step/review-w ReviewWizardStepComponent, TranslateModule, AsyncPipe, - MatStepperIcon, UseIxIconsInStepperComponent, ], providers: [ diff --git a/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts b/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts index 95fc5de8830..7326b2dfe2a 100644 --- a/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts +++ b/src/app/pages/system/advanced/cron/cron-delete-dialog/cron-delete-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -27,7 +26,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, FormActionsComponent, MatDialogActions, diff --git a/src/app/pages/system/bootenv/boot-pool-delete-dialog/boot-pool-delete-dialog.component.html b/src/app/pages/system/bootenv/boot-pool-delete-dialog/boot-pool-delete-dialog.component.html index 08720ff11f3..f7369f43e56 100644 --- a/src/app/pages/system/bootenv/boot-pool-delete-dialog/boot-pool-delete-dialog.component.html +++ b/src/app/pages/system/bootenv/boot-pool-delete-dialog/boot-pool-delete-dialog.component.html @@ -1,6 +1,6 @@

{{ 'Delete' | translate }}

- @if (!isJobCompleted) { + @if (!isJobCompleted()) {

{{ 'The following { n, plural, one {boot environment} other {# boot environments} } will be deleted. Are you sure you want to proceed?' | translate: { n: bulkItems.size } }} @@ -23,9 +23,7 @@

{{ 'Delete' | translate }}

@for (bulkItem of bulkItems | keyvalue; track trackByKey($index, bulkItem)) { - + {{ bulkItem.value.item.id }} } @@ -33,7 +31,7 @@

{{ 'Delete' | translate }}

- @if (!isJobCompleted) { + @if (!isJobCompleted()) { {{ 'Delete' | translate }}

- @if (!isJobCompleted) { + @if (!isJobCompleted()) { } - @if (!isJobCompleted) { + @if (!isJobCompleted()) { diff --git a/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.spec.ts b/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.spec.ts index fb022b5de7c..f681feda6d2 100644 --- a/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.spec.ts +++ b/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.spec.ts @@ -5,7 +5,6 @@ import { MatButtonHarness } from '@angular/material/button/testing'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; -import { BootEnvironmentAction } from 'app/enums/boot-environment-action.enum'; import { IxInputHarness } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.harness'; import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; @@ -26,8 +25,7 @@ describe('BootEnvironmentFormComponent', () => { ], providers: [ mockApi([ - mockCall('bootenv.create'), - mockCall('bootenv.update'), + mockCall('boot.environment.clone'), ]), mockProvider(SlideInService), mockProvider(FormErrorHandlerService), @@ -38,40 +36,7 @@ describe('BootEnvironmentFormComponent', () => { }); /* - * Create - */ - describe('creating a boot environment', () => { - beforeEach(() => { - spectator = createComponent({ - providers: [ - { - provide: SLIDE_IN_DATA, - useValue: { - operation: BootEnvironmentAction.Create, - }, - }, - ], - }); - ws = spectator.inject(ApiService); - loader = TestbedHarnessEnvironment.loader(spectator.fixture); - }); - it('sends a create payload to websocket and closes modal when save is pressed', async () => { - const form = await loader.getHarness(IxFormHarness); - const fields = { name: 'myBootEnv' }; - - await form.fillForm({ - Name: fields.name, - }); - - const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); - await saveButton.click(); - - expect(ws.call).toHaveBeenCalledWith('bootenv.create', [fields]); - }); - }); - - /* * Clone */ describe('cloning a boot environment', () => { @@ -82,10 +47,7 @@ describe('BootEnvironmentFormComponent', () => { providers: [ { provide: SLIDE_IN_DATA, - useValue: { - operation: BootEnvironmentAction.Clone, - name: cloneSource, - }, + useValue: cloneSource, }, ], }); @@ -101,55 +63,18 @@ describe('BootEnvironmentFormComponent', () => { it('sends a create payload with source option to websocket and closes modal when save is pressed', async () => { const form = await loader.getHarness(IxFormHarness); const fields = { - name: 'cloned', - source: cloneSource, + id: cloneSource, + target: 'cloned', }; await form.fillForm({ - Name: fields.name, - }); - - const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); - await saveButton.click(); - - expect(ws.call).toHaveBeenCalledWith('bootenv.create', [ - fields, - ]); - }); - }); - - /* - * Rename - */ - describe('renaming a boot environment', () => { - beforeEach(() => { - spectator = createComponent({ - providers: [ - { - provide: SLIDE_IN_DATA, - useValue: { - operation: BootEnvironmentAction.Rename, - name: 'myBootEnv', - }, - }, - ], - }); - ws = spectator.inject(ApiService); - loader = TestbedHarnessEnvironment.loader(spectator.fixture); - }); - - it('sends an update payload to websocket and closes modal when save is pressed', async () => { - const form = await loader.getHarness(IxFormHarness); - const fields = { name: 'updated' }; - await form.fillForm({ - Name: fields.name, + Name: fields.target, }); const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); await saveButton.click(); - expect(ws.call).toHaveBeenCalledWith('bootenv.update', [ - spectator.component.currentName, + expect(ws.call).toHaveBeenCalledWith('boot.environment.clone', [ fields, ]); }); diff --git a/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.ts b/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.ts index 74174723d73..429380941fc 100644 --- a/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.ts +++ b/src/app/pages/system/bootenv/bootenv-form/bootenv-form.component.ts @@ -1,26 +1,21 @@ import { ChangeDetectionStrategy, Component, - ChangeDetectorRef, OnInit, - Inject, + signal, + inject, } from '@angular/core'; import { Validators, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; -import { FormBuilder, FormControl } from '@ngneat/reactive-forms'; +import { FormBuilder } from '@ngneat/reactive-forms'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { TranslateService, TranslateModule } from '@ngx-translate/core'; +import { TranslateModule } from '@ngx-translate/core'; import { nameValidatorRegex } from 'app/constants/name-validator.constant'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; -import { BootEnvironmentAction } from 'app/enums/boot-environment-action.enum'; import { Role } from 'app/enums/role.enum'; import { helptextSystemBootenv } from 'app/helptext/system/boot-env'; -import { - BootenvTooltip, - CreateBootenvParams, - UpdateBootenvParams, -} from 'app/interfaces/bootenv.interface'; +import { BootenvCloneParams } from 'app/interfaces/boot-environment.interface'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; @@ -54,146 +49,43 @@ import { ApiService } from 'app/services/api.service'; }) export class BootEnvironmentFormComponent implements OnInit { protected readonly requiredRoles = [Role.FullAdmin]; - - Operations = BootEnvironmentAction; - currentName?: string; - operation: BootEnvironmentAction; - title: string; - - formGroup = this.formBuilder.group({ - name: ['', [Validators.required, Validators.pattern(nameValidatorRegex)]], + protected currentName = signal(inject(SLIDE_IN_DATA)); + protected formGroup = this.formBuilder.group({ + source: [this.currentName(), [Validators.required]], + target: ['', [Validators.required, Validators.pattern(nameValidatorRegex)]], }); - isFormLoading = false; - - tooltips: BootenvTooltip = { - name: helptextSystemBootenv.create_name_tooltip, + protected isLoading = signal(false); + protected tooltips = { + name: helptextSystemBootenv.clone_name_tooltip, + source: helptextSystemBootenv.clone_source_tooltip, }; constructor( - private translate: TranslateService, private formBuilder: FormBuilder, private ws: ApiService, private errorHandler: FormErrorHandlerService, - private changeDetectorRef: ChangeDetectorRef, private slideInRef: SlideInRef, - @Inject(SLIDE_IN_DATA) private slideInData: { operation: BootEnvironmentAction; name?: string }, ) {} ngOnInit(): void { - if (this.slideInData) { - this.currentName = this.slideInData.name; - this.operation = this.slideInData.operation; - this.setupForm(); - } - } - - setupForm(): void { - switch (this.operation) { - case this.Operations.Rename: - this.title = this.translate.instant('Rename Boot Environment'); - this.formGroup.patchValue({ - name: this.currentName, - }); - - this.tooltips = { - name: helptextSystemBootenv.create_name_tooltip, - }; - break; - case this.Operations.Clone: - this.title = this.translate.instant('Clone Boot Environment'); - - this.formGroup.addControl( - 'source', - new FormControl({ value: this.currentName, disabled: true }, Validators.required), - ); - - this.tooltips = { - name: helptextSystemBootenv.clone_name_tooltip, - source: helptextSystemBootenv.clone_source_tooltip, - }; - break; - default: - this.title = this.translate.instant('Create Boot Environment'); - this.tooltips = { - name: helptextSystemBootenv.create_name_tooltip, - }; - break; - } - - this.changeDetectorRef.detectChanges(); + this.formGroup.controls.source.disable(); } onSubmit(): void { - this.isFormLoading = true; - switch (this.operation) { - case this.Operations.Create: - this.createEnvironment(); - break; - case this.Operations.Rename: - this.renameEnvironment(); - break; - case this.Operations.Clone: - this.cloneEnvironment(); - break; - default: - console.error('Unsupported operation'); - } - } - - private createEnvironment(): void { - const createParams: CreateBootenvParams = [{ - name: this.formGroup.value.name, - }]; - - this.ws.call('bootenv.create', createParams).pipe(untilDestroyed(this)).subscribe({ - next: () => { - this.isFormLoading = false; - this.slideInRef.close(true); - }, - error: (error: unknown) => { - this.isFormLoading = false; - this.slideInRef.close(false); - this.errorHandler.handleWsFormError(error, this.formGroup); - }, - }); - } - - private renameEnvironment(): void { - const renameParams: UpdateBootenvParams = [ - this.currentName, - { - name: this.formGroup.value.name, - }, - ]; - - this.ws.call('bootenv.update', renameParams).pipe(untilDestroyed(this)).subscribe({ - next: () => { - this.isFormLoading = false; - this.slideInRef.close(true); - }, - error: (error: unknown) => { - this.isFormLoading = false; - this.slideInRef.close(false); - this.errorHandler.handleWsFormError(error, this.formGroup); - }, - }); - } - - private cloneEnvironment(): void { - const cloneParams: CreateBootenvParams = [{ - name: this.formGroup.value.name, - source: this.currentName, + this.isLoading.set(true); + const cloneParams: BootenvCloneParams = [{ + id: this.currentName(), + target: this.formGroup.value.target, }]; - this.ws.call('bootenv.create', cloneParams).pipe(untilDestroyed(this)).subscribe({ + this.ws.call('boot.environment.clone', cloneParams).pipe(untilDestroyed(this)).subscribe({ next: () => { - this.isFormLoading = false; + this.isLoading.set(false); this.slideInRef.close(true); }, error: (error: unknown) => { - this.isFormLoading = false; - this.slideInRef.close(false); + this.isLoading.set(false); this.errorHandler.handleWsFormError(error, this.formGroup); }, }); diff --git a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html index 3f5765da0d6..2e4062c5b52 100644 --- a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html +++ b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.html @@ -1,5 +1,8 @@ - - + + diff --git a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.spec.ts b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.spec.ts index 46cdee3a37b..0726bb402fa 100644 --- a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.spec.ts +++ b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.spec.ts @@ -37,7 +37,7 @@ describe('BootEnvironmentListComponent', () => { timezone: 'America/Los_Angeles', }), mockApi([ - mockCall('bootenv.query', fakeBootEnvironmentsDataSource), + mockCall('boot.environment.query', fakeBootEnvironmentsDataSource), ]), mockProvider(DialogService, { confirm: jest.fn(() => of(true)), @@ -62,20 +62,28 @@ describe('BootEnvironmentListComponent', () => { const cells = await table.getCellTexts(); const expectedRows = [ - ['', 'Name', 'Active', 'Date Created', 'Space', 'Keep', ''], - ['', 'CLONE', '', '2022-08-22 09:27:00', '384 KiB', 'No', ''], + ['', 'Name', 'Active', 'Date Created', 'Used Space', 'Keep', ''], [ '', - '22.12-MASTER-20220808-020013', - 'Now/Restart', - '2022-08-09 06:52:00', - '2.61 GiB', + '25.04.0-MASTER-20241105-224807', + 'Now', + '2024-11-06 04:05:36', + '3.13 GiB', + 'No', + '', + ], + [ + '', + '25.04.0-MASTER-20241031-104807', + 'No', + '2024-10-31 10:55:47', + '3.05 GiB', 'No', '', ], ]; - expect(websocket.call).toHaveBeenCalledWith('bootenv.query'); + expect(websocket.call).toHaveBeenCalledWith('boot.environment.query'); expect(cells).toEqual(expectedRows); }); }); diff --git a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.ts b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.ts index 714511feec3..afe273c3660 100644 --- a/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.ts +++ b/src/app/pages/system/bootenv/bootenv-list/bootenv-list.component.ts @@ -1,5 +1,7 @@ import { AsyncPipe } from '@angular/common'; -import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; +import { + ChangeDetectionStrategy, Component, OnInit, signal, +} from '@angular/core'; import { MatButton } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MAT_SLIDE_TOGGLE_DEFAULT_OPTIONS } from '@angular/material/slide-toggle'; @@ -12,11 +14,9 @@ import { } from 'rxjs'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { UiSearchDirective } from 'app/directives/ui-search.directive'; -import { BootEnvironmentAction } from 'app/enums/boot-environment-action.enum'; -import { BootEnvironmentActive } from 'app/enums/boot-environment-active.enum'; import { Role } from 'app/enums/role.enum'; import { helptextSystemBootenv } from 'app/helptext/system/boot-env'; -import { Bootenv } from 'app/interfaces/bootenv.interface'; +import { BootEnvironment } from 'app/interfaces/boot-environment.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { EmptyService } from 'app/modules/empty/empty.service'; import { SearchInput1Component } from 'app/modules/forms/search-input1/search-input1.component'; @@ -50,7 +50,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; import { SlideInService } from 'app/services/slide-in.service'; // TODO: Exclude AnythingUi when NAS-127632 is done -interface BootenvUi extends Bootenv { +interface BootEnvironmentUi extends BootEnvironment { selected: boolean; } @@ -83,19 +83,19 @@ interface BootenvUi extends Bootenv { ], }) export class BootEnvironmentListComponent implements OnInit { - readonly requiredRoles = [Role.FullAdmin]; + protected readonly requiredRoles = [Role.FullAdmin]; protected readonly searchableElements = bootListElements; + protected dataProvider: AsyncDataProvider; + protected filterString = signal(''); + private bootenvs: BootEnvironmentUi[] = []; - dataProvider: AsyncDataProvider; - filterString = ''; - - columns = createTable([ + columns = createTable([ checkboxColumn({ propertyName: 'selected', onRowCheck: (row, checked) => { this.bootenvs.find((bootenv) => row.id === bootenv.id).selected = checked; this.dataProvider.setRows([]); - this.onListFiltered(this.filterString); + this.onListFiltered(this.filterString()); }, onColumnCheck: (checked) => { this.dataProvider.currentPage$.pipe( @@ -104,29 +104,26 @@ export class BootEnvironmentListComponent implements OnInit { ).subscribe((bootEnvs) => { bootEnvs.forEach((bootEnv) => bootEnv.selected = checked); this.dataProvider.setRows([]); - this.onListFiltered(this.filterString); + this.onListFiltered(this.filterString()); }); }, cssClass: 'checkboxs-column', }), textColumn({ title: this.translate.instant('Name'), - propertyName: 'name', + propertyName: 'id', }), textColumn({ title: this.translate.instant('Active'), propertyName: 'active', getValue: (row) => { - switch (row.active) { - case BootEnvironmentActive.Now: - return this.translate.instant('Now'); - case BootEnvironmentActive.Restart: - return this.translate.instant('Restart'); - case BootEnvironmentActive.NowRestart: - return this.translate.instant('Now/Restart'); - default: - return row.active; + if (row.active) { + return this.translate.instant('Now'); } + if (row.activated) { + return this.translate.instant('Restart'); + } + return this.translate.instant('No'); }, }), dateColumn({ @@ -135,8 +132,8 @@ export class BootEnvironmentListComponent implements OnInit { sortBy: (row) => row.created.$date, }), sizeColumn({ - title: this.translate.instant('Space'), - propertyName: 'rawspace', + title: this.translate.instant('Used Space'), + propertyName: 'used_bytes', }), yesNoColumn({ title: this.translate.instant('Keep'), @@ -149,23 +146,9 @@ export class BootEnvironmentListComponent implements OnInit { iconName: iconMarker('mdi-check-decagram'), requiredRoles: this.requiredRoles, tooltip: this.translate.instant('Activate'), - hidden: (row) => { - return of([BootEnvironmentActive.NowRestart, BootEnvironmentActive.Restart].includes(row.active)); - }, + hidden: (row) => of(!row.can_activate || row.activated), onClick: (row) => this.doActivate(row), }, - { - iconName: iconMarker('mdi-content-copy'), - requiredRoles: this.requiredRoles, - tooltip: this.translate.instant('Clone'), - onClick: (row) => this.doClone(row), - }, - { - iconName: iconMarker('mdi-rename-box'), - requiredRoles: this.requiredRoles, - tooltip: this.translate.instant('Rename'), - onClick: (row) => this.doRename(row), - }, { iconName: iconMarker('bookmark'), requiredRoles: this.requiredRoles, @@ -180,33 +163,35 @@ export class BootEnvironmentListComponent implements OnInit { hidden: (row) => of(!row.keep), onClick: (row) => this.toggleKeep(row), }, + { + iconName: iconMarker('mdi-content-copy'), + requiredRoles: this.requiredRoles, + tooltip: this.translate.instant('Clone'), + onClick: (row) => this.doClone(row), + }, { iconName: iconMarker('mdi-delete'), requiredRoles: this.requiredRoles, tooltip: this.translate.instant('Delete'), - hidden: (row) => of(![BootEnvironmentActive.Dash, BootEnvironmentActive.Empty].includes(row.active)), + hidden: (row) => of(row.active || row.activated), onClick: (row) => this.doDelete([row]), }, ], cssClass: 'actions-column', }), ], { - uniqueRowTag: (row) => `bootenv-${row.name}`, - ariaLabels: (row) => [row.name, this.translate.instant('Boot Environment')], + uniqueRowTag: (row) => `bootenv-${row.id}`, + ariaLabels: (row) => [row.id, this.translate.instant('Boot Environment')], }); - get selectedBootenvs(): BootenvUi[] { + get selectedBootenvs(): BootEnvironmentUi[] { return this.bootenvs.filter((bootenv) => bootenv.selected); } get selectionHasItems(): boolean { - return this.selectedBootenvs.some( - (bootenv) => [BootEnvironmentActive.Dash, BootEnvironmentActive.Empty].includes(bootenv.active), - ); + return this.selectedBootenvs.some((bootenv) => !bootenv.active && !bootenv.activated); } - private bootenvs: BootenvUi[] = []; - constructor( private ws: ApiService, private matDialog: MatDialog, @@ -220,7 +205,7 @@ export class BootEnvironmentListComponent implements OnInit { ) {} ngOnInit(): void { - const request$ = this.ws.call('bootenv.query').pipe( + const request$ = this.ws.call('boot.environment.query').pipe( map((bootenvs) => { this.bootenvs = bootenvs.map((bootenv) => ({ ...bootenv, @@ -233,7 +218,7 @@ export class BootEnvironmentListComponent implements OnInit { this.refresh(); this.setDefaultSort(); this.dataProvider.emptyType$.pipe(untilDestroyed(this)).subscribe(() => { - this.onListFiltered(this.filterString); + this.onListFiltered(this.filterString()); }); } @@ -248,16 +233,9 @@ export class BootEnvironmentListComponent implements OnInit { this.matDialog.open(BootenvStatsDialogComponent); } - doRename(bootenv: Bootenv): void { - const slideInRef = this.slideInService.open(BootEnvironmentFormComponent, { - data: { operation: BootEnvironmentAction.Rename, name: bootenv.id }, - }); - this.handleSlideInClosed(slideInRef); - } - - doClone(bootenv: Bootenv): void { + doClone(bootenv: BootEnvironment): void { const slideInRef = this.slideInService.open(BootEnvironmentFormComponent, { - data: { operation: BootEnvironmentAction.Clone, name: bootenv.id }, + data: bootenv.id, }); this.handleSlideInClosed(slideInRef); } @@ -281,19 +259,16 @@ export class BootEnvironmentListComponent implements OnInit { }); } - doDelete(bootenvs: BootenvUi[]): void { + doDelete(bootenvs: BootEnvironmentUi[]): void { bootenvs.forEach((bootenv) => delete bootenv.selected); - this.matDialog.open(BootPoolDeleteDialogComponent, { - data: bootenvs.filter( - (bootenv) => [BootEnvironmentActive.Dash, BootEnvironmentActive.Empty].includes(bootenv.active), - ), - }).afterClosed().pipe( - filter(Boolean), - untilDestroyed(this), - ).subscribe(() => this.refresh()); + const data = bootenvs.filter((bootenv) => !bootenv.active && !bootenv.activated); + this.matDialog.open(BootPoolDeleteDialogComponent, { data }) + .afterClosed() + .pipe(filter(Boolean), untilDestroyed(this)) + .subscribe(() => this.refresh()); } - doActivate(bootenv: BootenvUi): void { + doActivate(bootenv: BootEnvironmentUi): void { this.dialogService.confirm({ title: this.translate.instant('Activate'), message: this.translate.instant('Activate this Boot Environment?'), @@ -301,7 +276,7 @@ export class BootEnvironmentListComponent implements OnInit { }).pipe( filter(Boolean), switchMap(() => { - return this.ws.call('bootenv.activate', [bootenv.id]).pipe( + return this.ws.call('boot.environment.activate', [{ id: bootenv.id }]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), ); @@ -310,7 +285,7 @@ export class BootEnvironmentListComponent implements OnInit { ).subscribe(() => this.refresh()); } - toggleKeep(bootenv: BootenvUi): void { + toggleKeep(bootenv: BootEnvironmentUi): void { if (!bootenv.keep) { this.dialogService.confirm({ title: this.translate.instant('Keep'), @@ -319,7 +294,7 @@ export class BootEnvironmentListComponent implements OnInit { }).pipe( filter(Boolean), switchMap(() => { - return this.ws.call('bootenv.set_attribute', [bootenv.id, { keep: true }]).pipe( + return this.ws.call('boot.environment.keep', [{ id: bootenv.id, value: true }]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), ); @@ -334,7 +309,7 @@ export class BootEnvironmentListComponent implements OnInit { }).pipe( filter(Boolean), switchMap(() => { - return this.ws.call('bootenv.set_attribute', [bootenv.id, { keep: false }]).pipe( + return this.ws.call('boot.environment.keep', [{ id: bootenv.id, value: false }]).pipe( this.loader.withLoader(), this.errorHandler.catchError(), ); @@ -345,8 +320,8 @@ export class BootEnvironmentListComponent implements OnInit { } protected onListFiltered(query: string): void { - this.filterString = query; - this.dataProvider.setFilter({ list: this.bootenvs, query, columnKeys: ['name'] }); + this.filterString.set(query); + this.dataProvider.setFilter({ list: this.bootenvs, query, columnKeys: ['id'] }); } private setDefaultSort(): void { diff --git a/src/app/pages/system/bootenv/bootenv-stats-dialog/bootenv-stats-dialog.component.ts b/src/app/pages/system/bootenv/bootenv-stats-dialog/bootenv-stats-dialog.component.ts index 5dae80cedab..1030df538b2 100644 --- a/src/app/pages/system/bootenv/bootenv-stats-dialog/bootenv-stats-dialog.component.ts +++ b/src/app/pages/system/bootenv/bootenv-stats-dialog/bootenv-stats-dialog.component.ts @@ -24,6 +24,7 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; import { ApiService } from 'app/services/api.service'; import { ErrorHandlerService } from 'app/services/error-handler.service'; import { AppState } from 'app/store'; +import { advancedConfigUpdated } from 'app/store/system-config/system-config.actions'; import { waitForAdvancedConfig } from 'app/store/system-config/system-config.selectors'; @UntilDestroy() @@ -88,7 +89,8 @@ export class BootenvStatsDialogComponent implements OnInit { .pipe(this.loader.withLoader(), untilDestroyed(this)) .subscribe({ next: () => { - this.dialogRef.close(); + this.dialogRef.close(true); + this.store$.dispatch(advancedConfigUpdated()); this.snackbar.success( this.translate.instant('Scrub interval set to {scrubIntervalValue} days', { scrubIntervalValue: interval }), ); diff --git a/src/app/pages/system/bootenv/test/fake-boot-environments.ts b/src/app/pages/system/bootenv/test/fake-boot-environments.ts index b5d84f6b908..9391f94341c 100644 --- a/src/app/pages/system/bootenv/test/fake-boot-environments.ts +++ b/src/app/pages/system/bootenv/test/fake-boot-environments.ts @@ -1,34 +1,30 @@ -import { Bootenv } from 'app/interfaces/bootenv.interface'; +import { BootEnvironment } from 'app/interfaces/boot-environment.interface'; export const fakeBootEnvironmentsDataSource = [ { - id: 'CLONE', - realname: 'CLONE', - name: 'CLONE', - active: '', + id: '25.04.0-MASTER-20241031-104807', + dataset: 'boot-pool/ROOT/25.04.0-MASTER-20241031-104807', + active: false, activated: false, - can_activate: true, - mountpoint: '-', - space: '384.0K', created: { - $date: 1661185620000, + $date: 1730397347000, }, + used_bytes: 3272175616, + used: '3.05 GiB', keep: false, - rawspace: 393216, + can_activate: true, }, { - id: '22.12-MASTER-20220808-020013', - realname: '22.12-MASTER-20220808-020013', - name: '22.12-MASTER-20220808-020013', - active: 'NR', + id: '25.04.0-MASTER-20241105-224807', + dataset: 'boot-pool/ROOT/25.04.0-MASTER-20241105-224807', + active: true, activated: true, - can_activate: true, - mountpoint: 'legacy', - space: '2.61G', created: { - $date: 1660053120000, + $date: 1730894736000, }, + used_bytes: 3357876224, + used: '3.13 GiB', keep: false, - rawspace: 2797170688, + can_activate: true, }, -] as Bootenv[]; +] as BootEnvironment[]; diff --git a/src/app/pages/system/general-settings/support/set-production-status-dialog/set-production-status-dialog.component.ts b/src/app/pages/system/general-settings/support/set-production-status-dialog/set-production-status-dialog.component.ts index 0a8583c698c..fdddac200fb 100644 --- a/src/app/pages/system/general-settings/support/set-production-status-dialog/set-production-status-dialog.component.ts +++ b/src/app/pages/system/general-settings/support/set-production-status-dialog/set-production-status-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component } from '@angular/core'; import { FormControl, ReactiveFormsModule } from '@angular/forms'; import { MatButton } from '@angular/material/button'; @@ -26,7 +25,6 @@ export interface SetProductionStatusDialogResult { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxCheckboxComponent, ReactiveFormsModule, diff --git a/src/app/pages/system/general-settings/support/support-card/support-card.component.ts b/src/app/pages/system/general-settings/support/support-card/support-card.component.ts index 0770dc16b3e..943f3bf6455 100644 --- a/src/app/pages/system/general-settings/support/support-card/support-card.component.ts +++ b/src/app/pages/system/general-settings/support/support-card/support-card.component.ts @@ -5,7 +5,6 @@ import { import { ReactiveFormsModule, FormsModule, FormControl } from '@angular/forms'; import { MatButton } from '@angular/material/button'; import { MatCard, MatCardContent } from '@angular/material/card'; -import { MatCheckbox } from '@angular/material/checkbox'; import { MatDialog } from '@angular/material/dialog'; import { MatMenuTrigger, MatMenu, MatMenuItem } from '@angular/material/menu'; import { MatToolbarRow } from '@angular/material/toolbar'; @@ -63,7 +62,6 @@ import { waitForSystemInfo } from 'app/store/system-info/system-info.selectors'; MatCardContent, SysInfoComponent, RequiresRolesDirective, - MatCheckbox, TestDirective, ReactiveFormsModule, FormsModule, diff --git a/src/app/pages/virtualization/components/all-instances/all-instances-header/all-instances-header.component.ts b/src/app/pages/virtualization/components/all-instances/all-instances-header/all-instances-header.component.ts index 10a1d620d72..ae9b4581f81 100644 --- a/src/app/pages/virtualization/components/all-instances/all-instances-header/all-instances-header.component.ts +++ b/src/app/pages/virtualization/components/all-instances/all-instances-header/all-instances-header.component.ts @@ -1,8 +1,5 @@ import { ChangeDetectionStrategy, Component, computed } from '@angular/core'; import { MatAnchor, MatButton } from '@angular/material/button'; -import { - MatCard, MatCardContent, MatCardHeader, MatCardTitle, -} from '@angular/material/card'; import { RouterLink } from '@angular/router'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule } from '@ngx-translate/core'; @@ -27,10 +24,6 @@ import { ChainedSlideInService } from 'app/services/chained-slide-in.service'; standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [ - MatCard, - MatCardContent, - MatCardHeader, - MatCardTitle, TranslateModule, MatButton, TestDirective, diff --git a/src/app/pages/virtualization/components/all-instances/all-instances-header/global-config-form/global-config-form.component.ts b/src/app/pages/virtualization/components/all-instances/all-instances-header/global-config-form/global-config-form.component.ts index dcd57b2ce37..8f9f0e919ca 100644 --- a/src/app/pages/virtualization/components/all-instances/all-instances-header/global-config-form/global-config-form.component.ts +++ b/src/app/pages/virtualization/components/all-instances/all-instances-header/global-config-form/global-config-form.component.ts @@ -13,7 +13,6 @@ import { DialogService } from 'app/modules/dialog/dialog.service'; import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; import { IxIpInputWithNetmaskComponent } from 'app/modules/forms/ix-forms/components/ix-ip-input-with-netmask/ix-ip-input-with-netmask.component'; -import { IxRadioGroupComponent } from 'app/modules/forms/ix-forms/components/ix-radio-group/ix-radio-group.component'; import { IxSelectComponent } from 'app/modules/forms/ix-forms/components/ix-select/ix-select.component'; import { ChainedRef } from 'app/modules/slide-ins/chained-component-ref'; import { @@ -36,7 +35,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; MatButton, MatCard, MatCardContent, - IxRadioGroupComponent, ReactiveFormsModule, RequiresRolesDirective, TestDirective, diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.html index 4bb8abff457..7d1c2b594c4 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.html +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.html @@ -1,7 +1,27 @@ +
+

+
+ + {{ 'Details for' | translate }} +
+ + + {{ 'Details for' | translate }} + + + + {{ instance().name }} + +

+
+
+
diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.scss b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.scss index b0eae28d708..ac97c73f252 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.scss +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.scss @@ -4,7 +4,6 @@ :host { display: block; width: 100%; - width: 100%; .header { color: var(--fg1); @@ -16,6 +15,7 @@ } .title { + color: var(--fg2); margin-bottom: 12px; margin-top: 20px; min-height: 36px; @@ -34,7 +34,7 @@ } .prefix { - display: flex; + display: inline; @media (max-width: $breakpoint-hidden) { display: none; diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.spec.ts new file mode 100644 index 00000000000..e212ae198ea --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.spec.ts @@ -0,0 +1,59 @@ +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { MockComponents } from 'ng-mocks'; +import { VirtualizationInstance } from 'app/interfaces/virtualization.interface'; +import { + InstanceDetailsComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-details.component'; +import { + InstanceDevicesComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component'; +import { + InstanceDisksComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component'; +import { + InstanceGeneralInfoComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component'; +import { + InstanceProxiesComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component'; +import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; + +describe('InstanceDetailsComponent', () => { + let spectator: Spectator; + const createComponent = createComponentFactory({ + component: InstanceDetailsComponent, + imports: [ + MockComponents( + InstanceGeneralInfoComponent, + InstanceDevicesComponent, + InstanceDisksComponent, + InstanceProxiesComponent, + ), + ], + providers: [ + mockProvider(VirtualizationInstancesStore), + ], + }); + + beforeEach(() => { + spectator = createComponent({ + props: { + instance: { + name: 'my-instance', + } as VirtualizationInstance, + }, + }); + }); + + it('shows name of the selected instance', () => { + expect(spectator.query('.title')).toHaveText('Details for'); + expect(spectator.query('.title')).toHaveText('my-instance'); + }); + + it('shows details sub-components related to selected instance', () => { + expect(spectator.query(InstanceGeneralInfoComponent)).toExist(); + expect(spectator.query(InstanceDevicesComponent)).toExist(); + expect(spectator.query(InstanceDisksComponent)).toExist(); + expect(spectator.query(InstanceProxiesComponent)).toExist(); + }); +}); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.ts index 49a9ab8e78e..2cab7032bd2 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-details.component.ts @@ -3,9 +3,13 @@ import { } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; import { VirtualizationInstance } from 'app/interfaces/virtualization.interface'; +import { MobileBackButtonComponent } from 'app/modules/buttons/mobile-back-button/mobile-back-button.component'; import { InstanceDevicesComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component'; +import { + InstanceDisksComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component'; import { InstanceGeneralInfoComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component'; @@ -25,14 +29,13 @@ import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/vi InstanceDevicesComponent, InstanceGeneralInfoComponent, InstanceProxiesComponent, + InstanceDisksComponent, + MobileBackButtonComponent, ], }) export class InstanceDetailsComponent { instance = input.required(); - protected readonly devices = this.instancesStore.selectedInstanceDevices; - protected readonly isLoadingDevices = this.instancesStore.isLoadingDevices; - constructor( private instancesStore: VirtualizationInstancesStore, ) {} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.html index f5e46b420d4..44a97734327 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.html +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.html @@ -9,18 +9,11 @@

@if (isLoadingDevices()) { } @else { - @for (device of shownDevices(); track device) { + @for (device of shownDevices(); track device.name) {
{{ getDeviceDescription(device) }} - + +
} @empty { {{ 'No devices added.' | translate }} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.scss b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.scss index 28a62d92b5b..dbb31b9f9ae 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.scss +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.scss @@ -3,17 +3,3 @@ display: flex; justify-content: space-between; } - -.delete-button { - opacity: 0.8; - - &:focus, - &:hover { - opacity: 1; - } - - ix-icon { - height: 20px; - width: 20px; - } -} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.spec.ts index 37eb17fd07e..4a171208fd0 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.spec.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.spec.ts @@ -1,48 +1,41 @@ -import { HarnessLoader } from '@angular/cdk/testing'; -import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; -import { of } from 'rxjs'; -import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; +import { MockComponent } from 'ng-mocks'; import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; import { VirtualizationProxy, VirtualizationUsb } from 'app/interfaces/virtualization.interface'; -import { DialogService } from 'app/modules/dialog/dialog.service'; -import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; -import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { InstanceDevicesComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; -import { ApiService } from 'app/services/api.service'; describe('InstanceDevicesComponent', () => { let spectator: Spectator; - let loader: HarnessLoader; + const devices = [ + { + dev_type: VirtualizationDeviceType.Usb, + name: 'usb1', + } as VirtualizationUsb, + { + dev_type: VirtualizationDeviceType.Gpu, + name: 'gpu1', + }, + { + name: 'proxy2', + } as VirtualizationProxy, + ]; + const createComponent = createComponentFactory({ component: InstanceDevicesComponent, + imports: [ + MockComponent(DeleteDeviceButtonComponent), + ], providers: [ - mockProvider(DialogService, { - confirm: jest.fn(() => of(true)), - }), - mockApi([ - mockCall('virt.instance.device_delete'), - ]), - mockProvider(SnackbarService), mockProvider(VirtualizationInstancesStore, { isLoadingDevices: () => false, selectedInstance: () => ({ id: 'my-instance' }), - selectedInstanceDevices: () => [ - { - dev_type: VirtualizationDeviceType.Usb, - name: 'usb1', - } as VirtualizationUsb, - { - dev_type: VirtualizationDeviceType.Gpu, - name: 'gpu1', - }, - { - name: 'proxy2', - } as VirtualizationProxy, - ], + selectedInstanceDevices: () => devices, loadDevices: jest.fn(), }), ], @@ -50,23 +43,19 @@ describe('InstanceDevicesComponent', () => { beforeEach(() => { spectator = createComponent(); - loader = TestbedHarnessEnvironment.loader(spectator.fixture); }); it('shows a list of USB or GPU devices', () => { - const devices = spectator.queryAll('.device'); + const deviceRows = spectator.queryAll('.device'); - expect(devices).toHaveLength(2); - expect(devices[0]).toHaveText('usb1'); - expect(devices[1]).toHaveText('gpu1'); + expect(deviceRows).toHaveLength(2); + expect(deviceRows[0]).toHaveText('usb1'); + expect(deviceRows[1]).toHaveText('gpu1'); }); - it('deletes a device with confirmation and reloads the list when delete icon is pressed', async () => { - const deleteIcon = await loader.getHarness(IxIconHarness.with({ name: 'mdi-close' })); - await deleteIcon.click(); - - expect(spectator.inject(DialogService).confirm).toHaveBeenCalled(); - expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('virt.instance.device_delete', ['my-instance', 'usb1']); - expect(spectator.inject(VirtualizationInstancesStore).loadDevices).toHaveBeenCalled(); + it('renders a button to delete the device', () => { + const deleteButtons = spectator.queryAll(DeleteDeviceButtonComponent); + expect(deleteButtons).toHaveLength(2); + expect(deleteButtons[0].device).toBe(devices[0]); }); }); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.ts index 9bded42e6bc..54955819609 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-devices/instance-devices.component.ts @@ -1,26 +1,18 @@ import { ChangeDetectionStrategy, Component, computed, } from '@angular/core'; -import { MatIconButton } from '@angular/material/button'; import { MatCard, MatCardContent, MatCardHeader } from '@angular/material/card'; -import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { UntilDestroy } from '@ngneat/until-destroy'; +import { TranslateModule } from '@ngx-translate/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { - EMPTY, Observable, switchMap, tap, -} from 'rxjs'; import { VirtualizationDeviceType, virtualizationDeviceTypeLabels } from 'app/enums/virtualization.enum'; import { VirtualizationDevice, } from 'app/interfaces/virtualization.interface'; -import { DialogService } from 'app/modules/dialog/dialog.service'; -import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { AppLoaderService } from 'app/modules/loader/app-loader.service'; -import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; -import { TestDirective } from 'app/modules/test-id/test.directive'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; -import { ApiService } from 'app/services/api.service'; -import { ErrorHandlerService } from 'app/services/error-handler.service'; @UntilDestroy() @Component({ @@ -35,9 +27,7 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; TranslateModule, MatCardContent, NgxSkeletonLoaderModule, - MatIconButton, - TestDirective, - IxIconComponent, + DeleteDeviceButtonComponent, ], }) export class InstanceDevicesComponent { @@ -51,12 +41,6 @@ export class InstanceDevicesComponent { constructor( private instanceStore: VirtualizationInstancesStore, - private dialog: DialogService, - private translate: TranslateService, - private snackbar: SnackbarService, - private ws: ApiService, - private loader: AppLoaderService, - private errorHandler: ErrorHandlerService, ) {} protected getDeviceDescription(device: VirtualizationDevice): string { @@ -69,33 +53,4 @@ export class InstanceDevicesComponent { return `${type}: ${description}`; } - - protected deleteProxyPressed(device: VirtualizationDevice): void { - this.dialog.confirm({ - message: this.translate.instant('Are you sure you want to delete this device?'), - title: this.translate.instant('Delete Device'), - }) - .pipe( - switchMap((confirmed) => { - if (!confirmed) { - return EMPTY; - } - - return this.deleteDevice(device); - }), - untilDestroyed(this), - ) - .subscribe(); - } - - private deleteDevice(proxy: VirtualizationDevice): Observable { - return this.ws.call('virt.instance.device_delete', [this.instanceStore.selectedInstance().id, proxy.name]).pipe( - this.loader.withLoader(), - this.errorHandler.catchError(), - tap(() => { - this.snackbar.success(this.translate.instant('Device deleted')); - this.instanceStore.loadDevices(); - }), - ); - } } diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.html new file mode 100644 index 00000000000..ca9a4d5815c --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.html @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.spec.ts new file mode 100644 index 00000000000..84b94c4e72d --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.spec.ts @@ -0,0 +1,61 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { mockApi, mockCall } from 'app/core/testing/utils/mock-api.utils'; +import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; +import { IxFormHarness } from 'app/modules/forms/ix-forms/testing/ix-form.harness'; +import { ChainedRef } from 'app/modules/slide-ins/chained-component-ref'; +import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; +import { + InstanceDiskFormComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component'; +import { ApiService } from 'app/services/api.service'; +import { FilesystemService } from 'app/services/filesystem.service'; + +describe('InstanceDiskFormComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + const createComponent = createComponentFactory({ + component: InstanceDiskFormComponent, + providers: [ + mockApi([ + mockCall('virt.instance.device_add'), + ]), + mockProvider(ChainedRef, { + getData: () => 'my-instance', + close: jest.fn(), + }), + mockProvider(SnackbarService), + mockProvider(FilesystemService), + ], + }); + + beforeEach(() => { + spectator = createComponent(); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + }); + + it('creates a new disk for the instance provided when form is submitted', async () => { + const form = await loader.getHarness(IxFormHarness); + + await form.fillForm({ + Source: '/mnt/path', + Destination: 'destination', + }); + + const addButton = await loader.getHarness(MatButtonHarness.with({ text: 'Add' })); + await addButton.click(); + + expect(spectator.inject(ChainedRef).close).toHaveBeenCalledWith({ + response: true, + error: false, + }); + expect(spectator.inject(SnackbarService).success).toHaveBeenCalled(); + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('virt.instance.device_add', ['my-instance', { + source: '/mnt/path', + destination: 'destination', + dev_type: VirtualizationDeviceType.Disk, + }]); + }); +}); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.ts new file mode 100644 index 00000000000..94ecff79c99 --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component.ts @@ -0,0 +1,88 @@ +import { ChangeDetectionStrategy, Component, signal } from '@angular/core'; +import { FormBuilder, ReactiveFormsModule, Validators } from '@angular/forms'; +import { MatButton } from '@angular/material/button'; +import { MatCard, MatCardContent } from '@angular/material/card'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; +import { VirtualizationDisk } from 'app/interfaces/virtualization.interface'; +import { FormActionsComponent } from 'app/modules/forms/ix-forms/components/form-actions/form-actions.component'; +import { IxExplorerComponent } from 'app/modules/forms/ix-forms/components/ix-explorer/ix-explorer.component'; +import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; +import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; +import { IxListItemComponent } from 'app/modules/forms/ix-forms/components/ix-list/ix-list-item/ix-list-item.component'; +import { FormErrorHandlerService } from 'app/modules/forms/ix-forms/services/form-error-handler.service'; +import { ChainedRef } from 'app/modules/slide-ins/chained-component-ref'; +import { ModalHeader2Component } from 'app/modules/slide-ins/components/modal-header2/modal-header2.component'; +import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; +import { TestDirective } from 'app/modules/test-id/test.directive'; +import { ApiService } from 'app/services/api.service'; +import { FilesystemService } from 'app/services/filesystem.service'; + +@UntilDestroy() +@Component({ + selector: 'ix-instance-disk-form', + templateUrl: './instance-disk-form.component.html', + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + IxExplorerComponent, + IxInputComponent, + IxListItemComponent, + ReactiveFormsModule, + TranslateModule, + MatCard, + MatCardContent, + ModalHeader2Component, + IxFieldsetComponent, + FormActionsComponent, + MatButton, + TestDirective, + ], +}) +export class InstanceDiskFormComponent { + protected readonly isLoading = signal(false); + protected readonly directoryNodeProvider = this.filesystem.getFilesystemNodeProvider({ directoriesOnly: false }); + + protected form = this.formBuilder.nonNullable.group({ + source: ['', Validators.required], + destination: ['', Validators.required], + }); + + constructor( + private formBuilder: FormBuilder, + private errorHandler: FormErrorHandlerService, + private ws: ApiService, + private slideInRef: ChainedRef, + private translate: TranslateService, + private snackbar: SnackbarService, + private filesystem: FilesystemService, + ) {} + + onSubmit(): void { + const instanceId = this.slideInRef.getData(); + this.isLoading.set(true); + + const payload = { + ...this.form.value, + dev_type: VirtualizationDeviceType.Disk, + } as VirtualizationDisk; + + this.ws.call('virt.instance.device_add', [instanceId, payload]) + .pipe(untilDestroyed(this)) + .subscribe({ + complete: () => { + this.snackbar.success(this.translate.instant('Disk added')); + this.slideInRef.close({ + error: false, + response: true, + }); + this.isLoading.set(false); + }, + error: (error) => { + this.errorHandler.handleWsFormError(error, this.form); + this.isLoading.set(false); + }, + }); + } +} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.html new file mode 100644 index 00000000000..6340a252262 --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.html @@ -0,0 +1,33 @@ + + +

+ {{ 'Disks' | translate }} +

+ + +
+ + + @if (isLoadingDevices()) { + + } @else { + @for (disk of visibleDisks(); track disk.name) { +
+
+ {{ disk.source }} + → + {{ disk.destination }} +
+ + +
+ } @empty { + {{ 'No disks added.' | translate }} + } + } +
+
diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.scss b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.scss new file mode 100644 index 00000000000..44336cdfe42 --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.scss @@ -0,0 +1,5 @@ +.disk { + align-items: center; + display: flex; + justify-content: space-between; +} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.spec.ts new file mode 100644 index 00000000000..8ca5263c5bc --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.spec.ts @@ -0,0 +1,61 @@ +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { MockComponent } from 'ng-mocks'; +import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; +import { VirtualizationDisk, VirtualizationProxy } from 'app/interfaces/virtualization.interface'; +import { + InstanceDisksComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; +import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; + +describe('InstanceDisksComponent', () => { + let spectator: Spectator; + const disks = [ + { + dev_type: VirtualizationDeviceType.Disk, + source: '/mnt/source-path', + destination: 'destination', + } as VirtualizationDisk, + { + dev_type: VirtualizationDeviceType.Disk, + source: null, + destination: 'destination', + } as VirtualizationDisk, + { + name: 'proxy2', + } as VirtualizationProxy, + ]; + const createComponent = createComponentFactory({ + component: InstanceDisksComponent, + imports: [ + MockComponent(DeleteDeviceButtonComponent), + ], + providers: [ + mockProvider(VirtualizationInstancesStore, { + isLoadingDevices: () => false, + selectedInstance: () => ({ id: 'my-instance' }), + selectedInstanceDevices: () => disks, + loadDevices: jest.fn(), + }), + ], + }); + + beforeEach(() => { + spectator = createComponent(); + }); + + it('shows a list of disks that have source set', () => { + const diskRows = spectator.queryAll('.disk'); + + expect(diskRows).toHaveLength(1); + expect(diskRows[0]).toHaveText('source-path → destination'); + }); + + it('renders a button to delete the disk', () => { + const deleteButtons = spectator.queryAll(DeleteDeviceButtonComponent); + expect(deleteButtons).toHaveLength(1); + expect(deleteButtons[0].device).toBe(disks[0]); + }); +}); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.ts new file mode 100644 index 00000000000..aa4c088f415 --- /dev/null +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disks.component.ts @@ -0,0 +1,64 @@ +import { ChangeDetectionStrategy, Component, computed } from '@angular/core'; +import { MatButton } from '@angular/material/button'; +import { + MatCard, MatCardContent, MatCardHeader, MatCardTitle, +} from '@angular/material/card'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { TranslateModule } from '@ngx-translate/core'; +import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; +import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; +import { TestDirective } from 'app/modules/test-id/test.directive'; +import { + InstanceDiskFormComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-disks/instance-disk-form/instance-disk-form.component'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; +import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; +import { ChainedSlideInService } from 'app/services/chained-slide-in.service'; + +@UntilDestroy() +@Component({ + selector: 'ix-instance-disks', + templateUrl: './instance-disks.component.html', + styleUrls: ['./instance-disks.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + MatButton, + MatCard, + MatCardContent, + MatCardHeader, + MatCardTitle, + NgxSkeletonLoaderModule, + TestDirective, + TranslateModule, + DeleteDeviceButtonComponent, + ], +}) +export class InstanceDisksComponent { + protected readonly isLoadingDevices = this.instanceStore.isLoadingDevices; + + constructor( + private slideIn: ChainedSlideInService, + private instanceStore: VirtualizationInstancesStore, + ) {} + + protected readonly visibleDisks = computed(() => { + return this.instanceStore.selectedInstanceDevices() + .filter((device) => device.dev_type === VirtualizationDeviceType.Disk) + // TODO: Second filter is due to Typescript issues. + .filter((disk) => disk.source); + }); + + protected addDisk(): void { + this.slideIn.open(InstanceDiskFormComponent, false, this.instanceStore.selectedInstance().id) + .pipe(untilDestroyed(this)) + .subscribe((result) => { + if (!result.response) { + return; + } + this.instanceStore.loadDevices(); + }); + } +} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.html index f0ba67588cb..754821a0aae 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.html +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.html @@ -15,8 +15,10 @@

@if (instance(); as instance) { -

{{ 'Name' | translate }}: {{ instance.name || '-' }}

-

{{ 'Status' | translate }}: {{ (instance.status | titlecase) | translate }}

+

+ {{ 'Status' | translate }}: + {{ (instance.status | mapValue: virtualizationStatusLabels) | translate }} +

{{ 'Autostart' | translate }}: {{ instance.autostart | yesNo }}

{{ 'Base Image' | translate }}: {{ instance.image.description || '-' }}

{{ 'CPU' | translate }}: {{ instance.cpu || '-' }}

diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.spec.ts index 82d7ed4d8dd..2398a4b82a3 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.spec.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.spec.ts @@ -5,10 +5,15 @@ import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectat import { of } from 'rxjs'; import { mockJob, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { mockAuth } from 'app/core/testing/utils/mock-auth.utils'; +import { VirtualizationStatus, VirtualizationType } from 'app/enums/virtualization.enum'; import { VirtualizationInstance } from 'app/interfaces/virtualization.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; -import { InstanceGeneralInfoComponent } from 'app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component'; -import { InstanceEditFormComponent } from 'app/pages/virtualization/components/instance-edit-form/instance-edit-form.component'; +import { + InstanceGeneralInfoComponent, +} from 'app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component'; +import { + InstanceEditFormComponent, +} from 'app/pages/virtualization/components/instance-edit-form/instance-edit-form.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; import { ApiService } from 'app/services/api.service'; import { SlideInService } from 'app/services/slide-in.service'; @@ -16,8 +21,8 @@ import { SlideInService } from 'app/services/slide-in.service'; const demoInstance = { id: 'demo', name: 'Demo', - type: 'CONTAINER', - status: 'RUNNING', + type: VirtualizationType.Container, + status: VirtualizationStatus.Running, cpu: '525', autostart: true, image: { @@ -77,13 +82,14 @@ describe('InstanceGeneralInfoComponent', () => { }); it('renders details in card', () => { - const cardContent = spectator.query('mat-card-content').querySelectorAll('p'); - expect(cardContent[0]).toHaveText('Name: Demo'); - expect(cardContent[1]).toHaveText('Status: Running'); - expect(cardContent[2]).toHaveText('Autostart: Yes'); - expect(cardContent[3]).toHaveText('Base Image: Almalinux 8 amd64 (20241030_23:38)'); - expect(cardContent[4]).toHaveText('CPU: 525'); - expect(cardContent[5]).toHaveText('Memory: 125 MiB'); + const chartExtra = spectator.query('mat-card-content').querySelectorAll('p'); + expect(chartExtra).toHaveLength(6); + expect(chartExtra[0]).toHaveText('Status: Running'); + expect(chartExtra[1]).toHaveText('Autostart: Yes'); + expect(chartExtra[2]).toHaveText('Base Image: Almalinux 8 amd64 (20241030_23:38)'); + expect(chartExtra[3]).toHaveText('CPU: 525'); + expect(chartExtra[4]).toHaveText('Memory: 125 MiB'); + expect(chartExtra[5]).toHaveText('Environment:'); }); it('renders environment variables', () => { @@ -101,7 +107,7 @@ describe('InstanceGeneralInfoComponent', () => { expect(spectator.inject(ApiService).job).toHaveBeenLastCalledWith('virt.instance.delete', ['demo']); }); - it('navigates to app edit page when Edit button is pressed', async () => { + it('opens edit instance form when Edit is pressed', async () => { const editButton = await loader.getHarness(MatButtonHarness.with({ text: 'Edit' })); await editButton.click(); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.ts index c41127a1fe8..5c8c4e639fe 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-general-info/instance-general-info.component.ts @@ -1,4 +1,4 @@ -import { KeyValuePipe, TitleCasePipe } from '@angular/common'; +import { KeyValuePipe } from '@angular/common'; import { ChangeDetectionStrategy, Component, input } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -11,10 +11,13 @@ import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { filter, switchMap } from 'rxjs'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { Role } from 'app/enums/role.enum'; +import { virtualizationStatusLabels } from 'app/enums/virtualization.enum'; import { VirtualizationInstance } from 'app/interfaces/virtualization.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxFormatterService } from 'app/modules/forms/ix-forms/services/ix-formatter.service'; +import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; import { YesNoPipe } from 'app/modules/pipes/yes-no/yes-no.pipe'; +import { TestDirective } from 'app/modules/test-id/test.directive'; import { InstanceEditFormComponent } from 'app/pages/virtualization/components/instance-edit-form/instance-edit-form.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; import { ApiService } from 'app/services/api.service'; @@ -37,15 +40,17 @@ import { SlideInService } from 'app/services/slide-in.service'; TranslateModule, MatCardContent, YesNoPipe, - TitleCasePipe, RequiresRolesDirective, KeyValuePipe, + TestDirective, + MapValuePipe, ], }) export class InstanceGeneralInfoComponent { instance = input.required(); protected readonly Role = Role; + protected readonly virtualizationStatusLabels = virtualizationStatusLabels; constructor( protected formatter: IxFormatterService, diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.html b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.html index 45dff44f16e..c66add9bc94 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.html +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.html @@ -15,7 +15,7 @@

@if (isLoadingDevices()) { } @else { - @for (proxy of proxies(); track proxy) { + @for (proxy of proxies(); track proxy.name) {
{{ proxy.source_port }} {{ proxy.source_proto }} ({{ 'Host' | translate }}) @@ -23,15 +23,7 @@

{{ proxy.dest_port }} {{ proxy.dest_proto }} ({{ 'Instance' | translate }})

- +
} @empty { {{ 'No proxies added.' | translate }} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.scss b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.scss index 22dc8499a66..825a4354f63 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.scss +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.scss @@ -7,17 +7,3 @@ .hint { color: var(--alt-fg1); } - -.delete-button { - opacity: 0.8; - - &:focus, - &:hover { - opacity: 1; - } - - ix-icon { - height: 20px; - width: 20px; - } -} diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.spec.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.spec.ts index 7c58453efa1..c3dcd98562f 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.spec.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.spec.ts @@ -2,39 +2,54 @@ import { HarnessLoader } from '@angular/cdk/testing'; import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; import { MatButtonHarness } from '@angular/material/button/testing'; import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { MockComponent } from 'ng-mocks'; import { of } from 'rxjs'; -import { mockCall, mockApi } from 'app/core/testing/utils/mock-api.utils'; import { VirtualizationDeviceType, VirtualizationProxyProtocol } from 'app/enums/virtualization.enum'; import { VirtualizationProxy, VirtualizationUsb } from 'app/interfaces/virtualization.interface'; -import { DialogService } from 'app/modules/dialog/dialog.service'; -import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; -import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { InstanceProxiesComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component'; import { InstanceProxyFormComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; -import { ApiService } from 'app/services/api.service'; import { ChainedSlideInService } from 'app/services/chained-slide-in.service'; describe('InstanceProxiesComponent', () => { let spectator: Spectator; let loader: HarnessLoader; + const devices = [ + { + dev_type: VirtualizationDeviceType.Usb, + name: 'Some other device', + } as VirtualizationUsb, + { + name: 'proxy1', + dev_type: VirtualizationDeviceType.Proxy, + source_port: 4000, + source_proto: VirtualizationProxyProtocol.Tcp, + dest_port: 3000, + dest_proto: VirtualizationProxyProtocol.Udp, + } as VirtualizationProxy, + { + name: 'proxy2', + dev_type: VirtualizationDeviceType.Proxy, + source_port: 5000, + source_proto: VirtualizationProxyProtocol.Udp, + dest_port: 5000, + dest_proto: VirtualizationProxyProtocol.Udp, + } as VirtualizationProxy, + ]; + const createComponent = createComponentFactory({ component: InstanceProxiesComponent, imports: [ - + MockComponent(DeleteDeviceButtonComponent), ], providers: [ - mockProvider(DialogService, { - confirm: jest.fn(() => of(true)), - }), - mockApi([ - mockCall('virt.instance.device_delete'), - ]), - mockProvider(SnackbarService), mockProvider(ChainedSlideInService, { open: jest.fn(() => of({ response: true, @@ -44,28 +59,7 @@ describe('InstanceProxiesComponent', () => { mockProvider(VirtualizationInstancesStore, { isLoadingDevices: () => false, selectedInstance: () => ({ id: 'my-instance' }), - selectedInstanceDevices: () => [ - { - dev_type: VirtualizationDeviceType.Usb, - name: 'Some other device', - } as VirtualizationUsb, - { - name: 'proxy1', - dev_type: VirtualizationDeviceType.Proxy, - source_port: 4000, - source_proto: VirtualizationProxyProtocol.Tcp, - dest_port: 3000, - dest_proto: VirtualizationProxyProtocol.Udp, - } as VirtualizationProxy, - { - name: 'proxy2', - dev_type: VirtualizationDeviceType.Proxy, - source_port: 5000, - source_proto: VirtualizationProxyProtocol.Udp, - dest_port: 5000, - dest_proto: VirtualizationProxyProtocol.Udp, - } as VirtualizationProxy, - ], + selectedInstanceDevices: () => devices, loadDevices: jest.fn(), }), ], @@ -92,12 +86,9 @@ describe('InstanceProxiesComponent', () => { expect(spectator.inject(VirtualizationInstancesStore).loadDevices).toHaveBeenCalled(); }); - it('deletes a proxy with confirmation and reloads the list when delete icon is pressed', async () => { - const deleteIcon = await loader.getHarness(IxIconHarness.with({ name: 'mdi-close' })); - await deleteIcon.click(); - - expect(spectator.inject(DialogService).confirm).toHaveBeenCalled(); - expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('virt.instance.device_delete', ['my-instance', 'proxy1']); - expect(spectator.inject(VirtualizationInstancesStore).loadDevices).toHaveBeenCalled(); + it('renders a button to delete the proxy', () => { + const deleteButtons = spectator.queryAll(DeleteDeviceButtonComponent); + expect(deleteButtons).toHaveLength(2); + expect(deleteButtons[0].device).toBe(devices[1]); }); }); diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.ts index 98c6133b7cf..6e0f1b13e7b 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxies.component.ts @@ -3,27 +3,20 @@ import { MatButton, MatIconButton } from '@angular/material/button'; import { MatCard, MatCardContent, MatCardHeader, MatCardTitle, } from '@angular/material/card'; -import { MatTooltip } from '@angular/material/tooltip'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; -import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { TranslateModule } from '@ngx-translate/core'; import { NgxSkeletonLoaderModule } from 'ngx-skeleton-loader'; -import { - EMPTY, Observable, switchMap, tap, -} from 'rxjs'; import { VirtualizationDeviceType } from 'app/enums/virtualization.enum'; -import { VirtualizationProxy } from 'app/interfaces/virtualization.interface'; -import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { AppLoaderService } from 'app/modules/loader/app-loader.service'; -import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; import { TestDirective } from 'app/modules/test-id/test.directive'; import { InstanceProxyFormComponent, } from 'app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; -import { ApiService } from 'app/services/api.service'; import { ChainedSlideInService } from 'app/services/chained-slide-in.service'; -import { ErrorHandlerService } from 'app/services/error-handler.service'; @UntilDestroy() @Component({ @@ -41,9 +34,9 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; MatButton, TestDirective, NgxSkeletonLoaderModule, - MatTooltip, MatIconButton, IxIconComponent, + DeleteDeviceButtonComponent, ], }) export class InstanceProxiesComponent { @@ -52,12 +45,6 @@ export class InstanceProxiesComponent { constructor( private slideIn: ChainedSlideInService, private instanceStore: VirtualizationInstancesStore, - private dialog: DialogService, - private snackbar: SnackbarService, - private ws: ApiService, - private translate: TranslateService, - private loader: AppLoaderService, - private errorHandler: ErrorHandlerService, ) {} protected readonly proxies = computed(() => { @@ -76,33 +63,4 @@ export class InstanceProxiesComponent { this.instanceStore.loadDevices(); }); } - - protected deleteProxyPressed(proxy: VirtualizationProxy): void { - this.dialog.confirm({ - message: this.translate.instant('Are you sure you want to delete this proxy?'), - title: this.translate.instant('Delete Proxy'), - }) - .pipe( - switchMap((confirmed) => { - if (!confirmed) { - return EMPTY; - } - - return this.deleteProxy(proxy); - }), - untilDestroyed(this), - ) - .subscribe(); - } - - private deleteProxy(proxy: VirtualizationProxy): Observable { - return this.ws.call('virt.instance.device_delete', [this.instanceStore.selectedInstance().id, proxy.name]).pipe( - this.loader.withLoader(), - this.errorHandler.catchError(), - tap(() => { - this.snackbar.success(this.translate.instant('Proxy deleted')); - this.instanceStore.loadDevices(); - }), - ); - } } diff --git a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component.ts b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component.ts index 81fe3ec8b19..4c0439577a0 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-details/instance-proxies/instance-proxy-form/instance-proxy-form.component.ts @@ -7,7 +7,6 @@ import { MatCard, MatCardContent } from '@angular/material/card'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; import { TranslateModule, TranslateService } from '@ngx-translate/core'; import { of } from 'rxjs'; -import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { VirtualizationDeviceType, VirtualizationProxyProtocol, @@ -41,7 +40,6 @@ import { ApiService } from 'app/services/api.service'; MatCard, MatCardContent, ReactiveFormsModule, - RequiresRolesDirective, TestDirective, TranslateModule, IxSelectComponent, diff --git a/src/app/pages/virtualization/components/all-instances/instance-list/instance-row/instance-row.component.ts b/src/app/pages/virtualization/components/all-instances/instance-list/instance-row/instance-row.component.ts index 31994593eba..8e1c811cbae 100644 --- a/src/app/pages/virtualization/components/all-instances/instance-list/instance-row/instance-row.component.ts +++ b/src/app/pages/virtualization/components/all-instances/instance-list/instance-row/instance-row.component.ts @@ -7,10 +7,9 @@ import { MatTooltipModule } from '@angular/material/tooltip'; import { TranslateModule } from '@ngx-translate/core'; import { RequiresRolesDirective } from 'app/directives/requires-roles/requires-roles.directive'; import { Role } from 'app/enums/role.enum'; -import { VirtualizationStatus, virtualizationStatusMap, virtualizationTypeMap } from 'app/enums/virtualization.enum'; +import { VirtualizationStatus, virtualizationStatusLabels, virtualizationTypeMap } from 'app/enums/virtualization.enum'; import { VirtualizationInstance } from 'app/interfaces/virtualization.interface'; import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; -import { FileSizePipe } from 'app/modules/pipes/file-size/file-size.pipe'; import { MapValuePipe } from 'app/modules/pipes/map-value/map-value.pipe'; import { TestDirective } from 'app/modules/test-id/test.directive'; @@ -21,7 +20,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ - FileSizePipe, IxIconComponent, MatTooltipModule, TestDirective, @@ -45,5 +43,5 @@ export class InstanceRowComponent { readonly onRestart = output(); readonly virtualizationTypeMap = virtualizationTypeMap; - readonly virtualizationStatusMap = virtualizationStatusMap; + readonly virtualizationStatusMap = virtualizationStatusLabels; } diff --git a/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.html b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.html new file mode 100644 index 00000000000..7a65959557a --- /dev/null +++ b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.html @@ -0,0 +1,15 @@ +
+ +
diff --git a/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.scss b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.scss new file mode 100644 index 00000000000..25aaa561393 --- /dev/null +++ b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.scss @@ -0,0 +1,17 @@ +.disabled { + cursor: not-allowed; +} + +.delete-button { + opacity: 0.6; + + &:focus, + &:hover { + opacity: 1; + } + + ix-icon { + height: 20px; + width: 20px; + } +} diff --git a/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.spec.ts b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.spec.ts new file mode 100644 index 00000000000..9318877d9e0 --- /dev/null +++ b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.spec.ts @@ -0,0 +1,68 @@ +import { HarnessLoader } from '@angular/cdk/testing'; +import { TestbedHarnessEnvironment } from '@angular/cdk/testing/testbed'; +import { MatButtonHarness } from '@angular/material/button/testing'; +import { createComponentFactory, mockProvider, Spectator } from '@ngneat/spectator/jest'; +import { of } from 'rxjs'; +import { mockApi, mockCall } from 'app/core/testing/utils/mock-api.utils'; +import { VirtualizationDevice } from 'app/interfaces/virtualization.interface'; +import { DialogService } from 'app/modules/dialog/dialog.service'; +import { IxIconHarness } from 'app/modules/ix-icon/ix-icon.harness'; +import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; +import { + DeleteDeviceButtonComponent, +} from 'app/pages/virtualization/components/common/delete-device-button/delete-device-button.component'; +import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; +import { ApiService } from 'app/services/api.service'; + +describe('DeleteDeviceButtonComponent', () => { + let spectator: Spectator; + let loader: HarnessLoader; + const createComponent = createComponentFactory({ + component: DeleteDeviceButtonComponent, + providers: [ + mockProvider(SnackbarService), + mockProvider(DialogService, { + confirm: jest.fn(() => of(true)), + }), + mockApi([ + mockCall('virt.instance.device_delete'), + ]), + mockProvider(VirtualizationInstancesStore, { + selectedInstance: () => ({ + id: 'my-instance', + }), + loadDevices: jest.fn(), + }), + ], + }); + + beforeEach(() => { + spectator = createComponent({ + props: { + device: { + name: 'my-device', + } as VirtualizationDevice, + }, + }); + loader = TestbedHarnessEnvironment.loader(spectator.fixture); + }); + + it('shows button as disabled for readonly devices', async () => { + spectator.setInput('device', { + name: 'my-device', + readonly: true, + } as VirtualizationDevice); + + const button = await loader.getHarness(MatButtonHarness); + expect(await button.isDisabled()).toBe(true); + }); + + it('deletes a device with confirmation and reloads the store when button is pressed', async () => { + const deleteIcon = await loader.getHarness(IxIconHarness.with({ name: 'mdi-close' })); + await deleteIcon.click(); + + expect(spectator.inject(DialogService).confirm).toHaveBeenCalled(); + expect(spectator.inject(ApiService).call).toHaveBeenCalledWith('virt.instance.device_delete', ['my-instance', 'my-device']); + expect(spectator.inject(VirtualizationInstancesStore).loadDevices).toHaveBeenCalled(); + }); +}); diff --git a/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.ts b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.ts new file mode 100644 index 00000000000..dacf93867f5 --- /dev/null +++ b/src/app/pages/virtualization/components/common/delete-device-button/delete-device-button.component.ts @@ -0,0 +1,75 @@ +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; +import { MatIconButton } from '@angular/material/button'; +import { MatTooltip } from '@angular/material/tooltip'; +import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; +import { TranslateModule, TranslateService } from '@ngx-translate/core'; +import { + EMPTY, Observable, switchMap, tap, +} from 'rxjs'; +import { VirtualizationDevice } from 'app/interfaces/virtualization.interface'; +import { DialogService } from 'app/modules/dialog/dialog.service'; +import { IxIconComponent } from 'app/modules/ix-icon/ix-icon.component'; +import { AppLoaderService } from 'app/modules/loader/app-loader.service'; +import { SnackbarService } from 'app/modules/snackbar/services/snackbar.service'; +import { TestDirective } from 'app/modules/test-id/test.directive'; +import { VirtualizationInstancesStore } from 'app/pages/virtualization/stores/virtualization-instances.store'; +import { ApiService } from 'app/services/api.service'; +import { ErrorHandlerService } from 'app/services/error-handler.service'; + +@UntilDestroy() +@Component({ + selector: 'ix-delete-device-button', + templateUrl: './delete-device-button.component.html', + styleUrls: ['./delete-device-button.component.scss'], + standalone: true, + changeDetection: ChangeDetectionStrategy.OnPush, + imports: [ + TranslateModule, + TestDirective, + IxIconComponent, + MatIconButton, + MatTooltip, + ], +}) +export class DeleteDeviceButtonComponent { + readonly device = input.required(); + + constructor( + private dialog: DialogService, + private ws: ApiService, + private errorHandler: ErrorHandlerService, + private translate: TranslateService, + private snackbar: SnackbarService, + private instanceStore: VirtualizationInstancesStore, + private loader: AppLoaderService, + ) {} + + protected deletePressed(): void { + this.dialog.confirm({ + message: this.translate.instant('Are you sure you want to delete this device?'), + title: this.translate.instant('Delete Device'), + }) + .pipe( + switchMap((confirmed) => { + if (!confirmed) { + return EMPTY; + } + + return this.deleteDevice(); + }), + untilDestroyed(this), + ) + .subscribe(); + } + + private deleteDevice(): Observable { + return this.ws.call('virt.instance.device_delete', [this.instanceStore.selectedInstance().id, this.device().name]).pipe( + this.loader.withLoader(), + this.errorHandler.catchError(), + tap(() => { + this.snackbar.success(this.translate.instant('Device deleted')); + this.instanceStore.loadDevices(); + }), + ); + } +} diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html index 757f238f01b..0409b4f6bce 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.html @@ -33,7 +33,7 @@ ixTest="browse-images" type="button" (click)="onBrowseImages()" - >{{ 'Browse' | translate }} + >{{ 'Browse Catalog' | translate }}

@@ -84,6 +84,40 @@ + + + @for (disk of form.controls.disks.controls; track disk; let i = $index) { + + + + + + } + + + + + + - {{ 'Save' | translate }} + {{ 'Create' | translate }} diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts index 19c1a8ac5fa..da58d6450bc 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.spec.ts @@ -31,6 +31,7 @@ import { InstanceWizardComponent } from 'app/pages/virtualization/components/ins import { VirtualizationImageWithId } from 'app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component'; import { ApiService } from 'app/services/api.service'; import { AuthService } from 'app/services/auth/auth.service'; +import { FilesystemService } from 'app/services/filesystem.service'; describe('InstanceWizardComponent', () => { let spectator: SpectatorRouting; @@ -45,6 +46,7 @@ describe('InstanceWizardComponent', () => { providers: [ mockProvider(AuthService, { hasRole: () => of(true) }), mockProvider(Router), + mockProvider(FilesystemService), mockApi([ mockCall('virt.instance.query', [{ id: 'test', @@ -100,7 +102,7 @@ describe('InstanceWizardComponent', () => { }); it('opens SelectImageDialogComponent when Browse image button is pressed and show image label when image is selected', async () => { - const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse' })); + const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse Catalog' })); await browseButton.click(); expect(spectator.inject(MatDialog).open).toHaveBeenCalled(); @@ -117,14 +119,16 @@ describe('InstanceWizardComponent', () => { 'Memory Size': '1 GiB', }); - const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse' })); + const browseButton = await loader.getHarness(MatButtonHarness.with({ text: 'Browse Catalog' })); await browseButton.click(); - const usbDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'xHCI Host Controller' })); - await usbDeviceCheckbox.setValue(true); - - const gpuDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'NVIDIA GeForce GTX 1080' })); - await gpuDeviceCheckbox.setValue(true); + const diskList = await loader.getHarness(IxListHarness.with({ label: 'Disks' })); + await diskList.pressAddButton(); + const diskForm = await diskList.getLastListItem(); + await diskForm.fillForm({ + Source: '/mnt/source', + Destination: 'destination', + }); const proxiesList = await loader.getHarness(IxListHarness.with({ label: 'Proxies' })); await proxiesList.pressAddButton(); @@ -136,16 +140,25 @@ describe('InstanceWizardComponent', () => { 'Instance Protocol': 'UDP', }); - const saveButton = await loader.getHarness(MatButtonHarness.with({ text: 'Save' })); - await saveButton.click(); + const usbDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'xHCI Host Controller' })); + await usbDeviceCheckbox.setValue(true); + + const gpuDeviceCheckbox = await loader.getHarness(IxCheckboxHarness.with({ label: 'NVIDIA GeForce GTX 1080' })); + await gpuDeviceCheckbox.setValue(true); + + const createButton = await loader.getHarness(MatButtonHarness.with({ text: 'Create' })); + await createButton.click(); expect(spectator.inject(ApiService).job).toHaveBeenCalledWith('virt.instance.create', [{ name: 'new', autostart: true, cpu: '1-2', devices: [ - { dev_type: VirtualizationDeviceType.Usb, product_id: '0003' }, - { dev_type: VirtualizationDeviceType.Gpu, gpu_type: 'NVIDIA Corporation' }, + { + dev_type: VirtualizationDeviceType.Disk, + source: '/mnt/source', + destination: 'destination', + }, { dev_type: VirtualizationDeviceType.Proxy, source_port: 3000, @@ -153,6 +166,8 @@ describe('InstanceWizardComponent', () => { dest_port: 2000, dest_proto: VirtualizationProxyProtocol.Udp, }, + { dev_type: VirtualizationDeviceType.Usb, product_id: '0003' }, + { dev_type: VirtualizationDeviceType.Gpu, gpu_type: 'NVIDIA Corporation' }, ], image: 'almalinux/8/cloud', memory: GiB, diff --git a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts index 7b3e8e83c2c..05989abf09a 100644 --- a/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts +++ b/src/app/pages/virtualization/components/instance-wizard/instance-wizard.component.ts @@ -34,6 +34,7 @@ import { } from 'app/interfaces/virtualization.interface'; import { DialogService } from 'app/modules/dialog/dialog.service'; import { IxCheckboxComponent } from 'app/modules/forms/ix-forms/components/ix-checkbox/ix-checkbox.component'; +import { IxExplorerComponent } from 'app/modules/forms/ix-forms/components/ix-explorer/ix-explorer.component'; import { IxFieldsetComponent } from 'app/modules/forms/ix-forms/components/ix-fieldset/ix-fieldset.component'; import { IxInputComponent } from 'app/modules/forms/ix-forms/components/ix-input/ix-input.component'; import { IxListItemComponent } from 'app/modules/forms/ix-forms/components/ix-list/ix-list-item/ix-list-item.component'; @@ -51,6 +52,7 @@ import { } from 'app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component'; import { ApiService } from 'app/services/api.service'; import { AuthService } from 'app/services/auth/auth.service'; +import { FilesystemService } from 'app/services/filesystem.service'; @UntilDestroy() @Component({ @@ -70,6 +72,7 @@ import { AuthService } from 'app/services/auth/auth.service'; IxListComponent, IxListItemComponent, IxSelectComponent, + IxExplorerComponent, ], templateUrl: './instance-wizard.component.html', styleUrls: ['./instance-wizard.component.scss'], @@ -110,6 +113,10 @@ export class InstanceWizardComponent implements OnInit { dest_proto: FormControl; dest_port: FormControl; }>>([]), + disks: this.formBuilder.array; + destination: FormControl; + }>>([]), autostart: [false], environmentVariables: new FormArray([]), memory: [null as number, Validators.required], @@ -119,6 +126,8 @@ export class InstanceWizardComponent implements OnInit { protected readonly visibleImageName = new FormControl(''); protected readonly proxyProtocols$ = of(mapToOptions(virtualizationProxyProtocolLabels, this.translate)); + readonly directoryNodeProvider = this.filesystem.getFilesystemNodeProvider(); + get hasRequiredRoles(): Observable { return this.authService.hasRole(this.requiredRoles); } @@ -134,6 +143,7 @@ export class InstanceWizardComponent implements OnInit { private dialogService: DialogService, protected formatter: IxFormatterService, private authService: AuthService, + private filesystem: FilesystemService, ) {} ngOnInit(): void { @@ -176,17 +186,30 @@ export class InstanceWizardComponent implements OnInit { this.form.controls.proxies.removeAt(index); } + protected addDisk(): void { + const control = this.formBuilder.group({ + source: ['', Validators.required], + destination: ['', Validators.required], + }); + + this.form.controls.disks.push(control); + } + + protected removeDisk(index: number): void { + this.form.controls.disks.removeAt(index); + } + protected onSubmit(): void { const payload = this.getPayload(); const job$ = this.ws.job('virt.instance.create', [payload]); this.dialogService - .jobDialog(job$, { title: this.translate.instant('Saving Instance') }) + .jobDialog(job$, { title: this.translate.instant('Creating Instance') }) .afterClosed() .pipe(untilDestroyed(this)) .subscribe({ next: ({ result }) => { - this.snackbar.success(this.translate.instant('Instance saved')); + this.snackbar.success(this.translate.instant('Instance created')); this.router.navigate(['/virtualization/view', result?.id]); }, error: (error) => { @@ -235,6 +258,12 @@ export class InstanceWizardComponent implements OnInit { } private getDevicesPayload(): VirtualizationDevice[] { + const disks = this.form.controls.disks.value.map((proxy) => ({ + dev_type: VirtualizationDeviceType.Disk, + source: proxy.source, + destination: proxy.destination, + })); + const usbDevices = Object.entries(this.form.controls.usb_devices.value || {}) .filter(([_, isSelected]) => isSelected) .map(([productId]) => ({ @@ -258,9 +287,10 @@ export class InstanceWizardComponent implements OnInit { })); return [ + ...disks, + ...proxies, ...usbDevices, ...gpuDevices, - ...proxies, ] as VirtualizationDevice[]; } diff --git a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts index ecdfa5c62ad..5389e726207 100644 --- a/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts +++ b/src/app/pages/virtualization/components/instance-wizard/select-image-dialog/select-image-dialog.component.ts @@ -4,7 +4,7 @@ import { import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; import { MatButton, MatIconButton } from '@angular/material/button'; import { - MAT_DIALOG_DATA, MatDialogActions, MatDialogContent, MatDialogModule, MatDialogRef, + MAT_DIALOG_DATA, MatDialogContent, MatDialogModule, MatDialogRef, } from '@angular/material/dialog'; import { MatTableModule } from '@angular/material/table'; import { UntilDestroy, untilDestroyed } from '@ngneat/until-destroy'; @@ -38,7 +38,6 @@ export type VirtualizationImageWithId = VirtualizationImage & { IxSelectComponent, ReactiveFormsModule, MatDialogContent, - MatDialogActions, MatDialogModule, TranslateModule, IxIconComponent, diff --git a/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.ts b/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.ts index 6cc5d418eb5..df5dd99b619 100644 --- a/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.ts +++ b/src/app/pages/vm/devices/device-list/device-delete-modal/device-delete-modal.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, OnInit, } from '@angular/core'; @@ -33,7 +32,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; imports: [ MatDialogTitle, ReactiveFormsModule, - CdkScrollable, MatDialogContent, IxCheckboxComponent, IxInputComponent, diff --git a/src/app/pages/vm/devices/device-list/device-details/device-details.component.ts b/src/app/pages/vm/devices/device-list/device-details/device-details.component.ts index d4bb365de1c..90625a1e072 100644 --- a/src/app/pages/vm/devices/device-list/device-details/device-details.component.ts +++ b/src/app/pages/vm/devices/device-list/device-details/device-details.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'; import { MatButton } from '@angular/material/button'; import { @@ -19,7 +18,6 @@ import { TestDirective } from 'app/modules/test-id/test.directive'; imports: [ MatDialogTitle, IxIconComponent, - CdkScrollable, MatDialogContent, MatDialogActions, MatButton, diff --git a/src/app/pages/vm/vm-list/clone-vm-dialog/clone-vm-dialog.component.ts b/src/app/pages/vm/vm-list/clone-vm-dialog/clone-vm-dialog.component.ts index 5c4c9e31405..3170c07f96f 100644 --- a/src/app/pages/vm/vm-list/clone-vm-dialog/clone-vm-dialog.component.ts +++ b/src/app/pages/vm/vm-list/clone-vm-dialog/clone-vm-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -28,7 +27,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxInputComponent, ReactiveFormsModule, diff --git a/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.ts b/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.ts index 0a9be98cade..4d7fb34a917 100644 --- a/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.ts +++ b/src/app/pages/vm/vm-list/delete-vm-dialog/delete-vm-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, OnInit, } from '@angular/core'; @@ -32,7 +31,6 @@ import { ErrorHandlerService } from 'app/services/error-handler.service'; standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, ReactiveFormsModule, IxCheckboxComponent, diff --git a/src/app/pages/vm/vm-list/stop-vm-dialog/stop-vm-dialog.component.ts b/src/app/pages/vm/vm-list/stop-vm-dialog/stop-vm-dialog.component.ts index 2b7466c157e..6308fa63204 100644 --- a/src/app/pages/vm/vm-list/stop-vm-dialog/stop-vm-dialog.component.ts +++ b/src/app/pages/vm/vm-list/stop-vm-dialog/stop-vm-dialog.component.ts @@ -1,4 +1,3 @@ -import { CdkScrollable } from '@angular/cdk/scrolling'; import { ChangeDetectionStrategy, Component, Inject, } from '@angular/core'; @@ -30,7 +29,6 @@ export interface StopVmDialogData { standalone: true, imports: [ MatDialogTitle, - CdkScrollable, MatDialogContent, IxCheckboxComponent, ReactiveFormsModule, diff --git a/src/assets/i18n/af.json b/src/assets/i18n/af.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/af.json +++ b/src/assets/i18n/af.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ar.json b/src/assets/i18n/ar.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ar.json +++ b/src/assets/i18n/ar.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ast.json b/src/assets/i18n/ast.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ast.json +++ b/src/assets/i18n/ast.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/az.json b/src/assets/i18n/az.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/az.json +++ b/src/assets/i18n/az.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/be.json b/src/assets/i18n/be.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/be.json +++ b/src/assets/i18n/be.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/bg.json b/src/assets/i18n/bg.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/bg.json +++ b/src/assets/i18n/bg.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/bn.json b/src/assets/i18n/bn.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/bn.json +++ b/src/assets/i18n/bn.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/br.json b/src/assets/i18n/br.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/br.json +++ b/src/assets/i18n/br.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/bs.json b/src/assets/i18n/bs.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/bs.json +++ b/src/assets/i18n/bs.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ca.json b/src/assets/i18n/ca.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ca.json +++ b/src/assets/i18n/ca.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/cs.json b/src/assets/i18n/cs.json index 5a9b21b8efc..3325537f44c 100644 --- a/src/assets/i18n/cs.json +++ b/src/assets/i18n/cs.json @@ -49,6 +49,7 @@ "Activates the configuration. Unset to disable the configuration without deleting it.": "", "Activates the replication schedule.": "", "Add Custom App": "", + "Add Disk": "", "Add Proxy": "", "Add a new bucket to your Storj account.": "", "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "", @@ -186,7 +187,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -326,7 +326,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -675,7 +675,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -742,6 +741,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -908,7 +908,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -934,7 +933,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -981,6 +979,7 @@ "Device Name": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1030,6 +1029,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1426,6 +1426,7 @@ "Failover Write": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -1797,7 +1798,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2362,6 +2363,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2413,7 +2415,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2686,7 +2687,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Pull": "", "Pull Image": "", @@ -2797,7 +2797,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3064,7 +3063,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -3481,7 +3479,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -3926,6 +3923,7 @@ "Total failed": "", "Traffic": "", "Transfer": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transparently reuse a single copy of duplicated data to save space. Deduplication can improve storage capacity, but is RAM intensive. Compressing data is generally recommended before using deduplication. Deduplicating data is a one-way process. Deduplicated data cannot be undeduplicated!.": "", diff --git a/src/assets/i18n/cy.json b/src/assets/i18n/cy.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/cy.json +++ b/src/assets/i18n/cy.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/da.json b/src/assets/i18n/da.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/da.json +++ b/src/assets/i18n/da.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index e3bc7c51504..c0d14d1d447 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -120,6 +120,7 @@ "Add Cron Job": "", "Add Custom App": "", "Add DNS Authenticator": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -345,7 +346,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -453,7 +453,7 @@ "Bridge Members": "", "Bridge Settings": "", "Bridge interface": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browse to the existing path on the remote host to sync with. Maximum path length is 255 characters": "", "Browse to the installer image file and click Upload.": "", @@ -730,7 +730,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate Authority": "", "Create Certificate Signing Requests": "", @@ -787,6 +786,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -918,7 +918,6 @@ "Delete Init/Shutdown Script {script}?": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -935,7 +934,6 @@ "Delete dataset {name}": "", "Delete device": "", "Delete files in the destination directory that do not exist in the source directory.": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete snapshot {name}?": "", @@ -965,6 +963,7 @@ "Device Name": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device «{disk}» has been detached.": "", "Device «{name}» was successfully attached.": "", @@ -998,6 +997,7 @@ "Disk Info": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1301,6 +1301,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -1629,7 +1630,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2078,6 +2079,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2118,7 +2120,6 @@ "Notifications": "", "Notransfer Timeout": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2361,7 +2362,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Pull": "", "Pull Image": "", "Pulling...": "", @@ -2440,7 +2440,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew 2FA Secret": "", "Renew Certificate Days Before Expiry": "", "Renew Secret": "", @@ -2650,7 +2649,6 @@ "Save Selection": "", "Save current ACL entries as a preset for future use.": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving settings": "", "Scan remote host key.": "", "Scan this QR Code with your authenticator app of choice. The next time you try to login, you will be asked to enter an One Time Password (OTP) from your authenticator app. This step is extremely important. Without the OTP you will be locked out of this system.": "", @@ -2961,7 +2959,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spare": "", @@ -3348,6 +3345,7 @@ "Traffic": "", "Train": "", "Transfer Mode": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transparently reuse a single copy of duplicated data to save space. Deduplication can improve storage capacity, but is RAM intensive. Compressing data is generally recommended before using deduplication. Deduplicating data is a one-way process. Deduplicated data cannot be undeduplicated!.": "", diff --git a/src/assets/i18n/dsb.json b/src/assets/i18n/dsb.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/dsb.json +++ b/src/assets/i18n/dsb.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/el.json b/src/assets/i18n/el.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/el.json +++ b/src/assets/i18n/el.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/en-au.json b/src/assets/i18n/en-au.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/en-au.json +++ b/src/assets/i18n/en-au.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/en-gb.json b/src/assets/i18n/en-gb.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/en-gb.json +++ b/src/assets/i18n/en-gb.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/eo.json b/src/assets/i18n/eo.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/eo.json +++ b/src/assets/i18n/eo.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/es-ar.json b/src/assets/i18n/es-ar.json index 699661b9ef6..cc72a77f5b4 100644 --- a/src/assets/i18n/es-ar.json +++ b/src/assets/i18n/es-ar.json @@ -43,6 +43,7 @@ "Activate this certificate extension. The key usage extension defines the purpose (e.g., encipherment, signature, certificate signing) of the key contained in the certificate. The usage restriction might be employed when a key that could be used for more than one operation is to be restricted. For example, when an RSA key should be used only to verify signatures on objects other than public key certificates and CRLs, the Digital Signature bits would be asserted. Likewise, when an RSA key should be used only for key management, the Key Encipherment bit would be asserted.
See RFC 3280, section 4.2.1.3 for more information.": "", "Activate this certificate extension.The Extended Key Usage extension identifies and limits valid uses for this certificate, such as client authentication or server authentication.See RFC 3280, section 4.2.1.13 for more details.": "", "Activate this extension. The authority key identifier extension provides a means of identifying the public key corresponding to the private key used to sign a certificate. This extension is used where an issuer has multiple signing keys (either due to multiple concurrent key pairs or due to changeover). The identification MAY be based on either the key identifier (the subject key identifier in the issuer's certificate) or on the issuer name and serial number.
See RFC 3280, section 4.2.1.1 for more information.": "", + "Add Disk": "", "Add Proxy": "", "Add Share": "", "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "", @@ -98,7 +99,6 @@ "Are you sure you want to delete the group quota {name}?": "", "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", "Asymmetric Logical Unit Access (ALUA)": "", "At least 1 GPU is required by the host for its functions.": "", "At least 1 data VDEV is required.": "", @@ -136,6 +136,7 @@ "Boot Environment": "", "Boot Pool Condition": "", "Boot Pool Disk Replaced": "", + "Browse Catalog": "", "Bucket Name": "", "Bucket Policy Only": "", "Bulk Actions": "", @@ -238,6 +239,7 @@ "Create Tunable": "", "Create empty source dirs on destination after sync": "", "Create more data VDEVs like the first.": "", + "Creating Instance": "", "Cron Job": "", "Cron Jobs": "", "Cron job created": "", @@ -298,7 +300,6 @@ "Delete Cloud Sync Task \"{name}\"?": "", "Delete Init/Shutdown Script {script}?": "", "Delete Periodic Snapshot Task \"{value}\"?": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -310,7 +311,6 @@ "Delete all TrueNAS configurations that depend on the exported pool. Impacted configurations may include services (listed above if applicable), applications, shares, and scheduled data protection tasks.": "", "Delete dataset {name}": "", "Delete device": "", - "Delete proxy": "", "Delete user primary group `{name}`": "", "Delete {n, plural, one {# user} other {# users}} with this primary group?": "", "Deleted {n, plural, one {# snapshot} other {# snapshots}}": "", @@ -321,6 +321,7 @@ "Determine how chmod behaves when adjusting file ACLs. See the zfs(8) aclmode property.

Passthrough only updates ACL entries that are related to the file or directory mode.

Restricted does not allow chmod to make changes to files or directories with a non-trivial ACL. An ACL is trivial if it can be fully expressed as a file mode without losing any access rules. Setting the ACL Mode to Restricted is typically used to optimize a dataset for SMB sharing, but can require further optimizations. For example, configuring an rsync task with this dataset could require adding --no-perms in the task Auxiliary Parameters field.": "", "Determines the outgoing and incoming traffic ports.
LACP is the recommended protocol if the network switch is capable of active LACP.
Failover is the default protocol choice and should only be used if the network switch does not support active LACP.": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Directory Inherit": "", "Directory Permissions": "", "Directory Service Read": "", @@ -331,6 +332,7 @@ "Disabled in Disk Settings": "", "Discover Remote Host Key": "", "Disk IO": "", + "Disk added": "", "Dispersal Strategy": "", "Display Login": "", "Display Port": "", @@ -448,6 +450,7 @@ "Failover Read": "", "Failover Write": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Faulted": "", "Feedback Type": "", "Fenced is not running.": "", @@ -571,6 +574,7 @@ "Instance": "", "Instance Port": "", "Instance Protocol": "", + "Instance created": "", "Instance updated": "", "Internal CA": "", "Invalid cron expression": "", @@ -709,6 +713,7 @@ "No arguments are passed": "", "No available licensed Expansion Shelves ": "", "No devices added.": "", + "No disks added.": "", "No options are passed": "", "No proxies added.": "", "No results found in {section}": "", @@ -819,7 +824,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Pull": "", "Quota Fill Critical": "", "Quota Fill Critical (in %)": "", @@ -928,7 +932,6 @@ "Save As Preset": "", "Save current ACL entries as a preset for future use.": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving settings": "", "Scan remote host key.": "", "Scan this QR Code with your authenticator app of choice. The next time you try to login, you will be asked to enter an One Time Password (OTP) from your authenticator app. This step is extremely important. Without the OTP you will be locked out of this system.": "", @@ -1248,6 +1251,7 @@ "Total Allocation": "", "Total Down": "", "Total Raw Capacity": "", + "Transfer Setting": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", "Treat Disk Size as Minimum": "", @@ -2030,7 +2034,6 @@ "Bridge Settings": "Configuración del puente", "Bridge interface": "Interfaz de puente", "Browsable to Network Clients": "Navegable a clientes de red", - "Browse": "Navegar", "Browse to a CD-ROM file present on the system storage.": "Busque un archivo de CD-ROM presente en el almacenamiento del sistema.", "Browse to a storage location and add the name of the new raw file on the end of the path.": "Busque una ubicación de almacenamiento y agregue el nombre del nuevo archivo sin formato al final de la ruta.", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "Buscar un archivo existente. Creá un nuevo archivo buscando un conjunto de datos y agregando /(filename.ext) a la ruta.", @@ -2325,7 +2328,6 @@ "Create": "Crear", "Create ACME Certificate": "Crear certificado ACME", "Create Alert": "Crear alerta", - "Create Boot Environment": "Crear entorno de arranque", "Create CSR": "Crear CSR", "Create Certificate": "Crear certificado", "Create Credential": "Crear credencial", @@ -3269,7 +3271,6 @@ "Installed Apps": "Apps instaladas", "Installing": "Instalando", "Instance Configuration": "Configuración de instancia", - "Instance saved": "Instancia guardada", "Instances you created will automatically appear here.": "Las instancias que creaste aparecerán automáticamente acá.", "Integrate Snapshots with VMware": "Integrar instantáneas con VMware", "Interface": "Interfaz", @@ -3776,7 +3777,6 @@ "Notifications": "Notificaciones", "Nov": "Noviembre", "Now": "Ahora", - "Now/Restart": "Ahora/Reiniciar", "Num Pending Deletes": "Número de eliminaciones pendientes", "Number of VDEVs": "Número de VDEVs", "Number of bytes": "Número de bytes", @@ -4084,7 +4084,6 @@ "Removed": "Eliminado", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "Elimina la ACL y los permisos de forma recursiva de todos los conjuntos de datos secundarios del conjunto de datos actual, incluidos todos los directorios y archivos contenidos en esos conjuntos de datos secundarios. Esto puede hacer que los datos sean inaccesibles hasta que se creen nuevos permisos.", "Rename": "Renombrar", - "Rename Boot Environment": "Cambiar nombre del entorno de arranque", "Renew": "Renovar", "Renew 2FA Secret": "Renovar secreto 2FA", "Renew Certificate Days": "Renovar días de certificado", @@ -4580,7 +4579,6 @@ "Source": "Origen", "Source Location": "Lugar de origen", "Source Path": "Ruta de origen", - "Space": "Espacio", "Spaces are allowed.": "Se permiten espacios.", "Sparse": "Escaso", "Specifies the auxiliary directory service ID provider.": "Especifica el proveedor de ID de servicio de directorio auxiliar.", diff --git a/src/assets/i18n/es-co.json b/src/assets/i18n/es-co.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/es-co.json +++ b/src/assets/i18n/es-co.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/es-mx.json b/src/assets/i18n/es-mx.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/es-mx.json +++ b/src/assets/i18n/es-mx.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/es-ni.json b/src/assets/i18n/es-ni.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/es-ni.json +++ b/src/assets/i18n/es-ni.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/es-ve.json b/src/assets/i18n/es-ve.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/es-ve.json +++ b/src/assets/i18n/es-ve.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json index 4537bfff8d8..3009717a789 100644 --- a/src/assets/i18n/es.json +++ b/src/assets/i18n/es.json @@ -173,6 +173,7 @@ "Add Custom App": "", "Add DNS Authenticator": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -454,7 +455,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -581,7 +581,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -914,7 +914,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -978,6 +977,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1129,7 +1129,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1154,7 +1153,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1202,6 +1200,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1248,6 +1247,7 @@ "Disk Sector Size": "", "Disk Tests": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1708,6 +1708,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2102,7 +2103,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2659,6 +2660,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2708,7 +2710,6 @@ "Notifications": "", "Notransfer Timeout": "", "Nov": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2998,7 +2999,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3106,7 +3106,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3378,7 +3377,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4242,6 +4240,7 @@ "Total failed": "", "Traffic": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", @@ -5011,7 +5010,6 @@ "Settings saved.": "Ajustes guardados.", "Show Console Messages": "Mostrar mensajes de la consola", "Size": "Tamaño", - "Space": "Espacio", "Space Available to Dataset": "Espacio disponible para el dataset", "Space Available to Zvol": "Espacio disponible para el Zvol", "Spare": "Repuesto", diff --git a/src/assets/i18n/et.json b/src/assets/i18n/et.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/et.json +++ b/src/assets/i18n/et.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/eu.json b/src/assets/i18n/eu.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/eu.json +++ b/src/assets/i18n/eu.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/fa.json b/src/assets/i18n/fa.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/fa.json +++ b/src/assets/i18n/fa.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/fi.json b/src/assets/i18n/fi.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/fi.json +++ b/src/assets/i18n/fi.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index c3559803c7a..3d8f3eca254 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -18,6 +18,7 @@ "Absent": "", "Active Directory": "", "Add Custom App": "", + "Add Disk": "", "Add Expansion Shelf": "", "Add Proxy": "", "Add to trusted store": "", @@ -43,7 +44,6 @@ "Arbitrary Text": "", "Archs": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", "Audit": "", "Audit Entry": "", "Audit ID": "", @@ -78,9 +78,10 @@ "Box": "", "Bridge Members": "", "Bridge Settings": "", - "Browse": "", + "Browse Catalog": "", "Bucket Name": "", "Bulk Actions": "", + "Burst": "", "CD-ROM Path": "", "CLI": "", "CN Realm": "", @@ -157,6 +158,7 @@ "Create Reporting Exporter": "", "Created": "", "Created date": "", + "Creating Instance": "", "Creating custom app": "", "Credentials: {credentials}": "", "Cronjob": "", @@ -183,12 +185,11 @@ "Datasets": "", "Default Route": "", "Defect": "", - "Delete Proxy": "", "Delete device": "", - "Delete proxy": "", "Delete raw file": "", "Descriptor": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Directory Mask": "", "Directory Permissions": "", "Directory Service Read": "", @@ -198,6 +199,7 @@ "Disk IO": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disks on {enclosure}": "", "Dismiss": "", "Dispersal Strategy": "", @@ -258,6 +260,7 @@ "Failover Now": "", "Failover Read": "", "Failover Write": "", + "Fast Storage": "", "Feedback Type": "", "File ID": "", "File Mask": "", @@ -358,7 +361,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Invisible": "", "Ipmi": "", @@ -506,6 +509,7 @@ "No VDEVs added.": "", "No available licensed Expansion Shelves ": "", "No devices added.": "", + "No disks added.": "", "No images found": "", "No instances": "", "No jobs running.": "", @@ -514,7 +518,6 @@ "Not Installed": "", "Notes": "", "Notifications": "", - "Now/Restart": "", "OS": "", "Offload Read": "", "Offload Write": "", @@ -564,7 +567,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Pull Image": "", "Quota": "", "Quotas set for {n, plural, one {# group} other {# groups}}": "", @@ -665,7 +667,6 @@ "SSH Keyscan": "", "SSSD Compat": "", "Samba": "", - "Saving Instance": "", "Schema": "", "Schema Mode": "", "Screenshots": "", @@ -842,6 +843,7 @@ "Total": "", "Total failed": "", "Traffic": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", @@ -1563,7 +1565,6 @@ "Builtin": "Intégré", "Bulk Edit Disks": "Modifier en masse les disques", "Bulk actions": "Actions en masse", - "Burst": "Poussée", "By clicking the share creation checkbox below, a new share will be created on form submission with the default share settings Additionally, local TrueNAS users will have access to the resulting share and some more configuration options will be available.": "En cochant la case de création de partage ci-dessous, un nouveau partage sera créé lors de la soumission du formulaire avec les paramètres de partage par défaut. De plus, les utilisateurs TrueNAS locaux auront accès au partage résultant et d'autres options de configuration seront disponibles.", "By default, Samba uses a hashing algorithm for NTFS illegal characters. Enabling this option translates NTFS illegal characters to the Unicode private range.": "Par défaut, Samba utilise un algorithme de hachage pour les caractères illégaux NTFS. En activant cette option, les caractères illégaux NTFS sont traduits dans la gamme privée Unicode.", "By default, the VM receives an auto-generated random MAC address. Enter a custom address into the field to override the default. Click Generate MAC Address to add a new randomized address into this field.": "Par défaut, la machine virtuelle reçoit une adresse MAC aléatoire générée automatiquement. Entrez une adresse personnalisée dans le champ pour remplacer l'adresse par défaut. Cliquez sur Générer une adresse MAC pour ajouter une nouvelle adresse aléatoire dans ce champ.", @@ -1852,7 +1853,6 @@ "Create ACME DNS-Authenticator": "Créer un authentificateur DNS ACME", "Create Alert": "Créer alerte", "Create Backup Credential": "Créer des informations d'identification de sauvegarde", - "Create Boot Environment": "Créer un environnement de démarrage", "Create CSR": "Créer CSR", "Create Certificate": "Créer certificat", "Create Certificate Authority": "Créer une autorité de certification", @@ -3804,7 +3804,6 @@ "Removed": "Supprimé", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "Supprime l'ACL et les autorisations de manière récursive de tous les datasets enfants du dataset actuel, y compris tous les répertoires et fichiers contenus dans ces datasets enfants. Cela peut rendre les données inaccessibles jusqu'à ce que de nouvelles autorisations soient créées.", "Rename": "Renommer", - "Rename Boot Environment": "Renommer l'environnement de boot", "Renew": "Renouveler", "Renew 2FA Secret": "Renouveler le secret 2FA", "Renew Certificate Days": "Renouveler les jours du certificat", @@ -4358,7 +4357,6 @@ "Source": "Source", "Source Dataset": "Dataset source", "Source Location": "Emplacement source", - "Space": "Espace", "Space Available to Dataset": "Espace disponible pour le dataset", "Space Available to Zvol": "Espace disponible pour le Zvol", "Spaces are allowed.": "Des espaces sont autorisés.", diff --git a/src/assets/i18n/fy.json b/src/assets/i18n/fy.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/fy.json +++ b/src/assets/i18n/fy.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ga.json b/src/assets/i18n/ga.json index bc95fc9c13f..28aa3c49461 100644 --- a/src/assets/i18n/ga.json +++ b/src/assets/i18n/ga.json @@ -6,6 +6,7 @@ "AD users and groups by default will have a domain name prefix (`DOMAIN\\`). In some edge cases this may cause erratic behavior from some clients and applications that are poorly designed and cannot handle the prefix. Set only if required for a specific application or client. Note that using this setting is not recommended as it may cause collisions with local user account names.": "", "Absent": "", "Add Custom App": "", + "Add Disk": "", "Add Proxy": "", "Add to trusted store": "", "Add user linked API Key": "", @@ -28,7 +29,6 @@ "Applying important system or security updates.": "", "Archs": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to restore the default set of widgets?": "", "Automatically restart the system after the update is applied.": "", "Autostart": "", @@ -36,7 +36,7 @@ "Base Image": "", "Block I/O": "", "Block I/O read and writes": "", - "Browse": "", + "Browse Catalog": "", "CPU & Memory": "", "CPU Overview": "", "CPU Temperature Per Core": "", @@ -62,6 +62,7 @@ "Create New Instance": "", "Created": "", "Created date": "", + "Creating Instance": "", "Creating custom app": "", "Credentials have been successfully added.": "", "Current status: {status}": "", @@ -72,13 +73,13 @@ "Dataset is locked": "", "Deduplication is experimental in 24.10 and not fully supported. When enabled, data is permanently stored with this memory-intensive method and cannot be undone. Take extreme caution and ensure you have adequate data backups before enabling this feature.": "", "Default widgets restored": "", - "Delete Proxy": "", "Delete Snapshot": "", "Delete device": "", - "Delete proxy": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device «{disk}» has been detached.": "", "Device «{name}» was successfully attached.": "", + "Disk added": "", "Docker Write": "", "Edit Custom App": "", "Edit Instance: {name}": "", @@ -95,6 +96,7 @@ "Exited": "", "Expires at": "", "Expires date": "", + "Fast Storage": "", "For performance reasons SHA512 is recommended over SHA256 for datasets with deduplication enabled.": "", "GPU Devices": "", "General Settings": "", @@ -123,7 +125,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Invalid CPU configuration.": "", @@ -152,6 +154,7 @@ "Network size of each docker network which will be cut off from base subnet.": "", "No containers are available.": "", "No devices added.": "", + "No disks added.": "", "No images found": "", "No instances": "", "No jobs running.": "", @@ -160,7 +163,6 @@ "Non expiring": "", "Not Installed": "", "Notes": "", - "Now/Restart": "", "OS": "", "Ok": "", "Override Admin Email": "", @@ -180,7 +182,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Reason": "", "Refresh Catalog": "", "Regularly scheduled system checks and updates.": "", @@ -197,7 +198,6 @@ "Restore default widgets": "", "Restoring backup": "", "Running Jobs": "", - "Saving Instance": "", "Search Images": "", "Select": "", "Select Image": "", @@ -207,8 +207,6 @@ "Set an expiration date-time for the API key.": "", "Set password for TrueNAS administrative user:": "", "Set to boot a debug kernel after the next system restart.": "", - "Set to enable Samba to do DNS updates when joining a domain.": "", - "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "", "Slot: {slot}": "", "Software Installation": "", "Specifies level of authentication and cryptographic protection. SYS or none should be used if no KDC is available. If a KDC is available, e.g. Active Directory, KRB5 is recommended. If desired KRB5I (integrity protection) and/or KRB5P (privacy protection) may be included with KRB5.": "", @@ -226,13 +224,14 @@ "The system will restart and be briefly unavailable while applying updates. Apply updates and restart?": "", "The {service} service is running and will auto-start after a system restart.": "", "This dataset is used to store apps config and other container related data": "", + "Transfer Setting": "", "Troubleshooting Issues": "", + "TrueNAS is Free and Open Source software, which is provided as-is with no warranty.": "", "TrueNAS maintains a cache of users and groups for API consumers (including the WebUI). This is a convenience feature that may be disabled if the domain contains large numbers of users and groups or if the caching generates excessive load on the domain controller.": "", "USB Devices": "", "Unexpected power loss necessitating a restart.": "", "Unresponsive system necessitating a forced restart.": "", "Unsaved Changes": "", - "Update Members": "", "Update successful. Please restart for the update to take effect. Restart now?": "", "Updating Instance": "", "Updating custom app": "", @@ -1227,7 +1226,6 @@ "Create ACME DNS-Authenticator": "Cruthaigh ACME DNS-Authenticator", "Create Alert": "Cruthaigh Foláirimh", "Create Backup Credential": "Cruthaigh Dintiúir Cúltaca", - "Create Boot Environment": "Cruthaigh Timpeallacht Tosaithe", "Create CSR": "Cruthaigh CSR", "Create Certificate": "Cruthaigh Deimhniú", "Create Certificate Authority": "Cruthaigh Údarás Deimhniú", @@ -3489,7 +3487,6 @@ "Removed": "Bhaint", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "Baintear an ACL agus ceadanna go hathchúrsach ó gach tacar sonraí leanaí den tacar sonraí reatha, lena n-áirítear na heolairí agus na comhaid go léir atá laistigh de na tacair sonraí leanaí sin. Féadann sé seo sonraí a dhéanamh dorochtana go dtí go gcruthófar ceadanna nua.", "Rename": "Athainmnigh", - "Rename Boot Environment": "Athainmnigh Timpeallacht Tosaithe", "Renew": "Athnuaigh", "Renew 2FA Secret": "Rún 2FA a athnuachan", "Renew Certificate Days": "Laethanta Teastais a athnuachan", @@ -4012,6 +4009,7 @@ "Set to display image upload options.": "Socraigh chun roghanna uaslódáil íomhá a thaispeáint.", "Set to either start this replication task immediately after the linked periodic snapshot task completes or continue to create a separate Schedule for this replication.": "Socraigh chun tús a chur leis an tasc macasamhlaithe seo díreach tar éis don tasc achomair thréimhsiúil nasctha a bheith críochnaithe nó lean ar aghaidh le Sceideal ar leith a chruthú don mhacasamhlú seo.", "Set to enable DHCP. Leave unset to create a static IPv4 or IPv6 configuration. Only one interface can be configured for DHCP.": "Socraigh chun DHCP a chumasú. Fág gan socrú chun cumraíocht statach IPv4 nó IPv6 a chruthú. Ní féidir ach comhéadan amháin a chumrú le haghaidh DHCP.", + "Set to enable Samba to do DNS updates when joining a domain.": "Socraigh chun cur ar chumas Samba nuashonruithe DNS a dhéanamh agus iad ag dul isteach in fhearann.", "Set to enable connecting to the SPICE web interface.": "Socraigh chun nascadh le comhéadan gréasáin SPICE a chumasú.", "Set to enable the File eXchange Protocol. This option makes the server vulnerable to FTP bounce attacks so it is not recommended.": "Socraigh chun an Prótacal Malartú Comhad a chumasú. Déanann an rogha seo an freastalaí i mbaol ionsaithe preab FTP agus mar sin ní mholtar é.", "Set to enable the iSCSI extent.": "Socraigh chun an méid iSCSI a chumasú.", @@ -4040,6 +4038,7 @@ "Set to reduce the size of data to transmit. Recommended for slow connections.": "Socraigh chun méid na sonraí a tharchur a laghdú. Moltar do naisc mall.", "Set to remove all ACLs from the current dataset. ACLs are also recursively stripped from directories and child datasets when those options are set.": "Socraigh chun gach ACL a bhaint den tacar sonraí reatha. Baintear ACLanna freisin go hathchúrsach ó eolairí agus tacair shonraí leanaí nuair a shocraítear na roghanna sin.", "Set to remove the data associated with this Virtual Machine (which will result in data loss if the data is not backed up). Unset to leave the data intact.": "Socraigh chun na sonraí a bhaineann leis an Meaisín Fíorúil seo a bhaint (rud a chaillfidh sonraí mura bhfuil na sonraí cúltaca). Díshuiteáil chun na sonraí a fhágáil slán.", + "Set to restrict SSH access in certain circumstances to only members of BUILTIN\\Administrators": "Socraigh chun rochtain SSH a shrianadh i gcúinsí áirithe do bhaill BUILTIN\\Riarthóirí amháin", "Set to run resilver tasks between the configured times.": "Socraigh chun tascanna athfhriotail a rith idir na hamanna cumraithe.", "Set to save the temporary file from each updated file to a holding directory until the end of the transfer when all transferred files are renamed into place.": "Socraigh chun an comhad sealadach a shábháil ó gach comhad nuashonraithe chuig eolaire coinneála go dtí deireadh an aistrithe nuair a athainmnítear gach comhad aistrithe i bhfeidhm.", "Set to start this VM when the system boots.": "Socraigh chun an VM seo a thosú nuair a thosaíonn an córas.", @@ -4201,7 +4200,6 @@ "Source Dataset": "Tacar Sonraí Foinse", "Source Location": "Suíomh Foinse", "Source Path": "Conair Foinse", - "Space": "Spás", "Space Available to Dataset": "Spás ar Fáil don Tacar Sonraí", "Space Available to Zvol": "Spás ar fáil do Zvol", "Spaces are allowed.": "Tá spásanna ceadaithe.", @@ -4679,7 +4677,6 @@ "TrueNAS Controller": "Rialaitheoir TrueNAS", "TrueNAS Help": "Cabhair TrueNAS", "TrueNAS URL": "URL TrueNAS", - "TrueNAS is Free and Open Source software, which is provided as-is with no warranty.": "Is bogearraí Foinse Oscailte saor in aisce é TrueNAS, a chuirtear ar fáil mar atá gan bharántas.", "TrueNAS recommends that the sync setting always be left to the default of \"Standard\" or increased to \"Always\". The \"Disabled\" setting should not be used in production and only where data roll back by few seconds in case of crash or power loss is not a concern.": "Molann TrueNAS go bhfágfaí an socrú sioncronaithe i gcónaí faoin réamhshocrú \"Caighdeánach\" nó go méadófaí go \"I gcónaí\". Níor cheart an socrú \"Daoine faoi Mhíchumas\" a úsáid i dtáirgeadh agus sa chás sin amháin nach ábhar imní é sonraí a rolladh siar cúpla soicind i gcás timpiste nó caillteanas cumhachta.", "TrueNAS server must be joined to Active Directory or have at least one local SMB user before creating an SMB share": "Ní mór freastalaí TrueNAS a cheangal leis an Eolaire Gníomhach nó úsáideoir SMB áitiúil amháin ar a laghad a bheith aige sula gcruthaítear sciar SMB", "TrueNAS software versions do not match between storage controllers.": "Ní hionann leaganacha bogearraí TrueNAS agus rialaitheoirí stórála.", @@ -4774,6 +4771,7 @@ "Update Image": "Nuashonraigh Íomhá", "Update Interval": "Eatramh Nuashonraithe", "Update License": "Nuashonraigh Ceadúnas", + "Update Members": "Baill Nuashonrú", "Update Password": "Nuashonraigh Pasfhocal", "Update Pool": "Snámha Nuashonraithe", "Update Production Status": "Nuashonraigh an Stádas Táirgthe", diff --git a/src/assets/i18n/gd.json b/src/assets/i18n/gd.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/gd.json +++ b/src/assets/i18n/gd.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/gl.json b/src/assets/i18n/gl.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/gl.json +++ b/src/assets/i18n/gl.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/he.json b/src/assets/i18n/he.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/he.json +++ b/src/assets/i18n/he.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/hi.json b/src/assets/i18n/hi.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/hi.json +++ b/src/assets/i18n/hi.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/hr.json b/src/assets/i18n/hr.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/hr.json +++ b/src/assets/i18n/hr.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/hsb.json b/src/assets/i18n/hsb.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/hsb.json +++ b/src/assets/i18n/hsb.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/hu.json b/src/assets/i18n/hu.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/hu.json +++ b/src/assets/i18n/hu.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ia.json b/src/assets/i18n/ia.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ia.json +++ b/src/assets/i18n/ia.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/id.json b/src/assets/i18n/id.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/id.json +++ b/src/assets/i18n/id.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/io.json b/src/assets/i18n/io.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/io.json +++ b/src/assets/i18n/io.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/is.json b/src/assets/i18n/is.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/is.json +++ b/src/assets/i18n/is.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/it.json b/src/assets/i18n/it.json index a3dadf377d8..ccf4d78c9fe 100644 --- a/src/assets/i18n/it.json +++ b/src/assets/i18n/it.json @@ -170,6 +170,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -442,7 +443,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -564,7 +564,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browse to an existing pool or dataset to store the new zvol.": "", @@ -884,7 +884,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -949,6 +948,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1103,7 +1103,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1128,7 +1127,6 @@ "Delete device": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete snapshot {name}?": "", @@ -1173,6 +1171,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1220,6 +1219,7 @@ "Disk Sector Size": "", "Disk Tests": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1681,6 +1681,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2110,7 +2111,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2713,6 +2714,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2766,7 +2768,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3078,7 +3079,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3196,7 +3196,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3479,7 +3478,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -3698,6 +3696,7 @@ "Times": "", "Timestamp": "", "Token": "", + "Transfer Setting": "", "Transport": "", "Transport Encryption Behavior": "", "Transport Options": "", @@ -4326,7 +4325,6 @@ "Source Dataset": "Dataset Sorgente", "Source Location": "Posizione Sorgente", "Source Path": "Percorso Sorgente", - "Space": "Spazio", "Space Available to Dataset": "Spazio Disponibile per Dataset", "Space Available to Zvol": "Spazio Disponibile per Zvol", "Spaces are allowed.": "Sono consentiti spazi.", diff --git a/src/assets/i18n/ja.json b/src/assets/i18n/ja.json index 62c503be079..36a50486e80 100644 --- a/src/assets/i18n/ja.json +++ b/src/assets/i18n/ja.json @@ -161,6 +161,7 @@ "Add Custom App": "", "Add DNS Authenticator": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -416,7 +417,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -531,7 +531,7 @@ "Bridge Members": "", "Bridge Settings": "", "Bridge interface": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browse to the existing path on the remote host to sync with. Maximum path length is 255 characters": "", "Browse to the exported key file that can be used to unlock this dataset.": "", @@ -839,7 +839,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -904,6 +903,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creation Time": "", "Credential": "", @@ -1058,7 +1058,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1083,7 +1082,6 @@ "Delete device": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete snapshot {name}?": "", @@ -1129,6 +1127,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1181,6 +1180,7 @@ "Disk Size": "", "Disk Tests": "", "Disk Type": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1602,6 +1602,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2008,7 +2009,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2589,6 +2590,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2640,7 +2642,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2927,7 +2928,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3037,7 +3037,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3298,7 +3297,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -3695,7 +3693,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spare": "", @@ -4123,6 +4120,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ka.json b/src/assets/i18n/ka.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ka.json +++ b/src/assets/i18n/ka.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/kk.json b/src/assets/i18n/kk.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/kk.json +++ b/src/assets/i18n/kk.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/km.json b/src/assets/i18n/km.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/km.json +++ b/src/assets/i18n/km.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/kn.json b/src/assets/i18n/kn.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/kn.json +++ b/src/assets/i18n/kn.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ko.json b/src/assets/i18n/ko.json index 68f66d456c4..746e0e530b0 100644 --- a/src/assets/i18n/ko.json +++ b/src/assets/i18n/ko.json @@ -49,6 +49,7 @@ "Add Cloud Credential": "", "Add Credential": "", "Add Custom App": "", + "Add Disk": "", "Add Disk Test": "", "Add Expansion Shelf": "", "Add Exporter": "", @@ -174,7 +175,6 @@ "Are you sure you want to delete the {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -232,7 +232,7 @@ "Box": "", "Bridge Members": "", "Bridge Settings": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browser time: {time}": "", "Bucket Name": "", @@ -587,7 +587,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -656,6 +655,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -828,7 +828,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -854,7 +853,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -909,6 +907,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -965,6 +964,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1451,6 +1451,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -1880,7 +1881,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2483,6 +2484,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2536,7 +2538,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2848,7 +2849,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -2966,7 +2966,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3249,7 +3248,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -3703,7 +3701,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4170,6 +4167,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/lb.json b/src/assets/i18n/lb.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/lb.json +++ b/src/assets/i18n/lb.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/lt.json b/src/assets/i18n/lt.json index bdcd98d4103..3c964a16239 100644 --- a/src/assets/i18n/lt.json +++ b/src/assets/i18n/lt.json @@ -185,6 +185,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -478,7 +479,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -624,7 +624,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -998,7 +998,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1067,6 +1066,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1239,7 +1239,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1265,7 +1264,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1320,6 +1318,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1376,6 +1375,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1862,6 +1862,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2291,7 +2292,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2894,6 +2895,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2947,7 +2949,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3259,7 +3260,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3377,7 +3377,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3660,7 +3659,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4114,7 +4112,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4581,6 +4578,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/lv.json b/src/assets/i18n/lv.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/lv.json +++ b/src/assets/i18n/lv.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/mk.json b/src/assets/i18n/mk.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/mk.json +++ b/src/assets/i18n/mk.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ml.json b/src/assets/i18n/ml.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ml.json +++ b/src/assets/i18n/ml.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/mn.json b/src/assets/i18n/mn.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/mn.json +++ b/src/assets/i18n/mn.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/mr.json b/src/assets/i18n/mr.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/mr.json +++ b/src/assets/i18n/mr.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/my.json b/src/assets/i18n/my.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/my.json +++ b/src/assets/i18n/my.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/nb.json b/src/assets/i18n/nb.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/nb.json +++ b/src/assets/i18n/nb.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ne.json b/src/assets/i18n/ne.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ne.json +++ b/src/assets/i18n/ne.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/nl.json b/src/assets/i18n/nl.json index a7b47895944..ae631696f22 100644 --- a/src/assets/i18n/nl.json +++ b/src/assets/i18n/nl.json @@ -36,6 +36,7 @@ "Add Cloud Credential": "", "Add Credential": "", "Add Custom App": "", + "Add Disk": "", "Add Disk Test": "", "Add Expansion Shelf": "", "Add Exporter": "", @@ -130,7 +131,6 @@ "Arbitrary Text": "", "Archs": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to restore the default set of widgets?": "", "Asymmetric Logical Unit Access (ALUA)": "", "Attach images (optional)": "", @@ -166,7 +166,7 @@ "Boot Pool Disk Replaced": "", "Bridge Members": "", "Bridge Settings": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browser time: {time}": "", "Bulk Actions": "", @@ -314,6 +314,7 @@ "Create iSCSI": "", "Created": "", "Created date": "", + "Creating Instance": "", "Creating custom app": "", "Credentials have been successfully added.": "", "Cron Job": "", @@ -357,13 +358,11 @@ "Delete Alert Service \"{name}\"?": "", "Delete All Selected": "", "Delete Cloud Backup \"{name}\"?": "", - "Delete Proxy": "", "Delete Snapshot": "", "Delete all TrueNAS configurations that depend on the exported pool. Impacted configurations may include services (listed above if applicable), applications, shares, and scheduled data protection tasks.": "", "Delete dataset {name}": "", "Delete device": "", "Delete group": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete user primary group `{name}`": "", @@ -374,6 +373,7 @@ "Desired – encrypt transport if supported by client during session negotiation": "", "Destroy the ZFS filesystem for pool data. This is a permanent operation. You will be unable to re-mount data from the exported pool.": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device removed": "", "Device «{disk}» has been detached.": "", "Device «{name}» was successfully attached.": "", @@ -390,6 +390,7 @@ "Disk IO": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disks on {enclosure}": "", "Disks w/ZFS Errors": "", "Disks with exported pools": "", @@ -489,6 +490,7 @@ "Failover Group": "", "Failover Now": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Feature Request": "", "Features": "", @@ -598,7 +600,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -802,6 +804,7 @@ "No available licensed Expansion Shelves ": "", "No containers are available.": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No images found": "", "No instances": "", @@ -824,7 +827,6 @@ "Not Installed": "", "Not Shared": "", "Notes": "", - "Now/Restart": "", "OS": "", "Ok": "", "One half widget and two quarter widgets below": "", @@ -897,7 +899,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Quotas set for {n, plural, one {# group} other {# groups}}": "", "Quotas set for {n, plural, one {# user} other {# users}}": "", "Range Size": "", @@ -1010,7 +1011,6 @@ "Save Access Control List": "", "Save Config": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving settings": "", "Schema": "", "Schema Mode": "", @@ -1230,6 +1230,7 @@ "Total Disks:": "", "Total failed": "", "Traffic": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", @@ -2171,7 +2172,6 @@ "Country": "Land", "Create": "Aanmaken", "Create ACME Certificate": "ACME certificaat aanmaken", - "Create Boot Environment": "Bootomgeving aanmaken", "Create Dataset": "Dataset aanmaken", "Create Home Directory": "Home-map aanmaken", "Create NFS Share": "NFS-share aanmaken", @@ -3902,7 +3902,6 @@ "Removed": "Verwijderd", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "Verwijdert de Toegangsbeheerlijst recursief van alle onderliggende datasets van de huidige dataset, inclusief alle mappen en bestanden in die onderliggende datasets. Hierdoor kan data ontoegankelijk worden totdat er een nieuwe Toegangsbeheerlijst is aangemaakt.", "Rename": "Hernoemen", - "Rename Boot Environment": "Bootomgeving hernoemen", "Renew": "Vernieuwen", "Renew 2FA Secret": "2FA-geheim vernieuwen", "Renew Certificate Days": "Certificaatdagen vernieuwen", @@ -4454,7 +4453,6 @@ "Source": "Bron", "Source Dataset": "Bron dataset", "Source Location": "Bronlocatie", - "Space": "Ruimte", "Spaces are allowed.": "Spaties zijn toegestaan.", "Spare": "Reserve", "Spare VDEVs": "Reserve VDEVs", diff --git a/src/assets/i18n/nn.json b/src/assets/i18n/nn.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/nn.json +++ b/src/assets/i18n/nn.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/os.json b/src/assets/i18n/os.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/os.json +++ b/src/assets/i18n/os.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/pa.json b/src/assets/i18n/pa.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/pa.json +++ b/src/assets/i18n/pa.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/pl.json b/src/assets/i18n/pl.json index 3ed6866df8d..bf0d8e1507e 100644 --- a/src/assets/i18n/pl.json +++ b/src/assets/i18n/pl.json @@ -159,6 +159,7 @@ "Add Custom App": "", "Add DNS Authenticator": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -438,7 +439,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -584,7 +584,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -958,7 +958,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1024,6 +1023,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1193,7 +1193,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1219,7 +1218,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1274,6 +1272,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1330,6 +1329,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1816,6 +1816,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2244,7 +2245,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2845,6 +2846,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2898,7 +2900,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3210,7 +3211,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3327,7 +3327,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3591,7 +3590,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4044,7 +4042,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4511,6 +4508,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/pt-br.json b/src/assets/i18n/pt-br.json index c86dee50904..44cfb2ca50f 100644 --- a/src/assets/i18n/pt-br.json +++ b/src/assets/i18n/pt-br.json @@ -133,6 +133,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -426,7 +427,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -572,7 +572,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -946,7 +946,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1015,6 +1014,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1187,7 +1187,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1213,7 +1212,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1268,6 +1266,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1324,6 +1323,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1810,6 +1810,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2238,7 +2239,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2841,6 +2842,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2894,7 +2896,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3206,7 +3207,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3324,7 +3324,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3607,7 +3606,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4061,7 +4059,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4528,6 +4525,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json index 501109c0dde..311b15acf3b 100644 --- a/src/assets/i18n/pt.json +++ b/src/assets/i18n/pt.json @@ -82,6 +82,7 @@ "Add Cloud Credential": "", "Add Credential": "", "Add Custom App": "", + "Add Disk": "", "Add Disk Test": "", "Add Exporter": "", "Add Filesystem": "", @@ -211,7 +212,6 @@ "Arbitrary Text": "", "Archs": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to restore the default set of widgets?": "", "Asymmetric Logical Unit Access (ALUA)": "", "At least one module must be defined in rsyncd.conf(5) of the rsync server or in the Rsync Modules of another system.": "", @@ -248,7 +248,7 @@ "Boot Pool Condition": "", "Bridge Members": "", "Bridge Settings": "", - "Browse": "", + "Browse Catalog": "", "Bulk Actions": "", "Burst": "", "By snapshot creation time": "", @@ -487,6 +487,7 @@ "Created": "", "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Credentials have been successfully added.": "", @@ -576,7 +577,6 @@ "Delete Interface": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -597,7 +597,6 @@ "Delete device": "", "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -627,6 +626,7 @@ "Determine whether this share name is included when browsing shares. Home shares are only visible to the owner regardless of this setting.": "", "Determines the outgoing and incoming traffic ports.
LACP is the recommended protocol if the network switch is capable of active LACP.
Failover is the default protocol choice and should only be used if the network switch does not support active LACP.": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device «{disk}» has been detached.": "", @@ -655,6 +655,7 @@ "Disk IO": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disks on {enclosure}": "", "Disks w/ZFS Errors": "", "Disks with exported pools": "", @@ -965,6 +966,7 @@ "Failed to load datasets": "", "Failover Group": "", "Failover is in an error state.": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Feature Request": "", "Features": "", @@ -1248,7 +1250,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -1685,6 +1687,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -1722,7 +1725,6 @@ "Not enough free space. Maximum available: {space}": "", "Notes": "", "Notransfer Timeout": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of bytes": "", "Number of days to renew certificate before expiring.": "", @@ -1936,7 +1938,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Quota (in GiB)": "", "Quota Fill Critical": "", @@ -2008,7 +2009,6 @@ "Remove {label} item": "", "Remove {value} from recent searches": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", "Renew Certificate Days Before Expiry": "", @@ -2197,7 +2197,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving settings": "", "Scan remote host key.": "", @@ -2889,6 +2888,7 @@ "Total failed": "", "Traffic": "", "Train": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transparently reuse a single copy of duplicated data to save space. Deduplication can improve storage capacity, but is RAM intensive. Compressing data is generally recommended before using deduplication. Deduplicating data is a one-way process. Deduplicated data cannot be undeduplicated!.": "", @@ -3883,7 +3883,6 @@ "Country": "País", "Create": "Criar", "Create ACME Certificate": "Criar certificado ACME", - "Create Boot Environment": "Criar ambiente de inicialização", "Create Dataset": "Criar conjunto de dados", "Create Home Directory": "Crie uma Pasta de Raiz", "Create NFS Share": "Criar partilha NFS", @@ -4928,7 +4927,6 @@ "Snapshots": "Instantâneos", "Source": "Fonte", "Source Dataset": "Fonte Conjunto de dados", - "Space": "Espaço", "Spaces are allowed.": "Localização da fonte", "Spare": "Reserva", "Spare VDEVs": "VDEVs de reserva", diff --git a/src/assets/i18n/ro.json b/src/assets/i18n/ro.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ro.json +++ b/src/assets/i18n/ro.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ru.json b/src/assets/i18n/ru.json index 4c26850084e..db802d07b98 100644 --- a/src/assets/i18n/ru.json +++ b/src/assets/i18n/ru.json @@ -95,6 +95,7 @@ "Add Custom App": "", "Add DNS Authenticator": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -306,7 +307,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -394,7 +394,7 @@ "Bridge Members": "", "Bridge Settings": "", "Bridge interface": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browse to the path to be copied. Linux file path limits apply. Other operating systems can have different limits which might affect how they can be used as sources or destinations.": "", "Browser time: {time}": "", @@ -606,7 +606,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -668,6 +667,7 @@ "Created by: {creationSource} ({creationType})": "", "Created date": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creation Time": "", "Credentials have been successfully added.": "", @@ -782,7 +782,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -804,7 +803,6 @@ "Delete dataset {name}": "", "Delete device": "", "Delete group": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete snapshot {name}?": "", @@ -830,6 +828,7 @@ "Device Name": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -859,6 +858,7 @@ "Disk Info": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1124,6 +1124,7 @@ "Failover Read": "", "Failover Write": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -1377,7 +1378,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -1819,6 +1820,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -1863,7 +1865,6 @@ "Notifications": "", "Notransfer Timeout": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of days to retain local audit messages.": "", @@ -2086,7 +2087,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Pull": "", "Pull Image": "", "Pulling...": "", @@ -2167,7 +2167,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days Before Expiry": "", @@ -2379,7 +2378,6 @@ "Save current ACL entries as a preset for future use.": "", "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving settings": "", "Scan remote host key.": "", @@ -2650,7 +2648,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spare": "", @@ -2986,6 +2983,7 @@ "Total failed": "", "Traffic": "", "Transfer": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", diff --git a/src/assets/i18n/sk.json b/src/assets/i18n/sk.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sk.json +++ b/src/assets/i18n/sk.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sl.json b/src/assets/i18n/sl.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sl.json +++ b/src/assets/i18n/sl.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sq.json b/src/assets/i18n/sq.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sq.json +++ b/src/assets/i18n/sq.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sr-latn.json b/src/assets/i18n/sr-latn.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sr-latn.json +++ b/src/assets/i18n/sr-latn.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sr.json b/src/assets/i18n/sr.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sr.json +++ b/src/assets/i18n/sr.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/strings.json b/src/assets/i18n/strings.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/strings.json +++ b/src/assets/i18n/strings.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sv.json b/src/assets/i18n/sv.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sv.json +++ b/src/assets/i18n/sv.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/sw.json b/src/assets/i18n/sw.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/sw.json +++ b/src/assets/i18n/sw.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/ta.json b/src/assets/i18n/ta.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/ta.json +++ b/src/assets/i18n/ta.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/te.json b/src/assets/i18n/te.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/te.json +++ b/src/assets/i18n/te.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/th.json b/src/assets/i18n/th.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/th.json +++ b/src/assets/i18n/th.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/tr.json b/src/assets/i18n/tr.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/tr.json +++ b/src/assets/i18n/tr.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/tt.json b/src/assets/i18n/tt.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/tt.json +++ b/src/assets/i18n/tt.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/udm.json b/src/assets/i18n/udm.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/udm.json +++ b/src/assets/i18n/udm.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/uk.json b/src/assets/i18n/uk.json index 51c6346d282..dae7593806b 100644 --- a/src/assets/i18n/uk.json +++ b/src/assets/i18n/uk.json @@ -61,6 +61,7 @@ "Add Cloud Credential": "", "Add Credential": "", "Add Custom App": "", + "Add Disk": "", "Add Disk Test": "", "Add Expansion Shelf": "", "Add Exporter": "", @@ -188,7 +189,6 @@ "Are you sure you want to delete the {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -246,7 +246,7 @@ "Box": "", "Bridge Members": "", "Bridge Settings": "", - "Browse": "", + "Browse Catalog": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", "Browser time: {time}": "", "Bucket Name": "", @@ -443,6 +443,7 @@ "Created by: {creationSource} ({creationType})": "", "Created date": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creation Time": "", "Credentials have been successfully added.": "", @@ -516,7 +517,6 @@ "Delete Interface": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -536,7 +536,6 @@ "Delete dataset {name}": "", "Delete device": "", "Delete group": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete user primary group `{name}`": "", @@ -550,6 +549,7 @@ "Details for {vmDevice}": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device removed": "", "Device updated": "", "Device «{disk}» has been detached.": "", @@ -572,6 +572,7 @@ "Disk IO": "", "Disk Sector Size": "", "Disk Tests": "", + "Disk added": "", "Disks on {enclosure}": "", "Disks w/ZFS Errors": "", "Disks with exported pools": "", @@ -709,6 +710,7 @@ "Failover Read": "", "Failover Write": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Feature Request": "", "Features": "", @@ -874,7 +876,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -1152,6 +1154,7 @@ "No available licensed Expansion Shelves ": "", "No containers are available.": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No events to display.": "", "No images found": "", @@ -1178,7 +1181,6 @@ "Not Shared": "", "Notes": "", "Notifications": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of days to retain local audit messages.": "", "OS": "", @@ -1284,7 +1286,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Pull Image": "", "Quota": "", "Quota (in GiB)": "", @@ -1454,7 +1455,6 @@ "Save And Go To Review": "", "Save Config": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving settings": "", "Scan remote host key.": "", "Scan this QR Code with your authenticator app of choice. The next time you try to login, you will be asked to enter an One Time Password (OTP) from your authenticator app. This step is extremely important. Without the OTP you will be locked out of this system.": "", @@ -1786,6 +1786,7 @@ "Total Raw Capacity": "", "Total failed": "", "Traffic": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transport Encryption Behavior": "", @@ -2686,7 +2687,6 @@ "Cores": "Ядер", "Country": "Країна", "Create ACME Certificate": "Створити сертифікат ACME", - "Create Boot Environment": "Створити завантажувальне середовище", "Create Home Directory": "Створити домашній каталог", "Create New": "Створити", "Create New Primary Group": "Створити нову первинну групу", @@ -4135,7 +4135,6 @@ "Removed": "Видалено", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "Рекурсивно видаляє ACL і дозволи з усіх дочірніх наборів даних поточного набору даних, включаючи всі каталоги та файли, що містяться в цих дочірніх наборах даних. Це може зробити дані недоступними, доки не буде створено нові дозволи.", "Rename": "Перейменувати", - "Rename Boot Environment": "Перейменувати середовище завантаження", "Renew": "Оновити", "Renew Certificate Days": "Дні оновлення сертифікатів", "Renew Secret": "Оновити секрет", @@ -4580,7 +4579,6 @@ "Source": "Джерело", "Source Dataset": "Джерело набору даних", "Source Location": "Розташування джерела", - "Space": "Простір", "Spaces are allowed.": "Пробіли допускаються.", "Spare": "Запасний", "Spare VDEVs": "Запасні VDev", diff --git a/src/assets/i18n/vi.json b/src/assets/i18n/vi.json index 6d55e48736b..c4b5140fa01 100644 --- a/src/assets/i18n/vi.json +++ b/src/assets/i18n/vi.json @@ -190,6 +190,7 @@ "Add DNS Authenticator": "", "Add Dataset": "", "Add Device": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks": "", "Add Disks To:": "", @@ -483,7 +484,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -630,7 +630,7 @@ "Bridge Settings": "", "Bridge interface": "", "Browsable to Network Clients": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -1004,7 +1004,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -1073,6 +1072,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1245,7 +1245,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1271,7 +1270,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete saved configurations from TrueNAS?": "", "Delete selections": "", @@ -1326,6 +1324,7 @@ "Device Order": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1382,6 +1381,7 @@ "Disk Tests": "", "Disk Type": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1868,6 +1868,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -2297,7 +2298,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2900,6 +2901,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2953,7 +2955,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -3265,7 +3266,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Public Key": "", "Pull": "", @@ -3383,7 +3383,6 @@ "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", "Rename": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3666,7 +3665,6 @@ "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", "Saving Debug": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving Permissions": "", "Saving settings": "", @@ -4120,7 +4118,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -4587,6 +4584,7 @@ "Train": "", "Transfer": "", "Transfer Mode": "", + "Transfer Setting": "", "Transfers": "", "Translate App": "", "Transmit Hash Policy": "", diff --git a/src/assets/i18n/zh-hans.json b/src/assets/i18n/zh-hans.json index af945357f42..2d4647e1881 100644 --- a/src/assets/i18n/zh-hans.json +++ b/src/assets/i18n/zh-hans.json @@ -1,61 +1,184 @@ { "": "", + "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "", "...": "", + "

The system will restart to perform this operation!

All passwords are reset when the uploaded configuration database file was saved without the Password Secret Seed.

": "", "Absent": "", + "Add Disk": "", "Add Proxy": "", + "Add to trusted store": "", + "Add user linked API Key": "", + "Adding, removing, or changing hardware components.": "", + "All Users": "", "Also unlock any separate encryption roots that are children of this dataset. Child datasets that inherit encryption from this encryption root will be unlocked in either case.": "", + "An update is already applied. Please restart the system.": "", "Api Keys": "", + "Apply updates and restart system after downloading.": "", + "Applying important system or security updates.": "", "Archs": "", "Are you sure you want to delete this device?": "", - "Are you sure you want to delete this proxy?": "", + "Automatically restart the system after the update is applied.": "", + "Autostart": "", + "Base Image": "", + "Browse Catalog": "", + "CPU & Memory": "", + "Cannot be enabled for built-in users.": "", + "Close Instance Form": "", + "Cloud Sync «{name}» has been deleted.": "", + "Cloud Sync «{name}» has been restored.": "", + "Containers (WIP)": "", + "Continue in background": "", + "Controller": "", + "Create Instance": "", + "Create New Instance": "", + "Created date": "", + "Creating Instance": "", + "Credentials have been successfully added.": "", "Current status: {status}": "", - "Delete Proxy": "", + "Custom Reason": "", + "Dataset is locked": "", "Delete device": "", - "Delete proxy": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", + "Device «{disk}» has been detached.": "", + "Device «{name}» was successfully attached.": "", + "Disk added": "", "Edit Instance: {name}": "", + "Enable NFS over RDMA": "", "Enable this to create a token with no expiration date. The token will stay active until it is manually revoked or updated.": "", + "Enter an email address to override the admin account’s default email. If left blank, the admin account’s email address will be used": "", "Environment Variable": "", "Environment Variables": "", "Error Installing": "", "Expires at": "", + "Expires date": "", + "Fast Storage": "", "GPU Devices": "", + "Global Config": "", + "Global Settings": "", + "Go To Dataset": "", + "Group Members": "", + "Hardware Change": "", + "High usage necessitating a system reset.": "", "Host Port": "", "Host Protocol": "", "Host ports are listed on the left and associated container ports are on the right. 0.0.0.0 on the host side represents binding to any IP address on the host.": "", + "IPv4 Network": "", + "IPv6 Network": "", + "If you can't use QR code, use this text code instead": "", + "Image": "", + "Initialized": "", + "Initializing...": "", "Instance": "", + "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", + "Invalid CPU configuration.": "", + "Invalid Date": "", + "Label": "", + "Legacy OS: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "", "List of files and directories to exclude from backup.
Separate entries by pressing Enter. See restic exclude patterns for more details about the --exclude option.": "", + "Logging in...": "", + "Maintenance Window": "", + "Modern OS: Extent block size 4k, TPC enabled, no Xen compat mode, SSD speed": "", + "Move all items to the left side list": "", + "Move all items to the right side list": "", + "Move selected items to the left side list": "", + "Move selected items to the right side list": "", "My API Keys": "", + "Name ~ \"admin\"": "", + "Network Reset": "", "No devices added.": "", + "No disks added.": "", + "No images found": "", "No instances": "", "No proxies added.": "", "Non expiring": "", "Not Installed": "", + "OS": "", + "Override Admin Email": "", + "Performance Optimization": "", + "Permissions cannot be modified on a locked dataset.": "", + "Permissions cannot be modified on a read-only dataset.": "", + "Permissions cannot be modified on a root dataset.": "", + "Pool is not selected": "", + "Pool «{pool}» has been exported/disconnected successfully.": "", + "Power On Hours Ago": "", + "Power Outage": "", "Preserve Power Management and S.M.A.R.T. settings": "", "Preserve disk description": "", "Proxies": "", + "Proxy": "", "Proxy added": "", - "Proxy deleted": "", + "Reason": "", + "Regularly scheduled system checks and updates.": "", + "Release": "", + "Required reset to fix system operation issues.": "", + "Required restart after new software installation.": "", + "Restart After Update": "", + "Restart standby TrueNAS controller": "", + "Restart to improve system performance speed.": "", + "Restart to re-establish network connections.": "", "Restarting...": "", + "Search Images": "", + "Select": "", + "Select Image": "", "Service Announcement:": "", + "Service started": "", + "Service stopped": "", "Set an expiration date-time for the API key.": "", + "Set password for TrueNAS administrative user:": "", + "Set to boot a debug kernel after the next system restart.": "", "Slot: {slot}": "", + "Software Installation": "", + "Start service": "", "Starting...": "", + "Stop service": "", "Stopping...": "", "StorJ is an S3 compatible, fault tolerant, globally distributed cloud storage platform with a security first approach to backup and recovery - delivering extreme resilience and performance both sustainably and economically. TrueNAS and Storj have partnered to streamline delivery of Hybrid Cloud solutions globally.": "", + "System Freeze": "", + "System Overload": "", + "System Update": "", + "System Version": "", + "The system will restart and be briefly unavailable while applying updates. Apply updates and restart?": "", + "The {service} service is running and will auto-start after a system restart.": "", + "Transfer Setting": "", + "Troubleshooting Issues": "", + "TrueNAS is Free and Open Source software, which is provided as-is with no warranty.": "", "USB Devices": "", + "Unexpected power loss necessitating a restart.": "", + "Unresponsive system necessitating a forced restart.": "", + "Unsaved Changes": "", + "Update successful. Please restart for the update to take effect. Restart now?": "", "Updating Instance": "", + "Updating settings": "", + "User API Keys": "", + "User linked API Keys": "", + "Username associated with this API key.": "", + "Using 3rd party applications with TrueNAS extends its\n functionality beyond standard NAS use, which can introduce risks like data loss or system disruption.

\n iXsystems does not guarantee application safety or reliability, and such applications may not\n be covered by support contracts. Issues with core NAS functionality may be closed without\n further investigation if the same data or filesystems are accessed by these applications.": "", + "VMware: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "", + "Variant": "", + "View logs": "", + "Virtualization Global Read": "", + "Virtualization Global Write": "", + "Virtualization Instance Write": "", + "Virtualization settings updated": "", + "Xen: Extent block size 512b, TPC enabled, Xen compat mode enabled, SSD speed": "", + "You are using an insecure connection. Switch to HTTPS for secure access.": "", + "You can only lock a dataset if it was encrypted with a passphrase": "", + "You have unsaved changes. Are you sure you want to close?": "", + "{n, plural, =0 {No keys} =1 {# key} other {# keys}}": "", + "{n, plural, one {There is an active iSCSI connection.} other {There are # active iSCSI connections}}": "", + "{temp}°C (All Cores)": "", "\n It looks like your session has been inactive for more than {lifetime} seconds.
\n For security reasons we will log you out at {time}.\n ": "\n您的会话似乎已超过 {lifetime} 秒处于非活动状态。
\n 出于安全原因,我们将在 {time} 后注销您的会话。\n", " Est. Usable Raw Capacity": "估计可用原始容量", " When the UPS Mode is set to slave. Enter the open network port number of the UPS Master system. The default port is 3493.": "当 UPS 模式 设置为 附属 时。输入 UPS 系统的开放端口号。默认端口为 3493。", " as of {dateTime}": "截至 {dateTime}", " bytes.": " 字节。", " seconds.": " 秒。", - "\"Power On Hours\" are how many hours have passed while the disk has been powered on. \"Power On Hours Ago\" is how many power on hours have passed since each test.": "上电时间 是指磁盘自开机以来经过的小时数。累计上电时间 是指自每次测试以来经过的开机小时数。", "% of all cores": "% 所有核心", "'Hosts Allow' or 'Hosts Deny' has been set": "「Hosts Allow」或「Hosts Deny」已设置", "'Hosts Allow' or 'Hosts Deny' has been updated": "「Hosts Allow」或「Hosts Deny」已更新", @@ -68,7 +191,7 @@ "(TrueNAS Controller 1)": "(TrueNAS 控制器 1)", "(TrueNAS Controller 2)": "(TrueNAS 控制器 2)", "({n, plural, =1 {# widget} other {# widgets}})": "({n} 个小部件)", - "+ Add a backup credential": " 新增备份凭据", + "+ Add a backup credential": " 添加备份凭据", "... Make sure the TrueNAS system is powered on and connected to the network.": "请确保 TrueNAS 系统已通电并连接到网络。", "0=Disabled, blank=inherit": "0=禁用,留空=继承", "1 day": "一天", @@ -134,7 +257,6 @@ "global is a reserved name that cannot be used as a share name. Please enter a different share name.": "global是保留名称,不能用作共享名。请输入其他共享名。", "

Currently following GPU(s) have been isolated:

    {gpus}

": "

目前以下 GPU(s) 已经被隔离:

    {gpus}

", "

Including the Password Secret Seed allows using this configuration file with a new boot device. This also decrypts all system passwords for reuse when the configuration file is uploaded.


Keep the configuration file safe and protect it from unauthorized access!": "

包括密码密钥种子在内,可以将此配置文件与新的引导设备一起使用。上传配置文件时,会解密所有系统密码以供重复使用。


请保管好配置文件并保护好它,其免受未经授权的访问!", - "

The system will restart to perform this operation!

All passwords are reset when the uploaded configuration database file was saved without the Password Secret Seed.

": "

系统将重新启动以执行此操作!

当上传的配置备份文件在没有密钥种子的情况下被保存时,所有密码将被重置。

", "Dataset: ": "数据集:", "A User Access Token for Box. An access token enables Box to verify a request belongs to an authorized session. Example token: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl.": " Box 的用户访问令牌。访问令牌使 Box 能够验证请求是否属于授权会话。令牌示例: T9cE5asGnuyYCCqIZFoWjFHvNbvVqHjl 。", "A message with verification instructions has been sent to the new email address. Please verify the email address before continuing.": "带有验证说明的消息已发送到新的电子邮件地址,请在继续之前验证电子邮件地址。", @@ -175,7 +297,7 @@ "Access": "访问", "Access Based Share Enumeration": "基于访问的共享枚举", "Access Control Entry": "访问控制入口", - "Access Control Entry (ACE) user or group. Select a specific User or Group for this entry, owner@ to apply this entry to the user that owns the dataset, group@ to apply this entry to the group that owns the dataset, or everyone@ to apply this entry to all users and groups. See nfs4_setfacl(1) NFSv4 ACL ENTRIES.": "访问控制条目 (ACE) 用户或组。为此条目选择一个特定 用户, 拥有者@ 以将此条目应用于所有该项目的拥有者,组@ 以将此条目应用于所有该项目的拥有组,or 所有人@ 以将此条目应用于所有用户和组。请参阅 nfs4_setfacl(1) NFSv4 ACL ENTRIES.", + "Access Control Entry (ACE) user or group. Select a specific User or Group for this entry, owner@ to apply this entry to the user that owns the dataset, group@ to apply this entry to the group that owns the dataset, or everyone@ to apply this entry to all users and groups. See nfs4_setfacl(1) NFSv4 ACL ENTRIES.": "访问控制条目 (ACE) 用户或组。为此条目选择一个特定 用户, 拥有者@ 以将此条目应用于所有该项目的拥有者,组@ 以将此条目应用于所有该项目的拥有组,or 所有热@ 以将此条目应用于所有用户和组。请参阅 nfs4_setfacl(1) NFSv4 ACL ENTRIES.", "Access Control List": "访问控制列表", "Access Key ID": "访问密钥 ID", "Access Key ID for the linked AWS account.": "链接 AWS 账户的访问密钥 ID。", @@ -210,118 +332,115 @@ "Active": "活动的", "Active Directory": "活动目录", "Active Directory - Primary Domain": "活动目录 - 主域名", - "Active Directory and LDAP are disabled.": "AD 和 LDAP 被禁用。", + "Active Directory and LDAP are disabled.": "活动目录和 LDAP 被禁用。", "Active Directory is disabled.": "AD 已禁用。", - "Active Directory must be enabled before adding new domains.": "在新增新域之前,必须先启用 AD 。", + "Active Directory must be enabled before adding new domains.": "在添加新域之前,必须先启用活动目录。", "Active IP Addresses": "活动 IP 地址", "Active Sessions": "活动的会话", "Active {controller}.": "活跃的 {controller}。", "Active: TrueNAS Controller {id}": "活跃:TrueNAS 控制器 {id}", "Adapter Type": "适配器类型", - "Add": "新增", + "Add": "添加", "Add ACME DNS-Authenticator": "新增 ACME DNS 验证器", - "Add API Key": "新增 API 密钥", + "Add API Key": "添加 API 密钥", "Add Alert": "新增警报", - "Add Alert Service": "新增警报服务", - "Add Allowed Initiators (IQN)": "新增允许的启动器 (IQN)", - "Add Associated Target": "新增 Associated Target", - "Add Authorized Access": "新增授权访问", + "Add Alert Service": "添加警报服务", + "Add Allowed Initiators (IQN)": "添加允许的启动器 (IQN)", + "Add Associated Target": "添加 Associated Target", + "Add Authorized Access": "添加授权访问", "Add Backup Credential": "新增备份凭据", - "Add CSR": "新增 CSR", - "Add Catalog": "新增目录", - "Add Certificate": "新增证书", - "Add Certificate Authority": "新增证书颁发机构 (CA)", + "Add CSR": "添加 CSR", + "Add Catalog": "添加目录", + "Add Certificate": "添加证书", + "Add Certificate Authority": "添加证书颁发机构 (CA)", "Add Certificate Signing Requests": "新增证书签名请求(CSR)", "Add Cloud Backup": "新增云备份", "Add Cloud Credential": "新增云凭据", - "Add Cloud Sync Task": "新增云同步任务", + "Add Cloud Sync Task": "添加云同步任务", "Add Credential": "新增凭据", - "Add Cron Job": "新增定时任务", + "Add Cron Job": "添加定时任务", "Add Custom App": "新增自定义应用程序", - "Add DNS Authenticator": "新增 DNS 身份验证器", - "Add Dataset": "新增数据集", - "Add Device": "新增设备", + "Add DNS Authenticator": "添加 DNS 身份验证器", + "Add Dataset": "添加数据集", + "Add Device": "添加设备", "Add Disk Test": "新增磁盘测试", - "Add Disks": "新增磁盘", - "Add Disks To:": "将磁盘新增到", + "Add Disks": "添加磁盘", + "Add Disks To:": "将磁盘添加到", "Add Expansion Shelf": "新增扩展机柜", "Add Exporter": "新增导出器", - "Add Extent": "新增范围", - "Add External Interfaces": "新增外部接口", + "Add Extent": "添加范围", + "Add External Interfaces": "添加外部接口", "Add Filesystem": "新增文件系统", - "Add Group": "新增组", - "Add Group Quotas": "新增组配额", - "Add ISCSI Target": "新增 ISCSI Target", - "Add Idmap": "新增 Idmap", + "Add Group": "添加组", + "Add Group Quotas": "添加组配额", + "Add ISCSI Target": "添加 ISCSI Target", + "Add Idmap": "添加 Idmap", "Add Image": "新增图像", - "Add Init/Shutdown Script": "新增开机/关机脚本", - "Add Initiator": "新增启动器", - "Add Interface": "新增接口", + "Add Init/Shutdown Script": "添加开机/关机脚本", + "Add Initiator": "添加启动器", + "Add Interface": "添加接口", "Add Item": "新增项目", - "Add Kerberos Keytab": "新增 Kerberos 密钥表", - "Add Kerberos Realm": "新增 Kerberos 领域", - "Add Kerberos SPN Entry": "新增 Kerberos SPN 条目", + "Add Kerberos Keytab": "添加 Kerberos 密钥表", + "Add Kerberos Realm": "添加 Kerberos 领域", + "Add Kerberos SPN Entry": "添加 Kerberos SPN 条目", "Add Kernel Parameters": "新增内核参数", "Add Key": "新增密钥", - "Add License": "新增许可证", + "Add License": "添加许可证", "Add Local Group": "新增本地组", "Add Local User": "新增本地用户", - "Add NFS Share": "新增 NFS 共享", - "Add NTP Server": "新增 NTP 服务器", + "Add NFS Share": "添加 NFS 共享", + "Add NTP Server": "添加 NTP 服务器", "Add New": "新增", "Add Periodic S.M.A.R.T. Test": "新增定期 S.M.A.R.T. 测试", - "Add Periodic Snapshot Task": "新增定期快照任务", + "Add Periodic Snapshot Task": "添加定期快照任务", "Add Pool": "新增池", - "Add Portal": "新增门户", + "Add Portal": "添加门户", "Add Privilege": "新增权限", - "Add Replication Task": "新增复制任务", - "Add Reporting Exporter": "新增报告导出器", - "Add Rsync Task": "新增 Rsync 任务", - "Add S.M.A.R.T. Test": "新增 S.M.A.R.T. 硬盘测试", - "Add SMB": "新增 SMB 共享", + "Add Replication Task": "添加复制任务", + "Add Reporting Exporter": "添加报告导出器", + "Add Rsync Task": "添加 Rsync 任务", + "Add S.M.A.R.T. Test": "添加 S.M.A.R.T. 硬盘测试", + "Add SMB": "添加 SMB 共享", "Add SMB Share": "新增 SMB 共享", "Add SPN": "新增 SPN", "Add SSH Connection": "新增 SSH 连接", "Add SSH Keypair": "新增 SSH 密钥对", - "Add Scrub Task": "新增数据巡检任务", + "Add Scrub Task": "添加数据清理任务", "Add Share": "新建共享", "Add Smart Test": "新增 S.M.A.R.T. 测试", - "Add Snapshot": "新增快照", + "Add Snapshot": "添加快照", "Add Snapshot Task": "新增快照任务", - "Add Static Route": "新增静态路由", - "Add Sysctl": "新增 Sysctl", - "Add To Pool": "新增到池", - "Add To Trusted Store": "新增到信任库", + "Add Static Route": "添加静态路由", + "Add Sysctl": "添加 Sysctl", + "Add To Pool": "添加到池", + "Add To Trusted Store": "添加到信任库", "Add TrueCloud Backup Task": "新增 TrueCloud 备份任务", "Add Tunable": "新增可调参数", - "Add User": "新增用户", - "Add User Quotas": "新增用户配额", - "Add VDEV": "新增 VDEV", + "Add User": "添加用户", + "Add User Quotas": "添加用户配额", + "Add VDEV": "添加 VDEV", "Add VM": "新增虚拟机", - "Add VM Snapshot": "新增 VM 快照", - "Add Vdevs to Pool": "向池中新增 Vdevs", + "Add VM Snapshot": "添加 VM 快照", + "Add Vdevs to Pool": "向池中添加 Vdevs", "Add Virtual Machine": "新增虚拟机", "Add Volume": "新增卷", "Add Widget": "新增小部件", - "Add Zvol": "新增 Zvol", - "Add a new bucket to your Storj account.": "将新存储桶新增到您的 Storj 帐户。", - "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "新增更多 sshd_config(5) 未在此处显示的选项。每行输入一个选项。选项是大小写敏感的。错误的拼写可能导致 SSH 服务无法启动。", + "Add Zvol": "添加 Zvol", + "Add a new bucket to your Storj account.": "将新存储桶添加到您的 Storj 帐户。", + "Add any more sshd_config(5) options not covered in this screen. Enter one option per line. These options are case-sensitive. Misspellings can prevent the SSH service from starting.": "添加更多 sshd_config(5) 未在此处显示的选项。每行输入一个选项。选项是大小写敏感的。错误的拼写可能导致 SSH 服务无法启动。", "Add any notes about this zvol.": "输入这个 zvol 的备注。", - "Add bucket": "新增存储桶", + "Add bucket": "添加存储桶", "Add catalog to system even if some trains are unhealthy.": "即使某些分支不健康,也将目录添加到系统中。", - "Add entry": "新增条目", - "Add groups": "新增组", + "Add entry": "添加条目", + "Add groups": "添加组", "Add iSCSI": "新增 iSCSI 共享", - "Add listen": "新增监听", + "Add listen": "添加监听", "Add new": "新增", "Add the required no. of disks to get a vdev size estimate": "新增所需数量的磁盘以获取 vdev 大小估算", "Add this user to additional groups.": "将此用户添加到其他组。", - "Add to trusted store": "添加到可信存储区", - "Add user linked API Key": "新增用户 API Key", "Add {item}": "新增 {item}", - "Added disks are erased, then the pool is extended onto the new disks with the chosen topology. Existing data on the pool is kept intact.": "擦除添加的磁盘,然后将池扩展到具有所选拓扑的新磁盘上。池中的现有数据保持不变。", + "Added disks are erased, then the pool is extended onto the new disks with the chosen topology. Existing data on the pool is kept intact.": "删除添加的磁盘,然后将池扩展到具有所选拓扑的新磁盘上。池中的现有数据保持不变。", "Adding data VDEVs of different types is not supported.": "不支持添加不同类型的数据 VDEVs", - "Adding, removing, or changing hardware components.": "添加、移除或更改硬件组件。", "Additional rsync(1) options to include. Separate entries by pressing Enter.
Note: The \"*\" character must be escaped with a backslash (\\*.txt) or used inside single quotes ('*.txt').": "要包含的附加rsync(1)选项。通过按 Enter 分隔条目。
注意: \"*\"字符必须以反斜杠 (\\\\*.txt) 进行转义,或在单引号 ('*.txt') 内使用。", "Additional smartctl(8) options.": "附加的smartctl(8)参数。", "Additional Domains": "附加域", @@ -330,7 +449,7 @@ "Additional Kerberos application settings. See the \"appdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "更多 Kerberos 应用设置。请参阅 \"appdefaults\" section of [krb.conf(5)]. 以获取可用设置和用法语法。", "Additional Kerberos library settings. See the \"libdefaults\" section of [krb.conf(5)]. for available settings and usage syntax.": "更多 Kerberos 库设置。请参阅 \"libdefaults\" section of [krb.conf(5)]. 以获取可用设置和用法语法。", "Additional Parameters String": "附加参数字符串", - "Additional domains to search. Separate entries by pressing Enter. Adding search domains can cause slow DNS lookups.": "要搜索的其他域。通过按 Enter 分隔条目。增加搜索域可能会导致 DNS 查找速度变慢。", + "Additional domains to search. Separate entries by pressing Enter. Adding search domains can cause slow DNS lookups.": "要搜索的其他域。通过按 Enter 分隔条目。添加搜索域可能会导致 DNS 查找速度变慢。", "Additional hosts to be appended to /etc/hosts. Separate entries by pressing Enter. Hosts defined here are still accessible by name even when DNS is not available. See hosts(5) for additional information.": "在 /etc/hosts中添加更多主机。按下 Enter 以分隔条目. 此处定义的主机在 DNS 失效的情况下仍可用名称访问。参阅 hosts(5) 以获取更多信息", "Additional options for nslcd.conf.": "附加选项 nslcd.conf。", "Address": "地址", @@ -338,7 +457,7 @@ "Address Pools": "地址池", "Adjust Resilver Priority": "调整一致性重建优先级", "Adjust Scrub Priority": "调整巡检优先级", - "Adjust Scrub/Resilver Priority": "调整数据巡检/一致性重建优先级", + "Adjust Scrub/Resilver Priority": "调整数据清理/重新同步优先级", "Adjust how often alert notifications are sent, use the Frequency drop-down. Setting the Frequency to NEVER prevents that alert from being added to alert notifications, but the alert can still show in the web interface if it is triggered.": "调整发送警报通知的频率,使用频率下拉列表。将频率设置为 NEVER 可防止将该警报添加到警报通知中,但如果触发该警报,该警报仍可显示在 Web 界面中。", "Admin Password": "管理员密码", "Admin Server": "管理服务器", @@ -373,7 +492,6 @@ "Aliases must be 15 characters or less.": "别名不得超过 15 个字符。", "All": "全部", "All Disks": "所有磁盘", - "All Users": "所有用户", "All data on that pool was destroyed.": "所有在此存储池上的数据将被摧毁。", "All disks healthy.": "所有磁盘状态正常。", "All pools are online.": "所有存储池在线", @@ -433,7 +551,7 @@ "Allowed sudo commands with no password": "允许使用 sudo 命令 (无密码鉴权)", "Allows multiple NTFS data streams. Disabling this option causes MacOS to write streams to files on the filesystem.": "允许多个 NTFS 数据流。禁用此选项会使 MacOS 将流写入文件系统上的文件。", "Allows sudo commands": "允许使用 sudo 命令", - "Alphanumeric Backblaze B2 Application Key ID. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the application keyID string to this field.": "字母数字的 Backblaze B2 应用程序密钥 ID。要生成新的应用程序密钥,请登录 Backblaze 帐户,进入 App Keys 页面,然后创建一个新的应用程序密钥。将应用程序 keyID 字符串复制到此字段。", + "Alphanumeric Backblaze B2 Application Key ID. To generate a new application key, log in to the Backblaze account, go to the App Keys page, and add a new application key. Copy the application keyID string to this field.": "字母数字的 Backblaze B2 应用程序密钥 ID。要生成新的应用程序密钥,请登录 Backblaze 帐户,进入 App Keys 页面,然后添加一个新的应用程序密钥。将应用程序 keyID 字符串复制到此字段。", "Also Include Naming Schema": "还包括命名方案", "Also include snapshots with the name": "还包括带有名称的快照", "Alternative names that SMB clients can use when connecting to this NAS. Can be no greater than 15 characters.": "SMB 客户端连接到此 NAS 时可以使用的备用名称。不得超过 15 个字符。", @@ -450,7 +568,6 @@ "An enclosure must be selected when 'Limit Pool to a Single Enclosure' is enabled.": "当启用“限制池到单个机箱”时,必须选择一个机箱。", "An error occurred while sending the review. Please try again later.": "在发送评论时发生错误,请稍后再试。", "An instance of this app already installed. Click the badge to see installed apps.": "该应用的一个实例已经安装。点击徽章查看已安装的应用。", - "An update is already applied. Please restart the system.": "更新已应用。请重新启动系统。", "Anonymous User Download Bandwidth": "匿名用户下载带宽", "Anonymous User Upload Bandwidth": "匿名用户上传带宽", "Any notes about initiators.": "关于启动器的任何注释。", @@ -499,8 +616,6 @@ "Apply permissions to child datasets": "将权限应用于子数据集", "Apply the same quota critical alert settings as the parent dataset.": "应用与父数据集相同的配额严重警报设置。", "Apply the same quota warning alert settings as the parent dataset.": "应用与父数据集相同的配额警告设置。", - "Apply updates and restart system after downloading.": "下载后应用更新并重启系统。", - "Applying important system or security updates.": "应用重要的系统或安全更新。", "Apps": "应用", "Apps Read": "应用程序读取", "Apps Service Not Configured": "应用程序服务未配置", @@ -601,10 +716,8 @@ "Automated Disk Selection": "自动选择磁盘", "Automatic update check failed. Please check system network settings.": "自动更新检查失败。请检查系统网络设置。", "Automatically populated with the original hostname of the system. This name is limited to 15 characters and cannot be the Workgroup name.": "使用系统的原始主机名自动填充。此名称限制为 15 个字符,不能以 Workgroup 为名称。", - "Automatically restart the system after the update is applied.": "在应用更新后自动重启系统。", "Automatically sets number of threads used by the kernel NFS server.": "自动设置内核 NFS 服务器使用的线程数。", "Automatically stop the script or command after the specified seconds.": "在指定的秒数后自动停止脚本或命令。", - "Autostart": "自动启动", "Auxiliary Arguments": "附加参数", "Auxiliary Groups": "附加组", "Auxiliary Parameters": "附加参数", @@ -637,7 +750,6 @@ "Bandwidth Limit": "带宽限制", "Base": "基础", "Base DN": "基本 DN", - "Base Image": "基础镜像", "Base Name": "基本名称", "Base64 encoded key for the Azure account.": "Azure 帐户的 Base64 编码密钥。", "Basic": "基本", @@ -679,7 +791,6 @@ "Bridge Settings": "桥接设置", "Bridge interface": "桥接接口", "Browsable to Network Clients": "允许网络客户端浏览", - "Browse": "浏览", "Browse to a CD-ROM file present on the system storage.": "浏览系统存储中存在的 CD-ROM 文件。", "Browse to a storage location and add the name of the new raw file on the end of the path.": "浏览存储位置,并在路径末尾添加新原始文件的名称。", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "浏览到现有文件。通过浏览数据集并在路径后追加 /(文件名.扩展名) 来创建新文件。", @@ -703,7 +814,7 @@ "Burst": "突发", "By clicking the share creation checkbox below, a new share will be created on form submission with the default share settings Additionally, local TrueNAS users will have access to the resulting share and some more configuration options will be available.": "通过单击下面的共享创建复选框,将在提交表单时使用默认共享设置创建一个新共享。此外,本地 TrueNAS 用户将有权访问生成的共享,并且将提供更多配置选项。", "By default, Samba uses a hashing algorithm for NTFS illegal characters. Enabling this option translates NTFS illegal characters to the Unicode private range.": "默认情况下,Samba 对 NTFS 非法字符使用哈希算法。启用此选项会将 NTFS 非法字符转换为 Unicode 私有范围。", - "By default, the VM receives an auto-generated random MAC address. Enter a custom address into the field to override the default. Click Generate MAC Address to add a new randomized address into this field.": "在默认情况下,虚拟机将会获得一个自动生成的随机 MAC 地址。输入一个自定义的地址来覆盖默认地址。点击生成 MAC 地址新增一个随机 MAC 地址。", + "By default, the VM receives an auto-generated random MAC address. Enter a custom address into the field to override the default. Click Generate MAC Address to add a new randomized address into this field.": "在默认情况下,虚拟机将会获得一个自动生成的随机 MAC 地址。输入一个自定义的地址来覆盖默认地址。点击生成 MAC 地址添加一个随机 MAC 地址到这个区域。", "By snapshot creation time": "按快照创建时间", "CA": "认证机构", "CC": "CC", @@ -715,7 +826,6 @@ "CONVEYANCE": "运输", "COPY": "复制", "CPU": "处理器", - "CPU & Memory": "CPU与内存", "CPU And Memory": "CPU 和内存", "CPU Configuration": "CPU 配置", "CPU Mode": "CPU 模式", @@ -733,8 +843,8 @@ "CRL Sign": "CRL 签名", "CSR": "证书签名请求 CSR", "CSR deleted": "CSR 已删除", - "CSR exists on this system": "这个 CSR 已存在此系统上", - "CSRs": "CSR", + "CSR exists on this system": "此系统上存在 CSR", + "CSRs": "CSRs", "Cache": "缓存", "Cache VDEVs": "缓存 VDEV", "Caches": "缓存", @@ -745,10 +855,9 @@ "Can not retrieve response": "无法检索到响应", "Cancel": "取消", "Cancel any pending Key synchronization.": "取消任何挂起的密钥同步。", - "Canceled Resilver on {date}": "{date}取消了一致性重建", - "Canceled Scrub on {date}": "{date}取消了数据巡检", + "Canceled Resilver on {date}": "{date}取消了重新同步", + "Canceled Scrub on {date}": "{date}取消了数据清理", "Cannot Edit while HA is Enabled": "启用 HA 时无法编辑", - "Cannot be enabled for built-in users.": "无法为内置用户启用。", "Cannot edit while HA is enabled.": "启用 HA 时无法编辑", "Capabilities": "能力", "Capacity": "容量", @@ -797,7 +906,7 @@ "Changing global 2FA settings might cause user secrets to reset. Which means users will have to reconfigure their 2FA. Are you sure you want to continue?": "更改全局双因素认证设置可能会导致用户密钥重置。这意味着用户必须重新配置其双因素认证。您确定要继续吗?", "Changing to a nightly train is one-way. Changing back to a stable train is not supported! ": "更改为 nightly 分支是单向的。不支持更改回稳定的分支!", "Channel": "向导", - "Channel {n}": "频道 {n}", + "Channel {n}": "频道{n}", "Check": "检查", "Check Alerts for more details.": "查看警报以获取更多详细信息。", "Check App Details": "检查应用程序详情", @@ -837,7 +946,7 @@ "Choose a new disk for the pool. To protect any existing data, adding the selected disk is stopped when the disk is already in use or has partitions present.": "为池选择一个新磁盘。为了保护任何现有数据,当磁盘已在使用中或存在分区时,将停止添加所选磁盘。", "Choose a path to the user's home directory. If the directory exists and matches the username, it is set as the user's home directory. When the path does not end with a subdirectory matching the username, a new subdirectory is created only if the 'Create Home Directory' field is marked checked. The full path to the user's home directory is shown here when editing a user.": "选择用户主目录的路径。如果该目录存在并且与用户名匹配,则将其设置为用户的主目录。当路径不以与用户名匹配的子目录结尾时,仅当「创建主目录」字段被标记为选中时才会创建新的子目录。编辑用户时,此处显示用户主目录的完整路径。", "Choose a pool for Apps": "选择应用程序池", - "Choose a pool to scrub.": "选择要运行数据巡检的池。", + "Choose a pool to scrub.": "选择要运行数据清理的池。", "Choose a privacy protocol.": "选择隐私协议。", "Choose a recent IP address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "选择一个最新的 IP 地址以限制访问管理 GUI 时的使用。内置的 HTTP 服务器绑定到 0.0.0.0 的通配符地址(任何地址),并在指定的地址不可用时发出警报。", "Choose a recent IPv6 address to limit the usage when accessing the administrative GUI. The built-in HTTP server binds to the wildcard address of 0.0.0.0 (any address) and issues an alert if the specified address becomes unavailable.": "选择一个最新的 IPv6 地址以限制访问管理 GUI 时的使用。内置的 HTTP 服务器绑定到 0.0.0.0 的通配符地址(任何地址),并在指定的地址不可用时发出警报。", @@ -859,13 +968,13 @@ "Choose pod": "选择 pod", "Choose the VM operating system type.": "选择虚拟机操作系统类型。", "Choose the backend to map Windows security identifiers (SIDs) to UNIX UIDs and GIDs. Click Edit to configure that backend.": "选择后端以将 Windows 安全标识符(SID)映射到 UNIX UID 和 GID。单击「编辑」以配置该后端。", - "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "选择不允许启动新的重新同步任务的小时和分钟。这不会影响活动的一致性重建任务。", - "Choose the hour and minute when resilver tasks can be started.": "选择可以启动一致性重建任务时的小时和分钟。", + "Choose the hour and minute when new resilver tasks are not allowed to start. This does not affect active resilver tasks.": "选择不允许启动新的重新同步任务的小时和分钟。这不会影响活动的重新同步任务。", + "Choose the hour and minute when resilver tasks can be started.": "选择可以启动重新同步任务时的小时和分钟。", "Choose the platform that will use this share. The associated options are applied to this share.": "选择将使用此共享的平台。关联的选项将应用于此共享。", "Choose the schema to use when querying AD for user/group info. rfc2307 uses the schema support included in Windows 2003 R2, sfu is for Service For Unix 3.0 or 3.5, and sfu20 is for Service For Unix 2.0.": "选择查询用户/组信息的 AD 时要使用的架构。rfc2307使用 Windows 2003 R2 中包含的架构支持,sfu 用于 Unix 3.0 或 3.5 的服务,sfu20 用于 Unix 2.0 服务。", "Choose the schema to use with LDAP authentication for SMB shares. The LDAP server must be configured with Samba attributes to use a Samba Schema. Options include RFC2307 (included in Windows 2003 R2) and Service for Unix (SFU). For SFU 3.0 or 3.5, choose \"SFU\". For SFU 2.0, choose \"SFU20\".": "选择用于 SMB 共享的 LDAP 身份验证的架构。LDAP 服务器必须配置有 Samba 属性才能使用 Samba 模式。选项包括 RFC2307 (包含在 Windows 2003 R2 中)和 Unix 服务(SFU)。对于 SFU 3.0 或 3.5,选择\"SFU\"。对于 SFU 2.0,选择 \"SFU20\"。", "Choose the speed in bps used by the serial port.": "选择串行端口使用的速度(以 bps 为单位)。", - "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "选择测试类型。请参阅smartctl(8)中有关每种类型的说明。一些类型会降低性能或使磁盘下线。避免 S.M.A.R.T. 测试和数据巡检或一致性重建任务同时运行", + "Choose the test type. See smartctl(8) for descriptions of each type. Some types will degrade performance or take disks offline. Avoid scheduling S.M.A.R.T. tests simultaneously with scrub or resilver operations.": "选择测试类型。请参阅smartctl(8)中有关每种类型的说明。一些类型会降低性能或使磁盘下线。避免 S.M.A.R.T. 测试和数据清理或重新同步任务同时运行", "Choose the type of interface. Bridge creates a logical link between multiple networks. Link Aggregation combines multiple network connections into a single interface. A Virtual LAN (VLAN) partitions and isolates a segment of the connection. Read-only when editing an interface.": "选择接口类型。网桥在多个网络之间创建逻辑链接。链路聚合将多个网络连接合并到一个接口中。虚拟 LAN(VLAN)分开并隔离连接段。编辑界面时为只读。", "Choose the type of permissions. Basic shows general permissions. Advanced shows each specific type of permission for finer control.": "选择权限类型。基础显示常规权限。高级显示每种特定类型的权限,以进行更精细的控制。", "Choose the type that matches the type of client accessing the pool/dataset.": "选择与访问池/数据集的客户端类型相匹配的类型。", @@ -898,7 +1007,6 @@ "Close": "关闭", "Close Feedback Dialog": "关闭反馈对话框", "Close Inspect VDEVs Dialog": "关闭检查 VDEVs 对话框", - "Close Instance Form": "关闭实例表单", "Close panel": "关闭面板", "Close scheduler": "关闭调度器", "Close the form": "关闭表单", @@ -918,8 +1026,6 @@ "Cloud Sync Tasks": "云同步任务", "Cloud Sync Write": "云端同步写入", "Cloud Sync to Storj or similar provider": "云同步到Storj或类似的服务提供商", - "Cloud Sync «{name}» has been deleted.": "云同步 «{name}» 已被删除。", - "Cloud Sync «{name}» has been restored.": "云同步 «{name}» 已被恢复。", "Cloud Sync «{name}» has started.": "云同步 «{name}» 已开始。", "Cloud Sync «{name}» stopped.": "云同步 «{name}» 已停止。", "Cloud credential added.": "添加了云凭证。", @@ -1021,17 +1127,14 @@ "Container Shell": "容器 Shell", "Container Write": "容器写入", "Containers": "容器", - "Containers (WIP)": "容器(进行中)", "Content Commitment": "内容承诺", "Contents of the uploaded Service Account JSON file.": "已上传的服务帐户 JSON 文件的内容。", "Context menu copy and paste operations are disabled in the Shell. Copy and paste shortcuts for Mac are Command+c and Command+v. For most operating systems, use Ctrl+Insert to copy and Shift+Insert to paste.": "命令行管理程序中禁用了上下文菜单复制和粘贴操作。Mac 的复制和粘贴快捷键是Command+cCommand+v。对于大多数操作系统,请使用Ctrl+Insert复制和Shift+Insert粘贴。", "Continue": "继续", - "Continue in background": "在后台继续执行", "Continue with download?": "继续下载吗?", "Continue with the upgrade": "继续升级", "Contract Type": "合同类型", "Control": "控制", - "Controller": "控制器", "Controller Type": "控制器类型", "Controls": "控件", "Controls whether SMART monitoring and scheduled SMART tests are enabled.": "控制是否启用 SMART 监控和计划的 SMART 测试。", @@ -1054,7 +1157,6 @@ "Create ACME DNS-Authenticator": "创建 ACME DNS 验证器", "Create Alert": "创建警报", "Create Backup Credential": "创建备份凭据", - "Create Boot Environment": "创建启动环境", "Create CSR": "创建 CSR", "Create Certificate": "创建证书", "Create Certificate Authority": "创建证书授权机构", @@ -1072,7 +1174,6 @@ "Create Home Directory": "创建用户主目录", "Create Idmap": "创建 Idmap", "Create Init/Shutdown Script": "创建初始化/关闭脚本", - "Create Instance": "创建实例", "Create Interface": "创建接口", "Create Kerberos Keytab": "创建 Kerberos 密钥表", "Create Kerberos Realm": "创建 Kerberos 领域", @@ -1081,7 +1182,6 @@ "Create NFS Share": "创建 NFS 共享", "Create NTP Server": "创建NTP服务器", "Create New": "新建", - "Create New Instance": "创建新实例", "Create New Primary Group": "创建新的主要组", "Create Periodic S.M.A.R.T. Test": "创建定期 S.M.A.R.T. 测试", "Create Periodic Snapshot Task": "创建定期快照任务", @@ -1120,7 +1220,6 @@ "Create pool": "创建池", "Created": "创建", "Created by: {creationSource} ({creationType})": "创建者: {creationSource} ({creationType})", - "Created date": "创建日期", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "即使最后一个快照的数据集没有更改,也可以创建数据集快照。建议用于创建长期还原点,将多个快照任务指向相同的数据集,或者与在 TrueNAS 11.2 和更早版本中创建的快照计划或复制兼容。

例如,允许每月快照计划使用空快照,即使每月快照任务已经为数据集的任何更改创建了快照,也可以进行每月创建快照。", "Creating ACME Certificate": "创建 ACME 证书", "Creating custom app": "创建自定义应用程序", @@ -1128,7 +1227,6 @@ "Creation Time": "创建时间", "Credential": "凭据", "Credentials": "用户凭证", - "Credentials have been successfully added.": "凭据已成功添加。", "Credentials: {credentials}": "凭据:{credentials}", "Critical": "危急", "Critical Extension": "关键扩展", @@ -1155,7 +1253,6 @@ "Custom App via YAML": "通过YAML自定义应用程序", "Custom Config": "自定义配置", "Custom Name": "自定义名称", - "Custom Reason": "自定义原因", "Custom Transfers": "自定义传输", "Custom Value": "自定义值", "Custom app config in YAML format.": "自定义应用程序配置采用YAML格式。", @@ -1209,7 +1306,6 @@ "Dataset ZFS Encryption": "数据集 ZFS 加密", "Dataset for use by an application. If you plan to deploy container applications, the system automatically creates the ix-apps dataset but this is not used for application data storage.": "供应用程序使用的数据集。如果您计划部署容器应用程序,系统会自动创建 ix-apps 数据集,但这不用于应用程序数据存储。", "Dataset has no mountpoint": "数据集没有挂载点", - "Dataset is locked": "数据集已锁定", "Dataset is shared via NFS": "数据集通过 NFS 共享。", "Dataset is shared via SMB": "数据集通过 SMB 共享。", "Dataset is shared via SMB as {shares}": "数据集通过 SMB 共享为 {shares}。", @@ -1229,7 +1325,7 @@ "Date created": "创建日期", "Day(s)": "天", "Days": "天数", - "Days before a completed scrub is allowed to run again. This controls the task schedule. For example, scheduling a scrub to run daily and setting Threshold days to 7 means the scrub attempts to run daily. When the scrub is successful, it continues to check daily but does not run again until seven days have elapsed. Using a multiple of seven ensures the scrub always occurs on the same weekday.": "完成数据巡检的前几天允许再次运行。这可以控制任务计划。例如,安排每天运行一次数据清理并将阈值天设置为 7 表示每天尝试运行数据清理。数据清理成功后,它将继续每天检查一次,直到 7 天后才再次运行。使用 7 的倍数可确保数据清理总是在同一工作日进行。", + "Days before a completed scrub is allowed to run again. This controls the task schedule. For example, scheduling a scrub to run daily and setting Threshold days to 7 means the scrub attempts to run daily. When the scrub is successful, it continues to check daily but does not run again until seven days have elapsed. Using a multiple of seven ensures the scrub always occurs on the same weekday.": "完成数据清理的前几天允许再次运行。这可以控制任务计划。例如,安排每天运行一次数据清理并将阈值天设置为 7 表示每天尝试运行数据清理。数据清理成功后,它将继续每天检查一次,直到 7 天后才再次运行。使用 7 的倍数可确保数据清理总是在同一工作日进行。", "Days of Month": "月的天数", "Days of Week": "星期几", "Days of the Week": "星期几", @@ -1301,7 +1397,7 @@ "Delete SSH Connection": "删除 SSH 连接", "Delete SSH Keypair": "删除 SSH 密钥对", "Delete Script": "删除脚本", - "Delete Scrub Task \"{name}\"?": "删除数据巡检任务 \"{name}\" 吗?", + "Delete Scrub Task \"{name}\"?": "删除清理任务 \"{name}\" 吗?", "Delete Snapshot": "删除快照", "Delete Static Route": "删除静态路由", "Delete Sysctl": "删除 Sysctl", @@ -1337,7 +1433,7 @@ "Deregister": "注销", "Deregister TrueCommand Cloud Service": "注销 TrueCommand 云服务", "Describe the UPS device. It can contain alphanumeric, period, comma, hyphen, and underscore characters.": "描述 UPS 设备。它可以包含字母数字,句点,逗号,连字符和下划线。", - "Describe the scrub task.": "描述这个数据巡检任务。", + "Describe the scrub task.": "描述这个数据清理任务。", "Describe this service.": "描述这个服务。", "Description": "描述", "Description (optional).": "描述(可选)。", @@ -1374,8 +1470,6 @@ "Device names of each disk being edited.": "正在编辑的每个磁盘的设备名称。", "Device removed": "设备已移除", "Device updated": "设备已更新", - "Device «{disk}» has been detached.": "设备 «{disk}» 已被卸载。", - "Device «{name}» was successfully attached.": "设备 «{name}» 已成功连接。", "Device/File": "设备/文件", "Devices": "设备", "Difference": "差异", @@ -1556,7 +1650,7 @@ "Edit S.M.A.R.T. Test": "编辑 S.M.A.R.T. 测试", "Edit SMB": "编辑 SMB", "Edit SSH Connection": "编辑 SSH 连接", - "Edit Scrub Task": "数据巡检任务", + "Edit Scrub Task": "数据清理任务", "Edit Share ACL": "编辑共享 ACL", "Edit Static Route": "编辑静态路由", "Edit Sysctl": "编辑 Sysctl", @@ -1604,7 +1698,6 @@ "Enable Hyper-V Enlightenments": "启用 Hyper-V Enlightenments", "Enable Kernel Debug": "启用内核调试", "Enable Learning": "启用学习", - "Enable NFS over RDMA": "启用基于 RDMA 的 NFS", "Enable S.M.A.R.T.": "启用 S.M.A.R.T.", "Enable SMB1 support": "启用 SMB1 支持", "Enable SMB2/3 Durable Handles": "启用 SMB2/3 Durable Handles", @@ -1732,7 +1825,6 @@ "Enter an alphanumeric encryption key. Only available when Passphrase is the chosen key format.": "输入字母数字加密密钥。仅当密码是所选的密钥格式时才可用。", "Enter an alphanumeric name for the certificate. Underscore (_), and dash (-) characters are allowed.": "输入证书的字母数字名称。允许使用下划线(_)和破折号(-)。", "Enter an alphanumeric name for the virtual machine.": "输入虚拟机的字母数字名称。", - "Enter an email address to override the admin account’s default email. If left blank, the admin account’s email address will be used": "输入一个电子邮件地址以覆盖管理员帐户的默认电子邮件。如果留空,将使用管理员帐户的电子邮件地址。", "Enter an optimal number of threads used by the kernel NFS server.": "输入内核 NFS 服务器使用的线程数", "Enter any additional snmpd.conf(5) options. Add one option for each line.": "输入任何snmpd.conf(5) 附加选项。为每行添加一个选项。", "Enter any aliases, separated by spaces. Each alias can be up to 15 characters long.": "输入别名,以空格分隔。每个别名最多可以包含 15 个字符。", @@ -1857,7 +1949,6 @@ "Expand pool to fit all available disk space.": "扩展池以适合所有可用的磁盘空间。", "Expander Status": "扩展器状态", "Expiration Date": "到期日期", - "Expires date": "到期日期", "Export": "导出", "Export All Keys": "导出所有密钥", "Export As {fileType}": "导出为 {fileType}", @@ -1948,8 +2039,8 @@ "Finding Pools": "查找池", "Finding pools to import...": "正在查找要导入的池...", "Finished": "已完成", - "Finished Resilver on {date}": "{date}完成一致性重建", - "Finished Scrub on {date}": "{date}完成数据巡检", + "Finished Resilver on {date}": "{date}完成重新同步", + "Finished Scrub on {date}": "{date}完成数据清理", "First Page": "第一页", "Fix Credential": "修复凭证", "Flags": "标记", @@ -2030,18 +2121,15 @@ "Gives control of how much of the new device is made available to ZFS. Set to use the entire capacity of the new device.": "控制可以向 ZFS 提供多少新设备。设置为使用新设备的全部容量。", "Global 2FA": "全局双因素认证", "Global 2FA Enable": "全局两因素认证启用", - "Global Config": "全局配置", "Global Configuration": "全局配置", "Global Configuration Settings": "全局配置设置", "Global SED Password": "全局 SED 密码", - "Global Settings": "全局设置", "Global Two Factor Authentication": "全局双因素认证", "Global Two Factor Authentication Settings": "全局双因素认证设置", "Global password to unlock SEDs.": "用于解锁 SED 的全局密码。", "Gmail": "Gmail", "Gmail credentials have been applied.": "Gmail 凭据已应用。", "Go Back": "返回", - "Go To Dataset": "转到数据集", "Go To Encryption Root": "转到加密根目录", "Go To Network Settings": "前往网络设置", "Go back to the previous form": "回到上一个表单", @@ -2062,7 +2150,6 @@ "Group Execute": "群组执行", "Group ID": "群组 ID", "Group ID created in Authorized Access. Required when the Discovery Authentication Method is set to CHAP or Mutual CHAP.": "在授权访问中创建的组 ID。将「发现身份验证方法」设置为 CHAP 或「相互 CHAP」时需要。", - "Group Members": "组成员", "Group Obj": "组对象", "Group Object Quota": "组对象配额", "Group Quota Manager": "组配额管理器", @@ -2104,7 +2191,6 @@ "HTTPS Protocols": "HTTPS 协议", "HTTPS Redirect": "HTTPS 重定向", "Hardware": "硬件", - "Hardware Change": "硬件更改", "Hardware Disk Encryption": "硬件磁盘加密", "Has Allow List": "拥有允许列表", "Healthy": "健康", @@ -2123,7 +2209,6 @@ "Hide from MSR": "从 MSR 隐藏", "Hide standard output (stdout) from the command. When unset, any standard output is mailed to the user account cron used to run the command.": "隐藏命令中的标准输出(stdout)。取消设置后,所有标准输出都会邮寄到用于运行命令的用户帐户 cron。", "High Bandwidth (16)": "高带宽(16)", - "High usage necessitating a system reset.": "系统过载需要重启系统。", "Highest Temperature": "最高温度", "Highest Usage": "最高使用率", "Highest port number of the active side listen address that is open to connections. The first available port between the minimum and maximum is used.": "对连接开放的活动侧侦听地址的最高端口号。使用最小和最大之间的第一个可用端口。", @@ -2163,7 +2248,7 @@ "Hosts Allow": "允许主机", "Hosts Deny": "禁止主机", "Hot Spare": "热备", - "Hottest": "最高温度", + "Hottest": "最热", "Hour and minute the system must stop creating snapshots. Snapshots already in progress will continue until complete.": "小时和分钟,系统必须在这个时间内停止创建快照。已经进行的快照将继续,直到完成。", "Hour and minute when the system can begin taking snapshots.": "小时和分钟,系统可以开始创建快照的时间。", "Hour(s)": "小时", @@ -2172,7 +2257,7 @@ "Hours/Days": "小时/天", "How long a snapshot remains on the destination system. Enter a number and choose a measure of time from the drop-down.": "快照在目标系统上保留多长时间。输入一个数字,然后从下拉菜单中选择一个时间度量。", "How many non-self-issued intermediate certificates that can follow this certificate in a valid certification path. Entering 0 allows a single additional certificate to follow in the certificate path. Cannot be less than 0.": "在有效的认证路径中可以遵循此证书的非自颁发的中间证书数。输入 0 允许在证书路径中遵循单个附加证书。不能小于 0。", - "How often to run the scrub task. Choose one of the presets or choose Custom to use the advanced scheduler.": "多久运行一次数据巡检任务。选择一种预设,或选择自定义以使用高级计划程序。", + "How often to run the scrub task. Choose one of the presets or choose Custom to use the advanced scheduler.": "多久运行一次数据清理任务。选择一种预设,或选择自定义以使用高级计划程序。", "How permissions are applied to the share. Allowed denies all permissions by default except those that are manually defined. Denied allows all permissions by default except those that are manually defined.": "如何将权限应用于共享。默认情况下,允许拒绝所有权限,但手动定义的权限除外。默认情况下,拒绝允许所有权限,但手动定义的权限除外。", "How the Permissions are applied to the chosen Who. Choose Allow to grant the specified permissions and Deny to restrict the specified permissions.": "权限如何应用于所选的谁。选择允许授予指定的权限,选择拒绝限制指定的权限。", "How the dataset is secured. Choose between securing with an encryption Key or a user-defined Passphrase. Creating a new key file invalidates any previously downloaded key file for this dataset. Delete any previous key file backups and back up the new key file.": "如何保护数据集。在使用加密密钥或用户定义的密码进行保护之间进行选择。创建新的密钥文件会使之前为该数据集下载的任何密钥文件失效。删除任何以前的密钥文件备份并备份新的密钥文件。", @@ -2206,11 +2291,9 @@ "IPv4 Address": "IPv4 地址", "IPv4 Default Gateway": "IPv4 默认网关", "IPv4 Netmask": "IPv4 子网掩码", - "IPv4 Network": "IPv4 网络", "IPv6": "IPv6", "IPv6 Address": "IPv6 地址", "IPv6 Default Gateway": "IPv6 默认网关", - "IPv6 Network": "IPv6 网络", "ISCSI Associated Target": "iSCSI 关联目标", "ISNS Servers": "ISNS 服务器", "ISO save location": "ISO 保存位置", @@ -2245,11 +2328,9 @@ "If the Hex key type is chosen, an encryption key will be auto-generated.": "如果选择Hex key类型,将自动生成加密密钥。", "If the IPMI out-of-band management interface is on a different VLAN from the management network, enter the IPMI VLAN.": "如果 IPMI 带外管理接口与管理网络位于不同的 VLAN,请输入 IPMI VLAN。", "If the destination system has snapshots but they do not have any data in common with the source snapshots, destroy all destination snapshots and do a full replication. Warning: enabling this option can cause data loss or excessive data transfer if the replication is misconfigured.": "如果目标系统具有快照,但是它们与源快照没有任何共同的数据,请销毁所有目标快照并进行完全复制。警告:如果复制配置错误,启用此选项可能会导致数据丢失或过多的数据传输。", - "If you can't use QR code, use this text code instead": "如果您无法使用二维码,请使用此文本代码。", "If {vmName} is still running, the Guest OS did not respond as expected. It is possible to use Power Off or the Force Stop After Timeout option to stop the VM.": "如果 {vmName} 仍在运行,客机操作系统未按预期响应。可以使用关闭电源超时后强制停止选项来停止虚拟机。", "Ignore Builtin": "忽略内置功能", "Ignore List": "忽略列表", - "Image": "图像", "Image ID": "镜像 ID", "Image Name": "镜像名称", "Image Size": "镜像大小", @@ -2309,9 +2390,7 @@ "Initial Deployment/Setup": "初始部署/设置", "Initial secret authentication key. When an authentication key is not set, no Authentication Protocol is used. If an authentication key is set and an Authentication Protocol is not specified, MD5 is used as the default.
Must be at least 8 and at most 32 octets long.": "初始私密验证密钥。未设置验证密钥时,不使用身份验证协议。如果设置了验证密钥,但未指定验证协议,则默认使用 MD5
至少 8 个字节,最多 32 个字节。", "Initial secret encryption key. If an encryption key is not set, no Encryption Protocol is used. If an encryption key is set and an Encryption Protocol is not specified, DES is used as the default.
Must be at least 8 and at most 32 octets long.": "初始私密加密密钥。如果未设置加密密钥,则不使用加密协议。如果设置了加密密钥,但未指定加密协议,则默认使用 DES
至少为 8 个字节,最多为 32 个字节。", - "Initialized": "已初始化", "Initializing Apps Service": "正在初始化应用服务", - "Initializing...": "初始化中...", "Initiate Failover": "启动故障转移", "Initiator": "启动器", "Initiator Group ID": "启动器组 ID", @@ -2334,8 +2413,6 @@ "Installed Apps": "已安装的应用程序", "Installer image file": "安装程序映像文件", "Installing": "安装中", - "Instance Configuration": "实例配置", - "Instance saved": "实例已保存", "Integrate Snapshots with VMware": "VMware 集成快照", "Interface": "网口", "Interface Settings": "网口设置", @@ -2350,8 +2427,6 @@ "Internal identifier of the certificate. Only alphanumeric characters, dash (-), and underline (_) are allowed.": "证书的内部标识符。仅允许使用字母数字字符,破折号(-)和下划线(_)。", "Internal identifier of the certificate. Only alphanumeric, \"_\" and \"-\" are allowed.": "证书的内部标识符。仅允许使用字母数字,\"_\" 和 \"-\"。", "Internetwork control": "互联网控制", - "Invalid CPU configuration.": "无效 CPU 配置", - "Invalid Date": "无效日期", "Invalid IP address": "IP 地址无效", "Invalid Pod name": "Pod 名无效", "Invalid cron expression": "无效的 cron 表达式", @@ -2386,7 +2461,7 @@ "Jira": "Jira", "Job": "任务", "Job aborted": "任务已中止", - "Job {job} Completed Successfully": "任务 {job} 已成功完成", + "Job {job} Completed Successfully": "作业 {job} 已成功完成", "Jobs": "任务", "Jobs History": "任务历史", "Jobs in progress": "进行中的任务", @@ -2416,7 +2491,7 @@ "Kernel": "内核", "Kernel Parameters": "内核参数", "Kernel Settings": "内核设置", - "Key": "项目", + "Key": "密钥", "Key Agreement": "密钥协议", "Key Cert Sign": "密钥证书签名", "Key Encipherment": "密钥加密", @@ -2457,7 +2532,6 @@ "LONG": "长", "LUN ID": "LUN ID", "LUN RPM": "LUN RPM", - "Label": "标签", "Lan": "局域网", "Language": "语言", "Languages other than English are provided by the community and may be incomplete. Learn how to contribute.": "除了英语以外的语言由社区提供,可能不完整。了解如何贡献。", @@ -2467,9 +2541,9 @@ "Last Resilver": "最后一致性重建", "Last Run": "最后一次运行", "Last Scan": "最后扫描", - "Last Scan Duration": "上次扫描耗时", + "Last Scan Duration": "上次扫描持续时间", "Last Scan Errors": "上次扫描错误", - "Last Scrub": "最后一次巡检", + "Last Scrub": "最后一次清理", "Last Scrub Date": "上次巡检时间", "Last Scrub Run": "上次巡检", "Last Snapshot": "最后一个快照", @@ -2479,7 +2553,7 @@ "Last {result} Test": "最后 {result} 测试", "Launch Docker Image": "启动 Docker 镜像", "Layout": "布局", - "Leave Domain": "离开域", + "Leave Domain": "离开网域", "Leave Feedback": "留下反馈", "Leave at the default of 512 unless the initiator requires a different block size.": "除非启动器要求不同的块大小,否则请保留默认值 512。", "Leave blank to allow all or enter a list of initiator hostnames. Separate entries by pressing Enter.": "保留空白以允许全部输入或输入启动程序主机名列表。通过按 Enter 分隔条目。", @@ -2490,7 +2564,6 @@ "Legacy": "传统", "Legacy AFP Compatibility": "旧版 AFP 兼容性", "Legacy NetBIOS name server. Advertises the SMB service NetBIOS Name. Can be required for legacy SMB1 clients to discover the server. When advertised, the server appears in Network Neighborhood).": "传统 NetBIOS 名称服务器。通告 SMB 服务的 NetBIOS 名称。传统 SMB1 客户端可以发现服务器。播发时,服务器将显示在网上邻居)。", - "Legacy OS: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "传统操作系统:数据区块大小 512 字节,启用 TPC,无 Xen 兼容模式,SSD 速度", "Legacy feature.

Allows the share to host user home directories. Each user is given a personal home directory when connecting to the share which is not accessible by other users. This allows for a personal, dynamic share. Only one share can be used as the home share.": "传统功能。

允许共享托管用户主目录。每个用户在连接到其他用户无法访问的共享时都会获得一个个人主目录。这允许个人动态共享。只能将一份共享用作家庭共享。", "Legacy feature.

Privileges are the same as the guest account. Guest access is disabled by default in Windows 10 version 1709 and Windows Server version 1903. Additional client-side configuration is required to provide guest access to these clients.

MacOS clients: Attempting to connect as a user that does not exist in TrueNAS does not automatically connect as the guest account. The Connect As: Guest option must be specifically chosen in MacOS to log in as the guest account. See the Apple documentation for more details.": "传统功能。

权限与访客帐户相同。Windows 10 版本 1709 和 Windows Server 版本 1903 默认禁用访客访问。需要额外的客户端配置才能为这些客户端提供访客访问。

MacOS 客户端:尝试以在 TrueNAS 中不存在的用户身份连接并不会自动以访客帐户连接。必须在 MacOS 中明确选择作为连接:访客选项以以访客帐户登录。有关更多详细信息,请参见苹果文档。", "Level": "级别", @@ -2565,7 +2638,6 @@ "Logged In To Jira": "已经登陆 Jira", "Logged In To Provider": "登录至提供商", "Logging Level": "日志级别", - "Logging in...": "登录中...", "Logical Block Size": "逻辑块大小", "Login Attempts": "登录尝试", "Login Banner": "登录横幅", @@ -2596,7 +2668,6 @@ "Machine Time: {machineTime} \n Browser Time: {browserTime}": "机器时间: {machineTime} \n 浏览器时间: {browserTime}", "Mail Server Port": "邮件服务器端口", "Main menu": "主菜单", - "Maintenance Window": "维护窗口", "Major": "主要", "Make Destination Dataset Read-only?": "将目标数据集设为只读?", "Make the currently active TrueNAS controller the default when both TrueNAS controllers are online and HA is enabled. To change the default TrueNAS controller, unset this option on the default TrueNAS controller and allow the system to fail over. This briefly interrupts system services.": "当两个 TrueNAS 控制器都在线并启用 HA 时,将当前活动的 TrueNAS 控制器设为默认值。要更改默认 TrueNAS 控制器,请在默认 TrueNAS 控制器上取消设置此选项并允许系统进行故障转移。这会短暂中断系统服务。", @@ -2719,7 +2790,6 @@ "Mixing disks of different sizes in a vdev is not recommended.": "在 vdev 中混合不同大小的磁盘是不建议的。", "Mode": "模式", "Model": "型号", - "Modern OS: Extent block size 4k, TPC enabled, no Xen compat mode, SSD speed": "现代操作系统:扩展块大小 4k,启用 TPC,无 Xen 兼容模式,SSD 速度", "Modify": "调整", "Module": "模块", "Mon": "周一", @@ -2731,11 +2801,7 @@ "Months": "月数", "More Options": "更多选项", "More info...": "更多信息...", - "Move all items to the left side list": "移动所有项目到左侧列表", - "Move all items to the right side list": "移动所有项目到右侧列表", "Move existing keys from the current key server to a new key server. To switch to a different key server, key synchronization must be Enabled, then enable this setting, update the key server connection configuration, and click SAVE.": "将现有密钥从当前密钥服务器移至新的密钥服务器。要切换到其他密钥服务器,必须先启用密钥同步,然后启用此设置,更新密钥服务器连接配置,然后单击保存。", - "Move selected items to the left side list": "将选定的项目移动到左侧列表", - "Move selected items to the right side list": "将选定的项目移动到右侧列表", "Move widget down": "向下移动小部件", "Move widget up": "向上移动小部件", "Multi-domain support. Enter additional domains to secure. Separate domains by pressing Enter For example, if the primary domain is example.com, entering www.example.com secures both addresses.": "多域支持。输入其他域以确保安全。通过按 Enter 分隔域。例如,如果主域是 example.com,则输入 www.example.com 可以保护两个地址。", @@ -2791,7 +2857,6 @@ "Name of this SSH connection. SSH connection names must be unique.": "此 SSH 连接的名称。SSH 连接名称必须唯一。", "Name of this replication configuration.": "此复制配置的名称。", "Name or Naming Schema must be provided.": "必须提供名称或命名惯例。", - "Name ~ \"admin\"": "名称 ~ \"admin\"", "Nameserver": "域名服务器", "Nameserver (DHCP)": "域名服务器 (DHCP)", "Nameserver 1": "域名服务器 1", @@ -2821,7 +2886,6 @@ "Network Interface Write": "网络接口写入", "Network Reconnection Issue": "网络重连问题", "Network Reports": "网络报告", - "Network Reset": "网络重置", "Network Settings": "网络设置", "Network Stats": "网络统计", "Network Timeout Before Initiating Failover": "启动故障转移之前的网络超时", @@ -2939,7 +3003,6 @@ "No enclosure": "无机箱", "No errors": "没有错误", "No events to display.": "没有可显示的事件。", - "No images found": "未找到图片", "No interfaces configured with Virtual IP.": "未使用虚拟 IP 配置接口。", "No items have been added yet.": "尚未新增任何项目。", "No jobs running.": "没有正在运行的任务。", @@ -2983,7 +3046,6 @@ "Notransfer Timeout": "无传输超时", "Nov": "十一月", "Now": "现在", - "Now/Restart": "当前/下次启动", "Num Pending Deletes": "待删除数量", "Number of VDEVs": "VDEVs 数量", "Number of bytes": "字节数", @@ -3007,7 +3069,6 @@ "OK": "是", "OQ % Used": "已使用对象配额 %", "OQ Used": "使用过的 OQ", - "OS": "操作系统", "OS Version": "操作系统版本", "OTHER": "其他", "Object Quota": "对象配额", @@ -3094,7 +3155,6 @@ "Outbound Network:": "出站网络:", "Outgoing Mail Server": "外发邮件服务器", "Outgoing [{networkInterfaceName}]": "出站 [{networkInterfaceName}]", - "Override Admin Email": "覆盖管理员邮箱", "Overrides default directory creation mask of 0777 which grants directory read, write and execute access for everybody.": "覆盖0777的默认目录创建掩码,该掩码授予每个人对目录的读取,写入和执行访问权限。", "Overrides default file creation mask of 0666 which creates files with read and write access for everybody.": "覆盖0666的默认文件创建掩码,该掩码创建对所有人具有读写访问权限的文件。", "Overview": "概述", @@ -3164,7 +3224,6 @@ "Percentage used of dataset quota at which to generate a warning alert.": "生成警告的数据集配额使用百分比。", "Perform Reverse DNS Lookups": "执行 rDNS 查找", "Performance": "性能", - "Performance Optimization": "性能优化", "Performs authentication from an LDAP server.": "从 LDAP 服务器执行身份验证。", "Periodic S.M.A.R.T. Tests": "定期 S.M.A.R.T. 测试", "Periodic Snapshot Tasks": "定期快照任务", @@ -3174,9 +3233,6 @@ "Permissions Basic": "基础权限", "Permissions Editor": "权限编辑器", "Permissions Type": "权限类型", - "Permissions cannot be modified on a locked dataset.": "在锁定的数据集中无法修改权限。", - "Permissions cannot be modified on a read-only dataset.": "在只读数据集上无法修改权限。", - "Permissions cannot be modified on a root dataset.": "根数据集上的权限无法修改。", "Permissions saved.": "权限已保存。", "Phone": "电话", "Phone Number": "电话号码", @@ -3205,8 +3261,8 @@ "Pool Disks have {alerts} alerts and {smartTests} failed S.M.A.R.T. tests": "池磁盘检测到 {alerts} 告警,以及 {smartTests} S.M.A.R.T. 硬盘检测错误", "Pool Name": "池名称", "Pool Options for {pool}": "{pool} 的池选项", - "Pool Scrub Read": "池数据巡检读取", - "Pool Scrub Write": "池数据巡检写入", + "Pool Scrub Read": "池数据清理读取", + "Pool Scrub Write": "池数据清理写入", "Pool Status": "池状态", "Pool Usage": "池使用情况", "Pool Wizard": "池向导", @@ -3216,14 +3272,12 @@ "Pool has been unset.": "池已取消设置。", "Pool imported successfully.": "池导入成功。", "Pool is not healthy": "池处于不健康的状态(可能有硬盘损坏!)", - "Pool is not selected": "未选择池", "Pool is using more than {maxPct}% of available space": "池已使用的空间已超过了 {maxPct}%", "Pool options for {poolName} successfully saved.": "{poolName} 的池选项已成功保存。", "Pool status is {status}": "池当前状态为 {status}", "Pool updated successfully": "池已成功的更新", "Pool {name} is {status}.": "池 {name} 的状态是 {status}。", "Pool {name} successfully upgraded.": "池 {name} 已成功升级。", - "Pool «{pool}» has been exported/disconnected successfully.": "池 «{pool}» 已成功导出/断开连接。", "Pool/Dataset": "池/数据集", "Pools": "池", "Pools:": "池:", @@ -3243,8 +3297,6 @@ "Power Mode": "电源模式", "Power Off": "关闭电源", "Power Off UPS": "关闭 UPS 电源", - "Power On Hours Ago": "累计上电时间", - "Power Outage": "停电", "Power Supply": "电源供应", "Pre Init": "初始化前期", "Pre Script": "运行前脚本", @@ -3293,7 +3345,6 @@ "Provides a plugin interface for Winbind to use varying backends to store SID/uid/gid mapping tables. The correct setting depends on the environment in which the NAS is deployed.": "为 Winbind 提供一个插件接口,以使用各种后端来存储 SID/uid/gid 映射表。正确的设置取决于 NAS 部署的环境。", "Provisioning Type": "配置类型", "Provisioning URI (includes Secret - Read only):": "设置 URI(包括密钥 - 只读):", - "Proxy": "代理", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "公网 IP 地址或域名。设置 FTP 客户端是否无法通过 NAT 设备连接。", "Public Key": "公钥", "Pull": "拉取", @@ -3345,7 +3396,6 @@ "Readonly Admin": "只读管理员", "Realm": "领域", "Rear": "后面", - "Reason": "原因", "Reboot": "重启", "Reboot of the other node is required for FIPS changes.": "需要重新启动另一个节点以应用FIPS更改。", "Reboot of this node is required for FIPS changes.": "此节点需要重启以应用FIPS更改。", @@ -3374,9 +3424,7 @@ "Region name - optional (rclone documentation).": "区域名称-可选的(rclone 文档)。", "Register": "注册", "Register Default Gateway": "注册默认网关", - "Regularly scheduled system checks and updates.": "定期进行系统检查和更新。", "Reject": "拒绝", - "Release": "发布", "Release Notes": "发布说明", "Reload now": "重新加载", "Reload the page": "重新加载页面", @@ -3412,7 +3460,6 @@ "Removed": "已移除", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "从当前数据集的所有子数据集中递归删除 ACL 和权限,包括这些子数据集中包含的所有目录和文件。这可能会使数据无法访问,直到创建新权限。", "Rename": "重命名", - "Rename Boot Environment": "重命名引导环境", "Renew": "更新", "Renew 2FA Secret": "更新双因素认证密钥", "Renew Certificate Days": "续签证书天数", @@ -3463,8 +3510,6 @@ "Requested action performed for selected Applications": "为选定的应用程序执行的请求操作", "Require IDENT Authentication": "需要 IDENT 认证", "Require Kerberos for NFSv4": "NFSv4 需要 Kerberos", - "Required reset to fix system operation issues.": "需要重置以修复系统操作问题。", - "Required restart after new software installation.": "安装新软件后需要重启。", "Required unless Enable password login is No. Passwords cannot contain a ?.": "除非启用密码登录,否则为必填项。密码不能包含 ?。", "Required – always encrypt transport (rejecting access if client does not support encryption – incompatible with SMB1 server enable_smb1)": "要求 - 始终加密传输(如果客户端不支持加密,则拒绝访问 - 与 SMB1 服务器不兼容)", "Reservation": "预留", @@ -3489,15 +3534,14 @@ "Resetting interfaces while HA is enabled is not allowed.": "启用 HA 时不允许重置接口。", "Resetting system configuration to default settings. The system will restart.": "将系统配置重置为默认设置。系统将重新启动。", "Resetting. Please wait...": "重置中。请稍等...", - "Resilver Priority": "一致性重建优先级", + "Resilver Priority": "重排优先级", "Resilver configuration saved": "一致性重建配置已保存", - "Resilvering": "一致性重建", - "Resilvering Status": "一致性重建状态", - "Resilvering pool: ": "一致性重建池", + "Resilvering": "重新同步", + "Resilvering Status": "重新同步状态", + "Resilvering pool: ": "重新同步池", "Resilvering:": "一致性重建进行中:", "Resolution": "解决方案", "Restart": "重启", - "Restart After Update": "更新后重启", "Restart App": "重启应用程序", "Restart Now": "立即重启", "Restart SMB Service": "重启 SMB 服务", @@ -3508,9 +3552,6 @@ "Restart is recommended for new FIPS setting to take effect. Would you like to restart now?": "建议重启以使新的 FIPS 设置生效。您现在想要重启吗?", "Restart is required after changing this setting.": "更改此设置后需要重新启动。", "Restart of a remote system is required for new FIPS setting to take effect. Would you like to restart standby now?": "需要重新启动远程系统以使新的 FIPS 设置生效。您是否想立即重启备用系统?", - "Restart standby TrueNAS controller": "重启备用的 TrueNAS 控制器", - "Restart to improve system performance speed.": "重新启动以提高系统性能速度。", - "Restart to re-establish network connections.": "重启以重新建立网络连接。", "Restarting Standby": "重启备用机", "Restore": "恢复", "Restore Cloud Sync Task": "恢复云同步任务", @@ -3694,7 +3735,6 @@ "Save network interface changes?": "保存更改的网络接口吗?", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "在新增 SMP 之前,请保存 '需要 Kerberos 用于 NFSv4' 的值。", "Saving Debug": "正在保存调试", - "Saving Instance": "保存实例", "Saving KMIP Config": "正在保存 KMIP 配置", "Saving Permissions": "正在保存权限", "Saving settings": "保存设置", @@ -3702,7 +3742,7 @@ "Scan this QR Code with your authenticator app of choice. The next time you try to login, you will be asked to enter an One Time Password (OTP) from your authenticator app. This step is extremely important. Without the OTP you will be locked out of this system.": "使用您选择的身份验证器应用程序扫描此二维码。下次您尝试登录时,系统会要求您从身份验证器应用程序输入一次性密码 (OTP)。此步骤非常重要。如果没有一次性密码,您将被被锁定在该系统之外。", "Schedule": "计划", "Schedule Preview": "计划预览", - "Scheduled Scrub Task": "计划的数据巡检任务", + "Scheduled Scrub Task": "计划的数据清理任务", "Schema": "模式", "Schema Mode": "模式模式", "Screenshots": "屏幕截图", @@ -3711,20 +3751,19 @@ "Script to execute after running sync.": "在运行 rsync 后运行的脚本。", "Script to execute before running sync.": "在运行 rsync 前运行的脚本。", "Scroll to top": "返回顶部", - "Scrub": "数据巡检", - "Scrub Boot Pool": "在启动池上运行数据巡检", - "Scrub In Progress:": "数据巡检正在进行中", - "Scrub Paused": "数据巡检暂停", - "Scrub Pool": "对存储池运行数据巡检", - "Scrub Started": "开始数据巡检", + "Scrub": "数据清理", + "Scrub Boot Pool": "在启动池上运行数据清理", + "Scrub In Progress:": "数据清理正在进行中", + "Scrub Paused": "数据清理停止", + "Scrub Pool": "对存储池运行数据清理", + "Scrub Started": "开始数据清理", "Scrub Task": "数据巡检任务", - "Scrub Tasks": "数据巡检任务", + "Scrub Tasks": "数据清理任务", "Scrub interval (in days)": "数据巡检间隔(天数)", - "Scrub interval set to {scrubIntervalValue} days": "数据巡检间隔设置为 {scrubIntervalValue} 天", + "Scrub interval set to {scrubIntervalValue} days": "数据清理间隔设置为 {scrubIntervalValue} 天", "Search": "搜索", "Search Alert Categories": "搜索警报类别", "Search Documentation for «{value}»": "搜索有关«{value}»的文档", - "Search Images": "搜索图片", "Search Input Fields": "搜索输入字段", "Search Results for «{query}»": "搜索结果 «{query}»", "Search UI": "搜索用户界面", @@ -3754,7 +3793,6 @@ "See Why is elliptic curve cryptography not widely used, compared to RSA? for more information about key types.": "参见为什么与 RSA 相比,椭圆曲线密码术没有得到广泛使用?有关密钥类型的更多信息。", "See Public key authentication in SSH/Authentication.": "请参阅 SSH/身份验证 中的 公钥认证。", "See the Network UPS Tools compatibility list for a list of supported UPS devices.": "有关支持的 UPS 设备列表,请参阅网络 UPS 工具兼容性列表 。", - "Select": "选择", "Select Bug when reporting an issue or Suggestion when requesting new functionality.": "报告问题时选择 Bug 或请求新功能时选择 Suggestion。", "Select Command for an executable or Script for an executable script.": "为可执行文件选择 Command 或为可执行脚本选择 Script 。", "Select Create new disk image to create a new zvol on an existing dataset. This is used as a virtual hard drive for the VM. Select Use existing disk image to use an existing zvol or file for the VM.": "选择创建新磁盘映像,以在现有数据集上创建新的 zvol。这用作虚拟机的虚拟硬盘驱动器。选择使用现有磁盘映像为虚拟机使用现有的 zvol 或文件。", @@ -3765,7 +3803,6 @@ "Select Disk Type": "选择磁盘类型", "Select Existing Zvol": "选择现有的 Zvol", "Select IP addresses to listen to for NFS requests. Leave empty for NFS to listen to all available addresses. Static IPs need to be configured on the interface to appear on the list.": "选择要侦听 NFS 请求的 IP 地址。为 NFS 留空以侦听所有可用地址。需要在接口上配置静态 IP 才能出现在列表中。", - "Select Image": "选择图像", "Select Pool": "选择池", "Select Rating": "选择评级", "Select Reporting": "选择报告", @@ -3829,7 +3866,7 @@ "Select the certificate of the Active Directory server if SSL connections are used. When no certificates are available, move to the Active Directory server and create a Certificate Authority and Certificate. Import the certificate to this system using the System/Certificates menu.": "如果使用 SSL 连接,则选择活动目录服务器的证书。如果没有可用的证书,请移至活动目录服务器并创建证书颁发机构和证书。使用「系统/证书」菜单将证书导入到该系统。", "Select the cloud storage provider credentials from the list of available Cloud Credentials.": "从可用的云凭据列表中选择云存储提供商凭据。", "Select the country of the organization.": "选择组织的国家。", - "Select the days to run resilver tasks.": "选择运行一致性重建任务的日期。", + "Select the days to run resilver tasks.": "选择运行重新同步任务的日期。", "Select the device to attach.": "选择要连接的设备。", "Select the directories or files to be sent to the cloud for Push syncs, or the destination to be written for Pull syncs. Be cautious about the destination of Pull jobs to avoid overwriting existing files.": "选择要发送到云以进行 Push 同步的目录或文件,或选择要写给 Pull 同步的目录或文件。注意 Pull 作业的目的地,以避免覆盖现有文件。", "Select the directories or files to be sent to the cloud for backup.": "选择要发送到云端进行备份的目录或文件。", @@ -3900,9 +3937,7 @@ "Service configuration saved": "服务配置已保存", "Service failed to start": "服务启动失败", "Service failed to stop": "服务停止失败", - "Service started": "服务已启动", "Service status": "服务状态", - "Service stopped": "服务已停止", "Services": "服务", "Session": "会期", "Session ID": "会话 ID", @@ -3910,7 +3945,7 @@ "Session Token Lifetime": "会话令牌生命周期", "Session dialect": "会话方言", "Sessions": "会话", - "Set": "已设置", + "Set": "组/集", "Set ACL": "设置 ACL", "Set ACL for this dataset": "为此数据集设置 ACL", "Set Attribute": "设置属性", @@ -3929,7 +3964,6 @@ "Set new password": "设置新密码", "Set only if required by the NFS client. Set to allow serving non-root mount requests.": "仅在 NFS 客户端要求时设置。设置为允许服务非 root 安装请求。", "Set or change the password of this SED. This password is used instead of the global SED password.": "设置或更改此 SED 的密码。使用此密码代替全局 SED 密码。", - "Set password for TrueNAS administrative user:": "为 TrueNAS 管理用户设置密码:", "Set production status as active": "将生产状态设置为活动", "Set specific times to snapshot the Source Datasets and replicate the snapshots to the Destination Dataset. Select a preset schedule or choose Custom to use the advanced scheduler.": "设置特定时间以对源数据集进行快照,并将快照复制到目标数据集。选择一个预设计划,或选择自定义以使用高级计划程序。", "Set the maximum number of connections per IP address. 0 means unlimited.": "设置每个 IP 地址最大并发连接数。0 表示无限制。", @@ -3947,7 +3981,6 @@ "Set to attempt to reduce latency over slow networks.": "设置为尝试减少慢速网络上的延迟。", "Set to automatically configure the IPv6. Only one interface can be configured this way.": "设置为自动配置 IPv6,这样只能配置一个接口。", "Set to automatically create the defined Remote Path if it does not exist.": "设置为自动创建已定义的远程路径(如果不存在)。", - "Set to boot a debug kernel after the next system restart.": "设置在下次系统重启后启动调试内核。", "Set to create a new primary group with the same name as the user. Unset to select an existing group for the user.": "设置为创建一个与用户同名的新主组。取消选择来为用户选择一个现有组。", "Set to determine if the system participates in a browser election. Leave unset when the network contains an AD or LDAP server, or when Vista or Windows 7 machines are present.": "设置以确定系统是否参与浏览器选举。当网络包含 AD 或 LDAP 服务器,或者存在 Vista 或 Windows 7 计算机时,请保持未设置状态。", "Set to display image upload options.": "设置为显示镜像上传选项。", @@ -4137,7 +4170,6 @@ "Snapshots could not be loaded": "无法加载快照", "Snapshots must not have dependent clones": "快照不得有依赖的克隆", "Snapshots will be created automatically.": "将自动创建快照。", - "Software Installation": "软件安装", "Some of the disks are attached to the exported pools\n mentioned in this list. Checking a pool name means you want to\n allow reallocation of the disks attached to that pool.": "某些磁盘连接到此列表中提到的导出池。检查池名称意味着您希望允许重新分配连接到该池的磁盘。", "Some of the selected disks have exported pools on them. Using those disks will make existing pools on them unable to be imported. You will lose any and all data in selected disks.": "某些选定的磁盘上已导出池。使用这些磁盘将导致其上的现有池无法导入。您将丢失选定磁盘中的所有数据。", "Sort": "排序", @@ -4145,7 +4177,6 @@ "Source Dataset": "源数据集", "Source Location": "源位置", "Source Path": "源路径", - "Space": "空间", "Space Available to Dataset": "数据集可用空间", "Space Available to Zvol": "Zvol 可用空间", "Spaces are allowed.": "允许使用空格。", @@ -4179,14 +4210,13 @@ "Start All Selected": "启动所有选定项", "Start Automatically": "自启", "Start Over": "从头开始", - "Start Scrub": "开始数据巡检", + "Start Scrub": "开始数据清理", "Start a dry run test of this cloud sync task? The system will connect to the cloud service provider and simulate transferring a file. No data will be sent or received.": "开始对此云同步任务进行试运行? 系统将连接到云服务提供商,并模拟传输文件。没有数据将被发送或接收。", "Start adding widgets to personalize it. Click on the \"Configure\" button to enter edit mode.": "开始新增小部件以个性化它。点击“配置”按钮以进入编辑模式。", "Start on Boot": "开机启动", - "Start scrub on pool {poolName}?": "开始对存储池 {poolName} 进行数据巡检?", - "Start service": "启动服务", + "Start scrub on pool {poolName}?": "开始对存储池 {poolName} 进行数据清理?", "Start session time": "会话启动时间", - "Start the scrub now?": "立即开始数据巡检吗?", + "Start the scrub now?": "立即开始数据清理吗?", "Start time for the replication task.": "复制任务的开始时间。", "Start {service} Service": "启动 {service} 服务", "Started": "已启动", @@ -4212,10 +4242,9 @@ "Stop All Selected": "停止所有选定的项", "Stop Flashing": "停止闪烁", "Stop Rollback if Snapshots Exist:": "如果存在快照,则停止回滚:", - "Stop Scrub": "停止数据巡检", + "Stop Scrub": "停止数据清理", "Stop TrueCommand Cloud Connection": "停止 TrueCommand 云连接", - "Stop service": "停止服务", - "Stop the scrub on {poolName}?": "停止对存储池 {poolName} 进行数据巡检?", + "Stop the scrub on {poolName}?": "停止对存储池 {poolName} 进行数据清理?", "Stop the {serviceName} service and close these connections?": "停止 {serviceName} 服务并关闭这些连接?", "Stop this Cloud Sync?": "停止此云同步吗?", "Stop {serviceName}?": "停止 {serviceName}?", @@ -4287,7 +4316,7 @@ "Sync to peer succeeded.": "与相同的一方同步成功。", "Synced": "同步完成", "Synchronize": "同步", - "Sysctl": "Sysctl", + "Sysctl": "系统控制", "Sysctl \"{name}\" deleted": "Sysctl \"{name}\" 已删除", "Syslog": "系统日志", "Syslog Level": "系统日志级别", @@ -4303,12 +4332,10 @@ "System Data Pool": "系统数据池", "System Dataset": "系统数据集", "System Dataset Pool": "系统数据集池", - "System Freeze": "系统冻结", "System Image": "系统映像", "System Information": "系统信息", "System Information – Active": "系统信息 – 活动", "System Information – Standby": "系统信息 - 待机", - "System Overload": "系统过载", "System Reports": "系统报告", "System Security": "系统安全", "System Security Settings": "系统安全设置", @@ -4316,10 +4343,8 @@ "System Serial": "系统序列号", "System Stats": "系统统计", "System Time Zone:": "系统时区:", - "System Update": "系统更新", "System Uptime": "系统运行时间", "System Utilization": "系统利用率", - "System Version": "系统版本", "System dataset updated.": "系统数据集已更新", "System domain name, like example.com": "系统域名,例如example.com", "System hostname.": "系统主机名。", @@ -4471,7 +4496,6 @@ "The system dataset will be updated and the SMB service restarted. This will cause a temporary disruption of any active SMB connections.": "系统数据集将被更新,SMB 服务将重新启动。这将导致任何活动的 SMB 连接暂时中断。", "The system restricts creating a zvol that brings the pool to over 80% capacity. Set to force creation of the zvol (NOT Recommended).": "系统限制创建 zvol 以使池达到 80% 以上的容量。设置为强制创建 zvol(不推荐)。", "The system uses a self-signed certificate to enable encrypted web interface connections. To change the default certificate, select a different certificate that was created or imported in the Certificates menu.": "系统使用自签名证书来启用加密的 Web 界面连接。要更改默认证书,请在证书菜单中选择一个已创建或导入的其他证书。", - "The system will restart and be briefly unavailable while applying updates. Apply updates and restart?": "系统将在应用更新时重新启动并短暂不可用。要应用更新并重启吗?", "The ticket was created successfully (see link below), but the debug file failed to attach. Please download the debug manually (System → Advanced → Save Debug), upload it to a third-party storage service and provide a link in the JIRA issue comment.": "工单已成功创建(请参见下面的链接),但调试文件未能附加。请手动下载调试(系统 → 高级 → 保存调试),上传到第三方存储服务并在 JIRA 问题评论中提供链接。", "The time in seconds the system waits for the VM to cleanly shut down. During system shutdown, the system initiates poweroff for the VM after the shutdown timeout has expired.": "系统等待虚拟机完全关闭的时间(以秒为单位)。在系统关闭期间,关闭超时到期后,系统将启动虚拟机的电源关闭。", "The time values when the task will run. Accepts standard crontab(5) values.

Symbols:
A comma (,) separates individual values.
An asterisk (*) means \"match all values\".
Hyphenated numbers (1-5) sets a range of time.
A slash (/) designates a step in the value: */2 means every other minute.

Example: 30-35 in Minutes, 1,14 in Hours, and */2 in Days means the task will run on 1:30 - 1:35 AM and 2:30 - 2:35 PM every other day.": "任务运行的时间值。接受标准 crontab(5) 值。

符号:
逗号 (,) 分隔各个值。
星号 (*) 表示「匹配所有值」。
连字符数字(1-5) 设置时间范围。
斜线 (/) 表示值中的一个步长:*/2 表示每隔一分钟。

示例:30-35 in Minutes, 1, 14 小时和 */2 天表示任务将在 1:30 - 1:35 AM 和 2:30 - 2:35 PM 每隔一天运行一次。", @@ -4484,7 +4508,6 @@ "The {name} service is {status}": "服务 {name} 的状态为 {status}", "The {service} service failed to start.": "{service} 服务未能启动。", "The {service} service failed to stop.": "{service} 服务未能停止。", - "The {service} service is running and will auto-start after a system restart.": "{服务} 正在运行,并将在系统重启后自动启动。", "The {service} service is running.": "{service} 服务正在运行。", "Theme": "主题", "There are no alerts.": "没有警报。", @@ -4625,7 +4648,6 @@ "Transport Options": "传输选项", "Traverse": "阻止", "Treat Disk Size as Minimum": "将磁盘大小视为最小", - "Troubleshooting Issues": "故障排除问题", "TrueCloud Backup Tasks": "TrueCloud 备份任务", "TrueCommand": "TrueCommand", "TrueCommand Cloud Service": "TrueCommand 云服务", @@ -4636,7 +4658,6 @@ "TrueNAS Controller": "TrueNAS 控制器", "TrueNAS Help": "TrueNAS 帮助", "TrueNAS URL": "TrueNAS URL", - "TrueNAS is Free and Open Source software, which is provided as-is with no warranty.": "TrueNAS 是免费且开源的软件,按原样提供,不提供任何担保。", "TrueNAS maintains a cache of users and groups for API consumers (including the WebUI). This is a convenience feature that may be disabled if the domain contains large numbers of users and groups or if the caching generates excessive load on the domain controller.": "TrueNAS 为 API 消费者(包括 WebUI)维护用户和组的缓存。这是一个便利的功能,但如果域中包含大量用户和组,或者缓存对域控制器产生过大负载,可以禁用该功能。", "TrueNAS recommends that the sync setting always be left to the default of \"Standard\" or increased to \"Always\". The \"Disabled\" setting should not be used in production and only where data roll back by few seconds in case of crash or power loss is not a concern.": "TrueNAS 建议将同步设置始终保持为默认的\"标准\"或增加到\"始终\"。在生产环境中不应使用\"禁用\"设置,仅在发生崩溃或断电时数据回滚几秒钟不是问题的情况下使用。", "TrueNAS server must be joined to Active Directory or have at least one local SMB user before creating an SMB share": "在创建 SMB 共享之前,TrueNAS 服务器必须加入 Active Directory 或至少拥有一个本地 SMB 用户", @@ -4686,7 +4707,6 @@ "Unavailable": "不可用", "Uncheck": "取消勾选", "Unencrypted": "未加密", - "Unexpected power loss necessitating a restart.": "意外断电导致需要重启。", "Unhealthy": "不健康", "Unique LUN ID. The default is generated from the MAC address of the system.": "唯一的逻辑单元 ID。默认值是从系统的 MAC 地址生成的。", "Unique Virtual Host ID on the broadcast segment of the network. Configuring multiple Virtual IP addresses requires a separate VHID for each address.": "网络广播段上的唯一虚拟主机 ID。配置多个虚拟 IP 地址需要为每个地址使用单独的 VHID。", @@ -4710,14 +4730,12 @@ "Unlock with Key file": "用密钥文件解锁", "Unlocked": "解锁", "Unlocking Datasets": "正在解锁数据集", - "Unresponsive system necessitating a forced restart.": "无响应的系统需要强制重启。", - "Unsaved Changes": "未保存的更改", "Unselect All": "取消全选", "Unset": "取消设置", "Unset Generate Encryption Key to instead import a custom Hex key.": "取消设置生成加密密钥以导入自定义十六进制密钥。", "Unset Pool": "取消设置池", "Unset to add a login prompt to the system before the console menu is shown.": "在显示控制台菜单之前,取消设置为系统添加登录提示。", - "Unset to disable the scheduled scrub without deleting it.": "取消设置以禁用预定的巡检而不删除它。", + "Unset to disable the scheduled scrub without deleting it.": "取消设置以禁用预定的校验而不删除它。", "Unset to disable this service without deleting it.": "取消设置以禁用此服务而不删除它。", "Unshare": "取消共享", "Unshare {name}": "取消分享 {name}", @@ -4745,7 +4763,6 @@ "Update TrueCommand Settings": "更新 TrueCommand 设置", "Update available": "更新可用", "Update in Progress": "正在进行更新", - "Update successful. Please restart for the update to take effect. Restart now?": "更新成功。请重启以使更新生效。现在重启吗?", "Updated 'Use as Home Share'": "更新了「用作家庭共享」", "Updated Date": "更新日期", "Updates": "更新", @@ -4756,7 +4773,6 @@ "Updating ACL": "更新 ACL(访问权限管理)中", "Updating custom app": "更新自定义应用程序", "Updating key type": "更新密钥类型", - "Updating settings": "更新设置", "Upgrade": "升级", "Upgrade All Selected": "升级所有选择项", "Upgrade Pool": "升级池", @@ -4814,7 +4830,6 @@ "Used by clients in PASV mode. A default of 0 means any port above 1023.": "由客户端在 PASV 模式下使用。默认值 0 表示 1023 以上的任何端口。", "Used to add additional proftpd(8) parameters.": "用于添加其他proftpd(8)参数。", "User": "用户", - "User API Keys": "用户 API 密钥", "User Bind Path": "用户绑定路径", "User CN": "用户 CN", "User Data Quota ": "用户数据配额", @@ -4844,7 +4859,6 @@ "User domain - optional (rclone documentation).": "用户域-可选的(rclone 文档)。", "User is lacking permissions to access WebUI.": "用户缺少访问 WebUI 的权限。", "User limit to Docker Hub has almost been reached or has already been reached. The installation process may stall as images cannot be pulled. The current limit will be renewed in {seconds}. The application can still be staged for installation.": "对 Docker Hub 的用户限制几乎已达到或已经达到。安装过程可能会停滞,因为无法拉取镜像。当前的限制将在 {seconds} 秒后更新。应用程序仍然可以准备安装。", - "User linked API Keys": "用户链接的API密钥", "User passed to camcontrol security -u to unlock SEDs": "用户传递给 camcontrol security -u 以解锁 SED", "User password": "用户密码", "User password. Must be at least 12 and no more than 16 characters long.": "用户密码。必须至少有 12 个字符,最长不超过 16 个字符。", @@ -4852,7 +4866,6 @@ "User who controls the dataset. This user always has permissions to read or write the ACL and read or write attributes. Users created manually or imported from a directory service appear in the drop-down menu.": "控制数据集的用户。该用户始终有权读取或写入 ACL 以及读取或写入属性。手动创建或从目录服务导入的用户将显示在下拉菜单中。", "User-defined string used to decrypt the dataset. Can be used instead of an encryption key.
WARNING: the passphrase is the only means to decrypt the information stored in this dataset. Be sure to create a memorable passphrase or physically secure the passphrase.": "用户定义的字符串,用于解密数据集。可以代替加密密钥使用。
警告:密码短语是解密存储在此数据集中的信息的唯一方法。确保创建一个难忘的密码短语或在物理上安全的密码短语。", "Username": "用户名", - "Username associated with this API key.": "与此API密钥相关的用户名。", "Username for this service.": "此服务的用户名。", "Username of the SNMP User-based Security Model (USM) user.": "SNMP 的用户名基于用户的安全模型(USM)用户。", "Username on the remote system to log in via Web UI to setup connection.": "通过网页面板 登录远程系统所需要的用户名。", @@ -4864,7 +4877,6 @@ "Uses the SMB Service NetBIOS Name to advertise the server to WS-Discovery clients. This causes the computer appear in the Network Neighborhood of modern Windows OSes.": "使用 SMB 服务 NetBIOS 名称将服务器通告给 WS-Discovery 客户端。这会导致计算机出现在 Windows 操作系统的网上邻居中。", "Uses three disks for parity while all other disks store data. RAIDZ3 requires at least five disks. RAIDZ is a traditional ZFS data protection scheme. \nChoose RAIDZ over dRAID when managing a smaller set of drives, where simplicity of setup and predictable disk usage are primary considerations.": "使用三个磁盘进行奇偶校验,而所有其他磁盘存储数据。RAIDZ3 需要至少五个磁盘。RAIDZ 是传统的 ZFS 数据保护方案。\n在管理较小的一组驱动器集时,选择 RAIDZ 而不是 dRAID,因为设置简单且磁盘使用情况可预测,是首选方案。", "Uses two disks for parity while all other disks store data. RAIDZ2 requires at least four disks. RAIDZ is a traditional ZFS data protection scheme. \nChoose RAIDZ over dRAID when managing a smaller set of drives, where simplicity of setup and predictable disk usage are primary considerations.": "使用两个磁盘进行奇偶校验,而所有其他磁盘存储数据。RAIDZ2 需要至少四个磁盘。RAIDZ 是传统的 ZFS 数据保护方案。\n在管理较小的一组驱动器集时,选择 RAIDZ 而不是 dRAID,因为设置简单且磁盘使用情况可预测,是首选方案。", - "Using 3rd party applications with TrueNAS extends its\n functionality beyond standard NAS use, which can introduce risks like data loss or system disruption.

\n iXsystems does not guarantee application safety or reliability, and such applications may not\n be covered by support contracts. Issues with core NAS functionality may be closed without\n further investigation if the same data or filesystems are accessed by these applications.": "使用第三方应用程序与 TrueNAS 结合,可以扩展其功能,超出标准 NAS 的使用范围,但这可能会引入数据丢失或系统中断等风险。

\niXsystems 不保证应用程序的安全性或可靠性,这些应用程序可能不在支持合同的范围内。如果这些应用程序访问相同的数据或文件系统,核心 NAS 功能的问题可能会在不进行进一步调查的情况下关闭。", "Using CSR": "使用 CSR", "Using pool {name}": "使用池 {name}", "Using this option will replicate all snapshots which names match specified regular expression. The performance on the systems with large number of snapshots will be lower, as snapshots metadata needs to be read in order to determine snapshots creation order.": "使用此选项将复制名称与指定正则表达式匹配的所有快照。具有大量快照的系统的性能会降低,因为需要读取快照元数据以确定快照创建顺序。", @@ -4890,7 +4902,6 @@ "VMware Snapshot Integration": "VMware 快照集成", "VMware Snapshots": "VMware 快照", "VMware Sync": "虚拟机同步", - "VMware: Extent block size 512b, TPC enabled, no Xen compat mode, SSD speed": "VMware:扩展块大小 512 字节,启用 TPC,未启用 Xen 兼容模式,SSD 速度", "Validate Certificates": "验证证书", "Validate Connection": "验证连接", "Validate Remote Path": "验证远程路径", @@ -4904,7 +4915,6 @@ "Var": "Var", "Variable": "变量", "Variable deleted.": "变量已删除。", - "Variant": "变量", "Vdev": "Vdev", "Vdev successfully extended.": "Vdev 成功扩展。", "Vdevs spans enclosure": "Vdevs 跨越机箱", @@ -4920,7 +4930,7 @@ "Video, < 10ms latency": "视频,延迟小于 10 毫秒", "View All": "查看全部", "View All S.M.A.R.T. Tests": "查看所有 S.M.A.R.T. 测试", - "View All Scrub Tasks": "查看所有数据巡检任务", + "View All Scrub Tasks": "查看所有数据清理任务", "View All Test Results": "查看所有测试结果", "View Changelog": "查看变更日志", "View Details": "查看详情", @@ -4932,7 +4942,6 @@ "View Netdata": "查看 Netdata", "View Release Notes": "查看发行说明", "View Reports": "查看报告", - "View logs": "查看日志", "View/Download CSR": "查看/下载 CSR", "View/Download Certificate": "查看/下载证书", "View/Download Key": "查看/下载密钥", @@ -4942,11 +4951,7 @@ "Virtual Machines": "虚拟机", "Virtual machine created": "虚拟机已创建。", "Virtualization": "虚拟化", - "Virtualization Global Read": "虚拟化全局读取", - "Virtualization Global Write": "虚拟化全局写入", - "Virtualization Instance Write": "虚拟化实例写入", "Virtualization is not supported": "不支持虚拟化", - "Virtualization settings updated": "虚拟化设置已更新", "Visible": "可见", "Voltage": "电压", "Volume Mounts": "卷挂载", @@ -5057,7 +5062,6 @@ "Write Owner": "写所有者", "Wrong username or password. Please try again.": "用户名或密码错误,请重试。", "Xen initiator compat mode": "Xen Initiator 兼容模式", - "Xen: Extent block size 512b, TPC enabled, Xen compat mode enabled, SSD speed": "Xen: 扩展块大小 512 字节,启用 TPC,启用 Xen 兼容模式,SSD 速度", "Yandex": "Yandex", "Yandex Access Token.": "Yandex 访问令牌 。", "Year(s)": "年", @@ -5066,14 +5070,11 @@ "Yes I understand the risks": "是的,我了解风险", "Yesterday": "昨天", "You are trying to open:
\n{url}

\nBecause HTTP to HTTPS redirect is enabled in settings your browser will force HTTPS connection for this URL.
\nThis may create issues if app does not support secure connections.
\n
\nYou can try opening app url in an incognito mode.
\nAlternatively you can disable redirect in Settings, clear browser cache and try again.": "您正在尝试打开:
\n{url}

\n因为在设置中启用了 HTTP 到 HTTPS 重定向,您的浏览器将强制为此 URL 进行 HTTPS 连接。
\n如果应用程序不支持安全连接,可能会出现问题。
\n
\n您可以尝试以隐身模式打开应用网址。
\n您也可以在「设置」中禁用重定向,清除浏览器缓存并重试。", - "You are using an insecure connection. Switch to HTTPS for secure access.": "您正在使用不安全的连接。请切换到 HTTPS 以实现安全访问。", "You can also vote for new features on our forum.": "您也可以在我们的论坛上为新功能投票 ", "You can join the TrueNAS Newsletter for monthly updates and latest developments.": "您可以加入 TrueNAS Newsletter 以获取每月更新和最新进展。", - "You can only lock a dataset if it was encrypted with a passphrase": "只有在数据集使用密码短语加密的情况下,您才能对其进行锁定。", "You can search both for local groups as well as groups from Active Directory. Press ENTER to separate entries.": "您可以搜索本地组以及来自 Active Directory 的组。按 ENTER 键分隔条目。", "You can search both for local users as well as users from Active Directory.Press ENTER to separate entries.": "您既可以搜索本地用户,也可以搜索 Active Directory 中的用户。按 ENTER 键分隔条目。", "You have left the domain.": "您已离开域。", - "You have unsaved changes. Are you sure you want to close?": "您有未保存的更改。您确定要关闭吗?", "You may enter a specific IP address (e.g., 192.168.1.1) for individual access, or use an IP address with a subnet mask (e.g., 192.168.1.0/24) to define a range of addresses.": "您可以输入特定的 IP 地址(例如 192.168.1.1)进行单独访问,或使用带有子网掩码的 IP 地址(例如 192.168.1.0/24)来定义地址范围。", "Your dashboard is currently empty!": "您的仪表盘当前是空的!", "ZFS": "ZFS", @@ -5102,7 +5103,7 @@ "Zvol «{name}» updated.": "Zvol «{name}» 已更新。", "[Use fewer transactions in exchange for more RAM.](https://rclone.org/docs/#fast-list) This can also speed up or slow down the transfer.": "[使用更少的事务来换取更多的 RAM。](https://rclone.org/docs/\\#fast-list)这也可以加快或减慢传输速度。", "by ancestor": "由上级提供", - "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed stripe width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "dRAID 是一项 ZFS 功能,可提高一致性重建速度和负载分布。由于固定条带宽度,小文件的磁盘空间效率可能会大大降低。\n在处理大容量驱动器和广泛的磁盘环境时,请选择 dRAID 而不是 RAID-Z,以增强性能表现。", + "dRAID is a ZFS feature that boosts resilver speed and load distribution. Due to fixed stripe width disk space efficiency may be substantially worse with small files. \nOpt for dRAID over RAID-Z when handling large-capacity drives and extensive disk environments for enhanced performance.": "dRAID 是一项 ZFS 功能,可提高重新同步速度和负载分布。由于固定条带宽度,小文件的磁盘空间效率可能会大大降低。\n在处理大容量驱动器和广泛的磁盘环境时,请选择 dRAID 而不是 RAID-Z,以增强性能表现。", "dRAID1": "dRAID1", "dRAID2": "dRAID2", "dRAID3": "dRAID3", @@ -5186,7 +5187,6 @@ "{n, plural, =0 {No Errors} one {# Error} other {# Errors}}": "{n, plural, =0 {No Errors} 1 {# Error} other {# Errors}}", "{n, plural, =0 {No Tasks} one {# Task} other {# Tasks}} Configured": "{n, plural, =0 {No Tasks} 1 {# Task} other {# Tasks}} 配置", "{n, plural, =0 {No errors} one {# Error} other {# Errors}}": "{n, plural, =0 {没有错误} other {# 个错误}}", - "{n, plural, =0 {No keys} =1 {# key} other {# keys}}": "{n, plural, =0 {没有密钥} other {# 个密钥}}", "{n, plural, =0 {No open files} one {# open file} other {# open files}}": "{n, plural, =0 {没有打开的文件} other {# 个打开的文件}}", "{n, plural, one {# CPU} other {# CPUs}}": "{n} 个 CPUs", "{n, plural, one {# GPU} other {# GPUs}} isolated": "{n} 个隔离 GPUs", @@ -5197,7 +5197,6 @@ "{n, plural, one {Failed Disk} other {Failed Disks}}": "{n} 块失败的磁盘", "{n, plural, one {Pool in Enclosure} other {Pools in Enclosure}}": "{n} 个机箱中的池", "{n, plural, one {SAS Expander} other {SAS Expanders}}": "{n} 个 SAS 扩展器", - "{n, plural, one {There is an active iSCSI connection.} other {There are # active iSCSI connections}}": "当前有 {n} 个活跃的iSCSI连接。", "{name} Devices": "设备 {name}", "{name} Sessions": "会话 {name}", "{name} and {n, plural, one {# other pool} other {# other pools}} are not healthy.": "{name} 和 {n} 个池的状态不健康。", @@ -5215,7 +5214,6 @@ "{tasks, plural, =1 {# received task} other {# received tasks}} this week": "本周完成 {tasks} 个接收任务", "{tasks, plural, =1 {# send task} other {# send tasks}}": "{tasks} 个发送任务", "{tasks, plural, =1 {# sent task} other {# sent tasks}} this week": "本周完成 {tasks} 个发送任务", - "{temp}°C (All Cores)": "{temp}°C(所有核心)", "{temp}°C (Core #{core})": "{temp}°C(核心 #{core})", "{temp}°C ({coreCount} cores at {temp}°C)": "{temp}°C (核心 {coreCount} {temp}°C)", "{threadCount, plural, one {# thread} other {# threads} }": "{threadCount} 个线程", diff --git a/src/assets/i18n/zh-hant.json b/src/assets/i18n/zh-hant.json index 92ac589c5fc..18c2625d015 100644 --- a/src/assets/i18n/zh-hant.json +++ b/src/assets/i18n/zh-hant.json @@ -164,6 +164,7 @@ "Add Cron Job": "", "Add Custom App": "", "Add DNS Authenticator": "", + "Add Disk": "", "Add Disk Test": "", "Add Disks To:": "", "Add Expansion Shelf": "", @@ -413,7 +414,6 @@ "Are you sure you want to delete the user quota {name}?": "", "Are you sure you want to delete this device?": "", "Are you sure you want to delete this item?": "", - "Are you sure you want to delete this proxy?": "", "Are you sure you want to delete this record?": "", "Are you sure you want to delete this script?": "", "Are you sure you want to delete this snapshot?": "", @@ -526,7 +526,7 @@ "Bridge Members": "", "Bridge Settings": "", "Bridge interface": "", - "Browse": "", + "Browse Catalog": "", "Browse to a CD-ROM file present on the system storage.": "", "Browse to a storage location and add the name of the new raw file on the end of the path.": "", "Browse to an existing file. Create a new file by browsing to a dataset and appending /(filename.ext) to the path.": "", @@ -825,7 +825,6 @@ "Create ACME DNS-Authenticator": "", "Create Alert": "", "Create Backup Credential": "", - "Create Boot Environment": "", "Create CSR": "", "Create Certificate": "", "Create Certificate Authority": "", @@ -889,6 +888,7 @@ "Created date": "", "Creates dataset snapshots even when there have been no changes to the dataset from the last snapshot. Recommended for creating long-term restore points, multiple snapshot tasks pointed at the same datasets, or to be compatible with snapshot schedules or replications created in TrueNAS 11.2 and earlier.

For example, allowing empty snapshots for a monthly snapshot schedule allows that monthly snapshot to be taken, even when a daily snapshot task has already taken a snapshot of any changes to the dataset.": "", "Creating ACME Certificate": "", + "Creating Instance": "", "Creating custom app": "", "Creating or editing a sysctl immediately updates the Variable to the configured Value. A restart is required to apply loader or rc.conf tunables. Configured tunables remain in effect until deleted or Enabled is unset.": "", "Creation Time": "", @@ -1037,7 +1037,6 @@ "Delete NTP Server": "", "Delete Periodic Snapshot Task \"{value}\"?": "", "Delete Privilege": "", - "Delete Proxy": "", "Delete Replication Task \"{name}\"?": "", "Delete Reporting Exporter": "", "Delete Rsync Task \"{name}\"?": "", @@ -1062,7 +1061,6 @@ "Delete files in the destination directory that do not exist in the source directory.": "", "Delete group": "", "Delete iSCSI extent {name}?": "", - "Delete proxy": "", "Delete raw file": "", "Delete selections": "", "Delete snapshot {name}?": "", @@ -1106,6 +1104,7 @@ "Device Name": "", "Device added": "", "Device deleted": "", + "Device is readonly and cannot be removed.": "", "Device names of each disk being edited.": "", "Device removed": "", "Device updated": "", @@ -1152,6 +1151,7 @@ "Disk Sector Size": "", "Disk Tests": "", "Disk Wiped successfully": "", + "Disk added": "", "Disk device name.": "", "Disk is unavailable": "", "Disk not attached to any pools.": "", @@ -1553,6 +1553,7 @@ "Failover is administratively disabled.": "", "Failover is in an error state.": "", "Failover is recommended for new FIPS setting to take effect. Would you like to failover now?": "", + "Fast Storage": "", "Fatal error! Check logs.": "", "Faulted": "", "Feature Request": "", @@ -1901,7 +1902,7 @@ "Instance Configuration": "", "Instance Port": "", "Instance Protocol": "", - "Instance saved": "", + "Instance created": "", "Instance updated": "", "Instances you created will automatically appear here.": "", "Integrate Snapshots with VMware": "", @@ -2431,6 +2432,7 @@ "No containers are available.": "", "No descriptor provided": "", "No devices added.": "", + "No disks added.": "", "No disks available.": "", "No e-mail address is set for root user or any other local administrator. Please, configure such an email address first.": "", "No enclosure": "", @@ -2481,7 +2483,6 @@ "Notransfer Timeout": "", "Nov": "", "Now": "", - "Now/Restart": "", "Num Pending Deletes": "", "Number of VDEVs": "", "Number of bytes": "", @@ -2737,7 +2738,6 @@ "Proxies": "", "Proxy": "", "Proxy added": "", - "Proxy deleted": "", "Public IP address or hostname. Set if FTP clients cannot connect through a NAT device.": "", "Pull": "", "Pull Image": "", @@ -2828,7 +2828,6 @@ "Remove {value} from recent searches": "", "Removed": "", "Removes the ACL and permissions recursively from all child datasets of the current dataset, including all directories and files contained within those child datasets. This can make data inaccessible until new permissions are created.": "", - "Rename Boot Environment": "", "Renew": "", "Renew 2FA Secret": "", "Renew Certificate Days": "", @@ -3070,7 +3069,6 @@ "Save current ACL entries as a preset for future use.": "", "Save network interface changes?": "", "Save the 'Require Kerberos for NFSv4' value before adding SMP": "", - "Saving Instance": "", "Saving KMIP Config": "", "Saving settings": "", "Scan remote host key.": "", @@ -3468,7 +3466,6 @@ "Source Dataset": "", "Source Location": "", "Source Path": "", - "Space": "", "Space Available to Dataset": "", "Space Available to Zvol": "", "Spaces are allowed.": "", @@ -3883,6 +3880,7 @@ "Traffic": "", "Train": "", "Transfer": "", + "Transfer Setting": "", "Translate App": "", "Transmit Hash Policy": "", "Transparently reuse a single copy of duplicated data to save space. Deduplication can improve storage capacity, but is RAM intensive. Compressing data is generally recommended before using deduplication. Deduplicating data is a one-way process. Deduplicated data cannot be undeduplicated!.": "", diff --git a/src/assets/icons/sprite-config.json b/src/assets/icons/sprite-config.json index 55cfdca26f4..5c456b2dd65 100644 --- a/src/assets/icons/sprite-config.json +++ b/src/assets/icons/sprite-config.json @@ -1,3 +1,3 @@ { - "iconUrl": "assets/icons/sprite.svg?v=889c0f9a7a" + "iconUrl": "assets/icons/sprite.svg?v=c8ca8bd44c" } \ No newline at end of file diff --git a/src/assets/icons/sprite.svg b/src/assets/icons/sprite.svg index abbf2904ef1..fcb13e331c8 100644 --- a/src/assets/icons/sprite.svg +++ b/src/assets/icons/sprite.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/tsconfig.strictNullChecks.json b/tsconfig.strictNullChecks.json index 3a3f8e4019e..aa71938d336 100644 --- a/tsconfig.strictNullChecks.json +++ b/tsconfig.strictNullChecks.json @@ -47,7 +47,6 @@ "./src/app/enums/api-message-type.enum.ts", "./src/app/enums/app-extra-category.enum.ts", "./src/app/enums/audit.enum.ts", - "./src/app/enums/boot-environment-action.enum.ts", "./src/app/enums/ca-create-type.enum.ts", "./src/app/enums/certificate-create-type.enum.ts", "./src/app/enums/certificate-digest-algorithm.enum.ts", @@ -274,7 +273,6 @@ "./src/app/interfaces/audit/smb-audit-entry.interface.ts", "./src/app/interfaces/auth-session.interface.ts", "./src/app/interfaces/auth.interface.ts", - "./src/app/interfaces/bootenv.interface.ts", "./src/app/interfaces/certificate-authority.interface.ts", "./src/app/interfaces/certificate.interface.ts", "./src/app/interfaces/choices.interface.ts",