expand/collapse events + item event filters...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-05-26 19:23:40 +03:00
parent 46f70b184d
commit a3f6a211e4

View File

@ -293,12 +293,14 @@ var callItemEventHandlers = function(item, event, evt, ...args){
// //
// makeItemEventMethod(event_name, handler[, options]) // makeItemEventMethod(event_name, handler[, options])
// makeItemEventMethod(event_name, handler, default_getter[, options]) // makeItemEventMethod(event_name, handler, default_getter[, options])
// makeItemEventMethod(event_name, handler, default_getter, filter[, options])
// -> event_method // -> event_method
// //
// //
// This extends makeEventMethod(..) by adding an option to pass an item // This extends makeEventMethod(..) by adding an option to pass an item
// when triggering the event and if no item is passed to produce a default, // when triggering the event and if no item is passed to produce a default,
// the rest of the signature is identical... // the rest of the signature is identical...
// XXX document filter...
// //
// Trigger an event on item(s)... // Trigger an event on item(s)...
// .event(item, ..) // .event(item, ..)
@ -316,16 +318,18 @@ var callItemEventHandlers = function(item, event, evt, ...args){
// NOTE: item events do not directly trigger the original caller's handlers // NOTE: item events do not directly trigger the original caller's handlers
// those will get celled recursively when the events are propagated // those will get celled recursively when the events are propagated
// up the tree. // up the tree.
// var makeItemEventMethod = function(event, handler, default_item, filter, options){
// XXX add a filter... // parse args...
// ...keep only applicable items... var args = [...arguments].slice(2)
var makeItemEventMethod = function(event, handler, default_item, options){ default_item = args[0] instanceof Function
options = default_item instanceof Function ? && args.shift()
options filter = args[0] instanceof Function
: default_item && args.shift()
default_item = default_item instanceof Function ? var filterItems = function(items){
default_item return filter ?
: null items.filter(filter)
: items }
options = args.shift()
options = Object.assign( options = Object.assign(
// NOTE: we need to be able to pass item objects, so we can not // NOTE: we need to be able to pass item objects, so we can not
// use queries at the same time as there is not way to // use queries at the same time as there is not way to
@ -357,14 +361,14 @@ var makeItemEventMethod = function(event, handler, default_item, options){
item item
// array of queries... // array of queries...
: item instanceof Array ? : item instanceof Array ?
item filterItems(item
.map(function(e){ .map(function(e){
return that.search(e, options) }) return that.search(e, options) })
.flat() .flat()
.unique() .unique())
// explicit item or query... // explicit item or query...
: item != null ? : item != null ?
this.search(item, options) filterItems(this.search(item, options))
// item is null or undefined -- get default... // item is null or undefined -- get default...
: default_item instanceof Function ? : default_item instanceof Function ?
[default_item.call(that) || []].flat() [default_item.call(that) || []].flat()
@ -2195,13 +2199,25 @@ var BaseBrowserPrototype = {
toggleSelect: makeItemEventToggler('selected', 'select', 'deselect', 'focused'), toggleSelect: makeItemEventToggler('selected', 'select', 'deselect', 'focused'),
toggleSelect2: makeItemEventToggler2('selected', 'select', 'deselect', 'focused'), toggleSelect2: makeItemEventToggler2('selected', 'select', 'deselect', 'focused'),
// XXX we need to filter collapsable items... // XXX should we .render(..) or .update(..) here???
// XXX do we need to filter via elem.collapsed too???
// ...likely ignore .collapsed as this will enable us to toggle
// with '!' correctly...
collapse: makeItemEventMethod('collapse', collapse: makeItemEventMethod('collapse',
function(evt, item){}, function(evt, item){
function(){ return this.focused }), console.log('>>>>', item)
item.forEach(function(e){ e.collapsed = true })
this.render()
},
function(){ return this.focused },
function(elem){ return elem.value && elem.children }),
expand: makeItemEventMethod('expand', expand: makeItemEventMethod('expand',
function(evt, item){}, function(evt, item){
function(){ return this.focused }), item.forEach(function(e){ delete e.collapsed })
this.render()
},
function(){ return this.focused },
function(elem){ return elem.value && elem.children }),
toggleCollapse: makeItemEventToggler('collapsed', 'collapse', 'expand', 'focused'), toggleCollapse: makeItemEventToggler('collapsed', 'collapse', 'expand', 'focused'),
open: makeItemEventMethod('open', open: makeItemEventMethod('open',
@ -2675,7 +2691,7 @@ var BrowserPrototype = {
next: function(){}, next: function(){},
prev: function(){}, prev: function(){},
collapse: function(){}, //collapse: function(){},
// XXX scroll... // XXX scroll...