mirror of
https://github.com/flynx/pWiki.git
synced 2025-12-17 08:31:38 +00:00
reworked ordering and sorting...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
parent
c0bdb4e604
commit
255187c956
@ -26,7 +26,7 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="sortable">
|
<div class="sortable">
|
||||||
<macro src="../*" sort="checked -title">
|
<macro src="../*" sort="checked order -title">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<div>
|
<div>
|
||||||
<span class="sort-handle">☰</span>
|
<span class="sort-handle">☰</span>
|
||||||
|
|||||||
113
pwiki.js
113
pwiki.js
@ -218,8 +218,6 @@ module.pWikiData = {
|
|||||||
// XXX should we account for order here???
|
// XXX should we account for order here???
|
||||||
match: function(path, sort, count, from){
|
match: function(path, sort, count, from){
|
||||||
var data = this.__data || {}
|
var data = this.__data || {}
|
||||||
sort = sort || (data[path] || {}).sort || []
|
|
||||||
sort = sort instanceof Array ? sort : [sort]
|
|
||||||
from = from || 0
|
from = from || 0
|
||||||
|
|
||||||
// XXX normalize this to account for '*'
|
// XXX normalize this to account for '*'
|
||||||
@ -234,6 +232,12 @@ module.pWikiData = {
|
|||||||
return path in data ? [ path ] : []
|
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)
|
var pattern = path2re(path)
|
||||||
|
|
||||||
return Object.keys(data)
|
return Object.keys(data)
|
||||||
@ -250,7 +254,25 @@ module.pWikiData = {
|
|||||||
.map(function(p, i){
|
.map(function(p, i){
|
||||||
return sort
|
return sort
|
||||||
.map(function(method){
|
.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
|
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()
|
return method == 'path' ? p.toLowerCase()
|
||||||
: method == 'Path' ? p
|
: method == 'Path' ? p
|
||||||
: method == 'title' ? path2list(p).pop().toLowerCase()
|
: method == 'title' ? path2list(p).pop().toLowerCase()
|
||||||
@ -259,8 +281,6 @@ module.pWikiData = {
|
|||||||
// special case...
|
// special case...
|
||||||
: method == 'checked' ? (data[p][method] ? 1 : 0)
|
: method == 'checked' ? (data[p][method] ? 1 : 0)
|
||||||
|
|
||||||
// XXX experimental...
|
|
||||||
//: method == 'order' ? order.indexOf(p)
|
|
||||||
// attr...
|
// attr...
|
||||||
: data[p][method]
|
: data[p][method]
|
||||||
})
|
})
|
||||||
@ -375,7 +395,6 @@ module.pWikiData = {
|
|||||||
// 'links': [ .. ],
|
// 'links': [ .. ],
|
||||||
// }
|
// }
|
||||||
//
|
//
|
||||||
// XXX should .__sort and .__order be stored in .__location???
|
|
||||||
var pWikiBase =
|
var pWikiBase =
|
||||||
module.pWikiBase = actions.Actions({
|
module.pWikiBase = actions.Actions({
|
||||||
config: {
|
config: {
|
||||||
@ -408,6 +427,7 @@ module.pWikiBase = actions.Actions({
|
|||||||
|
|
||||||
// Location and path API...
|
// Location and path API...
|
||||||
|
|
||||||
|
|
||||||
refresh: ['',
|
refresh: ['',
|
||||||
function(force){
|
function(force){
|
||||||
// get/set location and base fields...
|
// get/set location and base fields...
|
||||||
@ -628,9 +648,6 @@ module.pWikiBase = actions.Actions({
|
|||||||
.location(JSON.parse(JSON.stringify(this.location())))
|
.location(JSON.parse(JSON.stringify(this.location())))
|
||||||
|
|
||||||
o.__parent_context = this
|
o.__parent_context = this
|
||||||
if(this.__order){
|
|
||||||
o.__order = this.__order.slice()
|
|
||||||
}
|
|
||||||
|
|
||||||
return o
|
return o
|
||||||
}],
|
}],
|
||||||
@ -781,6 +798,9 @@ module.pWikiBase = actions.Actions({
|
|||||||
// data if it contains nothing but the order...
|
// data if it contains nothing but the order...
|
||||||
// NOTE: this will also maintain page position within order (.at())
|
// 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
|
// 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...
|
// 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
|
// ...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???
|
// XXX should we check if this returns a function???
|
||||||
var parent = this.wiki.data(path) || {}
|
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 out paths containing '*'
|
||||||
.filter(function(p){ return p.indexOf('*') < 0 })
|
.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...
|
// save cache...
|
||||||
location.match = order
|
location.match = order
|
||||||
@ -850,7 +848,7 @@ module.pWikiBase = actions.Actions({
|
|||||||
|
|
||||||
// get saved order...
|
// get saved order...
|
||||||
} else if(order == 'saved'){
|
} else if(order == 'saved'){
|
||||||
return this.__order
|
return location.order
|
||||||
// XXX should we check if this returns a function???
|
// XXX should we check if this returns a function???
|
||||||
|| (this.wiki.data(path) || {}).order
|
|| (this.wiki.data(path) || {}).order
|
||||||
|| []
|
|| []
|
||||||
@ -861,10 +859,10 @@ module.pWikiBase = actions.Actions({
|
|||||||
// - explicitly clear only local or persistent
|
// - explicitly clear only local or persistent
|
||||||
// - progressively clear local then persistent (current)
|
// - progressively clear local then persistent (current)
|
||||||
} else if(order == 'clear' || order == 'clear-all'){
|
} else if(order == 'clear' || order == 'clear-all'){
|
||||||
var local = !!this.__order
|
var local = !!location.order
|
||||||
|
|
||||||
// local order...
|
// local order...
|
||||||
delete this.__order
|
delete location.order
|
||||||
|
|
||||||
// clear persistent order...
|
// clear persistent order...
|
||||||
if(!local || order == 'clear-all'){
|
if(!local || order == 'clear-all'){
|
||||||
@ -886,21 +884,23 @@ module.pWikiBase = actions.Actions({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// save order...
|
||||||
} else if(order == 'save') {
|
} else if(order == 'save') {
|
||||||
// XXX should we check if this returns a function???
|
// XXX should we check if this returns a function???
|
||||||
var parent = this.wiki.data(path) || {}
|
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)
|
this.wiki.data(path, parent)
|
||||||
delete this.__order
|
delete location.order
|
||||||
|
|
||||||
// set order...
|
// set order...
|
||||||
} else {
|
} else {
|
||||||
this.__order = order
|
location.order = order
|
||||||
}
|
}
|
||||||
|
|
||||||
// save cache...
|
// save cache...
|
||||||
|
this.location(location)
|
||||||
this.order(true)
|
this.order(true)
|
||||||
}],
|
}],
|
||||||
|
|
||||||
@ -930,6 +930,8 @@ module.pWikiBase = actions.Actions({
|
|||||||
// Path - compare paths (case-sensitive)
|
// Path - compare paths (case-sensitive)
|
||||||
// title - compare titles (case-insensitive)
|
// title - compare titles (case-insensitive)
|
||||||
// Title - compare titles (case-sensitive)
|
// Title - compare titles (case-sensitive)
|
||||||
|
// checked - checked state
|
||||||
|
// order - the set manual order (see .order(..))
|
||||||
// <attribute> - compare data attributes
|
// <attribute> - compare data attributes
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
@ -938,16 +940,20 @@ module.pWikiBase = actions.Actions({
|
|||||||
// list of siblings is cached.
|
// list of siblings is cached.
|
||||||
// ...the resulting object is not to be stored for long.
|
// ...the resulting object is not to be stored for long.
|
||||||
// NOTE: the actual sorting is done by the store...
|
// NOTE: the actual sorting is done by the store...
|
||||||
|
//
|
||||||
|
// XXX add 'save' and 'saved' actions...
|
||||||
sort: ['Page/',
|
sort: ['Page/',
|
||||||
function(methods){
|
function(methods){
|
||||||
var that = this
|
var that = this
|
||||||
var res = this.clone()
|
var res = this.clone()
|
||||||
|
var location = this.location()
|
||||||
|
|
||||||
methods = methods instanceof Array ? methods : [].slice.call(arguments)
|
methods = methods instanceof Array ? methods : [].slice.call(arguments)
|
||||||
|
|
||||||
res.__sort = methods.length == 0 ?
|
location.sort = methods.length == 0 ?
|
||||||
(this.config['default-sort-methods'] || ['path'])
|
(this.config['default-sort-methods'] || ['path'])
|
||||||
: methods
|
: methods
|
||||||
|
res.location(location)
|
||||||
|
|
||||||
res.order(true)
|
res.order(true)
|
||||||
|
|
||||||
@ -957,13 +963,21 @@ module.pWikiBase = actions.Actions({
|
|||||||
// ...e.g. survive .order('force') or .order('clear')
|
// ...e.g. survive .order('force') or .order('clear')
|
||||||
reverse: ['Page/',
|
reverse: ['Page/',
|
||||||
function(){
|
function(){
|
||||||
this.__order && this.__order.reverse()
|
|
||||||
|
|
||||||
var location = this.location()
|
var location = this.location()
|
||||||
if(location.match){
|
|
||||||
location.match.reverse()
|
// reverse the match...
|
||||||
this.location(location)
|
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()
|
.toArray()
|
||||||
|
|
||||||
// save the order...
|
// save the order...
|
||||||
// XXX need to mix this with .sort(..)
|
|
||||||
wiki
|
wiki
|
||||||
.get(order[0] + '/../*')
|
.get(order[0] + '/../*')
|
||||||
.order(['*'].concat(order))
|
.order(['*'].concat(order))
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user