diff --git a/static/js/pandora.js b/static/js/pandora.js index d3cbe43d2..96f3a24c2 100644 --- a/static/js/pandora.js +++ b/static/js/pandora.js @@ -51,6 +51,7 @@ Ox.load({ site: data.site, user: data.user.level == 'guest' ? Ox.clone(data.site.user) : data.user }); + /* // ---- fixme: remove, server sends wrong data pandora.site.user.ui.lists = { "": { @@ -71,6 +72,7 @@ Ox.load({ {"id": "genre", "sort": [{"key": "items", "operator": "-"}]} ]; // ---- + */ Ox.print("USER.UI.LISTS", data.user.ui.lists, "SITE.USER.UI.LISTS", data.site.user.ui.lists) Ox.extend(pandora.site, { findKeys: Ox.map(data.site.itemKeys, function(key) { diff --git a/static/js/pandora/pandora.js b/static/js/pandora/pandora.js index c040c8d6b..b9da29167 100644 --- a/static/js/pandora/pandora.js +++ b/static/js/pandora/pandora.js @@ -322,6 +322,32 @@ pandora.getListData = function() { return data; }; +pandora.getListMenu = function(lists) { + return { id: 'listMenu', title: 'List', items: [ + { id: 'history', title: 'History', items: [ + { id: 'allmovies', title: 'All ' + pandora.site.itemName.plural } + ] }, + { id: 'viewlist', title: 'View List', items: lists ? ['personal', 'favorite', 'featured'].map(function(folder) { + return { id: folder + 'lists', title: Ox.toTitleCase(folder) + ' Lists', items: [ + { group: folder + 'lists', min: 0, max: 1, items: lists[folder].map(function(list) { + return { id: 'viewlist' + list.id, title: (folder == 'favorite' ? list.user + ': ' : '') + list.name, checked: list.id == pandora.user.ui.list }; + }) } + ] }; + }) : [ + { id: 'loading', title: 'Loading...', disabled: true } + ] }, + {}, + { id: 'newlist', title: 'New List...', keyboard: 'control n' }, + { id: 'newlistfromselection', title: 'New List from Selection...', disabled: true, keyboard: 'shift control n' }, + { id: 'newsmartlist', title: 'New Smart List...', keyboard: 'alt control n' }, + { id: 'newsmartlistfromresults', title: 'New Smart List from Results...', keyboard: 'shift alt control n' }, + {}, + { id: 'addmovietolist', title: ['Add Selected ' + pandora.site.itemName.singular + ' to List...', 'Add Selected ' + pandora.site.itemName.plural + ' to List...'], disabled: true }, + {}, + { id: 'setposterframe', title: 'Set Poster Frame', disabled: true } + ] }; +}; + pandora.getSortMenu = function() { var list = pandora.user.ui.lists[pandora.user.ui.list], isClipView = pandora.isClipView(list.listView); diff --git a/static/js/pandora/ui/foldersList.js b/static/js/pandora/ui/foldersList.js index 8a0cdfd5c..a1e013b04 100644 --- a/static/js/pandora/ui/foldersList.js +++ b/static/js/pandora/ui/foldersList.js @@ -1,4 +1,5 @@ // vim: et:ts=4:sw=4:sts=4:ft=javascript +// fixme: the filename should be folderList.js pandora.ui.folderList = function(id) { var i = Ox.getPositionById(pandora.site.sectionFolders[pandora.user.ui.section], id), that; @@ -119,7 +120,9 @@ pandora.ui.folderList = function(id) { {key: 'status', value: 'featured', operator: '!'}, ], operator: '&'}; } else if (id == 'featured') { - query = {conditions: [{key: 'status', value: 'featured', operator: '='}], operator: '&'}; + query = {conditions: [ + {key: 'status', value: 'featured', operator: '='} + ], operator: '&'}; } return pandora.api.findLists(Ox.extend(data, { query: query diff --git a/static/js/pandora/ui/menu.js b/static/js/pandora/ui/menu.js index bb9e6b66a..60574827d 100644 --- a/static/js/pandora/ui/menu.js +++ b/static/js/pandora/ui/menu.js @@ -32,27 +32,7 @@ pandora.ui.mainMenu = function() { { id: 'signup', title: 'Sign Up...', disabled: !isGuest }, { id: 'signinsignout', title: isGuest ? 'Sign In...' : 'Sign Out...' } ] }, - { id: 'listMenu', title: 'List', items: [ - { id: 'history', title: 'History', items: [ - { id: 'allmovies', title: 'All ' + pandora.site.itemName.plural } - ] }, - { id: 'lists', title: 'View List', items: [ - { id: 'favorites', title: 'Favorites' } - ] }, - { id: 'features', title: 'View Feature', items: [ - { id: 'situationistfilm', title: 'Situationist Film' }, - { id: 'timelines', title: 'Timelines' } - ] }, - {}, - { id: 'newlist', title: 'New List...', keyboard: 'control n' }, - { id: 'newlistfromselection', title: 'New List from Selection...', disabled: true, keyboard: 'shift control n' }, - { id: 'newsmartlist', title: 'New Smart List...', keyboard: 'alt control n' }, - { id: 'newsmartlistfromresults', title: 'New Smart List from Results...', keyboard: 'shift alt control n' }, - {}, - { id: 'addmovietolist', title: ['Add Selected ' + pandora.site.itemName.singular + ' to List...', 'Add Selected ' + pandora.site.itemName.plural + ' to List...'], disabled: true }, - {}, - { id: 'setposterframe', title: 'Set Poster Frame', disabled: true } - ]}, + pandora.getListMenu(), { id: 'editMenu', title: 'Edit', items: [ { id: 'undo', title: 'Undo', disabled: true, keyboard: 'control z' }, { id: 'redo', title: 'Redo', disabled: true, keyboard: 'shift control z' }, @@ -167,7 +147,7 @@ pandora.ui.mainMenu = function() { }) .bindEvent({ change: function(data) { - var value = data.checked[0].id; + var value = data.checked[0] ? data.checked[0].id : null; if (data.id == 'find') { pandora.$ui.findSelect.options({value: value}); } else if (data.id == 'movieview') { @@ -204,7 +184,6 @@ pandora.ui.mainMenu = function() { var groups = Ox.clone(pandora.user.ui.groups), id = data.id.replace('sortgroup', ''), position = Ox.getPositionById(groups, id), - // fixme: the backend mysteriously omits type type = Ox.getObjectById(pandora.site.groups, id).type, key = value, operator = key == 'name' && type == 'string' ? '+' : '-'; @@ -252,6 +231,10 @@ pandora.ui.mainMenu = function() { pandora.$ui.viewSelect.options({value: value}); pandora.$ui.contentPanel.replaceElement(1, pandora.$ui.list = pandora.ui.list()); pandora.URL.push('/' + value + '/' + document.location.search); + } else if (['personallists', 'favoritelists', 'featuredlists'].indexOf(data.id) > -1) { + pandora.URL.set( + data.checked[0] ? '?find=list:' + data.checked[0].id.substr(8) : '' + ); } }, click: function(data) { @@ -590,6 +573,40 @@ pandora.ui.mainMenu = function() { } } }); + + // fixme: the sidebar makes the same requests. + // is it ok to make them twice, or should the sidebar trigger the menu replace? + + var counter = 0, + lists = {}, + queries = { + // fixme: duplicated + personal: {conditions: [ + {key: 'user', value: pandora.user.username, operator: '='}, + {key: 'status', value: 'featured', operator: '!'} + ], operator: '&'}, + favorite: {conditions: [ + {key: 'subscribed', value: true, operator: '='}, + {key: 'status', value: 'featured', operator: '!'}, + ], operator: '&'}, + featured: {conditions: [ + {key: 'status', value: 'featured', operator: '='} + ], operator: '&'} + }; + + Ox.forEach(queries, function(query, folder) { + pandora.api.findLists({ + query: query, + keys: ['id', 'name', 'user'] + }, function(result) { + lists[folder] = result.data.items; + if (++counter == 3) { + Ox.print('--------------------------------------------', lists) + pandora.$ui.mainMenu.replaceMenu('listMenu', pandora.getListMenu(lists)); + } + }); + }); + return that; };