diff --git a/static/js/pandora/metadataDialog.js b/static/js/pandora/metadataDialog.js index 141fac61..6db85bfc 100644 --- a/static/js/pandora/metadataDialog.js +++ b/static/js/pandora/metadataDialog.js @@ -3,75 +3,182 @@ pandora.ui.metadataDialog = function(data) { var keys = [ - 'title', 'alternativetitles', + 'title', 'alternativeTitles', 'director', 'country', 'year', 'language', 'runtime', - 'productioncompany', - 'producer', 'writer', 'cinematographer', 'editor', 'cast', - 'genre', 'keywords', + // 'productionCompany', + 'producer', 'writer', 'cinematographer', 'editor', 'actor', + 'genre', 'keyword', 'summary' // color, sound ], updateKeys, dialogHeight = Math.round((window.innerHeight - 48) * 0.9), dialogWidth = Math.round(window.innerWidth * 0.9), - formWidth = dialogWidth - 32, + formWidth = getFormWidth(), imdb, - $content = Ox.Element(), + $confirmDialog, + $label = {}, $input = {}, - that = Ox.Dialog({ - buttons: [ - Ox.Button({ - id: 'cancel', - title: 'Don\'t Update' - }) - .bindEvent({ - click: function() { - that.close(); - } - }), - {}, - Ox.Button({ - id: 'update', - title: 'Update' - }) - .bindEvent({ - click: function() { - updateMetadata(); - } - }) - ], - height: dialogHeight, - closeButton: true, - content: $content, - maximizeButton: true, - removeOnClose: true, - title: 'Update Metadata', - width: dialogWidth - }) - .bindEvent({ - resize: setSize - }); + that = data.imdbId ? updateDialog() : idDialog(); + + data.imdbId && getMetadata(); + + function idDialog() { + return Ox.Dialog({ + buttons: [ + Ox.Button({ + id: 'close', + title: 'Close' + }) + .bindEvent({ + click: function() { + that.close(); + } + }) + ], + content: Ox.Element() + .append( + $('') + .attr({src: '/static/png/icon.png'}) + .css({position: 'absolute', left: '16px', top: '16px', width: '64px', height: '64px'}) + ) + .append( + $('
') + .css({position: 'absolute', left: '96px', top: '16px', width: '192px'}) + .html( + 'To update the metadata for this ' + + pandora.site.itemName.singular.toLowerCase() + + ', please enter its IMDb ID.' + ) + ), + fixedSize: true, + height: 128, + keyboard: {enter: 'close', escape: 'close'}, + removeOnClose: true, + title: 'Update Metadata', + width: 304 + }); + } + + function updateDialog() { + return Ox.Dialog({ + buttons: [ + Ox.Button({ + id: 'cancel', + title: 'Don\'t Update' + }) + .bindEvent({ + click: function() { + that.close(); + } + }), + {}, + Ox.Button({ + disabled: true, + id: 'update', + title: 'Update' + }) + .bindEvent({ + click: function() { + $confirmDialog = confirmDialog().open(); + } + }) + ], + closeButton: true, + content: Ox.Element().append( + $('') + .attr({src: Ox.UI.getImageURL('symbolLoadingAnimated')}) + .css({ + position: 'absolute', + width: '32px', + height: '32px', + left: 0, + top: 0, + right: 0, + bottom: 0, + margin: 'auto' + }) + ), + height: dialogHeight, + maximizeButton: true, + minHeight: 256, + minWidth: 512, + removeOnClose: true, + title: 'Update Metadata', + width: dialogWidth + }) + .bindEvent({ + resize: setSize + }); + } + + function confirmDialog() { + return Ox.Dialog({ + buttons: [ + Ox.Button({ + id: 'cancel', + title: 'Don\'t Update' + }) + .bindEvent({ + click: function() { + $confirmDialog.close(); + } + }), + {}, + Ox.Button({ + id: 'update', + title: 'Update' + }) + .bindEvent({ + click: function() { + $confirmDialog.close(); + updateMetadata(); + } + }) + ], + content: Ox.Element() + .append( + $('') + .attr({src: '/static/png/icon.png'}) + .css({position: 'absolute', left: '16px', top: '16px', width: '64px', height: '64px'}) + ) + .append( + $('
') + .css({position: 'absolute', left: '96px', top: '16px', width: '192px'}) + .html( + 'Are you sure you want to update the value' + + (updateKeys.length == 1 ? '' : 's') + + ' for ' + updateKeys.map(function(key, index) { + return ( + index == 0 ? '' + : index < updateKeys.length - 1 ? ', ' + : ' and ' + ) + getTitle(key) + }).join('') + '?' + ) + ), + fixedSize: true, + height: 128, + keyboard: {enter: 'update', escape: 'cancel'}, + removeOnClose: true, + title: 'Update Metadata', + width: 304 + }); + } function getMetadata(id, callback) { - // ox.data getData() - pandora.api.getMetadata({id: id, keys: keys}, function(results) { + pandora.api.getMetadata({id: data.imdbId, keys: keys}, function(result) { + var $content = Ox.Element().css({padding: '12px', overflowY: 'auto'}); if (result.data) { imdb = result.data; - imdb.alternativetitles = imdb.alternativetitles.map(function(value) { - return value[0]; - }); - imdb.cast = imdb.cast.map(function(value) { - return value.actor; - }); keys.forEach(function(key, index) { var isEqual = Ox.isEqual(data[key], imdb[key]), checked = isEqual ? [true, true] - : !Ox.isEmpty(data) && Ox.isEmpty(imdb[key]) ? [true, false] - : [false, true], - itemKey = Ox.getObjectById(pandora.site.itemKeys, key); + : !Ox.isUndefined(data) && Ox.isUndefined(imdb[key]) ? [true, false] + : [false, true]; if (index > 0) { $('
') .css({ @@ -80,10 +187,11 @@ pandora.ui.metadataDialog = function(data) { }) .appendTo($content); } - Ox.Label({ - title: itemKey.title, + $label[key] = Ox.Label({ + title: getTitle(key), width: formWidth }) + .css({display: 'inline-block', margin: '4px'}) .appendTo($content); $input[key] = [data[key], imdb[key]].map(function(v, i) { return Ox.InputGroup({ @@ -96,7 +204,7 @@ pandora.ui.metadataDialog = function(data) { .bindEvent({ change: function(data) { var $otherInput = $input[key][1 - i], - otherValue = $otherInput.optons('value'); + otherValue = $otherInput.options('value'); otherValue[0] = !otherValue[0]; $otherInput.options({value: otherValue}); updateKeys = getUpdateKeys(); @@ -104,7 +212,7 @@ pandora.ui.metadataDialog = function(data) { } }), Ox.Input({ - value: formatValue(v, itemKey.type), + value: formatValue(key, v), width: formWidth - 80 }) .bindEvent({ @@ -112,7 +220,7 @@ pandora.ui.metadataDialog = function(data) { // on submit, revert to initial value $input[key][i].options({value: [ $input[key][i].options('value')[0], - formatValue(v, itemKey.type) + formatValue(key, v) ]}); } }) @@ -121,9 +229,11 @@ pandora.ui.metadataDialog = function(data) { {title: ['Current', 'Update'][i], width: 64} ] }) + .css({display: 'inline-block', margin: '4px'}) .appendTo($content); }); }); + that.options({content: $content}) updateKeys = getUpdateKeys(); updateButton(); } else { @@ -132,72 +242,64 @@ pandora.ui.metadataDialog = function(data) { }); } - function formatValue(value, type) { - return type == 'text' ? value.replace('/\\n/g', ' ') // FIXME: needed? - : Ox.isArray(type) ? value.join(', ') - : value + function formatValue(key, value) { + return key == 'alternativeTitles' ? value.map(function(v) { + return v[0]; + }).join('; ') + : Ox.isArray( + Ox.getObjectById(pandora.site.itemKeys, key).type + ) ? value.join(', ') + : value; + } + + function getFormWidth() { + return dialogWidth - 32 - Ox.UI.SCROLLBAR_SIZE; + } + + function getTitle(key) { + return key == 'alternativeTitles' ? 'Alternative Titles' + : Ox.getObjectById(pandora.site.itemKeys, key).title; } function getUpdateKeys() { return keys.filter(function(key) { - return $input[key][0].options('value')[0] == false; + return $input[key][0].options('value')[0] === false; }); } - function setSize() { - // ... + function parseValue(value, type) { + return Ox.isArray(type) ? ', '.split(value) : value; + } + + function setSize(data) { + dialogHeight = data.height; + dialogWidth = data.width; + formWidth = getFormWidth(); + Ox.forEach($input, function($inputs, key) { + $label[key].options({width: formWidth}); + $inputs.forEach(function($element) { + $element.options('inputs')[1].options({width: formWidth - 80}); + }); + }); } function updateButton() { - that[updateKeys.length ? 'disableButton' : 'enableButton']('update'); + that[updateKeys.length ? 'enableButton' : 'disableButton']('update'); } function updateMetadata() { - var $confirmDialog = Ox.Dialog({ - buttons: [ - Ox.Button({ - id: 'cancel', - title: 'Don\'t Update' - }) - .bindEvent({ - click: function() { - $confirmDialog.close(); - } - }), - {}, - Ox.Button({ - id: 'update', - title: 'Update' - }) - .bindEvent({ - click: function() { - Ox.print('UPDATE') - } - }) - ], - content: Ox.Element() - .append( - $('') - .attr({src: '/static/png/icon.png'}) - .css({position: 'absolute', left: '16px', top: '16px', width: '64px', height: '64px'}) - ) - .append( - $('
') - .css({position: 'absolute', left: '96px', top: '16px', width: '192px'}) - .html( - 'To add or edit ' + layer + ', ' + ( - isEditor ? 'please sign up or sign in.' - : 'just switch to the editor.' - ) - ) - ), - fixedSize: true, - height: 128, - removeOnClose: true, - title: 'Update Metadata', - width: 304 - }).open(); - + var edit = {id: data.id}; + updateKeys.forEach(function(key) { + edit[key] = imdb[key]; + }); + that.disableButtons(); + pandora.api.edit(edit, function(result) { + that.close(); + pandora.updateItemContext(); + pandora.$ui.contentPanel.replaceElement(1, + pandora.$ui.item = pandora.ui.item() + ); + }); } return that;