@@ -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