@rs-pk/asset-management 1.0.26 → 1.0.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/bundles/rs-pk-asset-management.umd.js +398 -63
  2. package/bundles/rs-pk-asset-management.umd.js.map +1 -1
  3. package/bundles/rs-pk-asset-management.umd.min.js +2 -2
  4. package/bundles/rs-pk-asset-management.umd.min.js.map +1 -1
  5. package/esm2015/lib/components/partial/asset-dialog/asset-dialog.component.js +1 -2
  6. package/esm2015/lib/components/partial/asset-management-dialog/asset-management-dialog.component.js +1 -2
  7. package/esm2015/lib/components/partial/asset-wrapper/asset-wrapper.component.js +2 -9
  8. package/esm2015/lib/components/partial/folder-item/folder-item.component.js +2 -2
  9. package/esm2015/lib/components/partial/folder-list/folder-list.component.js +33 -5
  10. package/esm2015/lib/components/partial/node-details/node-details.component.js +64 -12
  11. package/esm2015/lib/components/partial/node-tree/node-tree.component.js +148 -10
  12. package/esm2015/lib/components/partial/search-box/search-box.component.js +2 -2
  13. package/esm2015/lib/models/asset.model.js +15 -1
  14. package/esm2015/lib/models/index.js +2 -2
  15. package/esm2015/lib/services/asset.service.js +47 -7
  16. package/esm2015/lib/services/env-config.service.js +3 -1
  17. package/esm2015/lib/services/node-tree.service.js +14 -6
  18. package/esm5/lib/components/partial/asset-dialog/asset-dialog.component.js +1 -2
  19. package/esm5/lib/components/partial/asset-management-dialog/asset-management-dialog.component.js +1 -2
  20. package/esm5/lib/components/partial/asset-wrapper/asset-wrapper.component.js +2 -12
  21. package/esm5/lib/components/partial/folder-item/folder-item.component.js +2 -2
  22. package/esm5/lib/components/partial/folder-list/folder-list.component.js +40 -5
  23. package/esm5/lib/components/partial/node-details/node-details.component.js +82 -15
  24. package/esm5/lib/components/partial/node-tree/node-tree.component.js +184 -19
  25. package/esm5/lib/components/partial/search-box/search-box.component.js +2 -2
  26. package/esm5/lib/models/asset.model.js +15 -1
  27. package/esm5/lib/models/index.js +2 -2
  28. package/esm5/lib/services/asset.service.js +61 -8
  29. package/esm5/lib/services/env-config.service.js +3 -1
  30. package/esm5/lib/services/node-tree.service.js +23 -9
  31. package/fesm2015/rs-pk-asset-management.js +317 -47
  32. package/fesm2015/rs-pk-asset-management.js.map +1 -1
  33. package/fesm5/rs-pk-asset-management.js +401 -66
  34. package/fesm5/rs-pk-asset-management.js.map +1 -1
  35. package/lib/components/partial/asset-wrapper/asset-wrapper.component.d.ts +0 -1
  36. package/lib/components/partial/folder-list/folder-list.component.d.ts +8 -2
  37. package/lib/components/partial/node-details/node-details.component.d.ts +10 -0
  38. package/lib/components/partial/node-tree/node-tree.component.d.ts +15 -1
  39. package/lib/models/asset.model.d.ts +7 -0
  40. package/lib/services/asset.service.d.ts +9 -2
  41. package/lib/services/env-config.service.d.ts +1 -0
  42. package/lib/services/node-tree.service.d.ts +2 -1
  43. package/package.json +1 -1
  44. package/rs-pk-asset-management.metadata.json +1 -1
@@ -7,7 +7,7 @@ import { MatInputModule } from '@angular/material/input';
7
7
  import { MatIconModule } from '@angular/material/icon';
8
8
  import { MatTooltipModule } from '@angular/material/tooltip';
9
9
  import { MatTreeModule } from '@angular/material/tree';
10
- import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
10
+ import { MatPaginator as MatPaginator$1, MatPaginatorModule } from '@angular/material/paginator';
11
11
  import { MatTableModule } from '@angular/material/table';
12
12
  import { MatProgressBarModule } from '@angular/material/progress-bar';
13
13
  import { MatMenuModule } from '@angular/material/menu';
@@ -21,7 +21,7 @@ import { BehaviorSubject as BehaviorSubject$1 } from 'rxjs/internal/BehaviorSubj
21
21
  import { map, distinctUntilChanged, takeUntil, switchMap } from 'rxjs/operators';
22
22
  import { Subject as Subject$1 } from 'rxjs/internal/Subject';
23
23
  import { DomSanitizer } from '@angular/platform-browser';
24
- import { MAT_DIALOG_DATA as MAT_DIALOG_DATA$1, MatDialogRef as MatDialogRef$1 } from '@angular/material';
24
+ import { MAT_DIALOG_DATA as MAT_DIALOG_DATA$1, MatDialogRef as MatDialogRef$1, MatPaginator } from '@angular/material';
25
25
  import { of } from 'rxjs/internal/observable/of';
26
26
  import { FlatTreeControl } from '@angular/cdk/tree';
27
27
  import { combineLatest } from 'rxjs/internal/observable/combineLatest';
@@ -72,6 +72,10 @@ if (false) {
72
72
  IAssetByIdPayload.prototype.assetId;
73
73
  /** @type {?|undefined} */
74
74
  IAssetByIdPayload.prototype.isFilter;
75
+ /** @type {?|undefined} */
76
+ IAssetByIdPayload.prototype.pageIndex;
77
+ /** @type {?|undefined} */
78
+ IAssetByIdPayload.prototype.pageSize;
75
79
  }
76
80
  /**
77
81
  * @record
@@ -80,6 +84,8 @@ function IInitialFolderTreeOptions() { }
80
84
  if (false) {
81
85
  /** @type {?|undefined} */
82
86
  IInitialFolderTreeOptions.prototype.dispatchRootId;
87
+ /** @type {?|undefined} */
88
+ IInitialFolderTreeOptions.prototype.pageSize;
83
89
  }
84
90
  class AssetModel {
85
91
  }
@@ -138,6 +144,8 @@ if (false) {
138
144
  AssetModel.prototype.HaveChildren;
139
145
  /** @type {?} */
140
146
  AssetModel.prototype.ParentId;
147
+ /** @type {?} */
148
+ AssetModel.prototype.Children;
141
149
  }
142
150
  class FolderTreeModel extends AssetModel {
143
151
  }
@@ -176,6 +184,12 @@ BackgroudProcessingStatus[BackgroudProcessingStatus.None] = 'None';
176
184
  BackgroudProcessingStatus[BackgroudProcessingStatus.InProcessing] = 'InProcessing';
177
185
  BackgroudProcessingStatus[BackgroudProcessingStatus.Processed] = 'Processed';
178
186
  BackgroudProcessingStatus[BackgroudProcessingStatus.Failed] = 'Failed';
187
+ /** @type {?} */
188
+ const MAX_FOLDER_TREE_SIZE = 10;
189
+ /** @type {?} */
190
+ const DEFAULT_FOLDER_TREE_INDEX = 0;
191
+ /** @type {?} */
192
+ const ROOT_ASSET_ID = 'ROOT';
179
193
 
180
194
  /**
181
195
  * @fileoverview added by tsickle
@@ -406,6 +420,8 @@ if (false) {
406
420
  AMConfig.prototype.asset2Url;
407
421
  /** @type {?|undefined} */
