cleanup and tweaking...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-05-26 20:20:18 +03:00
parent 6c37374657
commit 822ffdc5fa

View File

@ -389,7 +389,7 @@ var makeItemEventMethod = function(event, handler, default_item, filter, options
// - .toggleSelect([1, 2, 10, 20], 'next') -- toggles items on only, returns [] // - .toggleSelect([1, 2, 10, 20], 'next') -- toggles items on only, returns []
// - .toggleSelect([1, 2, 10, 20], 'on') -- works but returns [] // - .toggleSelect([1, 2, 10, 20], 'on') -- works but returns []
// - .toggleSelect([1, 2, 10, 20], 'off') -- works but returns [] // - .toggleSelect([1, 2, 10, 20], 'off') -- works but returns []
var makeItemEventToggler = function(get_state, set_state, unset_state, default_item, multi){ var makeItemEventToggler = function(get_state, set_state, unset_state, default_item, multi, options){
var _get_state = get_state instanceof Function ? var _get_state = get_state instanceof Function ?
get_state get_state
: function(e){ return !!e[get_state] } : function(e){ return !!e[get_state] }
@ -402,8 +402,21 @@ var makeItemEventToggler = function(get_state, set_state, unset_state, default_i
var _default_item = default_item instanceof Function ? var _default_item = default_item instanceof Function ?
default_item default_item
: function(){ return this[default_item] } : function(){ return this[default_item] }
// filter/multi...
var filter = multi instanceof Function
&& multi
var filterItems = function(items){
return filter ?
items.filter(filter)
: items }
multi = multi !== false multi = multi !== false
var getter = multi ? 'search' : 'get' var getter = multi ? 'search' : 'get'
options = Object.assign(
// 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
// distinguish one from the other...
{ noQueryCheck: true },
options || {})
// state normalization lookup table... // state normalization lookup table...
var states = { var states = {
@ -439,22 +452,25 @@ var makeItemEventToggler = function(get_state, set_state, unset_state, default_i
: item == null ? : item == null ?
false false
: state == '?' ? : state == '?' ?
[this[getter](item)] filterItems(
.flat() [this[getter](item, options)]
.map(_get_state) .flat())
.map(_get_state)
: state === true ? : state === true ?
_set_state.call(this, item) _set_state.call(this, item)
: state == false ? : state == false ?
_unset_state.call(this, item) _unset_state.call(this, item)
: [this[getter](item)] // 'next' or '!'...
.flat() // NOTE: 'next' and '!' are opposites of each other...
.map(function(e){ : filterItems(
// NOTE: 'next' and '!' are opposites of each other... [this[getter](item, options)]
return (state == 'next' ? .flat())
_get_state(e) .map(function(e){
: !_get_state(e)) ? return (state == 'next' ?
_unset_state.call(that, e) _get_state(e)
: _set_state.call(that, e) }) : !_get_state(e)) ?
_unset_state.call(that, e)
: _set_state.call(that, e) })
] ]
.flat() .flat()
// normalize for single item results -> return item and array... // normalize for single item results -> return item and array...
@ -1291,6 +1307,7 @@ var BaseBrowserPrototype = {
// XXX do we actually need to stop this as soon as we find something, // XXX do we actually need to stop this as soon as we find something,
// i.e. options.firstOnly??? // i.e. options.firstOnly???
// XXX add diff support... // XXX add diff support...
// XXX should this check hidden items when doing an identity check???
__search_test_generators__: { __search_test_generators__: {
// regexp path test... // regexp path test...
regexp: function(pattern){ regexp: function(pattern){
@ -2000,8 +2017,6 @@ var BaseBrowserPrototype = {
// NOTE: .one(..) has the same signature as .on(..) but will unregister // NOTE: .one(..) has the same signature as .on(..) but will unregister
// the handler as soon as it is done... // the handler as soon as it is done...
// //
// XXX need to design a means for this system to interact both
// ways with DOM events...
// XXX should we be able to trigger events from the item directly??? // XXX should we be able to trigger events from the item directly???
// i.e. .get(42).on('open', ...) instead of .get(42).open = ... // i.e. .get(42).on('open', ...) instead of .get(42).open = ...
// XXX might be a good idea to create an item wrapper object... // XXX might be a good idea to create an item wrapper object...
@ -2181,7 +2196,11 @@ var BaseBrowserPrototype = {
blur: makeItemEventMethod('blur', function(evt, items){ blur: makeItemEventMethod('blur', function(evt, items){
items.forEach(function(item){ items.forEach(function(item){
delete item.focused }) }), delete item.focused }) }),
toggleFocus: makeItemEventToggler('focused', 'focus', 'blur', 'focused', false), toggleFocus: makeItemEventToggler(
'focused',
'focus', 'blur',
function(){ return this.focused || 0 },
false),
select: makeItemEventMethod('select', select: makeItemEventMethod('select',
function(evt, items){ function(evt, items){
@ -2199,26 +2218,33 @@ 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'),
// NOTE: .expand(..) / .collapse(..) / .toggleCollapse(..) ignore
// item visibility due to item.collected state.
// XXX should we .render(..) or .update(..) here??? // 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){
item.forEach(function(e){ e.collapsed = true }) item.forEach(function(e){ e.collapsed = true })
this.render() this.render()
}, },
function(){ return this.focused }, function(){ return this.focused },
function(elem){ return elem.value && elem.children }), function(elem){ return elem.value && elem.children },
{iterateCollapsed: true}),
expand: makeItemEventMethod('expand', expand: makeItemEventMethod('expand',
function(evt, item){ function(evt, item){
item.forEach(function(e){ delete e.collapsed }) item.forEach(function(e){ delete e.collapsed })
this.render() this.render()
}, },
function(){ return this.focused }, function(){ return this.focused },
function(elem){ return elem.value && elem.children }), function(elem){ return elem.value && elem.children },
toggleCollapse: makeItemEventToggler('collapsed', 'collapse', 'expand', 'focused'), {iterateCollapsed: true}),
toggleCollapse: makeItemEventToggler(
'collapsed',
'collapse', 'expand',
'focused',
function(elem){ return elem.value && elem.children },
{iterateCollapsed: true}),
// XXX need to make primary/secondary item actions more obvious...
open: makeItemEventMethod('open', open: makeItemEventMethod('open',
function(evt, item){}, function(evt, item){},
function(){ return this.focused }), function(){ return this.focused }),