'use strict'; pandora.ui.collection = function() { var that, ui = pandora.user.ui, view = ui.collectionView, keys = [ 'description', 'dimensions', 'extension', 'id', 'title', 'ratio', 'size', 'user', 'entities', 'modified', 'editable' ]; if (view == 'list') { that = Ox.TableList({ columns: pandora.site.documentSortKeys.filter(function(key) { return !key.capability || pandora.hasCapability(key.capability); }).map(function(key) { var position = ui.collectionColumns.indexOf(key.id); return { addable: key.id != 'random', align: ['string', 'text'].indexOf( Ox.isArray(key.type) ? key.type[0]: key.type ) > -1 ? 'left' : key.type == 'list' ? 'center' : 'right', defaultWidth: key.columnWidth, format: (function() { return function(value, data) { var value = pandora.formatDocumentKey(key, data); if (Ox.isArray(value)) { value = value.join(', '); } return value; } })(), id: key.id, operator: pandora.getDocumentSortOperator(key.id), position: position, removable: !key.columnRequired, title: Ox._(key.title), type: key.type, visible: position > -1, width: ui.collectionColumnWidth[key.id] || key.columnWidth }; }), columnsVisible: true, columnsMovable: true, columnsRemovable: true, columnsResizable: true, columnsVisible: true, draggable: true, items: function(data, callback) { pandora.api.findDocuments(Ox.extend(data, { query: ui.findDocuments }), callback); return Ox.clone(data, true); }, keys: keys, scrollbarVisible: true, selected: ui.collectionSelection, sort: ui.collectionSort.concat([ {key: 'extension', operator: '+'}, {key: 'title', operator: '+'} ]), unique: 'id', }) .bindEvent({ columnchange: function(data) { var columnWidth = {}; pandora.UI.set({collectionColumns: data.ids}); /* data.ids.forEach(function(id) { columnWidth[id] = ui.collections[ui.collection].columnWidth[id] || Ox.getObjectById(pandora.site.sortKeys, id).width }); pandora.UI.set({collectionColumnWidth: columnWidth}); */ }, columnresize: function(data) { pandora.UI.set('collectionColumnWidth.' + data.id, data.width); }, sort: function(data) { pandora.UI.set({ collectionSort: [{key: data.key, operator: data.operator}] }); } }); } else if (view == 'grid') { that = Ox.IconList({ borderRadius: 0, defaultRatio: 640/1024, draggable: true, id: 'list', item: function(data, sort, size) { var sortKey = sort[0].key, infoKey = sortKey == 'title' ? 'extension' : sortKey, key = Ox.getObjectById(pandora.site.documentKeys, infoKey), info = pandora.formatDocumentKey(key, data, size), size = size || 128; return { height: Math.round(data.ratio > 1 ? size / data.ratio : size), id: data.id, info: info, title: data.title, url: pandora.getMediaURL('/documents/' + data.id + '/256p.jpg?' + data.modified), width: Math.round(data.ratio > 1 ? size : size * data.ratio) }; }, items: function(data, callback) { pandora.api.findDocuments(Ox.extend(data, { query: ui.findDocuments }), callback); return Ox.clone(data, true); }, keys: keys, selected: ui.collectionSelection, size: 128, sort: ui.collectionSort.concat([ {key: 'extension', operator: '+'}, {key: 'title', operator: '+'} ]), unique: 'id' }) .addClass('OxMedia'); } else if (view == 'pages') { that = Ox.InfoList({ borderRadius: 0, defaultRatio: 640/1024, draggable: true, id: 'list', item: function(data, sort, size) { size = 128; var sortKey = sort[0].key, infoKey = sortKey == 'title' ? 'extension' : sortKey, key = Ox.getObjectById(pandora.site.documentKeys, infoKey), info = pandora.formatDocumentKey(key, data, size); return { icon: { height: Math.round(data.ratio > 1 ? size / data.ratio : size), id: data.id, info: info, title: data.title, url: pandora.getMediaURL('/documents/' + data.id + '/256p.jpg?' + data.modified), width: Math.round(data.ratio >= 1 ? size : size * data.ratio) }, info: { css: {marginTop: '2px'}, element: pandora.ui.documentPages, id: data.id, options: { id: data.id, pages: data.pages, query: ui.findDocuments, ratio: data.ratio, title: data.title } } }; }, items: function(data, callback) { pandora.api.findDocuments(Ox.extend(data, { query: ui.findDocuments }), callback); return Ox.clone(data, true); }, keys: ['pages'].concat(keys), selected: ui.listSelection, size: 192, sort: ui.collectionSort.concat([ {key: 'extension', operator: '+'}, {key: 'title', operator: '+'} ]), unique: 'id', width: window.innerWidth - ui.showSidebar * ui.sidebarSize - 1 - Ox.UI.SCROLLBAR_SIZE }) .addClass('OxMedia') .bindEvent({ key_left: function() { // ... }, key_right: function() { // ... } }); } if (['list', 'grid'].indexOf(view) > -1) { // react to the resize event of the split panel that.bindEvent({ resize: function(data) { that.size(); }, pandora_showbrowser: function(data) { that.size(); } }); } if (['list', 'grid', 'pages'].indexOf(view) > -1) { //fixme pandora.enableDragAndDrop(that, true); that.bindEvent({ closepreview: function(data) { if (pandora.$ui.documentDialog) { pandora.$ui.documentDialog.close(); delete pandora.$ui.documentDialog; } }, copy: function(data) { pandora.clipboard.copy(data.ids, 'document'); }, copyadd: function(data) { pandora.clipboard.add(data.ids, 'document'); }, cut: function(data) { var listData = pandora.getListData(); if (listData.editable && listData.type == 'static') { pandora.clipboard.copy(data.ids, 'document'); pandora.doHistory('cut', data.ids, ui._collection, function() { pandora.UI.set({collectionSelection: []}); pandora.reloadList(); }); } }, cutadd: function(data) { var listData = pandora.getListData(); if (listData.editable && listData.type == 'static') { pandora.clipboard.add(data.ids, 'document'); pandora.doHistory('cut', data.ids, ui._collection, function() { pandora.UI.set({collectionSelection: []}); pandora.reloadList(); }); } }, 'delete': function(data) { var listData = pandora.getListData(); if (listData.editable && listData.type == 'static') { //fixme use history //pandora.doHistory('delete', data.ids, ui._collection, function() { pandora.api.removeCollectionItems({ collection: ui._collection, items: data.ids }, function() { pandora.UI.set({collectionSelection: []}); pandora.reloadList(); }); } else if (pandora.user.ui._collection == '' && data.ids.every(function(item) { return pandora.$ui.list.value(item, 'editable'); })) { pandora.ui.deleteDocumentDialog( data.ids.map(function(id) { return pandora.$ui.list.value(id); }), function() { Ox.Request.clearCache(); if (ui.document) { pandora.UI.set({document: ''}); } else { pandora.$ui.list.reloadList() } } ).open(); } }, init: function(data) { var folder, list; if (data.query.conditions.length == 0) { pandora.$ui.allItems.update(data.items); } else if ( data.query.conditions.length == 1 && data.query.conditions[0].key == 'document' && data.query.conditions[0].operator == '==' ) { list = data.query.conditions[0].value; folder = pandora.getListData(list).folder; if (pandora.$ui.folderList[folder] && !Ox.isEmpty(pandora.$ui.folderList[folder].value(list))) { pandora.$ui.folderList[folder].value( list, 'items', data.items ); } } pandora.$ui.statusbar.set('total', data); data = []; pandora.site.totals.forEach(function(v) { data[v.id] = 0; }); pandora.$ui.statusbar.set('selected', data); }, open: function(data) { var set = {document: data.ids[0]}; pandora.UI.set(set); }, openpreview: function(data) { if (!pandora.$ui.documentDialog) { pandora.$ui.documentDialog = pandora.openDocumentDialog({ documents: that.options('selected').map(function(id) { return that.value(id); }) }).bindEvent({ close: function() { that.closePreview(); delete pandora.$ui.documentDialog; } }); } else { pandora.$ui.documentDialog.update({ index: 0, items: that.options('selected').map(function(id) { return that.value(id); }) }); } }, paste: function(data) { var items = pandora.clipboard.paste(); if (items.length && pandora.clipboard.type() == 'document' && pandora.getListData().editable) { //fixme use history //pandora.doHistory('paste', items, ui._collection, function() { pandora.api.addCollectionItems({ collection: ui._collection, items: items }, function() { pandora.UI.set({collectionSelection: items}); pandora.reloadList(); }); } }, select: function(data) { var query; pandora.UI.set('collectionSelection', data.ids); if (data.ids.length == 0) { pandora.$ui.statusbar.set('selected', {items: 0}); } else { if (Ox.isUndefined(data.rest)) { query = { conditions: data.ids.map(function(id) { return { key: 'id', value: id, operator: '==' } }), operator: '|' }; } else { query = { conditions: [ui.find].concat( data.rest.map(function(id) { return { key: 'id', value: id, operator: '!=' }; }) ), operator: '&' }; } pandora.api.find({ query: query }, function(result) { pandora.$ui.statusbar.set('selected', result.data); }); } }, pandora_collectionsort: function(data) { that.options({sort: data.value}); }, pandora_showdocument: function(data) { isItemView && that.toggleElement(1); } }); } return that; };