408
422
  AMConfig.prototype.requestHeader;
423
+ /** @type {?|undefined} */
424
+ AMConfig.prototype.pageFolderSize;
409
425
  }
410
426
  /** @type {?} */
411
427
  const AM_CONFIG = new InjectionToken('asset.man.config.angular');
@@ -477,6 +493,14 @@ class AssetService {
477
493
  this.baseUrl = this._env.asset2Url;
478
494
  this.initOptionFiles();
479
495
  }
496
+ /**
497
+ * @return {?}
498
+ */
499
+ get AMConfig() {
500
+ return {
501
+ pageFolderSize: this._env.pageFolderSize
502
+ };
503
+ }
480
504
  /**
481
505
  * @private
482
506
  * @return {?}
@@ -485,6 +509,8 @@ class AssetService {
485
509
  this.keyword = '';
486
510
  this.pageSize = 12;
487
511
  this.pageIndex = 0;
512
+ this.pageFolderSize = this._env.pageFolderSize || MAX_FOLDER_TREE_SIZE;
513
+ this.pageFolderIndex = 0;
488
514
  this.folderTotal = 0;
489
515
  this.fileTotal = 0;
490
516
  this.sortBy = SortFilesBy.MODIFIED_DATE;
@@ -513,11 +539,12 @@ class AssetService {
513
539
  }
514
540
  /**
515
541
  * @param {?} folders
516
- * @param {?=} folderTotal
542
+ * @param {?=} pagination
517
543
  * @return {?}
518
544
  */
