diff --git a/pandora/0xdb.json b/pandora/0xdb.json index bd5031d41..a1e788d67 100644 --- a/pandora/0xdb.json +++ b/pandora/0xdb.json @@ -1,10 +1,13 @@ { "capabilities": { - "canPlayClips": {"guest": 1, "member": 2, "staff": 3, "admin": 4}, - "canPlayVideo": {"guest": 0, "member": 1, "staff": 3, "admin": 4}, - "canSeeItem": {"guest": 2, "member": 2, "staff": 3, "admin": 4}, - "canSeeFiles": {"guest": -1, "member": -1, "staff": 3, "admin": 4}, - "canSeeExtraItemViews": {"guest": false, "member": false, "staff": true, "admin": true} + "canDeleteItems": {"admin": true}, + "canEditItemIcons": {"staff": true, "admin": true}, + "canPlayClips": {"guest": 1, "member": 2, "friend": 3, "staff": 4, "admin": 4}, + "canPlayVideo": {"guest": 0, "member": 1, "friend": 3, "staff": 4, "admin": 4}, + "canReloadMetadata": {"staff": true, "admin": true}, + "canSeeFiles": {"guest": -1, "member": -1, "friend": -1, "staff": 4, "admin": 4}, + "canSeeItem": {"guest": 2, "member": 2, "friend": 3, "staff": 4, "admin": 4}, + "canSeeExtraItemViews": {"friend": true, "staff": true, "admin": true} }, "clipKeys": [ {"id": "clip:text", "title": "Text", "type": "string"}, @@ -551,7 +554,6 @@ "columnWidth": {} } }, - "editIcon": false, "find": {"conditions": [], "operator": "&"}, "groups": [ {"id": "director", "sort": [{"key": "items", "operator": "-"}]}, @@ -580,6 +582,7 @@ "showFlags": true, "showGroups": true, "showHome": true, + "showIconBrowser": false, "showInfo": true, "showMapControls": false, "showMapLabels": false, @@ -608,7 +611,7 @@ {"name": "Movies A-Z", "path": "", "items": 1234} ] }, - "userLevels": ["guest", "member", "staff", "admin"], + "userLevels": ["guest", "member", "friend", "staff", "admin"], "video": { "download": false, "formats": ["webm", "mp4"], diff --git a/static/js/pandora/ui/infoView.js b/static/js/pandora/ui/infoView.js index 4bf4e5a21..0369bf6fc 100644 --- a/static/js/pandora/ui/infoView.js +++ b/static/js/pandora/ui/infoView.js @@ -3,46 +3,54 @@ pandora.ui.infoView = function(data) { // fixme: given that currently, the info view doesn't scroll into view nicely // when collapsing the movies browser, the info view should become a split panel - var css = { + var ui = pandora.user.ui, + canEditIcons = pandora.site.capabilities.canEditItemIcons[pandora.user.level], + borderRadius = ui.icons == 'posters' ? 0 : iconSize / 8, + css = { marginTop: '4px', textAlign: 'justify', MozUserSelect: 'text', WebkitUserSelect: 'text' }, - listWidth = 144 + Ox.UI.SCROLLBAR_SIZE, - margin = 16, - iconSize = pandora.user.ui.infoIconSize, - iconRatio = pandora.user.ui.icons == 'posters' - ? (pandora.user.ui.showSitePoster ? 5/8 : data.posterRatio) : 1, + iconRatio = ui.icons == 'posters' + ? (ui.showSitePoster ? 5/8 : data.posterRatio) : 1, + iconSize = ui.infoIconSize, iconWidth = iconRatio > 1 ? iconSize : Math.round(iconSize * iconRatio), iconHeight = iconRatio < 1 ? iconSize : Math.round(iconSize / iconRatio), iconLeft = iconSize == 256 ? Math.floor((iconSize - iconWidth) / 2) : 0, - borderRadius = pandora.user.ui.icons == 'posters' ? 0 : iconSize / 8, - that = Ox.Element(), + listWidth = 144 + Ox.UI.SCROLLBAR_SIZE, + margin = 16, + statisticsWidth = 128, uid = Ox.uid(), + + that = Ox.Element(), + $list, + $info = $('
') .css({ position: 'absolute', - left: pandora.user.level == 'admin' && !pandora.user.ui.editPoster ? -listWidth + 'px' : 0, + left: canEditIcons && !ui.showIconBrowser ? -listWidth + 'px' : 0, top: 0, right: 0, }) .appendTo(that.$element), + $data = Ox.Container() .css({ position: 'absolute', - left: (pandora.user.level == 'admin' ? listWidth : 0) + 'px', + left: (canEditIcons ? listWidth : 0) + 'px', top: 0, right: 0, height: pandora.$ui.contentPanel.size(1) + 'px' }) .appendTo($info), + $icon = Ox.Element('') .attr({ src: '/' + data.id + '/' + ( - pandora.user.ui.icons == 'posters' - ? (pandora.user.ui.showSitePoster ? 'siteposter' : 'poster') : 'icon' + ui.icons == 'posters' + ? (ui.showSitePoster ? 'siteposter' : 'poster') : 'icon' ) + '512.jpg?' + uid }) .css({ @@ -58,6 +66,7 @@ pandora.ui.infoView = function(data) { singleclick: toggleIconSize }) .appendTo($data.$element), + $reflection = $('
') .addClass('OxReflection') .css({ @@ -69,10 +78,11 @@ pandora.ui.infoView = function(data) { overflow: 'hidden' }) .appendTo($data.$element), + $reflectionIcon = $('') .attr({ src: '/' + data.id + '/' + ( - pandora.user.ui.icons == 'posters' ? 'poster' : 'icon' + ui.icons == 'posters' ? 'poster' : 'icon' ) + '512.jpg?' + uid }) .css({ @@ -83,6 +93,7 @@ pandora.ui.infoView = function(data) { borderRadius: borderRadius + 'px' }) .appendTo($reflection), + $reflectionGradient = $('
') .css({ position: 'absolute', @@ -90,12 +101,13 @@ pandora.ui.infoView = function(data) { height: iconSize / 2 + 'px' }) .appendTo($reflection), + $text = $('
') .css({ position: 'absolute', left: margin + (iconSize == 256 ? 256 : iconWidth) + margin + 'px', top: margin + 'px', - right: margin + 'px' + right: margin + statisticsWidth + margin + 'px' }) .bind({ click: function(e) { @@ -107,6 +119,16 @@ pandora.ui.infoView = function(data) { } }) .appendTo($data.$element), + + $statistics = $('
') + .css({ + position: 'absolute', + width: statisticsWidth + 'px', + top: margin + 'px', + right: margin + 'px' + }) + .appendTo($data.$element), + $browserImages = []; var match = /(\(S\d{2}(E\d{2})?\))/.exec(data.title); @@ -329,29 +351,31 @@ pandora.ui.infoView = function(data) { $('
').css({height: '8px'}).appendTo($text); - if (pandora.user.level == 'admin') { + ['hue', 'saturation', 'lightness'].forEach(function(key) { + $('
') + .css({marginBottom: '4px'}) + .append(formatKey(key, true)) + .append(Ox.formatColor(data[key], key)) + .appendTo($statistics); + }); + + if (canEditIcons) { $icon.bindEvent({ doubleclick: function() { - pandora.UI.set('editPoster', !pandora.user.ui.editPoster); - if (pandora.user.ui.editPoster) { - $info.animate({ - left: 0 - }, 250); - } else { - $info.animate({ - left: -listWidth + 'px' - }, 250); - } + pandora.UI.set('showIconBrowser', !ui.showIconBrowser); + $info.animate({ + left: ui.showIconBrowser ? 0 : -listWidth + 'px' + }, 250); } }); - renderList(); - } - function formatKey(key) { - return '' + Ox.toTitleCase(key) + ': '; + function formatKey(key, isStatistics) { + return isStatistics + ? $('
').css({marginBottom: '2px', fontWeight: 'bold'}).html(Ox.toTitleCase(key)) + : '' + Ox.toTitleCase(key) + ': '; } function formatLight(str) { @@ -369,15 +393,15 @@ pandora.ui.infoView = function(data) { function renderList() { pandora.api.get({ id: data.id, - keys: [pandora.user.ui.icons == 'posters' ? 'posters' : 'frames'] + keys: [ui.icons == 'posters' ? 'posters' : 'frames'] }, 0, function(result) { - var images = result.data[pandora.user.ui.icons == 'posters' ? 'posters' : 'frames'], + var images = result.data[ui.icons == 'posters' ? 'posters' : 'frames'], selectedImage = images.filter(function(image) { return image.selected; })[0]; $list = Ox.IconList({ - defaultRatio: pandora.user.ui.icons == 'posters' ? 5/8 : data.stream.aspectRatio, - fixedRatio: pandora.user.ui.icons == 'posters' ? false : data.stream.aspectRatio, + defaultRatio: ui.icons == 'posters' ? 5/8 : data.stream.aspectRatio, + fixedRatio: ui.icons == 'posters' ? false : data.stream.aspectRatio, item: function(data, sort, size) { var ratio = data.width / data.height; size = size || 128; @@ -385,13 +409,13 @@ pandora.ui.infoView = function(data) { height: ratio <= 1 ? size : size / ratio, id: data['id'], info: data.width + ' x ' + data.height + ' px', - title: pandora.user.ui.icons == 'posters' ? data.source : Ox.formatDuration(data.position), + title: ui.icons == 'posters' ? data.source : Ox.formatDuration(data.position), url: data.url, width: ratio >= 1 ? size : size * ratio } }, items: images, - keys: pandora.user.ui.icons == 'posters' + keys: ui.icons == 'posters' ? ['index', 'source', 'width', 'height', 'url'] : ['index', 'position', 'width', 'height', 'url'], max: 1, @@ -421,12 +445,12 @@ pandora.ui.infoView = function(data) { if ($browserImages.length == 0) { $browserImages = pandora.$ui.browser.find('img[src*="/' + data.id + '/"]'); } - if (pandora.user.ui.icons == 'posters' && !pandora.user.ui.showSitePoster) { + if (ui.icons == 'posters' && !ui.showSitePoster) { $browserImages.each(function() { var $this = $(this), size = Math.max($this.width(), $this.height()); $this.attr({src: src}); - pandora.user.ui.icons == 'posters' && $this.css(imageRatio < 1 ? { + ui.icons == 'posters' && $this.css(imageRatio < 1 ? { width: Math.round(size * imageRatio) + 'px', height: size + 'px' } : { @@ -440,9 +464,9 @@ pandora.ui.infoView = function(data) { iconSize = iconSize == 256 ? 512 : 256; toggleIconSize(); } - pandora.api[pandora.user.ui.icons == 'posters' ? 'setPoster' : 'setPosterFrame'](Ox.extend({ + pandora.api[ui.icons == 'posters' ? 'setPoster' : 'setPosterFrame'](Ox.extend({ id: data.id - }, pandora.user.ui.icons == 'posters' ? { + }, ui.icons == 'posters' ? { source: selectedImage.source } : { // fixme: api slightly inconsistent, this shouldn't be "position" @@ -450,14 +474,14 @@ pandora.ui.infoView = function(data) { }), function() { // fixme: update the info (video preview) frame as well var src; - if (pandora.user.ui.icons == 'frames') { + if (ui.icons == 'frames') { src = '/' + data.id + '/icon512.jpg?' + Ox.uid() $icon.attr({src: src}); $reflectionIcon.attr({src: src}); } $browserImages.each(function() { $(this).attr({src: '/' + data.id + '/' + ( - pandora.user.ui.icons == 'posters' ? 'poster' : 'icon' + ui.icons == 'posters' ? 'poster' : 'icon' ) + '64.jpg?' + Ox.uid()}); }); }); @@ -473,7 +497,7 @@ pandora.ui.infoView = function(data) { iconWidth = iconRatio > 1 ? iconSize : Math.round(iconSize * iconRatio); iconHeight = iconRatio < 1 ? iconSize : Math.round(iconSize / iconRatio); iconLeft = iconSize == 256 ? Math.floor((iconSize - iconWidth) / 2) : 0, - borderRadius = pandora.user.ui.icons == 'posters' ? 0 : iconSize / 8; + borderRadius = ui.icons == 'posters' ? 0 : iconSize / 8; $icon.animate({ left: margin + iconLeft + 'px', width: iconWidth + 'px', @@ -503,14 +527,14 @@ pandora.ui.infoView = function(data) { that.reload = function() { var src = src = '/' + data.id + '/' + ( - pandora.user.ui.icons == 'posters' - ? (pandora.user.ui.showSitePoster ? 'siteposter' : 'poster') : 'icon' + ui.icons == 'posters' + ? (ui.showSitePoster ? 'siteposter' : 'poster') : 'icon' ) + '512.jpg?' + Ox.uid() $icon.attr({src: src}); $reflectionIcon.attr({src: src}); iconSize = iconSize == 256 ? 512 : 256; - iconRatio = pandora.user.ui.icons == 'posters' - ? (pandora.user.ui.showSitePoster ? 5/8 : data.posterRatio) : 1; + iconRatio = ui.icons == 'posters' + ? (ui.showSitePoster ? 5/8 : data.posterRatio) : 1; toggleIconSize(); pandora.user.level == 'admin' && $list.replaceWith($list = renderList()); }; @@ -524,7 +548,7 @@ pandora.ui.infoView = function(data) { that.bindEvent({ pandora_icons: that.reload, pandora_showsiteposter: function() { - pandora.user.ui.icons == 'posters' && that.reload(); + ui.icons == 'posters' && that.reload(); } }); diff --git a/static/js/pandora/ui/toolbar.js b/static/js/pandora/ui/toolbar.js index 6124d50de..bcf5c435c 100644 --- a/static/js/pandora/ui/toolbar.js +++ b/static/js/pandora/ui/toolbar.js @@ -23,7 +23,10 @@ pandora.ui.toolbar = function() { pandora.$ui.orderButton = pandora.ui.orderButton() ); } - if (ui.item && ui.itemView == 'info' && pandora.user.level == 'admin') { + if ( + ui.item && ui.itemView == 'info' + && pandora.site.capabilities.canReloadMetadata[pandora.user.level] + ) { that.append( Ox.Button({ title: 'Reload Metadata'