Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/plotdb/konfig


https://github.com/plotdb/konfig

Last synced: about 2 months ago
JSON representation

Awesome Lists containing this project

README

        

# @plotdb/konfig

Config editor.

## Usage

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 false
- `meta`: 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 as `number`, `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, see `Views` 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")

### API

- `init()`: initialization.
- return Promise, resolved initial config on initialized.
- `render()`: re-render controls
- `limited(opt)`: return if current config uses some limited values.
- return value is based on `opt`, an object with a fields `detail`. when `detail` is:
- omitted or `false`: return true or false, indicating if any value is limited.
- `true`: return an object with `true` in corresponding field if that field uses a limited value.
- `get()`: get value object.
- `set(v, opt)`: set value object to `v`.
- options: an option object with possibly following field:
- `append`: default false. if true, only fields with value other than undefined will be update.
- `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)`: update `meta` object. return Promise
- parameters: either
- the meta object
- `{meta, tab}` object.
- `tab()`: update `tab` object.
- `interface(meta)`: return a Promise resolved with an interface for the widget defined by `meta`.
- `on(event, cb(args...))`
- `fire(event, args...)`
- `ensureBuilt()`: in case that konfig is building interface and not yet ready, use `ensureBuilt` which return a Promise that resolves when konfig is ready.

## Class API

- `merge(des, obj1, obj2, ...)`: recursively merge meta objs by order into `des`, and return `des`.
- 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.

## Events

- `change`: fired when value is changed. Params:
- `value`: (serialized) value object return by `get`.
- `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.

## Sample Usage

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' }
}
});

## Meta Specification

Check `doc/spec.md` for more information.

## Views

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.

### Builtin Views

`@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")

#### simple

A simple list of controls. sample DOM:

div(ld-each="ctrl")

#### default

Controls with tabs. sample DOM:

div(ld-each="tab")
div(ld="name")
div(ld-each="ctrl")

#### recurse

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`.

### view as object

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 when `meta` changes, with a parameter object `opt`, with following fields:
- `root`: root element
- `ctrls`: ctrl list
- `tabs`: tab list

### view as function

When `view` option is a function, it should accept an parameter object with following fields:

- `root`: konfig root element
- `ctrls`: list of controls
- `tabs`: list of tabs

Additionally, it should return an object with at least following method:

- `render()`: this is called everytime when `konfig` 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.

## Action Loop

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 -> ...

## License

MIT