diff --git a/README b/README deleted file mode 100644 index 7557231..0000000 --- a/README +++ /dev/null @@ -1,41 +0,0 @@ -Open Media Library - -== Install == - - soon - -== Networking == - -At this time you need a working IPv6 connection to use Open Media Libary. -If you dont have native IPv6 you can use Teredo/Miredo (apt-get install miredo) -or get a tunnel Hurricane Electric (https://tunnelbroker.net/) -or SixSS (https://sixxs.net). - -== Platform == - -If you install Open Media Library on a architecture thats not directly supported, -you need a working python 2.7.x installation and the following packages: - - apt-get install \ - python-pypdf python-stdnum python-html5lib python-chardet python-openssl \ - python-simplejson python-lxml - pip install -r requirements.txt - -On Linux you need to always install: - - apt-get install \ - python-imaging python-lxml ghostscript - -== Development == - -mkdir client -cd client -git clone https://git.0x2620.org/openmedialibrary.git -git clone https://git.0x2620.org/openmedialibrary_platform.git platform -ln -s openmedialibrary/ctl ctl -./ctl update_static -./ctl db upgrade -./ctl setup - -# and start it -./ctl debug diff --git a/README.md b/README.md index c00b21c..9f6230a 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ Development git clone https://git.0x2620.org/openmedialibrary_platform.git platform ln -s openmedialibrary/ctl ctl ./ctl update_static - ./ctl db upgrade ./ctl setup # and start it diff --git a/static/js/deleteListDialog.js b/static/js/deleteListDialog.js index c53d7a3..c12a529 100644 --- a/static/js/deleteListDialog.js +++ b/static/js/deleteListDialog.js @@ -19,7 +19,7 @@ oml.ui.deleteListDialog = function() { oml.api.removeList({ id: ui._list }, function() { - oml.updateLists(function() { + oml.$ui.folders.updateOwnLists(function() { oml.UI.set({ find: { conditions: [{ diff --git a/static/js/findElement.js b/static/js/findElement.js index 62f8f81..db2d6ed 100644 --- a/static/js/findElement.js +++ b/static/js/findElement.js @@ -3,19 +3,19 @@ oml.ui.findElement = function() { var ui = oml.user.ui, - findIndex = ui._findState.index, + findIndex = ui._findState.index, findKey = ui._findState.key, findValue = ui._findState.value, hasPressedClear = false, previousFindKey = findKey, - that = Ox.FormElementGroup({ + that = Ox.FormElementGroup({ - elements: [ + elements: [ - oml.$ui.findScopeSelect = renderFindScopeSelect(), + oml.$ui.findInSelect = renderFindInSelect(), - oml.$ui.findSelect = Ox.Select({ + oml.$ui.findSelect = Ox.Select({ id: 'select', items: [].concat( oml.config.findKeys.map(function(key) { @@ -86,7 +86,7 @@ oml.ui.findElement = function() { } }, submit: function(data) { - var scope = oml.$ui.findScopeSelect.value(), + var scope = oml.$ui.findInSelect.value(), key = oml.$ui.findSelect.value(), conditions = [].concat( scope == 'list' ? [{ @@ -106,24 +106,23 @@ oml.ui.findElement = function() { }] : [] ); oml.UI.set({ - find: { - conditions: conditions, - operator: '&' - } - }); + find: { + conditions: conditions, + operator: '&' + } + }); } }) - - ] - }) - .css({ - float: 'right', - margin: '4px 4px 4px 2px' - }) + ] + }) + .css({ + float: 'right', + margin: '4px 4px 4px 2px' + }) .bindEvent({ oml_find: function() { that.replaceElement( - 0, oml.$ui.findScopeSelect = renderFindScopeSelect() + 0, oml.$ui.findInSelect = renderFindInSelect() ); } }); @@ -138,11 +137,11 @@ oml.ui.findElement = function() { key: key, query: { conditions: ui._list - && oml.$ui.findScopeSelect.value() == 'list' + && oml.$ui.findInSelect.value() == 'list' ? [{ - key: 'list', - operator: '==', - value: ui._list + key: 'list', + operator: '==', + value: ui._list }] : [], operator: '&' @@ -158,17 +157,17 @@ oml.ui.findElement = function() { } : null; } - function renderFindScopeSelect() { + function renderFindInSelect() { var scope = !ui._list ? 'all' : Ox.endsWith(ui._list, ':') ? 'user' : 'list'; - return Ox.Select({ + var $select = Ox.Select({ items: [ - {id: 'all', title: Ox._('Find: All Libraries')}, + {id: 'all', title: Ox._('Find In: All Libraries')}, ].concat(scope != 'all' ? [ - {id: 'user', title: Ox._('Find: This Library')}, + {id: 'user', title: Ox._('Find In: This Library')}, ] : []).concat(scope == 'list' ? [ - {id: 'list', title: Ox._('Find: This List')} + {id: 'list', title: Ox._('Find In: This List')} ] : []), overlap: 'right', style: 'squared', @@ -179,13 +178,22 @@ oml.ui.findElement = function() { }) .bindEvent({ change: function(data) { - oml.$ui.findScopeSelect.options({ + oml.$ui.findInSelect.options({ title: data.value == 'all' ? 'data' : data.value, tooltip: data.title }); oml.$ui.findInput.focusInput(true); } }); + $select.superValue = $select.value; + $select.value = function(value) { + if (arguments.length == 1) { + Ox.print('I AM HERE') + $select.options({title: value == 'all' ? 'data' : value}); + } + $select.superValue.apply($select, arguments); + } + return $select; } that.updateElement = function() { diff --git a/static/js/folders.js b/static/js/folders.js index f50753c..2787f2b 100644 --- a/static/js/folders.js +++ b/static/js/folders.js @@ -63,7 +63,7 @@ oml.ui.folders = function() { }) .bindEvent({ load: function() { - oml.api.find({query: getFind()}, function(result) { + oml.api.find({query: getFind('')}, function(result) { oml.$ui.librariesList.value('', 'items', result.data.items); }); }, @@ -220,7 +220,12 @@ oml.ui.folders = function() { oml.addList(ui._list); }, load: function() { - // ... + // FIXME: too much + items.forEach(function(item) { + oml.api.find({query: getFind(item.id)}, function(result) { + oml.$ui.folderList[index].value(item.id, 'items', result.data.items); + }); + }); }, move: function(data) { lists[user.id] = data.ids.map(function(listId) { @@ -268,6 +273,32 @@ oml.ui.folders = function() { }; + that.updateItems = function() { + oml.getUsersAndLists(function(users, lists) { + Ox.Request.clearCache('find'); + $lists.forEach(function($list) { + $list.reloadList(); + }); + }); + }; + + that.updateOwnLists = function(callback) { + oml.getUsersAndLists(function(users, lists) { + var items = lists.filter(function(list) { + return list.user == oml.user.preferences.username + && list.type != 'library'; + }); + oml.$ui.folderList[0].options({ + items: items + }) + .css({height: items.length * 16 + 'px'}) + .size(); + oml.$ui.folder[0].$content + .css({height: 16 + items.length * 16 + 'px'}); + callback && callback(); + }); + }; + return that.updateElement(); }; \ No newline at end of file diff --git a/static/js/identifyDialog.js b/static/js/identifyDialog.js index 57af3c4..0f3ce6a 100644 --- a/static/js/identifyDialog.js +++ b/static/js/identifyDialog.js @@ -131,6 +131,7 @@ oml.ui.identifyDialog = function(data) { that.options({content: Ox.LoadingScreen().start()}); that.disableButtons(); oml.api.edit(edit, function(result) { + Ox.print('EDITED', result.data); that.close(); Ox.Request.clearCache('find'); oml.$ui.browser.reloadList(true); diff --git a/static/js/importExportDialog.js b/static/js/importExportDialog.js index 3a2cd0b..77f3af7 100644 --- a/static/js/importExportDialog.js +++ b/static/js/importExportDialog.js @@ -119,16 +119,16 @@ oml.ui.importExportDialog = function(selected) { ); }); return [ - {id: ':', title: Ox._('Library')} + {id: '', title: Ox._('Library')} ].concat( lists.length ? [{}] : [] ).concat( lists.map(function(list) { - return {id: list.id, title: list.name}; + return {id: list.name, title: list.name}; }) ).concat(selected == 'import' ? [ {}, - {id: '', title: Ox._('New List...')} + {id: 'FIXME', title: Ox._('New List...')} ] : []); } @@ -223,7 +223,7 @@ oml.ui.importExportDialog = function(selected) { labelWidth: 128, max: 1, min: 1, - value: ':', + value: '', width: 480 }), Ox.Select({ @@ -271,7 +271,7 @@ oml.ui.importExportDialog = function(selected) { Ox.print('FORM CHANGE', data); if (data.id == 'list') { // FIXME: WRONG - if (data.data.value[0] != ':') { + if (data.data.value[0] != '') { $form.values('list', oml.validateName(data.data.value, getListNames())) } } diff --git a/static/js/infoView.js b/static/js/infoView.js index 073e58b..853292c 100644 --- a/static/js/infoView.js +++ b/static/js/infoView.js @@ -240,26 +240,24 @@ oml.ui.infoView = function(identifyData) { $elements = $elements ? Ox.makeArray($elements) : [$cover, $info, $data]; - Ox.print('DEBUG, $ELEMENTS', $elements); (data ? Ox.noop : oml.api.get)({ id: id, keys: [] }, function(result) { - if (!identifyData && ui.item != id) { + if (!identifyData && id && id != ui.item) { return; } if (result) { data = result.data; } - Ox.print('BOOK DATA', data) var $mediaButton, isEditable = !data.mainid && data.mediastate == 'available', src = !identifyData - ? '/' + data.id + '/cover256.jpg' + ? '/' + data.id + '/cover256.jpg?' + data.modified : data.cover, ratio = data.coverRatio || oml.config.coverRatio, size = 256, diff --git a/static/js/list.js b/static/js/list.js index b817b96..84e599e 100644 --- a/static/js/list.js +++ b/static/js/list.js @@ -23,7 +23,8 @@ oml.ui.list = function() { oml.clipboard.copy(data.ids, 'item'); oml.doHistory('cut', data.ids, ui._list, function() { oml.UI.set({listSelection: []}); - oml.reloadList(); + oml.$ui.folders.updateElement(); + oml.$ui.list.updateElement(); }); } }, @@ -33,16 +34,18 @@ oml.ui.list = function() { oml.clipboard.add(data.ids, 'item'); oml.doHistory('cut', data.ids, ui._list, function() { oml.UI.set({listSelection: []}); - oml.reloadList(); + oml.$ui.folders.updateElement(); + oml.$ui.list.updateElement(); }); } }, - 'delete': function() { + 'delete': function(data) { var listData = oml.getListData(); if (listData.editable && listData.type == 'static') { oml.doHistory('delete', data.ids, ui._list, function() { oml.UI.set({listSelection: []}); - oml.reloadList(); + oml.$ui.folders.updateItems(); + oml.$ui.list.updateElement(); }); } }, @@ -107,6 +110,7 @@ oml.ui.list = function() { oml.enableDragAndDrop(that); that.updateElement = function() { + Ox.Request.clearCache('find'); that.reloadList(true); }; diff --git a/static/js/listDialog.js b/static/js/listDialog.js index 639c794..03035ae 100644 --- a/static/js/listDialog.js +++ b/static/js/listDialog.js @@ -43,12 +43,7 @@ oml.ui.listDialog = function() { closeButton: true, content: Ox.LoadingScreen().start(), height: 264, - title: Ox._('List – {0}', [ - ui._list == '' ? Ox._('All Libraries') - : ui._list - .replace(/^:/, oml.user.preferences.username + ':') - .replace(/:$/, Ox._(':Library')) - ]), + title: getTitle(list), width: 648 + Ox.UI.SCROLLBAR_SIZE }); @@ -71,12 +66,18 @@ oml.ui.listDialog = function() { .bindEvent({ change: function(data) { var value = oml.validateName(data.value, listNames); + that.options({title: getTitle(':' + value)}) $nameInput.value(value); + // FIXME: UGLY + listNames[listNames.indexOf(listData.name)] = value; + listData.name = value; + // + Ox.print(listData.name, 'LIST NAMES ???', listNames) oml.api.editList({ - id: list, + id: ui._list, name: value }, function(result) { - oml.updateLists(function() { + oml.$ui.folders.updateOwnLists(function() { oml.UI.set({ find: { conditions: [{ @@ -102,6 +103,15 @@ oml.ui.listDialog = function() { that.options({content: $content}); }); + function getTitle(list) { + return Ox._('List – {0}', [ + list == '' ? Ox._('All Libraries') + : list + .replace(/^:/, oml.user.preferences.username + ':') + .replace(/:$/, Ox._(':Library')) + ]); + } + return that; }; \ No newline at end of file diff --git a/static/js/mainMenu.js b/static/js/mainMenu.js index 02d82b2..b9dc288 100644 --- a/static/js/mainMenu.js +++ b/static/js/mainMenu.js @@ -223,39 +223,7 @@ oml.ui.mainMenu = function() { } ] }, - { - id: 'findMenu', - title: Ox._('Find'), - items: [ - { - id: 'finditems', - title: Ox._('Find'), - items: [ - { - group: 'find', - title: Ox._('Find'), - min: 1, - max: 1, - items: oml.config.findKeys.map(function(key) { - var checked = key.id == findState.key; - return { - id: key.id, - title: Ox._(key.title), - checked: checked, - keyboard: checked ? 'control f' : '' - }; - }) - }, - ] - - }, - { - id: 'advancedfind', - title: Ox._('Advanced Find'), - keyboard: 'shift control f' - } - ] - }, + getFindMenu(), { id: 'helpMenu', title: Ox._('Help'), @@ -333,12 +301,21 @@ oml.ui.mainMenu = function() { operator: value == 'ascending' ? '+' : '-' }] }); + } else if (id == 'findin') { + oml.$ui.findInSelect.value(value); + if (ui._findState.key == 'advanced') { + // ... + } else { + oml.$ui.findInput.focusInput(true); + } } else if (id == 'find') { if (value) { oml.$ui.findSelect.value(value); if (ui._findState.key == 'advanced') { // fixme: autocomplete function doesn't get updated - pandora.$ui.findInput.options({placeholder: ''}); + oml.$ui.findInput.options({placeholder: ''}); + } else { + oml.$ui.findInput.focusInput(true); } } } else { @@ -505,6 +482,7 @@ oml.ui.mainMenu = function() { oml_find: function() { that.replaceMenu('listMenu', getListMenu()); that.replaceMenu('editMenu', getEditMenu()); + that.replaceMenu('findMenu', getFindMenu()); /* var action = Ox.startsWith(ui._list, ':') && ui._list != ':' ? 'enableItem' : 'disableItem'; @@ -678,7 +656,59 @@ oml.ui.mainMenu = function() { } function getFindMenu() { - return ; + var isLibraries = !ui._list, + isLibrary = Ox.endsWith(ui._list, ':'), + isList = !isLibraries && !isLibrary; + return { + id: 'findMenu', + title: Ox._('Find'), + items: [ + { + id: 'findlists', + title: Ox._('Find In'), + items: [ + { + group: 'findin', + min: 1, + max: 1, + items: [ + {id: 'all', title: Ox._('All Libraries'), checked: isLibraries} + ].concat(!isLibraries ? [ + {id: 'user', title: Ox._('This Library'), checked: isLibrary} + ] : []).concat(isList ? [ + {id: 'list', title: Ox._('This List'), checked: isList} + ] : []) + } + ] + }, + { + id: 'finditems', + title: Ox._('Find'), + items: [ + { + group: 'find', + min: 1, + max: 1, + items: oml.config.findKeys.map(function(key) { + var checked = key.id == findState.key; + return { + id: key.id, + title: Ox._(key.title), + checked: checked, + keyboard: checked ? 'control f' : '' + }; + }) + }, + ] + + }, + { + id: 'advancedfind', + title: Ox._('Advanced Find'), + keyboard: 'shift control f' + } + ] + }; } function getListMenu() { @@ -755,11 +785,13 @@ oml.ui.mainMenu = function() { that.updateElement = function(menu) { ( - menu ? Ox.makeArray(menu) : ['listMenu', 'editMenu'] + menu ? Ox.makeArray(menu) : ['listMenu', 'editMenu', 'findMenu'] ).forEach(function(menu) { that.updateMenu( menu, - menu == 'listMenu' ? getListMenu() : getEditMenu() + menu == 'listMenu' ? getListMenu() + : menu == 'editMenu' ? getEditMenu() + : getFindMenu() ); }); return that; diff --git a/static/js/utils.js b/static/js/utils.js index bcbc0c6..df430a6 100644 --- a/static/js/utils.js +++ b/static/js/utils.js @@ -4,6 +4,7 @@ oml.addList = function() { isDuplicate = args.length == 1, isSmart, isFrom, list, listData, data, username = oml.user.preferences.username; + Ox.Request.clearCache('getLists'); oml.api.getLists(function(result) { var lists = result.data.lists, listNames = lists.filter(function(list) { @@ -92,7 +93,7 @@ oml.addList = function() { oml.$ui.listDialog = oml.ui.listDialog().open(); } }); - oml.updateLists(); + oml.$ui.folders.updateOwnLists(); }); } }; @@ -397,7 +398,10 @@ oml.enableDragAndDrop = function($list, canMove) { */ cleanup(250); }); - drag.action == 'move' && oml.reloadList(); + oml.$ui.folders.updateItems(); + if (drag.action == 'move') { + oml.$ui.list.updateElement(); + } }); } else { cleanup() @@ -876,24 +880,6 @@ oml.updateFilterMenus = function() { }); }; -oml.updateLists = function(callback) { - // FIXME: can this go somewhere else? - Ox.Request.clearCache('getLists'); - oml.getUsersAndLists(function(users, lists) { - var items = lists.filter(function(list) { - return list.user == oml.user.preferences.username; - }); - oml.$ui.folderList[0].options({ - items: items - }) - .css({height: items.length * 16 + 'px'}) - .size(); - oml.$ui.folder[0].$content - .css({height: 16 + items.length * 16 + 'px'}); - callback && callback(); - }); -}; - oml.validateName = function(value, names) { var index = 1, length = 256, suffix; value = Ox.clean(Ox.clean(value).slice(0, length));