2019-04-04 21:47:52 +02:00
/// <reference path="../../ui/elements/modal.ts" />
/// <reference path="../../ConnectionHandler.ts" />
2019-01-20 18:43:14 +01:00
/// <reference path="../../proto.ts" />
namespace Modals {
2019-04-04 21:47:52 +02:00
export function spawnPlaylistManage ( client : ConnectionHandler ) {
2019-01-20 18:43:14 +01:00
let modal : Modal ;
let selected_playlist : Playlist ;
let available_playlists : Playlist [ ] ;
let highlight_own = settings . global ( "playlist-list-highlight-own" , true ) ;
const update_selected = ( ) = > {
const buttons = modal . htmlTag . find ( ".header .buttons" ) ;
buttons . find ( ".button-playlist-edit" ) . prop (
"disabled" ,
! selected_playlist
) ;
buttons . find ( ".button-playlist-delete" ) . prop (
"disabled" ,
! selected_playlist || ! ( /* not owner or permission */
client . permissions . neededPermission ( PermissionType . I_PLAYLIST_DELETE_POWER ) . granted ( selected_playlist . needed_power_delete ) || /* client has permissions */
client . getClient ( ) . properties . client_database_id == selected_playlist . playlist_owner_dbid /* client is playlist owner */
)
) ;
buttons . find ( ".button-playlist-create" ) . prop (
"disabled" ,
! client . permissions . neededPermission ( PermissionType . B_PLAYLIST_CREATE ) . granted ( 1 )
) ;
if ( selected_playlist ) {
buttons . find ( ".button-playlist-edit" ) . prop (
"disabled" ,
false
) ;
}
} ;
const update_list = async ( ) = > {
const info_tag = modal . htmlTag . find ( ".footer .info a" ) ;
info_tag . text ( "loading..." ) ;
selected_playlist = undefined ;
update_selected ( ) ;
try {
2019-02-23 14:27:58 +01:00
available_playlists = await client . serverConnection . command_helper . request_playlist_list ( ) ;
2019-01-20 18:43:14 +01:00
} catch ( error ) {
info_tag . text ( "failed to query playlist list." ) ;
//FIXME error handling?
return ;
}
const entries_tag = modal . htmlTag . find ( ".playlist-list-entries" ) ;
const entry_template = $ ( "#tmpl_playlist_list-list_entry" ) ;
entries_tag . empty ( ) ;
const owndbid = client . getClient ( ) . properties . client_database_id ;
for ( const query of available_playlists ) {
const tag = entry_template . renderTag ( query ) . on ( 'click' , event = > {
entries_tag . find ( ".entry.selected" ) . removeClass ( "selected" ) ;
$ ( event . target ) . parent ( ".entry" ) . addClass ( "selected" ) ;
selected_playlist = query ;
update_selected ( ) ;
} ) ;
if ( highlight_own && query . playlist_owner_dbid == owndbid )
tag . addClass ( "highlighted" ) ;
entries_tag . append ( tag ) ;
}
const entry_container = modal . htmlTag . find ( ".playlist-list-entries-container" ) ;
if ( entry_container . hasScrollBar ( ) )
entry_container . addClass ( "scrollbar" ) ;
info_tag . text ( "Showing " + available_playlists . length + " entries" ) ;
update_selected ( ) ;
} ;
modal = createModal ( {
header : tr ( "Manage playlists" ) ,
body : ( ) = > {
let template = $ ( "#tmpl_playlist_list" ) . renderTag ( ) ;
/* first open the modal */
setTimeout ( ( ) = > {
const entry_container = template . find ( ".playlist-list-entries-container" ) ;
if ( entry_container . hasScrollBar ( ) )
entry_container . addClass ( "scrollbar" ) ;
} , 100 ) ;
template . find ( ".footer .buttons .button-refresh" ) . on ( 'click' , update_list ) ;
template . find ( ".button-playlist-create" ) . on ( 'click' , event = > {
2019-02-23 14:27:58 +01:00
const single_handler : connection.SingleCommandHandler = {
function : command = > {
const json = command . arguments ;
update_list ( ) . then ( ( ) = > {
spawnYesNo ( tr ( "Playlist created successful" ) , tr ( "The playlist has been successfully created.<br>Should we open the editor?" ) , result = > {
if ( result ) {
for ( const playlist of available_playlists ) {
if ( playlist . playlist_id == json [ 0 ] [ "playlist_id" ] ) {
spawnPlaylistEdit ( client , playlist ) . close_listener . push ( update_list ) ;
return ;
}
2019-01-20 18:43:14 +01:00
}
}
2019-02-23 14:27:58 +01:00
} ) ;
2019-01-20 18:43:14 +01:00
} ) ;
2019-02-23 14:27:58 +01:00
return true ;
} ,
command : "notifyplaylistcreated"
2019-01-20 18:43:14 +01:00
} ;
2019-02-23 14:27:58 +01:00
client . serverConnection . command_handler_boss ( ) . register_single_handler ( single_handler ) ;
2019-02-23 14:15:22 +01:00
client . serverConnection . send_command ( "playlistcreate" ) . catch ( error = > {
2019-02-23 14:27:58 +01:00
client . serverConnection . command_handler_boss ( ) . remove_single_handler ( single_handler ) ;
2019-01-20 18:43:14 +01:00
if ( error instanceof CommandResult )
error = error . extra_message || error . message ;
createErrorModal ( tr ( "Unable to create playlist" ) , tr ( "Failed to create playlist<br>Message: " ) + error ) . open ( ) ;
} ) ;
} ) ;
template . find ( ".button-playlist-edit" ) . on ( 'click' , event = > {
if ( ! selected_playlist ) return ;
spawnPlaylistEdit ( client , selected_playlist ) . close_listener . push ( update_list ) ;
} ) ;
template . find ( ".button-playlist-delete" ) . on ( 'click' , ( ) = > {
if ( ! selected_playlist ) return ;
Modals . spawnYesNo ( tr ( "Are you sure?" ) , tr ( "Do you really want to delete this playlist?" ) , result = > {
if ( result ) {
2019-02-23 14:15:22 +01:00
client . serverConnection . send_command ( "playlistdelete" , { playlist_id : selected_playlist.playlist_id } ) . then ( ( ) = > {
2019-01-20 18:43:14 +01:00
createInfoModal ( tr ( "Playlist deleted successful" ) , tr ( "This playlist has been deleted successfully." ) ) . open ( ) ;
update_list ( ) ;
} ) . catch ( error = > {
if ( error instanceof CommandResult ) {
/* TODO extra handling here */
//if(error.id == ErrorID.PLAYLIST_IS_IN_USE) { }
error = error . extra_message || error . message ;
}
createErrorModal ( tr ( "Unable to delete playlist" ) , tr ( "Failed to delete playlist<br>Message: " ) + error ) . open ( ) ;
} ) ;
}
} ) ;
} ) ;
template . find ( ".input-search" ) . on ( 'change keyup' , ( ) = > {
const text = ( template . find ( ".input-search" ) . val ( ) as string || "" ) . toLowerCase ( ) ;
if ( text . length == 0 ) {
template . find ( ".playlist-list-entries .entry" ) . show ( ) ;
} else {
template . find ( ".playlist-list-entries .entry" ) . each ( ( _ , e ) = > {
const element = $ ( e ) ;
if ( element . text ( ) . toLowerCase ( ) . indexOf ( text ) == - 1 )
element . hide ( ) ;
else
element . show ( ) ;
} )
}
} ) ;
template . find ( ".button-highlight-own" ) . on ( 'change' , event = > {
const flag = ( < HTMLInputElement > event . target ) . checked ;
settings . changeGlobal ( "playlist-list-highlight-own" , flag ) ;
if ( flag ) {
const owndbid = client . getClient ( ) . properties . client_database_id ;
template . find ( ".playlist-list-entries .entry" ) . each ( ( index , _element ) = > {
const element = $ ( _element ) ;
if ( parseInt ( element . attr ( "playlist-owner-dbid" ) ) == owndbid )
element . addClass ( "highlighted" ) ;
} )
} else {
template . find ( ".playlist-list-entries .highlighted" ) . removeClass ( "highlighted" ) ;
}
} ) . prop ( "checked" , highlight_own ) ;
return template ;
} ,
footer : undefined ,
width : 750
} ) ;
update_list ( ) ;
modal . open ( ) ;
}
}