Config editor.
Following modules are needed:
npm install --save @plotdb/konfig @plotdb/semver @plotdb/block @plotdb/rescope @plotdb/csscope @loadingio/debounce.js proxise @loadingio/ldquery ldview
include them:
/* here we use `@zbryikt/template` syntax */
+script({
{name: "proxise"},
{name: "@loadingio/debounce.js"},
{name: "@loadingio/ldquery"},
{name: "ldview"},
{name: "@plotdb/semver"},
{name: "@plotdb/rescope"},
{name: "@plotdb/csscope"},
{name: "@plotdb/block"},
{name: "@plotdb/konfig"},
{name: "@plotdb/konfig", path: "konfig.widget.bootstrap.min.js"}
});
Then the initialization script:
kfg = new konfig({...});
kfg.on("change", function(cfg) { ... });
kfg.init().then(function() { ... });
Constructor options:
root
: root node or CSS selector for root node.- root node is used to place root tab for this config.
useBundle
: true if use bundle blocks, if availale. default true.debounce
: true to debounce updating. default true.autotab
: true to use meta object field key as tab name by default. default falsemeta
: meta object. see spec for more information.tab
: tab object. see spec for more information.manager
: block manager for retrieving blocks- use default manager if omitted, which always throw an Error except for blocks available in bundle.
typemap(name)
: converter from widget name to@plotdb/block
definition. For widget customization.name
: a widget name, such asnumber
,color
, etc.- return value: should be an object for block definition such as
{name: 'number', version: '0.0.1'}
view
: view for rendering. optional, default null. For more information, seeViews
section below.
A common sample usage:
kfg = new konfig({
root: document.querySelector('.kfg'),
useBundle: true /* bundle from konfig.widget.bootstrap.min.js */
view: 'simple'
meta: { sample: { type: 'number' } }
view: 'simple'
});
kfg.on("change", function() { ... });
kfg.init().then(function() {
});
with this DOM:
.kfg(ld-scope): div(ld-each="ctrl")
init()
: initialization.- return Promise, resolved initial config on initialized.
render()
: re-render controlslimited(opt)
: return if current config uses some limited values.- return value is based on
opt
, an object with a fieldsdetail
. whendetail
is:- omitted or
false
: return true or false, indicating if any value is limited. true
: return an object withtrue
in corresponding field if that field uses a limited value.
- omitted or
- return value is based on
get()
: get value object.set(v, opt)
: set value object tov
.- options: an option object with possibly following field:
append
: default false. if true, only fields with value other than undefined will be update.
- options: an option object with possibly following field:
obj()
: instead of a plain, serializable JSON,obj()
return a Promise resolved with objects corresponding to operatable objects provided by widgets.default()
: get a config object with all values from default value.reset()
: reset config object to default value.meta(opt)
: updatemeta
object. return Promise- parameters: either
- the meta object
{meta, tab}
object.
- parameters: either
tab()
: updatetab
object.interface(meta)
: return a Promise resolved with an interface for the widget defined bymeta
.on(event, cb(args...))
fire(event, args...)
ensureBuilt()
: in case that konfig is building interface and not yet ready, useensureBuilt
which return a Promise that resolves when konfig is ready.
merge(des, obj1, obj2, ...)
: recursively merge meta objs by order intodes
, and returndes
.- this is for merging meta objects.
append(o1, o2, o3, ...)
: recursively append config object backward to o1. return merged object.- this is for merging config objects.
change
: fired when value is changed. Params:value
: (serialized) value object return byget
.
action
: fired when widget fires this event.- this is for customized widgets to send user-defined events.
data
below is defined by user. - Params:
src
: source widget that fires this event -data
: data sent along with the original event by source widget.
- this is for customized widgets to send user-defined events.
kfg = new konfig({
root: document.body,
meta: {
showText: { type: 'boolean' },
textSize: { type: 'number', range: false, min: 10, max: 64, step: 1 },
textAlign: { type: 'choice', values: ["left", "right", "center"], default: 'left' },
textColor: { type: 'color', tab: 'color' }
}
});
Check doc/spec.md
for more information.
To correctly render your configuration editor, you have to specify how it should be rendered. This can be done by setting the view
option in constructor.
view
can be either a string, an object or a function. Following explains the details about the usage of corresponding types.
@plotdb/konfig
uses ldview
for widget rendering, and provide some builtin views which can be specified by their name, by setting view
option to following strings along with the corresponding sample DOM for ldview, for example:
new konfig({
view: "simple"
});
While @plotdb/konfig
provides a set of default view dynamics, you still have to define the looks and feels of your views. Following are possible values of view
, including simple
, default
and recurse
, along with the corresponding sample DOMs.
Additionally, you may want to scope your DOM if you are also using ldview for UI rendering:
div(ld-scope): div(ld-each="ctrl")
A simple list of controls. sample DOM:
div(ld-each="ctrl")
Controls with tabs. sample DOM:
div(ld-each="tab")
div(ld="name")
div(ld-each="ctrl")
Controls in recursive tabs. sample DOM:
div(ld="template")
div(ld="name")
div(ld-each="ctrl")
div(ld-each="tab")
DOM will be reused for recursive tabs so you have to specify a template roo node with ld="template"
.
Note ctrl
should be outside of tab
.
When view
option is an object, it can be anything with following methods:
render()
: called when@plotdb/konfig
renders tabs and ctrls.ctx(opt)
: called whenmeta
changes, with a parameter objectopt
, with following fields:root
: root elementctrls
: ctrl listtabs
: tab list
When view
option is a function, it should accept an parameter object with following fields:
root
: konfig root elementctrls
: list of controlstabs
: list of tabs
Additionally, it should return an object with at least following method:
render()
: this is called everytime whenkonfig
needs to br re-rendered.
This function is called everytime a konfig rebuild is necessary ( e.g., when meta
is updated ). You should implement singleton by yourself if needed.
Widgets may need to communicate with its controller, but there is no direct access or interface of konfig to widgets. Two way communication is possible with action:
rpc = proxise -> itf.fire \action, {name: \rpc, data: {...}}; return null
new itf action: rpc: -> rpc.resolve it
...
rpc!then -> ...
MIT