Skip to content

Commit 254b096

Browse files
committed
perf: if not favorite folder, create one and favorite
1 parent d04b475 commit 254b096

1 file changed

Lines changed: 79 additions & 17 deletions

File tree

src/app/elements/asset-tree/asset-tree.component.ts

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,13 @@ export class ElementAssetTreeComponent implements OnInit {
331331
name: this._i18n.instant('Favorite to'),
332332
fa: 'fa-star-o',
333333
hide: false,
334-
disabled: true,
335-
click: () => {}
334+
children: [
335+
{
336+
id: 'create-folder-and-favorite',
337+
name: this._i18n.instant('Create folder and favorite'),
338+
click: this.onCreateFolderAndFavorite.bind(this)
339+
}
340+
]
336341
}
337342
];
338343
}
@@ -436,6 +441,24 @@ export class ElementAssetTreeComponent implements OnInit {
436441
return String(folderOrId);
437442
}
438443

444+
private resolveCreatedFavoriteFolderId(folder: any, name: string, parentId: string = null): Promise<string> {
445+
const createdFolderId = this.resolveFolderId(folder);
446+
if (createdFolderId) {
447+
return Promise.resolve(createdFolderId);
448+
}
449+
const normalizedParentId = this.resolveFolderId(parentId);
450+
return this._http
451+
.getFavoriteFolders()
452+
.toPromise()
453+
.then(folders => {
454+
this.favoriteFolders = folders || [];
455+
const createdFolder = this.favoriteFolders.find(
456+
f => f.name === name && this.resolveFolderId(f.parent) === normalizedParentId
457+
);
458+
return this.resolveFolderId(createdFolder);
459+
});
460+
}
461+
439462
/**
440463
* Resolve the real asset id from tree/favorite nodes.
441464
*/
@@ -1027,11 +1050,15 @@ export class ElementAssetTreeComponent implements OnInit {
10271050
connectOnNewPage(node, 'auto');
10281051
}
10291052

1053+
onCreateFolderAndFavorite() {
1054+
this.onCreateFolder(null, this.rightClickSelectNode);
1055+
}
1056+
10301057
/**
10311058
* Create folder: pop an input, validate empty/duplicate name, then call backend
10321059
* @param parentId parent folder id, null means top-level
10331060
*/
1034-
onCreateFolder(parentId: string = null) {
1061+
onCreateFolder(parentId: string = null, favoriteNode: any = null) {
10351062
this.folderNameInput = '';
10361063
this._modal.create({
10371064
nzTitle: this._i18n.instant(parentId ? 'Create subfolder' : 'Create folder'),
@@ -1052,13 +1079,34 @@ export class ElementAssetTreeComponent implements OnInit {
10521079
return this._http
10531080
.createFavoriteFolder(name, parentId)
10541081
.toPromise()
1055-
.then(() => {
1082+
.then(folder => {
10561083
const msg = this._i18n.instant('Create folder') + ' ' + this._i18n.instant('success');
1084+
if (favoriteNode) {
1085+
return this.resolveCreatedFavoriteFolderId(folder, name, parentId)
1086+
.then(createdFolderId => {
1087+
if (!createdFolderId) {
1088+
this.refreshFavoriteTree();
1089+
return;
1090+
}
1091+
return this.favoriteAssetToFolder(createdFolderId, favoriteNode, {
1092+
refreshTreeOnSuccess: true
1093+
}).catch(() => {
1094+
this.refreshFavoriteTree();
1095+
});
1096+
})
1097+
.then(() => {
1098+
this._toastr.success(msg, '', { nzClass: 'custom-success-notification' });
1099+
});
1100+
}
10571101
this._toastr.success(msg, '', { nzClass: 'custom-success-notification' });
10581102
this.refreshFavoriteTree();
1103+
}, error => {
1104+
if (error && error.status === 400) {
1105+
this._message.error(this._i18n.instant('Folder already exists'));
1106+
}
1107+
return false;
10591108
})
10601109
.catch(() => {
1061-
this._message.error(this._i18n.instant('Folder already exists'));
10621110
return false;
10631111
});
10641112
}
@@ -1160,32 +1208,46 @@ export class ElementAssetTreeComponent implements OnInit {
11601208
* @param folderId target folder id
11611209
*/
11621210
onFavoriteTo(folderId: string) {
1163-
const srcNode = this.rightClickSelectNode;
1211+
this.favoriteAssetToFolder(folderId, this.rightClickSelectNode).catch(() => {});
1212+
}
1213+
1214+
private favoriteAssetToFolder(
1215+
folderId: string,
1216+
srcNode: any,
1217+
options: { refreshTreeOnSuccess?: boolean } = {}
1218+
): Promise<void> {
11641219
const normalizedFolderId = this.resolveFolderId(folderId);
11651220
const assetId = this.resolveAssetId(srcNode);
11661221
if (!normalizedFolderId || !assetId) {
1167-
return;
1222+
return Promise.resolve();
11681223
}
11691224
const favoritingKey = `${assetId}-${normalizedFolderId}`;
11701225
if (this.favoritingInFlight.has(favoritingKey)) {
1171-
return;
1226+
return Promise.resolve();
11721227
}
11731228
this.favoritingInFlight.add(favoritingKey);
1174-
this._http.favoriteAssetToFolder(assetId, normalizedFolderId).subscribe(
1175-
() => {
1229+
return this._http
1230+
.favoriteAssetToFolder(assetId, normalizedFolderId)
1231+
.toPromise()
1232+
.then(() => {
11761233
const msg = this._i18n.instant('Favorite') + ' ' + this._i18n.instant('success');
11771234
this._toastr.success(msg, '', { nzClass: 'custom-success-notification' });
11781235
this.setFavoriteAssetRecord(normalizedFolderId, assetId, srcNode);
1179-
this.moveFavoriteLeaf(normalizedFolderId, srcNode, assetId);
1180-
this.favoritingInFlight.delete(favoritingKey);
1181-
},
1182-
error => {
1183-
this.favoritingInFlight.delete(favoritingKey);
1236+
if (options.refreshTreeOnSuccess) {
1237+
this.refreshFavoriteTree();
1238+
} else {
1239+
this.moveFavoriteLeaf(normalizedFolderId, srcNode, assetId);
1240+
}
1241+
})
1242+
.catch(error => {
11841243
if (error && error.status === 400) {
11851244
this._message.warning(this._i18n.instant('Already in this folder'));
11861245
}
1187-
}
1188-
);
1246+
return Promise.reject(error);
1247+
})
1248+
.finally(() => {
1249+
this.favoritingInFlight.delete(favoritingKey);
1250+
});
11891251
}
11901252

11911253
/**

0 commit comments

Comments
 (0)