From 8a6f29cd313a6460ff90f179881a8219d610f501 Mon Sep 17 00:00:00 2001 From: rolux Date: Wed, 9 Nov 2011 22:32:54 +0000 Subject: [PATCH] rewrite history, again --- pandora/0xdb.jsonc | 1 + pandora/urls.py | 1 + static/js/pandora/URL.js | 75 ++++++++++++--------------------- static/js/pandora/account.js | 6 +-- static/js/pandora/appPanel.js | 43 +++++++++++++++++++ static/js/pandora/helpDialog.js | 50 ++++++++++++---------- static/js/pandora/home.js | 10 ++--- static/js/pandora/item.js | 6 ++- static/js/pandora/menu.js | 2 +- static/js/pandora/siteDialog.js | 7 +-- static/js/pandora/utils.js | 57 +++++++++++++++++-------- 11 files changed, 155 insertions(+), 103 deletions(-) diff --git a/pandora/0xdb.jsonc b/pandora/0xdb.jsonc index 5673bad6..2b4a64ff 100644 --- a/pandora/0xdb.jsonc +++ b/pandora/0xdb.jsonc @@ -617,6 +617,7 @@ "lists": {}, "mapFind": "", "mapSelection": "", + "page": "", "section": "items", "showAnnotations": true, "showBrowser": true, diff --git a/pandora/urls.py b/pandora/urls.py index eb275a1c..770063b9 100644 --- a/pandora/urls.py +++ b/pandora/urls.py @@ -24,6 +24,7 @@ urlpatterns = patterns('', (r'^api/upload/$', 'archive.views.firefogg_upload'), (r'^url=(?P.*)$', 'app.views.redirect_url'), (r'^file/(?P.*)$', 'archive.views.lookup_file'), + (r'^api$', include('api.urls')), (r'^api/$', include('api.urls')), (r'^resetUI$', 'user.views.reset_ui'), (r'', include('item.urls')), diff --git a/static/js/pandora/URL.js b/static/js/pandora/URL.js index 1ed860ae..e5ba9ec3 100644 --- a/static/js/pandora/URL.js +++ b/static/js/pandora/URL.js @@ -6,9 +6,13 @@ pandora.URL = (function() { var self = {}, that = {}; - function getState(keys) { + function getState() { - Ox.Log('GET STATE, UI', pandora.user.ui) + Ox.Log('', 'GET STATE, UI', pandora.user.ui) + + if (pandora.user.ui.page) { + return {page: pandora.user.ui.page}; + } var state = {}; @@ -45,7 +49,7 @@ pandora.URL = (function() { ); } - Ox.Log('URL', 'STATE ...', state) + Ox.Log('', 'URL', 'STATE ...', state) return state; @@ -66,43 +70,7 @@ pandora.URL = (function() { } else if (state.page) { - if (state.page == 'home') { - // if we're on page load, show screen immediately - pandora.$ui.home = pandora.ui.home()[ - !pandora.$ui.appPanel ? 'showScreen' : 'fadeInScreen' - ](); - } else if ( - Ox.getPositionById(pandora.site.sitePages, state.page) > -1 - || state.page == 'software' - ) { - if (pandora.$ui.siteDialog && pandora.$ui.siteDialog.is(':visible')) { - pandora.$ui.siteDialog.select(state.page); - } else { - pandora.$ui.siteDialog = pandora.ui.siteDialog(state.page).open(); - } - } else if (state.page == 'help') { - pandora.$ui.helpDialog = pandora.ui.helpDialog().open(); - } else if (['signup', 'signin'].indexOf(state.page) > -1) { - if (pandora.user.level == 'guest') { - if (pandora.$ui.accountDialog && pandora.$ui.accountDialog.is(':visible')) { - pandora.$ui.accountDialog.options(pandora.ui.accountDialogOptions(state.page)); - } else { - pandora.$ui.accountDialog = pandora.ui.accountDialog(state.page).open(); - } - } else { - pandora.URL.replace('/'); - } - } else if (['preferences', 'signout'].indexOf(state.page) > -1) { - if (pandora.user.level == 'guest') { - pandora.URL.replace('/'); - } else if (state.page == 'preferences') { - pandora.ui.preferencesDialog().open(); - } else { - pandora.ui.accountSignoutDialog().open(); - } - } else if (state.page == 'api') { - document.location.href = '/api/'; - } + pandora.UI.set(state); callback && callback(); } else { @@ -276,6 +244,10 @@ pandora.URL = (function() { $('.OxDialog:visible').each(function() { Ox.UI.elements[$(this).data('oxid')].close(); }); + if (pandora.$ui.home) { + pandora.UI.set({page: ''}); + pandora.$ui.home.fadeOutScreen(); + } if ( pandora.user.ui.item && pandora.user.ui.itemView == 'video' @@ -283,10 +255,8 @@ pandora.URL = (function() { && pandora.$ui.player.options('fullscreen') ) { pandora.$ui.player.remove(); - //pandora.$ui.player.options({fullscreen: false}); - //$('body > .OxVideoPlayer').remove(); } - if (!Ox.isEmpty(e.state)) { + if (e.state && !Ox.isEmpty(e.state)) { Ox.Log('', 'E.STATE', e.state) document.title = e.state.title; setState(e.state); @@ -313,12 +283,15 @@ pandora.URL = (function() { // sets the URL to the previous URL that.pop = function() { - self.URL.pop(); + self.URL.pop() || that.update(); }; // pushes a new URL (as string or from state) that.push = function(stateOrURL) { - var state, title = pandora.getPageTitle(), url; + var state, + title = pandora.getPageTitle(stateOrURL) + || pandora.getDocumentTitle(), + url; if (Ox.isObject(stateOrURL)) { state = stateOrURL; } else { @@ -329,8 +302,11 @@ pandora.URL = (function() { }; // replaces the current URL (as string or from state) - that.replace = function(stateOrURL) { - var state, title = pandora.getPageTitle(), url; + that.replace = function(stateOrURL, title) { + var state, + title = pandora.getPageTitle(stateOrURL) + || pandora.getDocumentTitle(), + url; if (Ox.isObject(stateOrURL)) { state = stateOrURL; } else { @@ -368,7 +344,10 @@ pandora.URL = (function() { action = 'push'; } state = getState(); - self.URL[action](state, pandora.getPageTitle(), ''); + self.URL[action]( + state, + pandora.getPageTitle(state) || pandora.getDocumentTitle() + ); } }; diff --git a/static/js/pandora/account.js b/static/js/pandora/account.js index a60dfda6..2fa32001 100644 --- a/static/js/pandora/account.js +++ b/static/js/pandora/account.js @@ -58,7 +58,7 @@ pandora.ui.accountDialogOptions = function(action, value) { title: 'Cancel' }).bindEvent('click', function() { pandora.$ui.accountDialog.close(); - pandora.URL.update(); + pandora.UI.set({page: ''}); }); } else if (type == 'submit') { return Ox.Button({ @@ -74,7 +74,7 @@ pandora.ui.accountDialogOptions = function(action, value) { title: buttonTitle[type] + '...' }).bindEvent('click', function() { if (['signin', 'signup'].indexOf(type) > -1) { - pandora.URL.replace({page: type}); + pandora.UI.set({page: type}); } else { pandora.$ui.accountDialog.options(pandora.ui.accountDialogOptions(type)); } @@ -319,7 +319,7 @@ pandora.ui.accountSignoutDialog = function() { title: 'Stay Signed In' }).bindEvent('click', function() { that.close(); - pandora.URL.update(); + pandora.UI({page: ''}); }), Ox.Button({ id: 'signout', diff --git a/static/js/pandora/appPanel.js b/static/js/pandora/appPanel.js index 17c7e433..00381225 100644 --- a/static/js/pandora/appPanel.js +++ b/static/js/pandora/appPanel.js @@ -13,6 +13,7 @@ pandora.ui.appPanel = function() { ], orientation: 'vertical' }); + setPage(pandora.user.ui.page); that.display = function() { // fixme: move animation into Ox.App var animate = $('.OxScreen').length == 0; @@ -27,6 +28,48 @@ pandora.ui.appPanel = function() { pandora.$ui.appPanel = pandora.ui.appPanel().appendTo(pandora.$ui.body); return that; } + that.bindEvent({ + pandora_page: function(data) { + setPage(data.value); + } + }); + function setPage(page) { + if (page == 'home') { + // if we're on page load, show screen immediately + pandora.$ui.home = pandora.ui.home()[ + !pandora.$ui.appPanel ? 'showScreen' : 'fadeInScreen' + ](); + } else if ( + Ox.getPositionById(pandora.site.sitePages, page) > -1 + || page == 'software' + ) { + if (pandora.$ui.siteDialog && pandora.$ui.siteDialog.is(':visible')) { + pandora.$ui.siteDialog.select(page); + } else { + pandora.$ui.siteDialog = pandora.ui.siteDialog(page).open(); + } + } else if (page == 'help') { + pandora.$ui.helpDialog = pandora.ui.helpDialog().open(); + } else if (['signup', 'signin'].indexOf(page) > -1) { + if (pandora.user.level == 'guest') { + if (pandora.$ui.accountDialog && pandora.$ui.accountDialog.is(':visible')) { + pandora.$ui.accountDialog.options(pandora.ui.accountDialogOptions(page)); + } else { + pandora.$ui.accountDialog = pandora.ui.accountDialog(page).open(); + } + } else { + pandora.URL.replace('/'); + } + } else if (['preferences', 'signout'].indexOf(page) > -1) { + if (pandora.user.level == 'guest') { + pandora.URL.replace('/'); + } else if (page == 'preferences') { + pandora.ui.preferencesDialog().open(); + } else { + pandora.ui.accountSignoutDialog().open(); + } + } + } return that; }; diff --git a/static/js/pandora/helpDialog.js b/static/js/pandora/helpDialog.js index c74d2a12..3c8e85ee 100644 --- a/static/js/pandora/helpDialog.js +++ b/static/js/pandora/helpDialog.js @@ -3,29 +3,33 @@ pandora.ui.helpDialog = function() { var content = Ox.Element().css({margin: '16px'}), that = Ox.Dialog({ - buttons: [ - Ox.Button({ - id: 'close', - title: 'Close' - }).bindEvent({ - click: function() { - that.close(); - pandora.URL.update(); - } - }) - ], - //closeButton: true, - content: content, - height: Math.round((window.innerHeight - 24) * 0.75), - keys: { - 'escape': 'close' - }, - //maximizeButton: true, - minHeight: 256, - minWidth: 640, - title: 'Help', - width: Math.round(window.innerWidth * 0.75) - }); + buttons: [ + Ox.Button({ + id: 'close', + title: 'Close' + }).bindEvent({ + click: function() { + that.close(); + } + }) + ], + closeButton: true, + content: content, + height: Math.round((window.innerHeight - 24) * 0.75), + keys: { + 'escape': 'close' + }, + maximizeButton: true, + minHeight: 256, + minWidth: 640, + title: 'Help', + width: Math.round(window.innerWidth * 0.75) + }) + .bindEvent({ + close: function(data) { + pandora.UI.set({page: ''}); + } + }); pandora.api.getPage({name: 'help'}, function(result) { //content.html(response.data.body); content.html('Help is coming soon...') diff --git a/static/js/pandora/home.js b/static/js/pandora/home.js index 7583a5b7..328d0925 100644 --- a/static/js/pandora/home.js +++ b/static/js/pandora/home.js @@ -134,7 +134,7 @@ pandora.ui.home = function() { }) .bindEvent({ click: function() { - pandora.URL.update(); + pandora.UI.set({page: ''}); that.fadeOutScreen(); } }) @@ -154,7 +154,7 @@ pandora.ui.home = function() { }) .bindEvent({ click: function() { - pandora.URL.push('/signup'); + pandora.UI.set({page: 'signup'}); that.fadeOutScreen(); } }), @@ -173,7 +173,7 @@ pandora.ui.home = function() { }) .bindEvent({ click: function() { - pandora.URL.push('/signin'); + pandora.UI.set({page :'signin'}); that.fadeOutScreen(); } }), @@ -192,7 +192,7 @@ pandora.ui.home = function() { }) .bindEvent({ click: function() { - pandora.URL.push('/preferences'); + pandora.UI.set({page: 'preferences'}); that.fadeOutScreen(); } }), @@ -211,7 +211,7 @@ pandora.ui.home = function() { }) .bindEvent({ click: function() { - pandora.URL.push('/about'); + pandora.UI.set({page: 'about'}); that.fadeOutScreen(); } }) diff --git a/static/js/pandora/item.js b/static/js/pandora/item.js index 71d2b2c5..97e46d9e 100644 --- a/static/js/pandora/item.js +++ b/static/js/pandora/item.js @@ -11,8 +11,10 @@ pandora.ui.item = function() { }, pandora.user.ui.itemView == 'info' && pandora.site.capabilities.canEditMetadata[pandora.user.level] ? 0 : -1, function(result) { if (result.status.code == 200) { - // fixme: can the history state title get updated too? - document.title = pandora.getPageTitle(result.data.title); + // we want to cache the title in any way, so that after closing + // a dialog and getting to this item, the title is correct + var documentTitle = pandora.getDocumentTitle(result.data.title); + document.title = pandora.getPageTitle(document.location.pathname) || documentTitle; } /*if (result.status.code != 200) { diff --git a/static/js/pandora/menu.js b/static/js/pandora/menu.js index f3fb853e..6b58c2c4 100644 --- a/static/js/pandora/menu.js +++ b/static/js/pandora/menu.js @@ -230,7 +230,7 @@ pandora.ui.mainMenu = function() { 'home', 'about', 'news', 'tour', 'faq', 'terms', 'rights', 'contact', 'software', 'signup', 'signin', 'signout', 'preferences', 'help' ].indexOf(data.id) > -1) { - pandora.URL.push('/' + data.id); + pandora.UI.set({page: data.id}); } else if ([ 'newlist', 'newlistfromselection', 'newsmartlist', 'newsmartlistfromresults' ].indexOf(data.id) > -1) { diff --git a/static/js/pandora/siteDialog.js b/static/js/pandora/siteDialog.js index ff454090..e0d36ada 100644 --- a/static/js/pandora/siteDialog.js +++ b/static/js/pandora/siteDialog.js @@ -112,8 +112,7 @@ pandora.ui.siteDialog = function(section) { that.options({ title: Ox.getObjectById(tabs, data.selected).title }); - pandora.URL.push({page: data.selected}); - //history.pushState({page: data.selected}, '', '/' + data.selected); + pandora.UI.set({page: data.selected}); } }); @@ -125,7 +124,6 @@ pandora.ui.siteDialog = function(section) { }).bindEvent({ click: function() { that.close(); - pandora.URL.update(); } }) ], @@ -140,6 +138,9 @@ pandora.ui.siteDialog = function(section) { width: Math.round(window.innerWidth * 0.75), }) .bindEvent({ + close: function(data) { + pandora.UI.set({page: ''}); + }, resize: function(data) { if ($tabPanel.selected() == 'contact') { pandora.$ui.contactForm.resize(); diff --git a/static/js/pandora/utils.js b/static/js/pandora/utils.js index b2537b6f..afccc6b6 100644 --- a/static/js/pandora/utils.js +++ b/static/js/pandora/utils.js @@ -492,6 +492,25 @@ pandora.getClipsQuery = function() { return clipsQuery; }; +(function() { + var itemTitles = {}; + pandora.getDocumentTitle = function(itemTitle) { + Ox.Log('', 'ITEM TITLES', itemTitles) + if (itemTitle) { + itemTitles[pandora.user.ui.item] = itemTitle + } + var parts = [pandora.site.site.name]; + if (!pandora.user.ui.item) { + pandora.user.ui._list && parts.push('List ' + pandora.user.ui._list); + parts.push(Ox.toTitleCase(pandora.user.ui.listView) + ' View'); + } else { + parts.push(itemTitles[pandora.user.ui.item] || pandora.user.ui.item); + parts.push(Ox.toTitleCase(pandora.user.ui.itemView) + ' View'); + } + return parts.join(' - '); + }; +}()); + pandora.getFilterSizes = function() { return Ox.divideInt( window.innerWidth - pandora.user.ui.showSidebar * pandora.user.ui.sidebarSize - 1, 5 @@ -664,24 +683,26 @@ pandora.getMetadataByIdOrName = function(item, view, str, callback) { } }; -(function() { - var itemTitles = {}; - pandora.getPageTitle = function(itemTitle) { - Ox.Log('', 'ITEM TITLES', itemTitles) - if (itemTitle) { - itemTitles[pandora.user.ui.item] = itemTitle - } - var parts = [pandora.site.site.name]; - if (!pandora.user.ui.item) { - pandora.user.ui._list && parts.push('List ' + pandora.user.ui._list); - parts.push(Ox.toTitleCase(pandora.user.ui.listView) + ' View'); - } else { - parts.push(itemTitles[pandora.user.ui.item] || pandora.user.ui.item); - parts.push(Ox.toTitleCase(pandora.user.ui.itemView) + ' View'); - } - return parts.join(' - '); - }; -}()); +pandora.getPageTitle = function(stateOrURL) { + var pages = Ox.merge([ + {id: '', title: ''}, + {id: 'help', title: 'Help'}, + {id: 'home', title: ''}, + {id: 'preferences', title: 'Preferences'}, + {id: 'signin', title: 'Sign In'}, + {id: 'signout', title: 'Sign Out'}, + {id: 'signup', title: 'Sign Up'}, + {id: 'software', title: 'Software'} + ], pandora.site.sitePages), + page = Ox.getObjectById( + pages, + Ox.isObject(stateOrURL) ? stateOrURL.page : stateOrURL.substr(1) + ); + return page + ? pandora.site.site.name + + (page.title ? ' - ' + page.title : '') + : null; +}; pandora.getSortKeyData = function(key) { return Ox.getObjectById(pandora.site.itemKeys, key)