519
- setFolderList(folders, folderTotal) {
520
- this.folderTotal = folderTotal || 0;
545
+ setFolderList(folders, pagination) {
546
+ this.setFolderTreePagination(pagination);
547
+ this.setFolderPagination(pagination);
521
548
  this.folderList$.next(folders);
522
549
  }
523
550
  /**
@@ -560,6 +587,27 @@ class AssetService {
560
587
  this.pageSize = pagination.PageSize;
561
588
  }
562
589
  }
590
+ /**
591
+ * @private
592
+ * @param {?} pagination
593
+ * @return {?}
594
+ */
595
+ setFolderPagination(pagination) {
596
+ if (pagination) {
597
+ this.folderTotal = pagination.Total;
598
+ this.pageFolderIndex = pagination.PageIndex;
599
+ this.pageFolderSize = pagination.PageSize;
600
+ }
601
+ }
602
+ /**
603
+ * @param {?} pagination
604
+ * @return {?}
605
+ */
606
+ setFolderTreePagination(pagination) {
607
+ if (pagination) {
608
+ this.folderTotal = pagination.Total;
609
+ }
610
+ }
563
611
  /**
564
612
  * @param {?} assetId
565
613
  * @return {?}
@@ -573,11 +621,15 @@ class AssetService {
573
621
  * @param {?} __0
574
622
  * @return {?}
575
623
  */
576
- getChildrenFolders({ assetId, isFilter = true }) {
624
+ getChildrenFolders({ assetId, isFilter = true, pageIndex = DEFAULT_FOLDER_TREE_INDEX, pageSize = this._env.pageFolderSize || MAX_FOLDER_TREE_SIZE }) {
577
625
  /** @type {?} */
578
626
  const url = `${this.baseUrl}/File/GetChildren`;
579
627
  /** @type {?} */
580
- let params = new HttpParams().set('getAll', 'true').set('isFolder', 'true');
628
+ let params = new HttpParams()
629
+ .set('getAll', 'true')
630
+ .set('isFolder', 'true')
631
+ .set('pageSize', `${pageSize}`)
632
+ .set('pageIndex', `${pageIndex}`);
581
633
  if (assetId) {
582
634
  params = params.set('assetId', assetId);
583
635
  }
@@ -648,6 +700,10 @@ if (false) {
648
700
  /** @type {?} */
649
701
  AssetService.prototype.pageIndex;
650
702
  /** @type {?} */
703
+ AssetService.prototype.pageFolderSize;
704
+ /** @type {?} */
705
+ AssetService.prototype.pageFolderIndex;
706
+ /** @type {?} */
651
707
  AssetService.prototype.folderTotal;
652
708
  /** @type {?} */
653
709
  AssetService.prototype.fileTotal;
@@ -1013,13 +1069,13 @@ class NodeTreeService {
1013
1069
  * @param {?} __0
1014
1070
  * @return {?}
1015
1071
  */
1016
- initialData({ dispatchRootId }) {
1072
+ initialData({ dispatchRootId, pageSize = this.assetService.AMConfig.pageFolderSize || MAX_FOLDER_TREE_SIZE }) {
1017
1073
  return __awaiter(this, void 0, void 0, function* () {
1018
1074
  if (dispatchRootId) {
1019
1075
  this.loading$.next(true);
1020
1076
  }
1021
1077
  /** @type {?} */
1022
- const result = yield this.assetService.getChildrenFolders({ isFilter: false }).toPromise();
1078
+ const result = yield this.assetService.getChildrenFolders({ isFilter: false, pageIndex: 0, pageSize }).toPromise();
1023
1079
  if (!result) {
1024
1080
  return;
1025
1081
  }
@@ -1039,7 +1095,7 @@ class NodeTreeService {
1039
1095
  * @param {?} folder
1040
1096
  * @return {?}
1041
1097
  */
1042
- (folder) => new DynamicFlatNode(folder, 0, this.isExpandable(folder))));
1098
+ (folder) => this.getDynamicFlatNode(folder, 0)));
1043
1099
  this.initialData$.next(initData);
1044
1100
  if (dispatchRootId) {
1045
1101
  this.loading$.next(false);
@@ -1047,6 +1103,14 @@ class NodeTreeService {
1047
1103
  return this.initialData$.getValue();
1048
1104
  });
1049
1105
  }
1106
+ /**
1107
+ * @param {?} node
1108
+ * @param {?=} level
1109
+ * @return {?}
1110
+ */
1111
+ getDynamicFlatNode(node, level = 0) {
1112
+ return new DynamicFlatNode(node, level, this.isExpandable(node));
1113
+ }
1050
1114
  /**
1051
1115
  * @param {?} node
1052
1116
  * @return {?}
@@ -1061,7 +1125,7 @@ class NodeTreeService {
1061
1125
  * @return {?}
1062
1126
  */
1063
1127
  isExpandable(node) {
1064
- return node.HaveChildren;
1128
+ return Boolean(node.HaveChildren);
1065
1129
  }
1066
1130
  /**
1067
1131
  * Add asset to stored data
@@ -1467,7 +1531,6 @@ class AssetManagementDialogComponent {
1467
1531
  * @return {?}
1468
1532
  */
1469
1533
  ngOnInit() {
1470
- console.log('Assest Management Dialog', this.data);
1471
1534
  this.initDialogConfig(this.data);
1472
1535
  select((/**
1473
1536
  * @param {?} state
@@ -2936,7 +2999,7 @@ class FolderItemComponent {
2936
2999
  FolderItemComponent.decorators = [
2937
3000
  { type: Component, args: [{
2938
3001
  selector: 'lib-folder-item',
2939
- template: "<div class=\"folder\" (dblclick)=\"openFolder()\">\n <mat-icon class=\"folder__icon\">folder</mat-icon>\n <span class=\"folder__name\" [matTooltip]=\"folder.OriginalFileName\">\n {{ folder.OriginalFileName }}\n </span>\n <mat-icon class=\"folder__action\" [matMenuTriggerFor]=\"menu\"\n >more_vert</mat-icon\n >\n</div>\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"renameFolder()\" [disabled]=\"!hasModifyPermission\">\n <mat-icon>edit_outline</mat-icon> <span>Rename</span>\n </button>\n <button mat-menu-item (click)=\"deleteFolder()\" [disabled]=\"!hasArchivePermission\">\n <mat-icon color=\"warn\">delete_outline</mat-icon> <span>Delete</span>\n </button>\n</mat-menu>\n",
3002
+ template: "<div class=\"folder\" (dblclick)=\"openFolder()\">\n <mat-icon class=\"folder__icon\">folder</mat-icon>\n <span class=\"folder__name\" [matTooltip]=\"folder.OriginalFileName\">\n {{ folder.OriginalFileName }}\n </span>\n <mat-icon class=\"folder__action\" [matMenuTriggerFor]=\"menu\"\n >more_vert</mat-icon\n >\n</div>\n<mat-menu #menu=\"matMenu\">\n <button mat-menu-item (click)=\"renameFolder()\" [disabled]=\"!hasModifyPermission\">\n <mat-icon>edit_outline</mat-icon> <span>Rename</span>\n </button>\n <button mat-menu-item (click)=\"deleteFolder()\" [disabled]=\"!hasArchivePermission\">\n <mat-icon color=\"warn\">delete_outline</mat-icon> <span>Delete</span>\n </button>\n</mat-menu>",
2940
3003
  styles: [":host::ng-deep .folder{width:180px;height:50px;display:flex;position:relative;align-items:center;padding:5px 20px 5px 10px;border-radius:10px;cursor:pointer;transition:.3s}:host::ng-deep .folder:hover{background-color:#f1f1f1}:host::ng-deep .folder:hover .folder__action{display:block}:host::ng-deep .folder__icon{display:flex;align-items:center;color:#6fc0ff;font-size:38px;margin-right:20px}:host::ng-deep .folder__name{font-size:14px;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .folder__action{display:none;right:0;position:absolute;color:#979797;transition:.3s}:host::ng-deep .folder__action:hover{color:#000}"]
2941
3004
  }] }
2942
3005
  ];
@@ -2981,10 +3044,21 @@ class FolderListComponent {
2981
3044
  this.hasModifyPermission = true;
2982
3045
  this.hasAccessPermission = true;
2983
3046
  this.hasArchivePermission = true;
3047
+ this.onPageChange = new EventEmitter();
2984
3048
  this.loading = false;
2985
3049
  this.unsubscribe$ = new Subject$1();
2986
3050
  this.bindSubscriber();
2987
3051
  }
3052
+ /**
3053
+ * @return {?}
3054
+ */
3055
+ ngOnChanges() {
3056
+ if (this.paginator && this.pagination) {
3057
+ this.paginator.pageIndex = this.pagination.pageIndex;
3058
+ this.paginator.pageSize = this.pagination.pageSize;
3059
+ this.paginator.length = this.pagination.length;
3060
+ }
3061
+ }
2988
3062
  /**
2989
3063
  * @return {?}
2990
3064
  */
@@ -2996,6 +3070,13 @@ class FolderListComponent {
2996
3070
  this.unsubscribe$.next();
2997
3071
  this.unsubscribe$.complete();
2998
3072
  }
3073
+ /**
3074
+ * @param {?=} event
3075
+ * @return {?}
3076
+ */
3077
+ pageChange(event) {
3078
+ this.onPageChange.emit(event);
3079
+ }
2999
3080
  /**
3000
3081
  * @private
3001
3082
  * @return {?}
@@ -3019,8 +3100,8 @@ class FolderListComponent {
3019
3100
  FolderListComponent.decorators = [
3020
3101
  { type: Component, args: [{
3021
3102
  selector: 'lib-folder-list',
3022
- template: "<div class=\"folder-container\">\n <h6>Folders</h6>\n <div class=\"folder-list custom-scrollbar\">\n <lib-folder-item\n *ngFor=\"let folder of folders\"\n [folder]=\"folder\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n ></lib-folder-item>\n </div>\n <div class=\"folder-empty\" *ngIf=\"folders && !folders.length\">\n <span>This folder is empty.</span>\n </div>\n</div>\n",
3023
- styles: [":host::ng-deep .folder-container h6{color:#979797}:host::ng-deep .folder-container .folder-list{display:flex;flex-wrap:nowrap;overflow:auto;padding-bottom:10px}:host::ng-deep .folder-container .folder-empty{text-align:center;color:#979797;font-size:14px}"]
3103
+ template: "<div class=\"folder-container\">\n <h6>Folders</h6>\n <div class=\"folder-list custom-scrollbar\">\n <lib-folder-item\n *ngFor=\"let folder of folders\"\n [folder]=\"folder\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n ></lib-folder-item>\n </div>\n <div class=\"folder-empty\" *ngIf=\"folders && !folders.length\">\n <span>This folder is empty.</span>\n </div>\n <div [hidden]=\"!folders?.length\">\n <mat-paginator\n #paginator\n [pageSizeOptions]=\"[10, 20, 50, 100]\"\n (page)=\"pageChange($event)\"\n [showFirstLastButtons]=\"true\"\n >\n </mat-paginator>\n </div>\n</div>",
3104
+ styles: [":host::ng-deep .folder-container h6{color:#979797}:host::ng-deep .folder-container .folder-list{display:flex;flex-wrap:wrap;overflow:auto;padding-bottom:10px;max-height:320px}:host::ng-deep .folder-container .folder-empty{text-align:center;color:#979797;font-size:14px}"]
3024
3105
  }] }
3025
3106
  ];
3026
3107
  /** @nocollapse */
@@ -3029,7 +3110,10 @@ FolderListComponent.propDecorators = {
3029
3110
  hasModifyPermission: [{ type: Input }],
3030
3111
  hasAccessPermission: [{ type: Input }],
3031
3112
  hasArchivePermission: [{ type: Input }],
3032
- folders: [{ type: Input }]
3113
+ paginator: [{ type: ViewChild, args: [MatPaginator, { static: true },] }],
3114
+ folders: [{ type: Input }],
3115
+ pagination: [{ type: Input }],
3116
+ onPageChange: [{ type: Output }]
3033
3117
  };
3034
3118
  if (false) {
3035
3119
  /** @type {?} */
@@ -3039,8 +3123,14 @@ if (false) {
3039
3123
  /** @type {?} */
3040
3124
  FolderListComponent.prototype.hasArchivePermission;
3041
3125
  /** @type {?} */
3126
+ FolderListComponent.prototype.paginator;
3127
+ /** @type {?} */
3042
3128
  FolderListComponent.prototype.folders;
3043
3129
  /** @type {?} */
3130
+ FolderListComponent.prototype.pagination;
3131
+ /** @type {?} */
3132
+ FolderListComponent.prototype.onPageChange;
3133
+ /** @type {?} */
3044
3134
  FolderListComponent.prototype.loading;
3045
3135
  /**
3046
3136
  * @type {?}
@@ -3281,7 +3371,7 @@ AssetListComponent.propDecorators = {
3281
3371
  hasModifyPermission: [{ type: Input }],
3282
3372
  hasAccessPermission: [{ type: Input }],
3283
3373
  hasArchivePermission: [{ type: Input }],
3284
- paginator: [{ type: ViewChild, args: [MatPaginator, { static: true },] }],
3374
+ paginator: [{ type: ViewChild, args: [MatPaginator$1, { static: true },] }],
3285
3375
  assets: [{ type: Input }]
3286
3376
  };
3287
3377
  if (false) {
@@ -3439,7 +3529,6 @@ class AssetDialogComponent {
3439
3529
  * @return {?}
3440
3530
  */
3441
3531
  ngOnInit() {
3442
- console.log('data', this.data.permission);
3443
3532
  this.uploadAssetsService.supportedSize = this.assetsService.maxSize * 1024 * 1024;
3444
3533
  this.linkDownload = `${this._env.asset2Url}/File/Download/${this.data.assetId}`;
3445
3534
  this.getAssetDetail();
@@ -4249,17 +4338,22 @@ if (false) {
4249
4338
  */
4250
4339
  class NodeTreeComponent {
4251
4340
  /**
4341
+ * @param {?} assetService
4252
4342
  * @param {?} nodeTreeService
4253
4343
  * @param {?} svc
4254
4344
  * @param {?} changeDetectorRef
4255
4345
  */
4256
- constructor(nodeTreeService, svc, changeDetectorRef) {
4346
+ constructor(assetService, nodeTreeService, svc, changeDetectorRef) {
4347
+ this.assetService = assetService;
4257
4348
  this.nodeTreeService = nodeTreeService;
4258
4349
  this.svc = svc;
4259
4350
  this.changeDetectorRef = changeDetectorRef;
4351
+ this.ROOT_ASSET_ID = ROOT_ASSET_ID;
4260
4352
  this.isRoot = false;
4261
4353
  this.homeLoading = false;
4262
4354
  this.loading = false;
4355
+ this.loadingMoreList = {};
4356
+ this.folderChildrenMap = new Map();
4263
4357
  this.unsubscribe$ = new Subject();
4264
4358
  this.getLevel = (/**
4265
4359
  * @param {?} node
@@ -4280,6 +4374,17 @@ class NodeTreeComponent {
4280
4374
  this.treeControl = new FlatTreeControl(this.getLevel, this.isExpandable);
4281
4375
  this.dataSource = new NodeTreeDataSource(this.treeControl, nodeTreeService);
4282
4376
  }
4377
+ /**
4378
+ * @return {?}
4379
+ */
4380
+ get folderTreeMeta() {
4381
+ /** @type {?} */
4382
+ const rootFolder = this.folderChildrenMap.get(ROOT_ASSET_ID);
4383
+ return {
4384
+ length: rootFolder ? rootFolder.size : 0,
4385
+ total: this.nodeTreeService.rootFolder ? this.nodeTreeService.rootFolder.TotalFolder || '0' : 0,
4386
+ };
4387
+ }
4283
4388
  /**
4284
4389
  * @return {?}
4285
4390
  */
@@ -4297,6 +4402,24 @@ class NodeTreeComponent {
4297
4402
  this.changeDetectorRef.detectChanges();
4298
4403
  });
4299
4404
  }
4405
+ /**
4406
+ * @param {?} id
4407
+ * @return {?}
4408
+ */
4409
+ getFolderChildrenSize(id) {
4410
+ /** @type {?} */
4411
+ const children = this.folderChildrenMap.get(id);
4412
+ return children ? children.size : 0;
4413
+ }
4414
+ /**
4415
+ * @param {?} node
4416
+ * @return {?}
4417
+ */
4418
+ canLoadMore(node) {
4419
+ /** @type {?} */
4420
+ const size = this.getFolderChildrenSize(node.item.AssetId);
4421
+ return size < node.item.TotalFolder;
4422
+ }
4300
4423
  /**
4301
4424
  * @private
4302
4425
  * @return {?}
@@ -4337,6 +4460,7 @@ class NodeTreeComponent {
4337
4460
  */
4338
4461
  (data) => {
4339
4462
  if (data && data.length) {
4463
+ this.handleDatasourceChange(data);
4340
4464
  this.changeDetectorRef.detectChanges();
4341
4465
  }
4342
4466
  }));
@@ -4377,6 +4501,35 @@ class NodeTreeComponent {
4377
4501
  this.changeDetectorRef.detectChanges();
4378
4502
  })));
4379
4503
  }
4504
+ /**
4505
+ * @private
4506
+ * @param {?=} data
4507
+ * @return {?}
4508
+ */
4509
+ handleDatasourceChange(data = []) {
4510
+ if (!data || !data.length)
4511
+ return;
4512
+ /** @type {?} */
4513
+ const maps = new Map();
4514
+ maps.set(ROOT_ASSET_ID, new Map());
4515
+ data.forEach((/**
4516
+ * @param {?} node
4517
+ * @return {?}
4518
+ */
4519
+ (node) => {
4520
+ /** @type {?} */
4521
+ const nodeId = node.item.AssetId;
4522
+ /** @type {?} */
4523
+ const parent = this.getParent(node);
4524
+ /** @type {?} */
4525
+ const parentId = parent ? parent.item.AssetId : ROOT_ASSET_ID;
4526
+ if (!maps.has(parentId)) {
4527
+ maps.set(parentId, new Map());
4528
+ }
4529
+ maps.get(parentId).set(nodeId, node);
4530
+ }));
4531
+ this.folderChildrenMap = maps;
4532
+ }
4380
4533
  /**
4381
4534
  * @param {?} node
4382
4535
  * @return {?}
@@ -4411,6 +4564,58 @@ class NodeTreeComponent {
4411
4564
  });
4412
4565
  }
4413
4566
  }
4567
+ /**
4568
+ * @param {?=} node
4569
+ * @return {?}
4570
+ */
4571
+ loadMoreFolder(node) {
4572
+ return __awaiter(this, void 0, void 0, function* () {
4573
+ /** @type {?} */
4574
+ const id = node ? node.item.AssetId : ROOT_ASSET_ID;
4575
+ try {
4576
+ this.setLoadingMore(id, true);
4577
+ /** @type {?} */
4578
+ const children = this.folderChildrenMap.get(id);
4579
+ /** @type {?} */
4580
+ const itemsPerPage = this.assetService.AMConfig.pageFolderSize || MAX_FOLDER_TREE_SIZE;
4581
+ /** @type {?} */
4582
+ const result = yield this.assetService.getChildrenFolders({
4583
+ assetId: id === ROOT_ASSET_ID ? null : id,
4584
+ isFilter: false,
4585
+ pageIndex: Math.round((children ? children.size : 0) / itemsPerPage)
4586
+ }).toPromise();
4587
+ /** @type {?} */
4588
+ const assetChildren = result.Data.Children || [];
4589
+ // Handle datasource
4590
+ /** @type {?} */
4591
+ const index = this.dataSource.data.indexOf(node);
4592
+ /** @type {?} */
4593
+ const nodes = assetChildren.map((/**
4594
+ * @param {?} folder
4595
+ * @return {?}
4596
+ */
4597
+ (folder) => {
4598
+ this.nodeTreeService.addNode(folder, id);
4599
+ return this.nodeTreeService.getDynamicFlatNode(folder, node ? node.level + 1 : 0);
4600
+ }));
4601
+ if (id !== ROOT_ASSET_ID) {
4602
+ /** @type {?} */
4603
+ const updatedData = this.dataSource.data.slice();
4604
+ updatedData.splice(index + 1, 0, ...nodes);
4605
+ this.dataSource.data = updatedData;
4606
+ }
4607
+ else {
4608
+ this.dataSource.data = [...this.dataSource.data, ...nodes];
4609
+ }
4610
+ this.setLoadingMore(id, false);
4611
+ this.changeDetectorRef.detectChanges();
4612
+ }
4613
+ catch (error) {
4614
+ console.log('Load more folder error', error);
4615
+ this.setLoadingMore(id, false);
4616
+ }
4617
+ });
4618
+ }
4414
4619
  /**
4415
4620
  * @param {?} node
4416
4621
  * @return {?}
@@ -4473,6 +4678,7 @@ class NodeTreeComponent {
4473
4678
  /** @type {?} */
4474
4679
  const parent = this.getParent(node);
4475
4680
  if (parent) {
4681
+ // Reload parent folder (get children and expand it again)
4476
4682
  yield this.dataSource.reloadNode(parent);
4477
4683
  /** @type {?} */
4478
4684
  const updatedNode = this.getNodeById(id);
@@ -4481,20 +4687,30 @@ class NodeTreeComponent {
4481
4687
  }
4482
4688
  }
4483
4689
  else {
4484
- yield this.nodeTreeService.initialData({ dispatchRootId: false });
4485
- /** @type {?} */
4486
- const updatedNode = this.getNodeById(id);
4487
- if (updatedNode) {
4488
- yield this.treeControl.expand(updatedNode);
4489
- }
4690
+ // BUG: This will reload the root folder when the user selects a folder from the tree
4691
+ // await this.nodeTreeService.initialData({ dispatchRootId: false });
4692
+ // const updatedNode = this.getNodeById(id);
4693
+ // if (updatedNode) {
4694
+ // await this.treeControl.expand(updatedNode);
4695
+ // }
4490
4696
  }
4491
4697
  }
4492
4698
  else {
4699
+ // Reload root folder
4493
4700
  yield this.nodeTreeService.initialData({ dispatchRootId: false });
4494
4701
  }
4495
4702
  this.loading = false;
4496
4703
  });
4497
4704
  }
4705
+ /**
4706
+ * @private
4707
+ * @param {?} id
4708
+ * @param {?} value
4709
+ * @return {?}
4710
+ */
4711
+ setLoadingMore(id, value) {
4712
+ this.loadingMoreList[id] = value;
4713
+ }
4498
4714
  /**
4499
4715
  * @return {?}
4500
4716
  */
@@ -4508,12 +4724,13 @@ class NodeTreeComponent {
4508
4724
  NodeTreeComponent.decorators = [
4509
4725
  { type: Component, args: [{
4510
4726
  selector: 'lib-node-tree',
4511
- template: "<div class=\"node custom-scrollbar node-tree\">\n <div class=\"node__home\" (click)=\"backToHome()\" [ngClass]=\"{ active: isRoot,\n disabled: loading || homeLoading}\">\n <mat-icon *ngIf=\"!homeLoading\">home</mat-icon>\n <mat-spinner *ngIf=\"homeLoading\" [diameter]=\"20\"\n class=\"node__home--loading\"></mat-spinner>\n <span>Home</span>\n </div>\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\"\n class=\"node__item\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding\n [ngClass]=\"{ active: checked(node),disabled: loading || node.isLoading }\"\n (click)=\"selectNode(node)\">\n <button mat-icon-button disabled class=\"node__item--pading\"></button>\n <div class=\"node__item--info\" [style.maxWidth.px]=\"width -50\">\n <mat-icon class=\"folder-icon\">folder</mat-icon>\n <div class=\"node-name\">\n <span>\n {{ node.item.OriginalFileName }}\n </span>\n <span class=\"node-summary\" *ngIf=\"node.item?.TotalFolder ||\n node.item?.TotalFile\">\n <small *ngIf=\"node.item?.TotalFolder\">{{ node.item?.TotalFolder}}\n {{node.item?.TotalFolder> 1 ?\n 'folders':'folder'}}</small>\n <small *ngIf=\"node.item?.TotalFolder && node.item?.TotalFile\">,\n </small>\n <small *ngIf=\"node.item?.TotalFile\">{{ node.item?.TotalFile}}\n {{node.item?.TotalFile> 1 ?\n 'files':'file'}}</small>\n </span>\n </div>\n </div>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding\n (click)=\"selectNode(node)\"\n [ngClass]=\"{ active: checked(node), disabled: loading || node.isLoading\n }\">\n <button mat-icon-button [attr.aria-label]=\"'Toggle ' +\n node.item.OriginalFileName\" matTreeNodeToggle\n [disabled]=\"node.isLoading\">\n <mat-icon *ngIf=\"!node.isLoading\" class=\"mat-icon-rtl-mirror\">\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n <mat-spinner *ngIf=\"node.isLoading\" [diameter]=\"20\"\n class=\"node__item--loading\"></mat-spinner>\n </button>\n <div class=\"node__item--info\" [style.maxWidth.px]=\"width -50\">\n <mat-icon class=\"folder-icon\">folder</mat-icon>\n <div class=\"node-name\">\n <span>\n {{ node.item.OriginalFileName }}\n </span>\n <span class=\"node-summary\">\n <small *ngIf=\"node.item?.TotalFolder\">{{ node.item?.TotalFolder}}\n {{node.item?.TotalFolder> 1 ?\n 'folders':'folder'}}</small>\n <small *ngIf=\"node.item?.TotalFolder && node.item?.TotalFile\">,\n </small>\n <small *ngIf=\"node.item?.TotalFile\">{{ node.item?.TotalFile}}\n {{node.item?.TotalFile> 1 ?\n 'files':'file'}}</small>\n </span>\n </div>\n </div>\n </mat-tree-node>\n </mat-tree>\n</div>",
4512
- styles: [":host::ng-deep .node{overflow-x:hidden;height:100%;display:-ms-grid;display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}:host::ng-deep .node__home{padding:8px 10px;display:flex;align-items:center;height:44px}:host::ng-deep .node__home .mat-icon{color:#979797;margin-right:15px;margin-bottom:10px;font-size:32px}:host::ng-deep .node__home .node__home--loading{margin-right:19px}:host::ng-deep .node__item--loading{margin-left:10px}:host::ng-deep .node__item--info{display:flex;align-items:center}:host::ng-deep .node__item--info .folder-icon{display:flex;align-items:center;color:#6fc0ff;font-size:32px;margin-right:20px}:host::ng-deep .node__item--info .node-name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .node__item--info .node-name span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .node__item--info .node-name .node-summary{margin-top:-5px;color:#979797}:host::ng-deep .node .mat-tree{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:100%}:host::ng-deep .node .mat-tree .mat-tree-node{padding:5px 0;min-height:44px}:host::ng-deep .node .mat-tree .mat-tree-node .node__item--pading{height:20px}:host::ng-deep .node .mat-tree-node:hover,:host::ng-deep .node .node__home{transition:.3s;cursor:pointer}:host::ng-deep .node .mat-tree-node:hover:hover,:host::ng-deep .node .node__home:hover{background-color:#e8e8e8}:host::ng-deep .node .active{background-color:#f0f0f0}:host::ng-deep .node .disabled{pointer-events:none}"]
4727
+ template: "<div class=\"node custom-scrollbar node-tree\">\n <div class=\"node__home\" (click)=\"backToHome()\" [ngClass]=\"{ active: isRoot,\n disabled: loading || homeLoading}\">\n <mat-icon *ngIf=\"!homeLoading\">home</mat-icon>\n <mat-spinner *ngIf=\"homeLoading\" [diameter]=\"20\"\n class=\"node__home--loading\"></mat-spinner>\n <span>Home</span>\n </div>\n <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\"\n class=\"node__item\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodePadding\n [ngClass]=\"{ active: checked(node),disabled: loading || node.isLoading }\"\n (click)=\"selectNode(node)\">\n <button mat-icon-button disabled class=\"node__item--pading\"></button>\n <div class=\"node__item--info\" [style.maxWidth.px]=\"width -50\">\n <mat-icon class=\"folder-icon\">folder</mat-icon>\n <div class=\"node-name\">\n <span>\n {{ node.item.OriginalFileName }}\n </span>\n <span class=\"node-summary\" *ngIf=\"node.item?.TotalFolder ||\n node.item?.TotalFile\">\n <small *ngIf=\"node.item?.TotalFolder\">{{ node.item?.TotalFolder}}\n {{node.item?.TotalFolder> 1 ?\n 'folders':'folder'}}</small>\n <small *ngIf=\"node.item?.TotalFolder && node.item?.TotalFile\">,\n </small>\n <small *ngIf=\"node.item?.TotalFile\">{{ node.item?.TotalFile}}\n {{node.item?.TotalFile> 1 ?\n 'files':'file'}}</small>\n </span>\n </div>\n </div>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding \n [ngClass]=\"{ active: checked(node), disabled: loading || node.isLoading\n }\">\n <div class=\"d-flex align-items-center\" (click)=\"selectNode(node)\">\n <button mat-icon-button [attr.aria-label]=\"'Toggle ' +\n node.item.OriginalFileName\" matTreeNodeToggle\n [disabled]=\"node.isLoading\">\n <mat-icon *ngIf=\"!node.isLoading\" class=\"mat-icon-rtl-mirror\">\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n <mat-spinner *ngIf=\"node.isLoading\" [diameter]=\"20\"\n class=\"node__item--loading\"></mat-spinner>\n </button>\n <div class=\"node__item--info\" [style.maxWidth.px]=\"width -50\">\n <mat-icon class=\"folder-icon\">folder</mat-icon>\n <div class=\"node-name\">\n <span>\n {{ node.item.OriginalFileName }}\n </span>\n <span class=\"node-summary\">\n <small *ngIf=\"node.item?.TotalFolder\"><ng-container *ngIf=\"treeControl.isExpanded(node)\"><b>{{getFolderChildrenSize(node.item.AssetId)}}</b>/</ng-container>{{ node.item?.TotalFolder}}\n {{node.item?.TotalFolder> 1 ?\n 'folders':'folder'}}</small>\n <small *ngIf=\"node.item?.TotalFolder && node.item?.TotalFile\">,\n </small>\n <small *ngIf=\"node.item?.TotalFile\">{{ node.item?.TotalFile}}\n {{node.item?.TotalFile> 1 ?\n 'files':'file'}}</small>\n </span>\n </div>\n </div>\n </div>\n <ng-container *ngIf=\"treeControl.isExpanded(node)\"> \n <div *ngIf=\"!!loadingMoreList[node.item.AssetId]\" class=\"mx-2\" [style.minWidth.px]=\"40\">\n <mat-spinner [diameter]=\"20\"\n class=\"node__item--loading\"></mat-spinner>\n </div>\n <button *ngIf=\"!loadingMoreList[node.item.AssetId] && canLoadMore(node)\" matTooltip=\"Load More\" class=\"mx-2\" mat-icon-button (click)=\"loadMoreFolder(node)\" [disabled]=\"loadingMoreList[node.item.AssetId] || homeLoading || loading\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#5f6368\"><path d=\"m482-200 114-113-114-113-42 42 43 43q-28 1-54.5-9T381-381q-20-20-30.5-46T340-479q0-17 4.5-34t12.5-33l-44-44q-17 25-25 53t-8 57q0 38 15 75t44 66q29 29 65 43.5t74 15.5l-38 38 42 42Zm165-170q17-25 25-53t8-57q0-38-14.5-75.5T622-622q-29-29-65.5-43T482-679l38-39-42-42-114 113 114 113 42-42-44-44q27 0 55 10.5t48 30.5q20 20 30.5 46t10.5 52q0 17-4.5 34T603-414l44 44ZM480-80q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z\"/></svg>\n </button>\n </ng-container>\n </mat-tree-node>\n </mat-tree>\n <div class=\"p-2 d-flex flex-column align-items-center justify-content-center\" *ngIf=\"folderTreeMeta.length\">\n <button mat-raised-button *ngIf=\"folderTreeMeta.length !== folderTreeMeta.total\" (click)=\"loadMoreFolder()\" [disabled]=\"loadingMoreList[ROOT_ASSET_ID] || loading || homeLoading\">\n <div class=\"d-flex align-items-center\">\n <mat-spinner [diameter]=\"20\" *ngIf=\"loadingMoreList[ROOT_ASSET_ID]\"></mat-spinner>\n <mat-icon *ngIf=\"!loadingMoreList[ROOT_ASSET_ID]\">expand_more</mat-icon>\n <div class=\"ml-2\">Load More</div>\n </div>\n </button>\n <div class=\"mt-2\" [style.fontSize.px]=\"13\"><b>{{ folderTreeMeta.length }}</b> of <b>{{ folderTreeMeta.total }} folders</b></div>\n </div>\n</div>",
4728
+ styles: [":host::ng-deep .node{overflow-x:hidden;height:100%;display:-ms-grid;display:grid;grid-auto-rows:-webkit-max-content;grid-auto-rows:max-content}:host::ng-deep .node-tree{max-height:max(800px,90vh);overflow-y:auto}:host::ng-deep .node__home{padding:8px 10px;display:flex;align-items:center;height:44px}:host::ng-deep .node__home .mat-icon{color:#979797;margin-right:15px;margin-bottom:10px;font-size:32px}:host::ng-deep .node__home .node__home--loading{margin-right:19px}:host::ng-deep .node__item--loading{margin-left:10px}:host::ng-deep .node__item--info{display:flex;align-items:center}:host::ng-deep .node__item--info .folder-icon{display:flex;align-items:center;color:#6fc0ff;font-size:32px;margin-right:20px}:host::ng-deep .node__item--info .node-name{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .node__item--info .node-name span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host::ng-deep .node__item--info .node-name .node-summary{margin-top:-5px;color:#979797}:host::ng-deep .node .mat-tree{width:-webkit-max-content!important;width:-moz-max-content!important;width:max-content!important;min-width:100%}:host::ng-deep .node .mat-tree .mat-tree-node{padding:5px 0;min-height:44px}:host::ng-deep .node .mat-tree .mat-tree-node .node__item--pading{height:20px}:host::ng-deep .node .mat-tree-node:hover,:host::ng-deep .node .node__home{transition:.3s;cursor:pointer}:host::ng-deep .node .mat-tree-node:hover:hover,:host::ng-deep .node .node__home:hover{background-color:#e8e8e8}:host::ng-deep .node .active{background-color:#f0f0f0}:host::ng-deep .node .disabled{pointer-events:none}"]
4513
4729
  }] }
4514
4730
  ];
4515
4731
  /** @nocollapse */
4516
4732
  NodeTreeComponent.ctorParameters = () => [
4733
+ { type: AssetService },
4517
4734
  { type: NodeTreeService },
4518
4735
  { type: AssetManagementService },
4519
4736
  { type: ChangeDetectorRef }
@@ -4525,6 +4742,8 @@ if (false) {
4525
4742
  /** @type {?} */
4526
4743
  NodeTreeComponent.prototype.width;
4527
4744
  /** @type {?} */
4745
+ NodeTreeComponent.prototype.ROOT_ASSET_ID;
4746
+ /** @type {?} */
4528
4747
  NodeTreeComponent.prototype.currentFolderId;
4529
4748
  /** @type {?} */
4530
4749
  NodeTreeComponent.prototype.isRoot;
@@ -4533,9 +4752,13 @@ if (false) {
4533
4752
  /** @type {?} */
4534
4753
  NodeTreeComponent.prototype.loading;
4535
4754
  /** @type {?} */
4755
+ NodeTreeComponent.prototype.loadingMoreList;
4756
+ /** @type {?} */
4536
4757
  NodeTreeComponent.prototype.treeControl;
4537
4758
  /** @type {?} */
4538
4759
  NodeTreeComponent.prototype.dataSource;
4760
+ /** @type {?} */
4761
+ NodeTreeComponent.prototype.folderChildrenMap;
4539
4762
  /**
4540
4763
  * @type {?}
4541
4764
  * @private
@@ -4547,6 +4770,8 @@ if (false) {
4547
4770
  NodeTreeComponent.prototype.isExpandable;
4548
4771
  /** @type {?} */
4549
4772
  NodeTreeComponent.prototype.hasChild;
4773
+ /** @type {?} */
4774
+ NodeTreeComponent.prototype.assetService;
4550
4775
  /**
4551
4776
  * @type {?}
4552
4777
  * @private
@@ -4772,7 +4997,7 @@ class SearchBoxComponent {
4772
4997
  * @return {?}
4773
4998
  */
4774
4999
  ([folders, assets]) => {
4775
- this.assetService.setFolderList(folders.Data, folders.Meta.Total);
5000
+ this.assetService.setFolderList(folders.Data, { Total: folders.Data.TotalFolder });
4776
5001
  this.assetService.setAssetList(assets.Data.Children, assets.Meta);
4777
5002
  }))
4778
5003
  .add((/**
@@ -4937,16 +5162,9 @@ class AssetWrapperComponent {
4937
5162
  this.hasArchivePermission = true;
4938
5163
  this.assets = new EventEmitter();
4939
5164
  this.unsubscribe$ = new Subject$1();
4940
- this.nodeTreeMinWidth = 250;
5165
+ this.nodeTreeMinWidth = 300;
4941
5166
  this.nodeTreeMaxWidth = 700;
4942
5167
  }
4943
- /**
4944
- * @return {?}
4945
- */
4946
- ngOnChanges() {
4947
- console.log('modify', this.hasModifyPermission);
4948
- console.log('archive', this.hasArchivePermission);
4949
- }
4950
5168
  /**
4951
5169
  * @return {?}
4952
5170
  */
@@ -5284,17 +5502,20 @@ class NodeDetailsComponent {
5284
5502
  type: ActionTypes.SET_GLOBAL_LOADING,
5285
5503
  payload: true,
5286
5504
  });
5505
+ const { pageIndex, pageSize } = this.getFolderPagePagination();
5287
5506
  this.assetService
5288
- .getChildrenFolders({ assetId: id })
5507
+ .getChildrenFolders({ assetId: id, pageIndex, pageSize })
5289
5508
  .pipe(takeUntil(this.unsubscribe$))
5290
5509
  .subscribe((/**
5291
5510
  * @param {?} res
5292
5511
  * @return {?}
5293
5512
  */
5294
5513
  (res) => {
5295
- this.assetService.setFolderList(res.Data, res.Meta.Total);
5296
- if (res.Data && res.Data.Children) {
5297
- res.Data.Children.forEach((/**
5514
+ const { Data } = res;
5515
+ const { Children } = Data;
5516
+ this.setFolderList(res);
5517
+ if (Children) {
5518
+ Children.forEach((/**
5298
5519
  * @param {?} node
5299
5520
  * @return {?}
5300
5521
  */
@@ -5311,6 +5532,18 @@ class NodeDetailsComponent {
5311
5532
  });
5312
5533
  }));
5313
5534
  }
5535
+ /**
5536
+ * @private
5537
+ * @param {?} res
5538
+ * @return {?}
5539
+ */
5540
+ setFolderList(res) {
5541
+ const { Data, Meta } = res;
5542
+ const { TotalFolder } = Data;
5543
+ const { PageIndex, PageSize } = Meta;
5544
+ this.assetService.setFolderList(Data, { Total: TotalFolder, PageIndex, PageSize });
5545
+ this.setFolderPagination({ length: TotalFolder, pageIndex: PageIndex, pageSize: PageSize });
5546
+ }
5314
5547
  /**
5315
5548
  * @private
5316
5549
  * @param {?} id
@@ -5321,8 +5554,9 @@ class NodeDetailsComponent {
5321
5554
  type: ActionTypes.SET_GLOBAL_LOADING,
5322
5555
  payload: true,
5323
5556
  });
5557
+ const { pageIndex, pageSize } = this.getFolderPagePagination();
5324
5558
  combineLatest([
5325
- this.assetService.getChildrenFolders({ assetId: id }),
5559
+ this.assetService.getChildrenFolders({ assetId: id, pageIndex, pageSize }),
5326
5560
  this.assetService.getChildrenAssets({
5327
5561
  assetId: id,
5328
5562
  }),
@@ -5332,11 +5566,11 @@ class NodeDetailsComponent {
5332
5566
  * @param {?} __0
5333
5567
  * @return {?}
5334
5568
  */
5335
- ([folders, assets]) => {
5336
- this.assetService.setFolderList(folders.Data, folders.Meta.Total);
5337
- this.assetService.setAssetList(assets.Data.Children, assets.Meta);
5338
- if (folders.Data && folders.Data.Children) {
5339
- folders.Data.Children.forEach((/**
5569
+ ([foldersRes, assetsRes]) => {
5570
+ this.setFolderList(foldersRes);
5571
+ this.assetService.setAssetList(assetsRes.Data.Children, assetsRes.Meta);
5572
+ if (foldersRes.Data && foldersRes.Data.Children) {
5573
+ foldersRes.Data.Children.forEach((/**
5340
5574
  * @param {?} node
5341
5575
  * @return {?}
5342
5576
  */
@@ -5353,6 +5587,40 @@ class NodeDetailsComponent {
5353
5587
  });
5354
5588
  }));
5355
5589
  }
5590
+ /**
5591
+ * @return {?}
5592
+ */
5593
+ getFolderPagePagination() {
5594
+ return {
5595
+ pageIndex: this.assetService.pageFolderIndex,
5596
+ pageSize: this.assetService.pageFolderSize,
5597
+ length: this.assetService.folderTotal,
5598
+ };
5599
+ }
5600
+ /**
5601
+ * @param {?} event
5602
+ * @return {?}
5603
+ */
5604
+ onFolderPageChange(event) {
5605
+ this.assetService.pageFolderIndex = event.pageIndex;
5606
+ this.assetService.pageFolderSize = event.pageSize;
5607
+ this.fetchFolder(this.currentFolder.AssetId);
5608
+ }
5609
+ /**
5610
+ * @private
5611
+ * @param {?} pagination
5612
+ * @return {?}
5613
+ */
5614
+ setFolderPagination(pagination) {
5615
+ if (!pagination)
5616
+ return;
5617
+ const { length, pageIndex, pageSize } = pagination;
5618
+ this.folderPagination = {
5619
+ pageIndex,
5620
+ pageSize,
5621
+ length
5622
+ };
5623
+ }
5356
5624
  /**
5357
5625
  * @return {?}
5358
5626
  */
@@ -5380,7 +5648,7 @@ class NodeDetailsComponent {
5380
5648
  NodeDetailsComponent.decorators = [
5381
5649
  { type: Component, args: [{
5382
5650
  selector: 'lib-node-details',
5383
- template: "<div class=\"node-details custom-scrollbar\">\n <div class=\"node-header\">\n <mat-progress-bar [style.visibility]=\"(loading$ | async) ? 'visible' : 'hidden'\" mode=\"indeterminate\">\n </mat-progress-bar>\n <div class=\"node-header-content\">\n <div class=\"node-header-content__left\">\n <H5 class=\"node-header-content__left--title\">\n <ng-container *ngIf=\"assetService?.keyword\">\n Search results for <span>{{ assetService?.keyword }}</span> in\n </ng-container>\n {{ currentFolder?.OriginalFileName }}\n </H5>\n <p *ngIf=\"!noResults\" class=\"node-header-content__left--subtitle\">\n {{ assetService?.folderTotal }}\n {{ assetService?.folderTotal > 1 ? 'folders' : 'folder' }},\n {{ assetService?.fileTotal }}\n {{ assetService?.fileTotal > 1 ? 'files': 'file' }}\n </p>\n </div>\n <div class=\"node-header-content__right\">\n <div class=\"button-wrapper\">\n <button mat-raised-button [disabled]=\"!selectedAssets?.length || !hasArchivePermission\" (click)=\"deleteAssets()\" color=\"warn\">\n <span>{{selectedAssets?.length > 1 ? 'Delete assets' : 'Delete asset'}}</span>\n <span *ngIf=\"selectedAssets?.length\" class=\"count\">({{ selectedAssets.length }})</span>\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"openUploadDialog()\" [disabled]=\"!currentFolder?.AssetId || !hasModifyPermission\">\n Upload asset\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"addFolder()\" [disabled]=\"!currentFolder?.AssetId || !hasModifyPermission\">\n Add folder\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"node-body\">\n <lib-search-not-found *ngIf=\"noResults; else contentAsset\"></lib-search-not-found>\n <ng-template #contentAsset>\n <lib-folder-list\n class=\"node-body__section\"\n [folders]=\"currentFolder?.Children\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n ></lib-folder-list>\n <lib-asset-list\n [assets]=\"assets\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n ></lib-asset-list>\n </ng-template>\n </div>\n</div>",
5651
+ template: "<div class=\"node-details custom-scrollbar\">\n <div class=\"node-header\">\n <mat-progress-bar [style.visibility]=\"(loading$ | async) ? 'visible' : 'hidden'\" mode=\"indeterminate\">\n </mat-progress-bar>\n <div class=\"node-header-content\">\n <div class=\"node-header-content__left\">\n <H5 class=\"node-header-content__left--title\">\n <ng-container *ngIf=\"assetService?.keyword\">\n Search results for <span>{{ assetService?.keyword }}</span> in\n </ng-container>\n {{ currentFolder?.OriginalFileName }}\n </H5>\n <p *ngIf=\"!noResults\" class=\"node-header-content__left--subtitle\">\n {{ assetService?.folderTotal }}\n {{ assetService?.folderTotal > 1 ? 'folders' : 'folder' }},\n {{ assetService?.fileTotal }}\n {{ assetService?.fileTotal > 1 ? 'files': 'file' }}\n </p>\n </div>\n <div class=\"node-header-content__right\">\n <div class=\"button-wrapper\">\n <button mat-raised-button [disabled]=\"!selectedAssets?.length || !hasArchivePermission\" (click)=\"deleteAssets()\" color=\"warn\">\n <span>{{selectedAssets?.length > 1 ? 'Delete assets' : 'Delete asset'}}</span>\n <span *ngIf=\"selectedAssets?.length\" class=\"count\">({{ selectedAssets.length }})</span>\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"openUploadDialog()\" [disabled]=\"!currentFolder?.AssetId || !hasModifyPermission\">\n Upload asset\n </button>\n <button mat-raised-button color=\"primary\" (click)=\"addFolder()\" [disabled]=\"!currentFolder?.AssetId || !hasModifyPermission\">\n Add folder\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"node-body\">\n <lib-search-not-found *ngIf=\"noResults; else contentAsset\"></lib-search-not-found>\n <ng-template #contentAsset>\n <lib-folder-list\n class=\"node-body__section\"\n [folders]=\"currentFolder?.Children\"\n [pagination]=\"folderPagination\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n (onPageChange)=\"onFolderPageChange($event)\"\n ></lib-folder-list>\n <lib-asset-list\n [assets]=\"assets\"\n [hasModifyPermission]=\"hasModifyPermission\"\n [hasAccessPermission]=\"hasAccessPermission\"\n [hasArchivePermission]=\"hasArchivePermission\"\n ></lib-asset-list>\n </ng-template>\n </div>\n</div>",
5384
5652
  styles: [":host::ng-deep .node-details{max-height:100%;overflow-y:auto}:host::ng-deep .node-details .node-header{position:-webkit-sticky;position:sticky;top:0;background-color:#fff;z-index:20}:host::ng-deep .node-details .node-header-content{padding:10px 20px;display:flex;justify-content:space-between;flex-wrap:wrap;gap:10px}:host::ng-deep .node-details .node-header-content__left--title{margin-bottom:5px}:host::ng-deep .node-details .node-header-content__left--title span{color:#fb3458}:host::ng-deep .node-details .node-header-content__left--subtitle{margin:0;color:#979797;font-size:14px}:host::ng-deep .node-details .node-header-content__right{flex:1}:host::ng-deep .node-details .node-header-content__right .button-wrapper{display:flex;gap:15px;justify-content:flex-end}:host::ng-deep .node-details .node-header-content__right .button-wrapper .count{margin-left:3px}:host::ng-deep .node-details .node-body{padding:0 20px}:host::ng-deep .node-details .node-body__section{display:block;margin-bottom:15px}"]
5385
5653
  }] }
5386
5654
  ];
@@ -5410,6 +5678,8 @@ if (false) {
5410
5678
  */
5411
5679
  NodeDetailsComponent.prototype.unsubscribe$;
5412
5680
  /** @type {?} */
5681
+ NodeDetailsComponent.prototype.folderPagination;
5682
+ /** @type {?} */
5413
5683
  NodeDetailsComponent.prototype.selectedAssets;
5414
5684
  /** @type {?} */
5415
5685
  NodeDetailsComponent.prototype.loading$;