Skip to content

Commit

Permalink
NAS-129733: Replace NodeProvider (#10256)
Browse files Browse the repository at this point in the history
Co-authored-by: Boris Vasilenko <[email protected]>
  • Loading branch information
bvasilenko and bvasilenko authored Jul 1, 2024
1 parent b755c17 commit 5f34bc0
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 28 deletions.
9 changes: 8 additions & 1 deletion src/app/interfaces/api/api-call-directory.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,13 @@ import {
ChartReleaseUpgradeParams,
} from 'app/interfaces/chart-release.interface';
import { Choices } from 'app/interfaces/choices.interface';
import { CloudBackup, CloudBackupSnapshot, CloudBackupUpdate } from 'app/interfaces/cloud-backup.interface';
import {
CloudBackup,
CloudBackupSnapshot,
CloudBackupSnapshotDirectoryListing,
CloudBackupSnapshotDirectoryParams,
CloudBackupUpdate,
} from 'app/interfaces/cloud-backup.interface';
import {
CloudSyncDirectoryListing,
CloudSyncListDirectoryParams,
Expand Down Expand Up @@ -389,6 +395,7 @@ export interface ApiCallDirectory {
'cloud_backup.create': { params: [CloudBackupUpdate]; response: CloudBackup };
'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.query': { params: [id?: QueryParams<CloudBackup>]; response: CloudBackup[] };
'cloud_backup.update': { params: [id: number, update: CloudBackupUpdate]; response: CloudBackup };

Expand Down
17 changes: 17 additions & 0 deletions src/app/interfaces/cloud-backup.interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,23 @@ export type CloudBackupRestoreParams = [
},
];

export enum CloudBackupSnapshotDirectoryFileType {
File = 'file',
Dir = 'dir',
}

export type CloudBackupSnapshotDirectoryParams = [
id: number,
snapshot_id: string,
path: string,
];

export interface CloudBackupSnapshotDirectoryListing {
name: string;
path: string;
type: CloudBackupSnapshotDirectoryFileType;
}

export interface BackupTile {
title: string;
totalSend: number;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@
<ix-explorer
*ngIf="isExcludePathsSelected"
formControlName="excludedPaths"
root="/"
[required]="true"
[tooltip]="helptext.tooltips.excluded_paths"
[label]="'Excluded Paths' | translate"
[nodeProvider]="bucketNodeProvider"
[nodeProvider]="snapshotNodeProvider"
[multiple]="true"
></ix-explorer>

Expand All @@ -37,19 +36,18 @@
<ix-explorer
*ngIf="isIncludeFromSubfolderSelected"
formControlName="subFolder"
root="/"
[required]="true"
[label]="'Subfolder' | translate"
[nodeProvider]="bucketNodeProvider"
[nodeProvider]="snapshotNodeProvider"
[tooltip]="helptext.tooltips.sub_folder"
></ix-explorer>

<ix-explorer
*ngIf="isIncludeFromSubfolderSelected"
formControlName="includedPaths"
[root]="form.controls.subFolder.value || '/'"
[root]="form.controls.subFolder.value || mntPath"
[label]="'Included Paths' | translate"
[nodeProvider]="bucketNodeProvider"
[nodeProvider]="snapshotNodeProvider"
[tooltip]="helptext.tooltips.included_paths"
[multiple]="true"
></ix-explorer>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,16 @@ import { TranslateService } from '@ngx-translate/core';
import { map, of } from 'rxjs';
import { DatasetPreset } from 'app/enums/dataset.enum';
import { ExplorerNodeType } from 'app/enums/explorer-type.enum';
import { mntPath } from 'app/enums/mnt-path.enum';
import { Role } from 'app/enums/role.enum';
import { mapToOptions } from 'app/helpers/options.helper';
import { helptextTruecloudBackup } from 'app/helptext/data-protection/truecloud-backup/cloudsync';
import {
CloudBackup, CloudBackupRestoreParams, CloudBackupSnapshot, SnapshotIncludeExclude,
CloudBackup,
CloudBackupRestoreParams,
CloudBackupSnapshot,
CloudBackupSnapshotDirectoryFileType,
SnapshotIncludeExclude,
} from 'app/interfaces/cloud-backup.interface';
import { DatasetCreate } from 'app/interfaces/dataset.interface';
import { ExplorerNodeData, TreeNode } from 'app/interfaces/tree-node.interface';
Expand All @@ -33,11 +38,11 @@ import { WebSocketService } from 'app/services/ws.service';
})
export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit {
readonly requiredRoles = [Role.CloudBackupWrite];

readonly mntPath = mntPath;
readonly helptext = helptextTruecloudBackup;

fileNodeProvider: TreeNodeProvider;
bucketNodeProvider: TreeNodeProvider;
snapshotNodeProvider: TreeNodeProvider;

readonly includeExcludeOptions = new Map<SnapshotIncludeExclude, string>([
[SnapshotIncludeExclude.IncludeEverything, this.translate.instant('Include everything')],
Expand All @@ -56,7 +61,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit {
includeExclude: [SnapshotIncludeExclude.IncludeEverything, Validators.required],
excludedPaths: [[] as string[], Validators.required],
excludePattern: [null as string | null, Validators.required],
subFolder: ['/'],
subFolder: [mntPath],
includedPaths: [[] as string[]],
});

Expand Down Expand Up @@ -92,7 +97,7 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit {

ngOnInit(): void {
this.setFileNodeProvider();
this.setBucketNodeProvider();
this.setSnapshotNodeProvider();
this.disableHiddenFields();
this.listenForFormChanges();
}
Expand Down Expand Up @@ -134,26 +139,20 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit {
});
}

getBucketsNodeProvider(): TreeNodeProvider {
getSnapshotNodeProvider(): TreeNodeProvider {
return (node: TreeNode<ExplorerNodeData>) => {
const data = {
credentials: this.data.backup?.credentials?.id,
attributes: {
folder: node.data.path,
bucket: this.data.backup.attributes.bucket,
},
args: '',
};

return this.ws.call('cloudsync.list_directory', [data]).pipe(
return this.ws.call(
'cloud_backup.list_snapshot_directory',
[this.data.backup.id, this.data.snapshot?.id, node.data.path],
).pipe(
map((listing) => {
const nodes: ExplorerNodeData[] = [];

listing.forEach((file) => {
if (file.IsDir) {
if (file.type === CloudBackupSnapshotDirectoryFileType.Dir && file.path !== node.data.path) {
nodes.push({
path: `${data.attributes.folder}/${file.Name}`.replace(/\/+/g, '/'),
name: file.Name,
path: file.path,
name: file.name,
type: ExplorerNodeType.Directory,
hasChildren: true,
});
Expand Down Expand Up @@ -196,8 +195,8 @@ export class CloudBackupRestoreFromSnapshotFormComponent implements OnInit {
this.fileNodeProvider = this.filesystemService.getFilesystemNodeProvider({ directoriesOnly: true });
}

private setBucketNodeProvider(): void {
this.bucketNodeProvider = this.getBucketsNodeProvider();
private setSnapshotNodeProvider(): void {
this.snapshotNodeProvider = this.getSnapshotNodeProvider();
}

private disableHiddenFields(): void {
Expand Down

0 comments on commit 5f34bc0

Please sign in to comment.