working on the API...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-01-26 21:32:14 +03:00
parent 000379b656
commit cf26b84076

View File

@ -36,18 +36,52 @@ var widget = require('./widget')
// XXX // XXX
var Items = module.items = function(){} var Items = module.items = function(){}
Items.dialog = null
Items.items = null
// Focus last created item... // Focus last created item...
// XXX also would be nice to set the last created items to .last or // XXX also would be nice to set the last created items to .last or
// similar in the context... // similar in the context...
Items.focus = function(){ Items.focus = function(){
} }
// Embed a list...
// //
Items.embed = function(){ // .group(make(..), ..)
// // XXX not implemented yet...
// .group(make(..), .., options)
// -> make
//
// Example:
// make.group(
// make(1),
// make(2),
// make(3))
//
// XXX need to cleanup the args...
// XXX do we need to pass options to groups???
Items.group = function(...items){
// XXX filter out non-make values....
// ...for some reason this clears the list...
//items = items
// .filter(function(e){
// return e === this })
var l = this.items.length - items.length
this.items.splice(l, items.length, this.items.slice(l))
return this
} }
Items.dialog = null Items.embed = function(list, options){
return this(list, options) }
Items.nest = function(item, list, options){
options = options || {}
options.sublist = list
return this(item, options)
}
// singular items... // singular items...
@ -143,14 +177,39 @@ var BaseBrowserPrototype = {
// - first item of sub-list // - first item of sub-list
// - connected to the sub-list but part of the parent list // - connected to the sub-list but part of the parent list
// ...I'm leaning to the later... // ...I'm leaning to the later...
items: null, __items: null,
get items(){
this.__items
|| this.make()
return this.__items
},
set items(value){
this.__items = value },
// //
// .__list__(make) // .__list__(make, options)
// -> undefined // -> undefined
// -> list // -> list
// //
// XXX do we care about the return value??? //
// make(value, options)
// -> make
//
//
// There are two modes of operation:
// 1) call make(..) to create items
// 2) return a list of items
//
// The if make is called at least once the return value is ignored.
//
//
// Example:
// XXX
//
//
// NOTE: this is not designed to be called directly...
//
// XXX not sure how to handle options in here -- see .make(..) and its notes... // XXX not sure how to handle options in here -- see .make(..) and its notes...
__list__: function(make, options){ __list__: function(make, options){
throw new Error('.__list__(..): Not implemented.') }, throw new Error('.__list__(..): Not implemented.') },
@ -177,9 +236,10 @@ var BaseBrowserPrototype = {
}.bind(this) }.bind(this)
make.__proto__ = Items make.__proto__ = Items
make.dialog = this make.dialog = this
make.items = items
//var res = this.__list__(make) //var res = this.__list__(make)
// XXX not sure about this... // XXX not sure about this -- options handling...
var res = this.__list__(make, var res = this.__list__(make,
options ? options ?
Object.assign( Object.assign(
@ -203,8 +263,11 @@ var BaseBrowserPrototype = {
return items }, return items },
// Render nested list... // Render nested list...
// NOTE: to skip rendering an item/list return null... // NOTE: to skip rendering an item/list return null...
renderSubList: function(item, rendered, options){ renderSubList: function(sublist, item, options){
return rendered }, return sublist },
// Render group...
renderGroup: function(items, options){
return items },
// Render list item... // Render list item...
// NOTE: to skip rendering an item/list return null... // NOTE: to skip rendering an item/list return null...
renderItem: function(item, i, options){ renderItem: function(item, i, options){
@ -237,6 +300,7 @@ var BaseBrowserPrototype = {
options = context.options options = context.options
// render the items... // render the items...
var _render
// XXX should we control render parameters (range, start, end, ...) // XXX should we control render parameters (range, start, end, ...)
// from outside render and pass this info down to nested lists??? // from outside render and pass this info down to nested lists???
// ...if yes how?? // ...if yes how??
@ -244,18 +308,38 @@ var BaseBrowserPrototype = {
// - arg threading // - arg threading
// - render context // - render context
var items = this.items var items = this.items
.map(function(item, i){ .map(_render = function(item, i){
return item.render ? return (
// group...
item instanceof Array ?
that.renderGroup(
item.map(_render), options)
// renderable item...
: item.render ?
that.renderSubList( that.renderSubList(
item,
item.render(context), item.render(context),
item,
options) options)
// renderable value -- embedded list...
: item.value.render ? : item.value.render ?
that.renderSubList( that.renderSubList(
item,
item.value.render(context), item.value.render(context),
item,
options) options)
: that.renderItem(item, i, options) }) // renderable sub-list -- nested list...
: (item.sublist || {}).render ?
(item.collapsed ?
// collapsed item...
that.renderItem(item, i, options)
// expanded item (grouped)...
: that.renderGroup([
that.renderItem(item, i, options),
that.renderSubList(
item.sublist.render(context),
item,
options) ], options))
// basic item...
: that.renderItem(item, i, options)) })
.filter(function(e){ .filter(function(e){
return e != null }) return e != null })
@ -283,6 +367,20 @@ var BaseBrowserPrototype = {
.render(this, options) }, .render(this, options) },
// XXX item API...
get: function(){},
set: function(){},
remove: function(){},
sort: function(){},
splice: function(){},
// XXX should there return an array or a .constructor(..) instance??
forEach: function(){},
map: function(){},
filter: function(){},
reduce: function(){},
__init__: function(func, options){ __init__: function(func, options){
this.__list__ = func this.__list__ = func
this.options = Object.assign( this.options = Object.assign(
@ -328,9 +426,12 @@ var BrowserPrototype = {
// XXX list header // XXX list header
// ...is it the responsibility of sub-list or the parent list??? // ...is it the responsibility of sub-list or the parent list???
// XXX save link to dom (???) // XXX save link to dom (???)
renderSubList: function(item, rendered, options){ renderSubList: function(sublist, item, options){
// XXX expand/collapse state??? // XXX expand/collapse state???
return rendered }, return sublist },
// Render group...
renderGroup: function(items, options){
return items },
// Render list item... // Render list item...
// XXX save link to dom in item.dom (???) // XXX save link to dom in item.dom (???)
renderItem: function(item, i, options){ renderItem: function(item, i, options){