From 34eed095377043f7e8d2456de96a0c4ff9a9c16f Mon Sep 17 00:00:00 2001 From: Lars Jung Date: Thu, 25 Oct 2012 01:37:34 +0200 Subject: [PATCH] Improves event system. --- README.md | 2 +- src/_h5ai/client/js/inc/core/location.js | 47 ++++++++++++++++- src/_h5ai/client/js/inc/core/refresh.js | 37 ------------- src/_h5ai/client/js/inc/ext/autorefresh.js | 4 +- src/_h5ai/client/js/inc/ext/crumb.js | 12 ----- src/_h5ai/client/js/inc/ext/delete.js | 4 +- src/_h5ai/client/js/inc/ext/dropbox.js | 4 +- src/_h5ai/client/js/inc/ext/sort.js | 4 +- src/_h5ai/client/js/inc/ext/statusbar.js | 36 ++++--------- src/_h5ai/client/js/inc/ext/tree.js | 10 +--- src/_h5ai/client/js/inc/main.js | 6 --- src/_h5ai/client/js/inc/view/items.js | 60 +++++++++++----------- src/_h5ai/conf/options.json | 2 +- 13 files changed, 98 insertions(+), 130 deletions(-) delete mode 100644 src/_h5ai/client/js/inc/core/refresh.js diff --git a/README.md b/README.md index 5cfa885c..31b481ea 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ It profits from these great projects: * removes `aai` mode! * adds smart browsing -* add line wrap and line highlighting on hover to text preview +* add line wrap and line highlighting (on hover) to text preview ### v0.22.1 - *2012-10-16* diff --git a/src/_h5ai/client/js/inc/core/location.js b/src/_h5ai/client/js/inc/core/location.js index 5529447e..253f98ac 100644 --- a/src/_h5ai/client/js/inc/core/location.js +++ b/src/_h5ai/client/js/inc/core/location.js @@ -72,6 +72,36 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event return modulejs.require('model/entry').get(absHref); }, + load = function (callback) { + + modulejs.require('core/server').request({action: 'get', entries: true, entriesHref: absHref, entriesWhat: 1}, function (json) { + + var Entry = modulejs.require('model/entry'), + entry = Entry.get(absHref); + + if (json) { + + var found = {}; + + _.each(json.entries, function (jsonEntry) { + + var e = Entry.get(jsonEntry.absHref, jsonEntry.time, jsonEntry.size, jsonEntry.status, jsonEntry.content); + found[e.absHref] = true; + }); + + _.each(entry.content, function (e) { + + if (!found[e.absHref]) { + Entry.remove(e.absHref); + } + }); + } + if (_.isFunction(callback)) { + callback(entry); + } + }); + }, + setLocation = function (newAbsHref, keepBrowserUrl) { newAbsHref = encodedHref(newAbsHref); @@ -89,12 +119,19 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event } notify.set('loading...'); - modulejs.require('core/refresh')(function () { + load(function () { notify.set(); event.pub('location.changed', getItem()); }); }, + refresh = function () { + + load(function () { + event.pub('location.refreshed', getItem()); + }); + }, + setLink = function ($el, item) { $el.attr('href', item.absHref); @@ -123,13 +160,19 @@ modulejs.define('core/location', ['_', 'modernizr', 'core/settings', 'core/event } + event.sub('ready', function () { + + setLocation(document.location.href, true); + }); + + return { forceEncoding: forceEncoding, - encodedHref: encodedHref, getDomain: getDomain, getAbsHref: getAbsHref, getItem: getItem, setLocation: setLocation, + refresh: refresh, setLink: setLink }; }); diff --git a/src/_h5ai/client/js/inc/core/refresh.js b/src/_h5ai/client/js/inc/core/refresh.js deleted file mode 100644 index 912b06c4..00000000 --- a/src/_h5ai/client/js/inc/core/refresh.js +++ /dev/null @@ -1,37 +0,0 @@ - -modulejs.define('core/refresh', ['_', 'core/server', 'model/entry', 'core/location'], function (_, server, Entry, location) { - - var parseJson = function (entry, json) { - - var found = {}; - - _.each(json.entries, function (jsonEntry) { - - var e = Entry.get(jsonEntry.absHref, jsonEntry.time, jsonEntry.size, jsonEntry.status, jsonEntry.content); - found[e.absHref] = true; - }); - - _.each(entry.content, function (e) { - if (!found[e.absHref]) { - Entry.remove(e.absHref); - } - }); - }, - - refresh = function (callback) { - - var entry = Entry.get(location.getAbsHref()); - - server.request({action: 'get', entries: true, entriesHref: entry.absHref, entriesWhat: 1}, function (json) { - - if (json) { - parseJson(entry, json); - } - if (_.isFunction(callback)) { - callback(entry); - } - }); - }; - - return refresh; -}); diff --git a/src/_h5ai/client/js/inc/ext/autorefresh.js b/src/_h5ai/client/js/inc/ext/autorefresh.js index 7faff453..43e4b020 100644 --- a/src/_h5ai/client/js/inc/ext/autorefresh.js +++ b/src/_h5ai/client/js/inc/ext/autorefresh.js @@ -1,5 +1,5 @@ -modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'core/refresh'], function (_, $, allsettings, event, refresh) { +modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'core/location'], function (_, $, allsettings, event, location) { var settings = _.extend({ enabled: false, @@ -8,7 +8,7 @@ modulejs.define('ext/autorefresh', ['_', '$', 'core/settings', 'core/event', 'co heartbeat = function () { - refresh(); + location.refresh(); setTimeout(heartbeat, settings.interval); }, diff --git a/src/_h5ai/client/js/inc/ext/crumb.js b/src/_h5ai/client/js/inc/ext/crumb.js index b4656b50..43b906f1 100644 --- a/src/_h5ai/client/js/inc/ext/crumb.js +++ b/src/_h5ai/client/js/inc/ext/crumb.js @@ -14,7 +14,6 @@ modulejs.define('ext/crumb', ['_', '$', 'core/settings', 'core/resource', 'core/ pageHintTemplate = 'has index page', statusHintTemplate = '', - // updates the crumb for this single entry update = function (entry, force) { if (!force && entry.$crumb && entry.$crumb.data('status') === entry.status) { @@ -62,13 +61,6 @@ modulejs.define('ext/crumb', ['_', '$', 'core/settings', 'core/resource', 'core/ return $html; }, - onContentChanged = function (entry) { - - if (entry.$crumb) { - update(entry, true); - } - }, - onLocationChanged = function (item) { var crumb = item.getCrumb(), @@ -101,10 +93,6 @@ modulejs.define('ext/crumb', ['_', '$', 'core/settings', 'core/resource', 'core/ return; } - // event.sub('entry.created', onContentChanged); - // event.sub('entry.removed', onContentChanged); - event.sub('entry.changed', onContentChanged); - event.sub('location.changed', onLocationChanged); }; diff --git a/src/_h5ai/client/js/inc/ext/delete.js b/src/_h5ai/client/js/inc/ext/delete.js index 7c99f4de..5e0d5159 100644 --- a/src/_h5ai/client/js/inc/ext/delete.js +++ b/src/_h5ai/client/js/inc/ext/delete.js @@ -1,5 +1,5 @@ -modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/event', 'core/resource', 'core/refresh', 'core/server'], function (_, $, allsettings, event, resource, refresh, server) { +modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/event', 'core/resource', 'core/location', 'core/server'], function (_, $, allsettings, event, resource, location, server) { var settings = _.extend({ enabled: false @@ -31,7 +31,7 @@ modulejs.define('ext/delete', ['_', '$', 'core/settings', 'core/event', 'core/re if (!json || json.code) { failed(); } - refresh(); + location.refresh(); }, requestDeletion = function (hrefsStr) { diff --git a/src/_h5ai/client/js/inc/ext/dropbox.js b/src/_h5ai/client/js/inc/ext/dropbox.js index 2d45a5b2..e8a8b78f 100644 --- a/src/_h5ai/client/js/inc/ext/dropbox.js +++ b/src/_h5ai/client/js/inc/ext/dropbox.js @@ -1,5 +1,5 @@ -modulejs.define('ext/dropbox', ['_', '$', 'core/settings', 'core/location', 'core/refresh', 'core/server'], function (_, $, allsettings, location, refresh, server) { +modulejs.define('ext/dropbox', ['_', '$', 'core/settings', 'core/location', 'core/server'], function (_, $, allsettings, location, server) { var settings = _.extend({ enabled: false, @@ -99,7 +99,7 @@ modulejs.define('ext/dropbox', ['_', '$', 'core/settings', 'core/location', 'cor afterAll: function () { - refresh(); + location.refresh(); }, error: function (err, file) { diff --git a/src/_h5ai/client/js/inc/ext/sort.js b/src/_h5ai/client/js/inc/ext/sort.js index 89031b21..964528d5 100644 --- a/src/_h5ai/client/js/inc/ext/sort.js +++ b/src/_h5ai/client/js/inc/ext/sort.js @@ -143,8 +143,8 @@ modulejs.define('ext/sort', ['_', '$', 'core/settings', 'core/resource', 'core/e event.preventDefault(); }); - event.sub('entry.changed', onContentChanged); - event.sub('entry.created', onContentChanged); + event.sub('location.changed', onContentChanged); + event.sub('location.refreshed', onContentChanged); }; init(); diff --git a/src/_h5ai/client/js/inc/ext/statusbar.js b/src/_h5ai/client/js/inc/ext/statusbar.js index 09edfd47..7956e932 100644 --- a/src/_h5ai/client/js/inc/ext/statusbar.js +++ b/src/_h5ai/client/js/inc/ext/statusbar.js @@ -1,5 +1,5 @@ -modulejs.define('ext/statusbar', ['_', '$', 'core/settings', 'core/format', 'core/event', 'core/location'], function (_, $, allsettings, format, event, location) { +modulejs.define('ext/statusbar', ['_', '$', 'core/settings', 'core/format', 'core/event'], function (_, $, allsettings, format, event) { var settings = _.extend({ enabled: false @@ -37,36 +37,22 @@ modulejs.define('ext/statusbar', ['_', '$', 'core/settings', 'core/format', 'cor var $statusbar = $(template), $folderTotal = $statusbar.find('.folderTotal'), - $fileTotal = $statusbar.find('.fileTotal'); + $fileTotal = $statusbar.find('.fileTotal'), + onLocationChanged = function (item) { + + var stats = item.getStats(); + $folderTotal.text(stats.folders); + $fileTotal.text(stats.files); + }; $statusDefault = $statusbar.find('.status.default'); $statusDynamic = $statusbar.find('.status.dynamic'); - event.sub('location.changed', function (item) { - - var stats = item.getStats(); - $folderTotal.text(stats.folders); - $fileTotal.text(stats.files); - - update(); - }); - - event.sub('statusbar', update); $('#bottombar > .center').append($statusbar); - event.sub('entry.created', function () { - - var stats = location.getItem().getStats(); - $folderTotal.text(stats.folders); - $fileTotal.text(stats.files); - }); - - event.sub('entry.removed', function () { - - var stats = location.getItem().getStats(); - $folderTotal.text(stats.folders); - $fileTotal.text(stats.files); - }); + event.sub('statusbar', update); + event.sub('location.changed', onLocationChanged); + event.sub('location.refreshed', onLocationChanged); event.sub('entry.mouseenter', function (entry) { diff --git a/src/_h5ai/client/js/inc/ext/tree.js b/src/_h5ai/client/js/inc/ext/tree.js index 00afc7f2..a42787dc 100644 --- a/src/_h5ai/client/js/inc/ext/tree.js +++ b/src/_h5ai/client/js/inc/ext/tree.js @@ -20,7 +20,6 @@ modulejs.define('ext/tree', ['_', '$', 'core/settings', 'core/resource', 'core/e magicSequence = '=h5ai=', - // updates the tree for this single entry update = function (entry) { var $html = $(template), @@ -223,7 +222,6 @@ modulejs.define('ext/tree', ['_', '$', 'core/settings', 'core/resource', 'core/e }); }, - // creates the complete tree from entry down to the root init = function () { if (!settings.enabled) { @@ -243,14 +241,8 @@ modulejs.define('ext/tree', ['_', '$', 'core/settings', 'core/resource', 'core/e shiftTree(); }); - event.sub('location.changed', onLocationChanged); - - // strong negative performance impact in aai mode - // event.sub('entry.changed', onContentChanged); - // event.sub('entry.created', onContentChanged); - // event.sub('entry.removed', onContentChanged); - event.sub('ready', adjustSpacing); + event.sub('location.changed', onLocationChanged); $(window).on('resize', function () { diff --git a/src/_h5ai/client/js/inc/main.js b/src/_h5ai/client/js/inc/main.js index 8e92d494..f9513298 100644 --- a/src/_h5ai/client/js/inc/main.js +++ b/src/_h5ai/client/js/inc/main.js @@ -1,14 +1,10 @@ modulejs.define('main', ['_', 'core/event'], function (_, event) { - event.pub('beforeView'); - modulejs.require('view/items'); modulejs.require('view/spacing'); modulejs.require('view/viewmode'); - event.pub('beforeExt'); - _.each(modulejs.state(), function (state, id) { if (/^ext\/.+/.test(id)) { @@ -16,7 +12,5 @@ modulejs.define('main', ['_', 'core/event'], function (_, event) { } }); - modulejs.require('core/location').setLocation(document.location.href, true); - event.pub('ready'); }); diff --git a/src/_h5ai/client/js/inc/view/items.js b/src/_h5ai/client/js/inc/view/items.js index 702ae024..f5d5420c 100644 --- a/src/_h5ai/client/js/inc/view/items.js +++ b/src/_h5ai/client/js/inc/view/items.js @@ -119,6 +119,36 @@ modulejs.define('view/items', ['_', '$', 'core/settings', 'core/resource', 'core } }, + onLocationRefreshed = function (item) { + + var $extended = $('#extended'), + $ul = $extended.find('ul'), + $empty = $extended.find('.empty'), + $items = $ul.find('.entry:not(.folder-parent)'), + currentItems = _.map($items.get(), function (i) { return $(i).data('entry'); }), + refreshedItems = _.values(item.content), + create = _.difference(refreshedItems, currentItems), + remove = _.difference(currentItems, refreshedItems); + + _.each(create, function (item) { + + update(item, true).hide().appendTo($ul).fadeIn(400); + }); + + _.each(remove, function (item) { + + item.$extended.fadeOut(400, function () { + item.$extended.remove(); + }); + }); + + if (item.isEmpty()) { + setTimeout(function () { $empty.show(); }, 400); + } else { + $empty.hide(); + } + }, + init = function () { var $content = $(contentTemplate), @@ -134,36 +164,8 @@ modulejs.define('view/items', ['_', '$', 'core/settings', 'core/resource', 'core .on('mouseenter', '.entry a', onMouseenter) .on('mouseleave', '.entry a', onMouseleave); - event.sub('entry.changed', function (entry) { - - if (entry.isInCurrentFolder() && entry.$extended) { - update(entry, true); - } - }); - - event.sub('entry.created', function (entry) { - - if (entry.isInCurrentFolder() && !entry.$extended) { - $emtpy.fadeOut(100, function () { - update(entry, true).hide().appendTo($ul).fadeIn(400); - }); - } - }); - - event.sub('entry.removed', function (entry) { - - if (entry.isInCurrentFolder() && entry.$extended) { - entry.$extended.fadeOut(400, function () { - entry.$extended.remove(); - - if (entry.parent.isEmpty()) { - $emtpy.fadeIn(100); - } - }); - } - }); - event.sub('location.changed', onLocationChanged); + event.sub('location.refreshed', onLocationRefreshed); $content.appendTo('body'); }; diff --git a/src/_h5ai/conf/options.json b/src/_h5ai/conf/options.json index 759607ce..eb13f916 100644 --- a/src/_h5ai/conf/options.json +++ b/src/_h5ai/conf/options.json @@ -55,7 +55,7 @@ Options - interval: number, update interval in milliseconds, at least 1000 */ "autorefresh": { - "enabled": false, + "enabled": true, "interval": 5000 },