diff --git a/pandora/templates/site.json b/pandora/templates/site.json
index 912f028..d39f76b 100644
--- a/pandora/templates/site.json
+++ b/pandora/templates/site.json
@@ -179,9 +179,14 @@
"section": "items",
"sections": ["my", "public", "featured"],
"showAnnotations": true,
- "showGroups": true,
+ "showGroups": false,
"showInfo": true,
"showMovies": true,
+ "showSection": {
+ "my": true,
+ "public": true,
+ "featured": true
+ },
"showSidebar": true,
"sidebarSize": 256,
"sitePage": "home",
diff --git a/static/js/pandora.js b/static/js/pandora.js
index 2f995db..a223662 100755
--- a/static/js/pandora.js
+++ b/static/js/pandora.js
@@ -19,8 +19,9 @@ var pandora = new Ox.App({
config: data.config,
requests: {},
ui: {
- infoRatio: 4 / 3,
+ infoRatio: 16 / 9,
sectionElement: 'buttons',
+ sectionLength: {},
selectedMovies: []
},
user: data.user
@@ -31,6 +32,12 @@ var pandora = new Ox.App({
$.browser.safari && Ox.theme('modern');
}
+ // fixme: remove
+ app.user.ui.showSection = {
+ "my": true,
+ "public": true,
+ "featured": true
+ }
// $.each(pandora.afterLaunch, function(i, f) { f(); });
@@ -64,6 +71,7 @@ var pandora = new Ox.App({
app.ui.sectionButtonsWidth = app.$ui.sectionButtons.width() + 8;
app.$ui.window.resize(function() {
+ resizeSections();
if (app.user.ui.item == '') {
app.$ui.list.size();
resizeGroups(app.$ui.rightPanel.width());
@@ -938,7 +946,8 @@ var pandora = new Ox.App({
.css({
position: 'absolute',
left: 0,
- top: 0
+ top: 0,
+ height: '96px'
})
)
.append(
@@ -949,7 +958,12 @@ var pandora = new Ox.App({
bottom: 0,
height: '16px',
})
- );
+ )
+ .bindEvent({
+ toggle: function(event, data) {
+ app.user.ui.showInfo = !data.collapsed;
+ }
+ });
return that;
},
item: function() {
@@ -1084,6 +1098,7 @@ var pandora = new Ox.App({
})
.bindEvent({
resize: function(event, data) {
+ var infoSize = Math.round(data / app.ui.infoRatio) + 16;
app.user.ui.sidebarSize = data;
if (data < app.ui.sectionButtonsWidth && app.$ui.sectionButtons) {
app.$ui.sectionButtons.remove();
@@ -1094,16 +1109,14 @@ var pandora = new Ox.App({
delete app.$ui.sectionSelect;
app.$ui.sectionbar.append(app.$ui.sectionButtons = ui.sectionButtons());
}
- app.$ui.sectionLists.forEach(function($list) {
- $list.css({width: data + 'px'});
- $list.resizeColumn('name', data - 88);
- });
- app.$ui.leftPanel.size('infoPanel', Math.round(data / app.ui.infoRatio) + 16);
+ !app.user.ui.showInfo && app.$ui.leftPanel.css({bottom: -infoSize});
+ app.$ui.leftPanel.size('infoPanel', infoSize);
+ resizeSections();
},
toggle: function(event, data) {
app.user.ui.showSidebar = !data.collapsed;
if (data.collapsed) {
- app.$ui.sectionLists.forEach(function($list) {
+ app.$ui.sectionList.forEach(function($list) {
$list.loseFocus();
});
}
@@ -1168,7 +1181,7 @@ var pandora = new Ox.App({
size: 128,
sort: app.user.ui.lists[app.user.ui.list].sort,
unique: 'id'
- });
+ })
} else if (view == 'map') {
that = new Ox.SplitPanel({
elements: [
@@ -1425,6 +1438,7 @@ var pandora = new Ox.App({
width = app.$ui.info.width(),
height = imageHeight * width / imageWidth;
app.ui.infoRatio = width / height;
+ !app.user.ui.showInfo && app.$ui.leftPanel.css({bottom: -height - 16});
app.$ui.leftPanel.size('infoPanel', height + 16);
$still.css({
position: 'absolute',
@@ -1447,6 +1461,7 @@ var pandora = new Ox.App({
}, 250, function() {
app.$ui.infoStill.remove();
app.$ui.infoStill = $still;
+ resizeSections();
});
});
/*
@@ -2023,7 +2038,7 @@ var pandora = new Ox.App({
collapsible: true,
element: app.$ui.leftPanel = ui.leftPanel(),
resizable: true,
- resize: [128, 256, 384, 512],
+ resize: [192, 256, 320, 384],
size: app.user.ui.sidebarSize
},
{
@@ -2034,6 +2049,123 @@ var pandora = new Ox.App({
})
return that;
},
+ publicListsDialog: function() {
+ var that = new Ox.Dialog({
+ buttons: [
+ new Ox.Button({
+ id: 'done',
+ title: 'Done'
+ }).bindEvent({
+ click: function() {
+ that.close();
+ }
+ })
+ ],
+ content: new Ox.TextList({
+ columns: [
+ {
+ format: function() {
+ return $('').attr({
+ src: 'static/oxjs/build/png/ox.ui/icon16.png'
+ });
+ },
+ id: 'id',
+ operator: '+',
+ title: $('').attr({
+ src: 'static/oxjs/build/png/ox.ui/icon16.png'
+ }),
+ visible: true,
+ width: 16
+ },
+ {
+ id: 'user',
+ operator: '+',
+ title: 'User',
+ visible: true,
+ width: 160
+ },
+ {
+ id: 'name',
+ operator: '+',
+ title: 'Name',
+ visible: true,
+ width: 160
+ },
+ {
+ align: 'right',
+ id: 'items',
+ operator: '-',
+ title: 'Items',
+ visible: true,
+ width: 40
+ },
+ {
+ format: function(value) {
+ return $('')
+ .attr({
+ src: 'static/oxjs/build/png/ox.ui.' + Ox.theme() +
+ '/symbolFind.png'
+ })
+ .css({
+ opacity: value == 'static' ? 0.1 : 1
+ });
+ },
+ id: 'type',
+ operator: '+',
+ title: $('').attr({
+ src: 'static/oxjs/build/png/ox.ui.' +
+ Ox.theme() + '/symbolFind.png'
+ }),
+ visible: true,
+ width: 16
+ },
+ {
+ clickable: true,
+ format: function(value) {
+ return $('')
+ .attr({
+ src: 'static/oxjs/build/png/ox.ui.' +
+ Ox.theme() + '/symbolCheck.png'
+ })
+ .css({
+ opacity: value == 'static' ? 0.1 : 1
+ });
+ },
+ id: 'status',
+ operator: '+',
+ title: $('').attr({
+ src: 'static/oxjs/build/png/ox.ui.' +
+ Ox.theme() + '/symbolCheck.png'
+ }),
+ visible: true,
+ width: 16
+ },
+ ],
+ columnsVisible: true,
+ request: function(data, callback) {
+ var query = {conditions: [
+ //{key: 'user', value: app.user.username, operator: '!'},
+ {key: 'status', value: 'public', operator: '='}
+ ], operator: ''};
+ return pandora.api.findLists($.extend(data, {
+ query: query
+ }), callback);
+ },
+ sort: [
+ {key: 'name', operator: '+'}
+ ]
+ }),
+ height: 320,
+ keys: {enter: 'close', escape: 'close'},
+ padding: 0,
+ title: 'Public Lists',
+ width: 420
+ })
+ .css({
+ position: 'absolute'
+ });
+ return that;
+ },
rightPanel: function() {
var that = new Ox.SplitPanel({
elements: [
@@ -2099,12 +2231,228 @@ var pandora = new Ox.App({
});
return that;
},
+ sectionList: function(id, i) {
+ var width = app.user.ui.sidebarWidth, //getSectionsWidth(),
+ that = new Ox.TextList({
+ columns: [
+ {
+ format: function() {
+ return $('').attr({
+ src: 'static/oxjs/build/png/ox.ui/icon16.png'
+ });
+ },
+ id: 'user',
+ operator: '+',
+ visible: true,
+ width: 16
+ },
+ {
+ format: function(value) {
+ return value.split('.').join(': ');
+ },
+ id: 'id',
+ operator: '+',
+ unique: true,
+ visible: id == 'public',
+ width: width - 88
+ },
+ {
+ editable: function(data) {
+ return data.user == app.user.username;
+ // return data.id && data.id.split(': ')[0] == app.user.username;
+ },
+ id: 'name',
+ input: {
+ autovalidate: autovalidateListname
+ },
+ operator: '+',
+ visible: id != 'public',
+ width: width - 88
+ },
+ {
+ align: 'right',
+ id: 'items',
+ operator: '-',
+ visible: true,
+ width: 40
+ },
+ {
+ clickable: function(data) {
+ //alert(JSON.stringify([data.user, data.type]))
+ //Ox.print('$$$$$$$$', data.user, data.type)
+ return data.user == app.user.username && data.type == 'smart';
+ },
+ format: function(value) {
+ return $('')
+ .attr({
+ src: 'static/oxjs/build/png/ox.ui.' + Ox.theme() +
+ '/symbolFind.png'
+ })
+ .css({
+ opacity: value == 'static' ? 0.1 : 1
+ });
+ },
+ id: 'type',
+ operator: '+',
+ visible: true,
+ width: 16
+ },
+ {
+ clickable: id == 'my',
+ format: function(value) {
+ //var symbols = {private: 'Publish', public: 'Publish', featured: 'Star'};
+ return $('')
+ .attr({
+ src: 'static/oxjs/build/png/ox.ui.' + Ox.theme() + '/symbol'
+ + (value == 'featured' ? 'Star' : 'Publish') + '.png'
+ })
+ .css({
+ opacity: value == 'private' ? 0.1 : 1
+ })
+ },
+ id: 'status',
+ operator: '+',
+ visible: true,
+ width: 16
+ }
+ ],
+ max: 1,
+ min: 0,
+ pageLength: 1000,
+ request: function(data, callback) {
+ var query;
+ if (id == 'my') {
+ query = {conditions: [
+ {key: 'user', value: app.user.username, operator: '='},
+ {key: 'status', value: 'featured', operator: '!'}
+ ], operator: ''};
+ } else if (id == 'public') {
+ query = {conditions: [{key: 'subscribed', value: true, operator: '='}], operator: ''};
+ } else if (id == 'featured') {
+ query = {conditions: [{key: 'status', value: 'featured', operator: '='}], operator: '&'};
+ }
+ return pandora.api.findLists($.extend(data, {
+ query: query
+ }), callback);
+ },
+ sort: [
+ {key: 'position', operator: '+'}
+ ],
+ sortable: id == 'my' || id == 'public' || app.user.group == 'admin'
+ })
+ .css({
+ left: 0,
+ top: 0,
+ width: width + 'px',
+ })
+ .bind({
+ dragenter: function(e) {
+ //Ox.print('DRAGENTER', e)
+ }
+ })
+ .bindEvent({
+ click: function(event, data) {
+ var $list = app.$ui.sectionList[i];
+ if (data.key == 'type') {
+ var $dialog = new Ox.Dialog({
+ buttons: [
+ new Ox.Button({
+ id: 'cancel',
+ title: 'Cancel'
+ }).bindEvent('click', function() {
+ $dialog.close();
+ }),
+ new Ox.Button({
+ id: 'save',
+ title: 'Save'
+ }).bindEvent('click', function() {
+ $dialog.close();
+ })
+ ],
+ content: new Ox.Element('div').html('...'),
+ height: 200,
+ keys: {enter: 'save', escape: 'cancel'},
+ title: 'Advanced Find',
+ width: 640
+ }).open();
+ } else if (data.key == 'status') {
+ pandora.api.editList({
+ id: data.id,
+ status: $list.value(data.id, data.key) == 'private' ? 'public' : 'private'
+ }, function(result) {
+ $list.value(result.data.id, 'status', result.data.status);
+ });
+ }
+ },
+ 'delete': function(event, data) {
+ var $list = app.$ui.sectionList[i];
+ URL.set('');
+ $list.options({selected: []});
+ pandora.api.removeList({
+ id: data.ids[0]
+ }, function() {
+ Ox.Request.emptyCache(); // fixme: remove
+ $list.reloadList();
+ });
+ },
+ init: function(event, data) {
+ app.ui.sectionLength[id] = data.items;
+ app.$ui.section[i].$content.css({
+ height: data.items * 16 + 'px'
+ });
+ app.$ui.sectionList[i].css({
+ height: data.items * 16 + 'px'
+ });
+ },
+ move: function(event, data) {
+ /*
+ data.ids.forEach(function(id, pos) {
+ app.user.ui.lists[id].position = pos;
+ });
+ */
+ pandora.api.sortLists({
+ section: id,
+ ids: data.ids
+ });
+ },
+ select: function(event, data) {
+ if (data.ids.length) {
+ app.$ui.sectionList.forEach(function($list, i_) {
+ i != i_ && $list.options('selected', []);
+ });
+ URL.set('?find=list:' + data.ids[0]);
+ } else {
+ URL.set('');
+ }
+ },
+ submit: function(event, data) {
+ data_ = {id: data.id};
+ data_[data.key] = data.value;
+ pandora.api.editList(data_, function(result) {
+ if (result.data.id != data.id) {
+ app.$ui.sectionList[i].value(data.id, 'name', result.data.name);
+ app.$ui.sectionList[i].value(data.id, 'id', result.data.id);
+ URL.set('?find=list:' + result.data.id);
+ }
+ });
+ }
+ });
+ return that;
+ },
sections: function() {
- var that = new Ox.Element();
+ var that = new Ox.Element()
+ .css({overflowY: 'auto'})
+ .bindEvent({
+ resize: function(event, data) {
+ resizeSections();
+ }
+ });
+ var counter = 0;
var $sections = [];
- app.$ui.sectionLists = [];
+ app.$ui.section = [];
+ app.$ui.sectionList = [];
$.each(app.user.ui.sections, function(i, id) {
- var $section, menu = [];
+ var menu = [];
if (id == 'my') {
menu = [
{ id: 'new', title: 'New List...' },
@@ -2119,7 +2467,7 @@ var pandora = new Ox.App({
{ id: 'browse', title: 'More Public Lists...' },
];
}
- $section = new Ox.CollapsePanel({
+ app.$ui.section[i] = new Ox.CollapsePanel({
id: id,
menu: menu,
size: 16,
@@ -2127,7 +2475,7 @@ var pandora = new Ox.App({
})
.bindEvent({
click: function(event, data) {
- var $list = app.$ui.sectionLists[i],
+ var $list = app.$ui.sectionList[i],
id;
if (data.id == 'new' || data.id == 'newsmart') {
pandora.api.addList({
@@ -2138,234 +2486,39 @@ var pandora = new Ox.App({
id = result.data.id;
URL.set('?find=list:' + id)
Ox.Request.emptyCache(); // fixme: remove
- $list.reloadList()
- .bindEvent({load: load});
+ $list.reloadList().bindEvent({load: load});
+ function load(event, data) {
+ $list.gainFocus()
+ .options({selected: [id]})
+ .editCell(id, 'name');
+ $list.unbindEvent({load: load}) // fixme: need bindEventOnce
+ }
});
- }
- function load(event, data) {
- $list.gainFocus()
- .options({selected: [id]})
- .editCell(id, 'name');
- $list.unbindEvent({load: load}) // fixme: need bindEventOnce
+ } else if (data.id == 'browse') {
+ app.$ui.publicListsDialog = ui.publicListsDialog().open();
}
},
toggle: function(event, data) {
Ox.print('toggle')
- data.collapsed && app.$ui.sectionLists[i].loseFocus();
+ data.collapsed && app.$ui.sectionList[i].loseFocus();
+ app.user.ui.showSection[id] = !data.collapsed;
}
});
- $sections.push($section);
- app.$ui.sectionLists[i] = new Ox.TextList({
- columns: [
- {
- id: 'user',
- format: function() {
- return $('').attr({
- src: 'static/oxjs/build/png/ox.ui/icon16.png'
- });
- },
- operator: '+',
- visible: true,
- width: 16
- },
- {
- id: 'id',
- format: function(value) {
- return value.split('.').join(': ');
- },
- operator: '+',
- unique: true,
- visible: id == 'public',
- width: 168
- },
- {
- align: 'left',
- editable: function(data) {
- return data.user == app.user.username;
- // return data.id && data.id.split(': ')[0] == app.user.username;
- },
- id: 'name',
- input: {
- autovalidate: autovalidateListname
- },
- operator: '+',
- visible: id != 'public',
- width: 168
- },
- {
- align: 'right',
- id: 'items',
- operator: '-',
- visible: true,
- width: 40
- },
- {
- align: 'left',
- clickable: function(data) {
- //alert(JSON.stringify([data.user, data.type]))
- //Ox.print('$$$$$$$$', data.user, data.type)
- return data.user == app.user.username && data.type == 'smart';
- },
- format: function(value) {
- // var symbols = {static: 'Click', smart: 'Find'};
- return $('')
- .attr({
- src: 'static/oxjs/build/png/ox.ui.' + Ox.theme() +
- '/symbolFind.png'
- })
- .css({
- opacity: value == 'static' ? 0.1 : 1
- });
- },
- id: 'type',
- operator: '+',
- visible: true,
- width: 16
- },
- {
- align: 'left',
- clickable: id == 'my',
- format: function(value) {
- //var symbols = {private: 'Publish', public: 'Publish', featured: 'Star'};
- return $('')
- .attr({
- src: 'static/oxjs/build/png/ox.ui.' + Ox.theme() + '/symbol'
- + (value == 'featured' ? 'Star' : 'Publish') + '.png'
- })
- .css({
- opacity: value == 'private' ? 0.1 : 1
- })
- },
- id: 'status',
- operator: '+',
- visible: true,
- width: 16
- }
- ],
- max: 1,
- min: 0,
- pageLength: 1000,
- request: function(data, callback) {
- var query;
- if (id == 'my') {
- query = {conditions: [
- {key: 'user', value: app.user.username, operator: '='},
- {key: 'status', value: 'featured', operator: '!'}
- ], operator: ''};
- } else if (id == 'public') {
- query = {conditions: [{key: 'subscribed', value: true, operator: '='}], operator: ''};
- } else if (id == 'featured') {
- query = {conditions: [{key: 'status', value: 'featured', operator: '='}], operator: '&'};
- }
- return pandora.api.findLists($.extend(data, {
- query: query
- }), callback);
- },
- sort: [
- {key: 'position', operator: '+'}
- ],
- sortable: id == 'my' || id == 'public' || app.user.group == 'admin'
- })
- .css({
- left: 0,
- top: 0,
- width: app.user.ui.sidebarSize + 'px',
- })
- .bind({
- dragenter: function(e) {
- //Ox.print('DRAGENTER', e)
- }
- })
- .bindEvent({
- click: function(event, data) {
- var $list = app.$ui.sectionLists[i];
- if (data.key == 'type') {
- var $dialog = new Ox.Dialog({
- buttons: [
- new Ox.Button({
- id: 'cancel',
- title: 'Cancel'
- }).bindEvent('click', function() {
- $dialog.close();
- }),
- new Ox.Button({
- id: 'save',
- title: 'Save'
- }).bindEvent('click', function() {
- $dialog.close();
- })
- ],
- content: new Ox.Element('div').html('...'),
- height: 200,
- keys: {enter: 'save', escape: 'cancel'},
- title: 'Advanced Find',
- width: 640
- }).open();
- } else if (data.key == 'status') {
- pandora.api.editList({
- id: data.id,
- status: $list.value(data.id, data.key) == 'private' ? 'public' : 'private'
- }, function(result) {
- $list.value(result.data.id, 'status', result.data.status);
- });
- }
- },
- 'delete': function(event, data) {
- var $list = app.$ui.sectionLists[i];
- URL.set('');
- $list.options({selected: []});
- pandora.api.removeList({
- id: data.ids[0]
- }, function() {
- Ox.Request.emptyCache(); // fixme: remove
- $list.reloadList();
- });
- },
- init: function(event, data) {
- $section.$content.css({
- height: data.items * 16 + 'px'
- });
- app.$ui.sectionLists[i].css({
- height: data.items * 16 + 'px'
- });
- },
- move: function(event, data) {
- /*
- data.ids.forEach(function(id, pos) {
- app.user.ui.lists[id].position = pos;
- });
- */
- pandora.api.sortLists({
- section: id,
- ids: data.ids
- });
- },
- select: function(event, data) {
- if (data.ids.length) {
- app.$ui.sectionLists.forEach(function($list, i_) {
- i != i_ && $list.options('selected', []);
- });
- URL.set('?find=list:' + data.ids[0]);
- } else {
- URL.set('');
- }
- },
- submit: function(event, data) {
- data_ = {id: data.id};
- data_[data.key] = data.value;
- pandora.api.editList(data_, function(result) {
- if (result.data.id != data.id) {
- app.$ui.sectionLists[i].value(data.id, 'name', result.data.name);
- app.$ui.sectionLists[i].value(data.id, 'id', result.data.id);
- URL.set('?find=list:' + result.data.id);
- }
- });
- }
- })
- .appendTo($section.$content);
- });
- $.each($sections, function(i, $section) {
- that.append($section);
+ $sections.push(app.$ui.section[i]);
+ app.$ui.sectionList[i] = ui.sectionList(id, i)
+ .bindEvent({init: init})
+ .appendTo(app.$ui.section[i].$content);
+ function init(event, data) {
+ Ox.print('init', i, counter)
+ if (++counter == 3) {
+ $.each($sections, function(i, $section) {
+ that.append($section);
+ });
+ resizeSections();
+ }
+ app.$ui.sectionList[i].unbindEvent({init: init}); // fixme: need bindEventOnce
+ }
+ app.$ui.sectionList[i]
});
that.toggle = function() {
@@ -2569,13 +2722,32 @@ var pandora = new Ox.App({
) > -1 ? 'left' : 'right';
}
- function getGroupWidth(pos, panelWidth) {
+ function getGroupWidth(pos, panelWidth) { // fixme: don't pass panelWidth
var width = {};
width.list = Math.floor(panelWidth / 5) + (panelWidth % 5 > pos);
width.column = width.list - 40 - ($.browser.mozilla ? 16 : 12);
return width;
}
+ function getSectionsWidth() {
+ var width = app.user.ui.sidebarSize;
+ Ox.print(getSectionsHeight(), '>', app.$ui.leftPanel.height() - 24 - 1 - app.$ui.info.height(), getSectionsHeight() > app.$ui.leftPanel.height() - 24 - 1 - app.$ui.info.height())
+ // fixme: don't use height(), look up in splitpanels
+ if (getSectionsHeight() > app.$ui.leftPanel.height() - 24 - 1 - app.$ui.info.height()) {
+ width -= $.browser.mozilla ? 16 : 12;
+ }
+ return width;
+ }
+
+ function getSectionsHeight() {
+ var height = 48;
+ $.each(app.user.ui.showSection, function(id, show) {
+ height += show * app.ui.sectionLength[id] * 16;
+ });
+ Ox.print('getSectionsHeight', height)
+ return height;
+ }
+
function getSortOperator(key) { // fixme: make static
return ['person', 'string', 'text', 'title'].indexOf(
Ox.getObjectById(app.config.sortKeys, key).type
@@ -2621,6 +2793,14 @@ var pandora = new Ox.App({
});
}
+ function resizeSections() {
+ var width = getSectionsWidth();
+ app.$ui.sectionList.forEach(function($list) {
+ $list.css({width: width + 'px'});
+ $list.resizeColumn('name', width - 88);
+ });
+ }
+
function validateUser(key, existing) {
existing = existing || false;
var string = key == 'username' ? 'username' : 'e-mail address';