From 255187c956a835c8863b85edba1bca9aa4f5a509 Mon Sep 17 00:00:00 2001 From: "Alex A. Naanou" Date: Wed, 12 Oct 2016 03:56:01 +0300 Subject: [PATCH] reworked ordering and sorting... Signed-off-by: Alex A. Naanou --- bootstrap/Templates/outline.html | 2 +- pwiki.js | 113 +++++++++++++++++-------------- 2 files changed, 64 insertions(+), 51 deletions(-) diff --git a/bootstrap/Templates/outline.html b/bootstrap/Templates/outline.html index c0b0220..4806000 100644 --- a/bootstrap/Templates/outline.html +++ b/bootstrap/Templates/outline.html @@ -26,7 +26,7 @@
- +
diff --git a/pwiki.js b/pwiki.js index 4c0758e..bbf41e2 100755 --- a/pwiki.js +++ b/pwiki.js @@ -218,8 +218,6 @@ module.pWikiData = { // XXX should we account for order here??? match: function(path, sort, count, from){ var data = this.__data || {} - sort = sort || (data[path] || {}).sort || [] - sort = sort instanceof Array ? sort : [sort] from = from || 0 // XXX normalize this to account for '*' @@ -234,6 +232,12 @@ module.pWikiData = { return path in data ? [ path ] : [] } + sort = sort || (data[path] || {}).sort || ['order'] + sort = sort instanceof Array ? sort : [sort] + + var order = (data[path] || {}).order || [] + + var pattern = path2re(path) return Object.keys(data) @@ -250,7 +254,25 @@ module.pWikiData = { .map(function(p, i){ return sort .map(function(method){ + // explicit order... + if(method instanceof Array){ + i = method.indexOf(p) + i = i < 0 ? method.indexOf('*') : i + i = i < 0 ? method.length : i + return i + } + + // drop the reversal marker... method = method[0] == '-' ? method.slice(1) : method + + // stored order... + if(method == 'order'){ + i = order.indexOf(p) + i = i < 0 ? order.indexOf('*') : i + i = i < 0 ? order.length : i + return i + } + return method == 'path' ? p.toLowerCase() : method == 'Path' ? p : method == 'title' ? path2list(p).pop().toLowerCase() @@ -259,8 +281,6 @@ module.pWikiData = { // special case... : method == 'checked' ? (data[p][method] ? 1 : 0) - // XXX experimental... - //: method == 'order' ? order.indexOf(p) // attr... : data[p][method] }) @@ -375,7 +395,6 @@ module.pWikiData = { // 'links': [ .. ], // } // -// XXX should .__sort and .__order be stored in .__location??? var pWikiBase = module.pWikiBase = actions.Actions({ config: { @@ -408,6 +427,7 @@ module.pWikiBase = actions.Actions({ // Location and path API... + refresh: ['', function(force){ // get/set location and base fields... @@ -628,9 +648,6 @@ module.pWikiBase = actions.Actions({ .location(JSON.parse(JSON.stringify(this.location()))) o.__parent_context = this - if(this.__order){ - o.__order = this.__order.slice() - } return o }], @@ -781,6 +798,9 @@ module.pWikiBase = actions.Actions({ // data if it contains nothing but the order... // NOTE: this will also maintain page position within order (.at()) // + // NOTE: the actual sorting/ordering is done in .wiki.match(..) + // + // XXX should we also cache the saved sort and order??? // XXX (LEAK?) not sure if the current location where order is stored // is the right way to go -- would be really hard to clean out... // ...might be a good idea to clear pattern paths that match no @@ -809,37 +829,15 @@ module.pWikiBase = actions.Actions({ // XXX should we check if this returns a function??? var parent = this.wiki.data(path) || {} - var pages = this.wiki.match(path, this.__sort) + + var sort = (location.sort || parent.sort || ['order']).slice() + + var i = sort.indexOf('order') + location.order && i >= 0 && sort.splice(i, 1, location.order) + + var order = this.wiki.match(path, sort) // filter out paths containing '*' .filter(function(p){ return p.indexOf('*') < 0 }) - var order = (this.__order || parent.order || []) - // clear all paths that are not currently visible... - // NOTE: paths may not be visible because they are - // filtered out by .location().path pattern... - .filter(function(p){ - return pages.indexOf(p) >= 0 || p == '*' }) - - // order present... - if(order.length > 0){ - // get the spot where to place pages not in order... - // NOTE: if '*' is not in order, then unsorted pages - // will get appended to the end... - // NOTE: only one '*' is supported... - var i = order.indexOf('*') - i = i == -1 ? order.length : i - - // get pages not in order... - pages = pages - .filter(function(p){ - return order.indexOf(p) < 0 }) - - // build the list... - order.splice.apply(order, [i, 1].concat(pages)) - - // unsorted -- simply list the pages... - } else { - order = pages - } // save cache... location.match = order @@ -850,7 +848,7 @@ module.pWikiBase = actions.Actions({ // get saved order... } else if(order == 'saved'){ - return this.__order + return location.order // XXX should we check if this returns a function??? || (this.wiki.data(path) || {}).order || [] @@ -861,10 +859,10 @@ module.pWikiBase = actions.Actions({ // - explicitly clear only local or persistent // - progressively clear local then persistent (current) } else if(order == 'clear' || order == 'clear-all'){ - var local = !!this.__order + var local = !!location.order // local order... - delete this.__order + delete location.order // clear persistent order... if(!local || order == 'clear-all'){ @@ -886,21 +884,23 @@ module.pWikiBase = actions.Actions({ } } + // save order... } else if(order == 'save') { // XXX should we check if this returns a function??? var parent = this.wiki.data(path) || {} - var order = parent.order = this.__order || this.order() + var order = parent.order = location.order || this.order() this.wiki.data(path, parent) - delete this.__order + delete location.order // set order... } else { - this.__order = order + location.order = order } // save cache... + this.location(location) this.order(true) }], @@ -930,6 +930,8 @@ module.pWikiBase = actions.Actions({ // Path - compare paths (case-sensitive) // title - compare titles (case-insensitive) // Title - compare titles (case-sensitive) + // checked - checked state + // order - the set manual order (see .order(..)) // - compare data attributes // // @@ -938,16 +940,20 @@ module.pWikiBase = actions.Actions({ // list of siblings is cached. // ...the resulting object is not to be stored for long. // NOTE: the actual sorting is done by the store... + // + // XXX add 'save' and 'saved' actions... sort: ['Page/', function(methods){ var that = this var res = this.clone() + var location = this.location() methods = methods instanceof Array ? methods : [].slice.call(arguments) - res.__sort = methods.length == 0 ? + location.sort = methods.length == 0 ? (this.config['default-sort-methods'] || ['path']) : methods + res.location(location) res.order(true) @@ -957,13 +963,21 @@ module.pWikiBase = actions.Actions({ // ...e.g. survive .order('force') or .order('clear') reverse: ['Page/', function(){ - this.__order && this.__order.reverse() - var location = this.location() - if(location.match){ - location.match.reverse() - this.location(location) + + // reverse the match... + location.match && location.match.reverse() + + // reverse order... + location.order = this.order().reverse() + + // reverse sort... + if(location.sort){ + location.sort = location.sort + .map(function(m){ return m[0] == '-' ? m.slice(1) : '-'+m }) } + + this.location(location) }], @@ -1360,7 +1374,6 @@ var pWikiUIActions = actions.Actions({ .toArray() // save the order... - // XXX need to mix this with .sort(..) wiki .get(order[0] + '/../*') .order(['*'].concat(order))