'use strict'; oml.ui.importExportDialog = function(selected) { var ui = oml.user.ui, username = oml.user.preferences.username, $bar = Ox.Bar({size: 24}), $buttons = Ox.ButtonGroup({ buttons: [ {id: 'import', title: Ox._('Import Books')}, {id: 'export', title: Ox._('Export Books')} ], min: 1, max: 1, selectable: true, selected: selected }) .css({ width: '768px', padding: '4px 0', textAlign: 'center' }) .bindEvent({ change: function(data) { oml.UI.set({page: data.value}); } }) .appendTo($bar), $innerPanel = Ox.SlidePanel({ elements: [ {id: 'import', element: Ox.Element()}, {id: 'export', element: Ox.Element()} ], orientation: 'horizontal', selected: selected, size: 512 }), $outerPanel = Ox.SplitPanel({ elements: [ {element: $bar, size: 24}, {element: $innerPanel} ], orientation: 'vertical' }), that = Ox.Dialog({ buttons: [ Ox.Button({ id: 'hide', title: Ox._('Hide') }) .bindEvent({ click: function() { that.close(); } }) ], closeButton: true, content: Ox.LoadingScreen().start(), height: 144, removeOnClose: true, title: Ox._('Import & Export Books'), width: 512 }) .bindEvent({ close: function() { if (Ox.contains(['import', 'export'], ui.page)) { oml.UI.set({page: ''}); } }, oml_page: function(data) { if (Ox.contains(['import', 'export'], data.value)) { selected = data.value; $buttons.options({selected: selected}); $innerPanel.options({selected: selected}); } } }), $label = {}, $activityButton = {}, $progress = {}, $status = {}, $progressButton = {}; oml.getLists(function() { oml.api.getActivity(function(result) { var isActive = !Ox.isEmpty(result.data), activity = result.data.activity; /* result.data = { path: '/Users/rolux/Desktop/Books', status: {}, progress: [0,42] }; */ $innerPanel .replaceElement(0, activity == 'import' ? renderActivity(result.data) : renderForm('import', isActive) ) .replaceElement(1, activity == 'export' ? renderActivity(result.data) : renderForm('export', isActive) ); that.options({content: $outerPanel}); }); }); function getListItems(selected) { var lists = ui._lists.filter(function(list) { return list.user == username && list.type != 'library' && ( selected == 'export' || list.type == 'static' ); }); return [ {id: '', title: Ox._('Library')} ].concat( lists.length ? [{}] : [] ).concat( lists.map(function(list) { return {id: list.name, title: list.name}; }) ).concat(selected == 'import' ? [ {}, {id: 'FIXME', title: Ox._('New List...')} ] : []); } function getListNames() { return ui._lists.filter(function(list) { return list.user == username; }).map(function(list) { return list.name; }); } function renderActivity(data) { var $element = Ox.Element(), $title = $('
') .addClass('OxSelectable') .css({ margin: '16px 16px 4px 16px', width: '480px', height: '16px', whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }) .html( Ox._(data.activity == 'import' ? 'Import from' : 'Export to') + ' ' + data.path + '' ) .appendTo($element); $progress[data.activity] = Ox.Progressbar({ progress: -1, showTooltips: true, width: 480 }) .css({margin: '4px 16px'}) .appendTo($element); $status[data.activity] = $('
') .addClass('OxSelectable') .css({ margin: '6px 16px 4px 16px', height: '16px' }) .appendTo($element); $progressButton[data.activity] = Ox.Button({ title: '', width: 128 }) .css({ position: 'absolute', right: '16px', bottom: '16px' }) .bindEvent({ click: function() { if (this.options('title') == Ox._('Done')) { $innerPanel.replaceElement(0, renderForm(data.activity)); } else { oml.api[ data.activity == 'import' ? 'cancelImport' : 'cancelExport' ](function() { // ... }); } } }) .appendTo($element); if (data.progress) { setProgress(data); setStatus(data); setButton(data); } return $element; } function renderForm(selected, isActive) { var $element = Ox.Element(), $form = Ox.Form({ items: selected == 'import' ? [ Ox.Input({ autocomplete: function(value, callback) { oml.api.autocompleteFolder({path: value}, function(result) { callback(result.data.items); }); }, autocompleteSelect: true, changeOnKeypress: true, id: 'path', label: 'Source Path', labelWidth: 128, width: 480 }), Ox.SelectInput({ id: 'list', inputValue: oml.getValidName(Ox._('Untitled'), getListNames()), inputWidth: 224, items: getListItems('import'), label: 'Destination', labelWidth: 128, max: 1, min: 1, value: '', width: 480 }), Ox.Select({ id: 'mode', items: [ {id: 'copy', title: Ox._('Copy (keep files in source path)')}, {id: 'move', title: Ox._('Move (delete files from source path)')} ], label: Ox._('Import Mode'), labelWidth: 128, width: 480 }) ] : [ Ox.Input({ changeOnKeypress: true, id: 'path', label: 'Destination Path', labelWidth: 128, width: 480 }), Ox.Select({ id: 'list', items: getListItems('export'), label: 'Source', labelWidth: 128, value: ':', width: 480 }), Ox.Select({ id: 'mode', items: [ {id: 'add', title: Ox._('Add (keep files in destination path)')}, {id: 'replace', title: Ox._('Replace (delete files from destination path)')} ], label: Ox._('Export Mode'), labelWidth: 128, width: 480 }) ] }) .css({margin: '16px'}) .bindEvent({ change: function(data) { var values = $form.values(); $activityButton[selected].options({ disabled: !values.path }); } }) .appendTo($element); $label[selected] = Ox.Label({ //textAlign: 'center', title: Ox._( 'Waiting for ' + (selected == 'import' ? 'export' : 'import') + ' to finish...' ), width: 344 }) .css({ position: 'absolute', bottom: '16px', left: '16px' }) [isActive ? 'show' : 'hide']() .appendTo($element); $activityButton[selected] = Ox.Button({ disabled: true, id: 'import', title: Ox._(selected == 'import' ? 'Import' : 'Export'), width: 128 }) .css({ position: 'absolute', right: '16px', bottom: '16px' }) .bindEvent({ click: function() { var data = $form.values(), addList = data.list && !Ox.contains( oml.getOwnListNames(), data.list ); $innerPanel.replaceElement(0, renderActivity({ activity: 'import', path: data.path, progress: [0, 0] }) ); $label['export'].show(); (addList ? oml.addList : Ox.noop)(false, false, data.list, function() { oml.api.import({ list: data.list, mode: data.mode, path: data.path, }, function() { // ... }); }); } }) .appendTo($element); return $element; } function setButton(data) { $progressButton[data.activity].options({ title: !data.status ? Ox._( data.activity == 'import' ? 'Cancel Import' : 'Cancel Export' ) : Ox._('Done') }); } function setProgress(data) { var progress = data.status ? 1 : !data.progress[0] || !data.progress[1] ? -1 : data.progress[0] / data.progress[1]; $progress[data.activity].options({progress: progress}) } function setStatus(data) { // FIXME: LOCALIZATION var total = Ox.formatCount(data.progress[1], 'book').replace(/$no /, 'No'), status = data.status && data.status.code ? ( data.status.code == 200 ? ( data.progress[1] ? 'Done. ' + total + ' ' + (selected == 'import' ? 'imported' : 'exported.') : Ox._('No books found.') ) : data.status.code == 404 ? Ox._(( selected == 'import' ? 'Source' : 'Destination' ) + ' path not found.') : Ox._((selected == 'import' ? 'Import' : 'Export') + 'failed.') ) : !data.progress[0] && data.progress[1] ? Ox._('Scanning: {0} found.', [total]) : data.progress[0] ? Ox._(selected == 'import' ? 'Importing:' : 'Exporting') + ' ' + Ox._('{0} of {1}', [data.progress[0], total]) : ''; $status[data.activity].html(status); } that.select = function(selected_) { selected = selected_; $buttons.options({selected: selected}); $innerPanel.options({selected: selected}); return that; }; oml.bindEvent({ activity: function(data) { setProgress(data); setStatus(data); setButton(data); } }); return that; };