more work on the universal editor...

Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
This commit is contained in:
Alex A. Naanou 2019-11-14 00:18:24 +03:00
parent 4921924840
commit d356483226

View File

@ -968,7 +968,7 @@ var EditorActions = actions.Actions({
// as-is into .makeEditorBlock(..)'s spec to be able to create things // as-is into .makeEditorBlock(..)'s spec to be able to create things
// like '---' -> <hr> and other stuff... // like '---' -> <hr> and other stuff...
__editor_fields__: { __editor_fields__: {
// generic field... // Generic field...
// //
// options format: // options format:
// { // {
@ -980,29 +980,6 @@ var EditorActions = actions.Actions({
// // // //
// value: <value> | <func([value])>, // value: <value> | <func([value])>,
// //
// values: <array> | <func([values])>,
//
// // XXX not implemented...
// value_editable: <bool>,
//
//
// // value list dialog...
// //
// // NOTE: <opts> is a .showList(..) / .showEditableList(..)
// // compatible options object...
// list: false | <opts> | <func(cur, callback(val))>,
//
// list_editable: <bool>,
//
// // XXX not implemented...
// list_button: <str>,
//
//
// // if true will not call make.dialog.update() on value
// // update...
// // XXX revise...
// doNotAutoUpdateDialog: <bool>,
//
// //
// // XXX not implemented... // // XXX not implemented...
// doc: <str> | <func>, // doc: <str> | <func>,
@ -1037,13 +1014,45 @@ var EditorActions = actions.Actions({
], options) ], options)
}, },
// Editable field...
//
// XXX need to set .value... // XXX need to set .value...
editable: function(actions, make, options){ //editable: function(actions, make, options){},
return this.field(actions, make.Editable, options) },
// value toggle...
//
// options format:
// {
// values: <array> | <func([values])>,
//
// // XXX not implemented...
// value_editable: <bool>,
//
//
// // value list dialog...
// //
// // NOTE: <opts> is a .showList(..) / .showEditableList(..)
// // compatible options object...
// list: false | <opts> | <func(cur, callback(val))>,
//
// list_editable: <bool>,
//
// // XXX not implemented...
// list_button: <str>,
//
//
// // if true will not call make.dialog.update() on value
// // update...
// // XXX revise...
// doNotAutoUpdateDialog: <bool>,
//
// }
//
toggle: function(actions, make, options){ toggle: function(actions, make, options){
this.field(actions, make, this.field(actions, make,
Object.assign( Object.assign(
// XXX not sure about this...
options,
{ {
type: 'toggle', type: 'toggle',
@ -1136,49 +1145,110 @@ var EditorActions = actions.Actions({
: 'off' } }))) : 'off' } })))
}, },
// attribute value toggle...
//
// options format: // options format:
// { // {
// obj: <obj> | <func>,
// key: <str>, // key: <str>,
//
// values_key: [<value>, ...], // values_key: [<value>, ...],
// value_dict: { // value_dict: {
// <key>: <value>, // <key>: <value>,
// ... // ...
// }, // },
// callback: <func(mode, value)>, //
// live_update: <bool>,
// callback: <func(value, values)>,
// read_only: <bool>,
// //
// ... // ...
// } // }
// //
// XXX should this be a more generic .attributeToggle(..) ??? // XXX should we support dialog.close(..)'s reject mode here???
configToggle: function(actions, make, options){ attrToggle: function(actions, make, options){
var update = function(){
if(!options.read_only){
var obj = options.obj instanceof Function ?
options.obj.call(actions)
: options.obj
'__value' in options
//&& (options.value = obj[options.key] = options.__value)
&& (obj[options.key] = options.__value)
'__values' in options
//&& (options.values = obj[options.values_key] = options.__values) }
&& (obj[options.values_key] = options.__values) }
options.callback
&& options.callback.call(actions, obj, options.__value, options.__values) }
make.dialog.close(function(){
options.live_update
|| update() })
this.toggle(actions, make, this.toggle(actions, make,
Object.assign( Object.assign(
// XXX not sure about this...
options,
{ {
// XXX PROBLEM: the value of this does not get
// propagated to the original options...
//__value: null,
value: function(value){ value: function(value){
var obj = options.obj instanceof Function ?
options.obj.call(actions)
: options.obj
var d = options.value_dict var d = options.value_dict
var mode = arguments.length == 0 ? 'get' : 'set' // get...
// get and normalize... value = arguments.length > 0 ?
value = mode == 'get' ? value
actions.config[options.key] : '__value' in options ?
: value options.__value
value = d ? d[value] : value : d ?
// set and return... d[obj[options.key]]
value = mode == 'set' ? : obj[options.key]
(actions.config[options.key] = value) // set...
: value arguments.length != 0
// callback... && (options.__value = value)
// XXX revise... // live mode...
options.callback && options.live_update
&& options.callback.call(actions, mode, value) && update()
return value }, return value },
// XXX //__values: null,
values: function(value){ values: function(value){
var obj = options.obj instanceof Function ?
options.obj.call(actions)
: options.obj
return arguments.length == 0 ? return arguments.length == 0 ?
actions.config[options.values_key] ('__values' in options ?
: (actions.config[options.values_key] = value) }, options.__values
: obj[options.values_key].slice())
: (options.__values = value) },
}, },
options)) }, options)) },
// Config editable value...
//
// XXX
//configEditable: function(){},
// Config value toggle...
//
configToggle: function(actions, make, options){
this.attrToggle(actions, make,
Object.assign(
// XXX not sure about this...
options,
{
obj: function(){
return actions.config }
},
options)) },
// XXX todo: // XXX todo:
// - date // - date
// - ... // - ...
@ -1259,7 +1329,9 @@ var EditorActions = actions.Actions({
spec.reduce(function(res, e){ spec.reduce(function(res, e){
var id = e.id || e.title var id = e.id || e.title
id != undefined id != undefined
&& (res[id] = e.value) && (res[id] = e.value instanceof Function ?
e.value.call(that)
: e.value)
return res }, {}), return res }, {}),
// NOTE: technically we do not need to pass this // NOTE: technically we do not need to pass this
// through as we are mutating the data inside // through as we are mutating the data inside
@ -1280,7 +1352,10 @@ var EditorActions = actions.Actions({
// pass the results... // pass the results...
.close(function(){ .close(function(){
_callback _callback
&& _callback(spec) }) })], && _callback(spec)
// XXX fixing a double .close() bug...
_callback = null
}) })],
// XXX move this to examples.js // XXX move this to examples.js
@ -1291,19 +1366,11 @@ var EditorActions = actions.Actions({
// basic field... // basic field...
[['Basic static field: ', 'value']], [['Basic static field: ', 'value']],
/*/ XXX
{
type: 'editable',
title: 'String: ',
value: '',
},
//*/
// toggle...
{ {
type: 'toggle', type: 'toggle',
title: '$Toggle: ', title: '$Toggle: ',
}, },
{ {
type: 'toggle', type: 'toggle',
title: 'Direct toggle: ', title: 'Direct toggle: ',
@ -1331,6 +1398,11 @@ var EditorActions = actions.Actions({
title: 'Theme: ', title: 'Theme: ',
key: 'theme', key: 'theme',
values_key: 'themes', values_key: 'themes',
// optional stuff...
live_update: true,
callback: function(cfg, value){
this.toggleTheme(value) },
}, },
], ],