diff --git a/docs/jsapi/LuCI.baseclass.html b/docs/jsapi/LuCI.baseclass.html deleted file mode 100644 index cb83d23b6a7f4068688fcb489a38f5fd852b27bb..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.baseclass.html +++ /dev/null @@ -1,4686 +0,0 @@ - - - - - Class: baseclass - - - - - - - - - - - - - - - - - -
- - -
-

Class: baseclass

- - - - -
- -
-

- LuCI. - - baseclass -

- -

LuCI.baseclass is the abstract base class all LuCI classes inherit from.

-

It provides simple means to create subclasses of given classes and -implements prototypal inheritance.

- -
- -
-
- - - - -
-
-

- - new LuCI.baseclass() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - staticLuCI.baseclass.extend(properties){LuCI.baseclass} -

- - - - -
- - -
-
- - -
-

Extends this base class with the properties described in -properties and returns a new subclassed Class instance

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
properties - - -Object.<string, *> - - - - - -

An object describing the properties to add to the new -subclass.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.baseclass - - - Returns a new LuCI.baseclass sublassed from this class, extended -by the given properties and with its prototype set to this base -class to enable inheritance. The resulting value represents a -class constructor and can be instantiated with new.
- - - - -
- - - -
-
-

- - staticLuCI.baseclass.instantiate(params, new_args){LuCI.baseclass} -

- - - - -
- - -
-
- - -
-

Calls the class constructor using new with the given argument -array being passed as variadic parameters to the constructor.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
params - - -Array.<*> - - - - - - - - - - -

An array of arbitrary values which will be passed as arguments -to the constructor function.

new_args - - -* - - - - - - - optional - - - - - repeatable - - -

Specifies arguments to be passed to the subclass constructor -as-is in order to instantiate the new subclass.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.baseclass - - - Returns a new LuCI.baseclass instance extended by the given -properties with its prototype set to this base class to -enable inheritance.
- - - - -
- - - -
-
-

- - staticLuCI.baseclass.isSubclass(classValue){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether the given class value is a subclass of this class.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
classValue - - -LuCI.baseclass - - - - - -

The class object to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given classValue is a subclass of this -class or false if the given value is not a valid class or not -a subclass of this class'.
- - - - -
- - - -
-
-

- - staticLuCI.baseclass.singleton(properties, new_args){LuCI.baseclass} -

- - - - -
- - -
-
- - -
-

Extends this base class with the properties described in -properties, instantiates the resulting subclass using -the additional optional arguments passed to this function -and returns the resulting subclassed Class instance.

-

This function serves as a convenience shortcut for -Class.extend() and subsequent -new.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
properties - - -Object.<string, *> - - - - - - - - - - -

An object describing the properties to add to the new -subclass.

new_args - - -* - - - - - - - optional - - - - - repeatable - - -

Specifies arguments to be passed to the subclass constructor -as-is in order to instantiate the new subclass.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.baseclass - - - Returns a new LuCI.baseclass instance extended by the given -properties with its prototype set to this base class to -enable inheritance.
- - - - -
- - - -
-
-

- - super(key, callArgs){*|null} -

- - - - -
- - -
-
- - -
-

Walks up the parent class chain and looks for a class member -called key in any of the parent classes this class inherits -from. Returns the member value of the superclass or calls the -member as function and returns its return value when the -optional callArgs array is given.

-

This function has two signatures and is sensitive to the -amount of arguments passed to it:

-
    -
  • super('key') - -Returns the value of key when found within one of the -parent classes.
  • -
  • super('key', ['arg1', 'arg2']) - -Calls the key() method with parameters arg1 and arg2 -when found within one of the parent classes.
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - - - - - - -

The name of the superclass member to retrieve.

callArgs - - -Array.<*> - - - - - - - optional - - - - - -

An optional array of function call parameters to use. When -this parameter is specified, the found member value is called -as function using the values of this array as arguments.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a ReferenceError when callArgs are specified and -the found member named by key is not a function value.

-
-
-
-
-
- Type -
-
- -ReferenceError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - null - - - Returns the value of the found member or the return value of -the call to the found method. Returns null when no member -was found in the parent class chain or when the call to the -superclass method returned null.
- - - - -
- - - -
-
-

- - varargs(args, offset, extra_args){Array.<*>} -

- - - - -
- - -
-
- - -
-

Extract all values from the given argument array beginning from -offset and prepend any further given optional parameters to -the beginning of the resulting array copy.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
args - - -Array.<*> - - - - - - - - - - -

The array to extract the values from.

offset - - -number - - - - - - - - - - -

The offset from which to extract the values. An offset of 0 -would copy all values till the end.

extra_args - - -* - - - - - - - optional - - - - - repeatable - - -

Extra arguments to add to prepend to the resultung array.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<*> - - - Returns a new array consisting of the optional extra arguments -and the values extracted from the args array beginning with -offset.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.dom.html b/docs/jsapi/LuCI.dom.html deleted file mode 100644 index d0a69d1c23d2cd85db588fc9918b52cb48a5d199..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.dom.html +++ /dev/null @@ -1,6244 +0,0 @@ - - - - - Class: dom - - - - - - - - - - - - - - - - - -
- - -
-

Class: dom

- - - - -
- -
-

- LuCI. - - dom -

- -

The dom class provides convenience method for creating and -manipulating DOM elements.

-

To import the class in views, use 'require dom', to import it in -external JavaScript, use L.require("dom").then(...).

- -
- -
-
- - - - -
-
-

- - new LuCI.dom() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - append(node, children){Node|null} -

- - - - -
- - -
-
- - -
-

Appends the given children data to the given node.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -* - - - - - - - - - - -

The Node argument to append the children to.

children - - -* - - - - - - - optional - - - - - -

The childrens to append to the given node.

-

When children is an array, then each item of the array -will be either appended as child element or text node, -depending on whether the item is a DOM Node instance or -some other non-null value. Non-Node, non-null values -will be converted to strings first before being passed as -argument to createTextNode().

-

When children is a function, it will be invoked with -the passed node argument as sole parameter and the append -function will be invoked again, with the given node argument -as first and the return value of the children function as -second parameter.

-

When children is is a DOM Node instance, it will be -appended to the given node.

-

When children is any other non-null value, it will be -converted to a string and appened to the innerHTML property -of the given node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - null - - - Returns the last children Node appended to the node or null -if either the node argument was no valid DOM node or if the -children was null or didn't result in further DOM nodes.
- - - - -
- - - -
-
-

- - attr(node, key, val) -

- - - - -
- - -
-
- - -
-

Sets attributes or registers event listeners on element nodes.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -* - - - - - - - - - - -

The Node argument to set the attributes or add the event -listeners for. When the given node value is not a valid -DOM Node, the function returns and does nothing.

key - - -string -| - -Object.<string, *> - - - - - - - - - - -

Specifies either the attribute or event handler name to use, -or an object containing multiple key, value pairs which are -each added to the node as either attribute or event handler, -depending on the respective value.

val - - -* - - - - - - - optional - - - - - -

Specifies the attribute value or event handler function to add. -If the key parameter is an Object, this parameter will be -ignored.

-

When val is of type function, it will be registered as event -handler on the given node with the key parameter being the -event name.

-

When val is of type object, it will be serialized as JSON and -added as attribute to the given node, using the given key -as attribute name.

-

When val is of any other type, it will be added as attribute -to the given node as-is, with the underlying setAttribute() -call implicitely turning it into a string.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - bindClassInstance(node, inst){Class} -

- - - - -
- - -
-
- - -
-

Binds the given class instance ot the specified DOM Node.

-

This function uses the dom.data() facility to attach the -passed instance of a Class to a node. This is needed for -complex widget elements or similar where the corresponding -class instance responsible for the element must be retrieved -from DOM nodes obtained by querySelector() or similar means.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - -

The DOM Node instance to bind the class to.

inst - - -Class - - - - - -

The Class instance to bind to the node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError when the given instance argument isn't -a valid Class instance.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Class - - - Returns the bound class instance.
- - - - -
- - - -
-
-

- - callClassMethod(node, method, params){*|null} -

- - - - -
- - -
-
- - -
-

Finds a bound class instance on the given node itself or the -first bound instance on its closest parent node and invokes -the specified method name on the found class instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - - - - - - -

The DOM Node instance to start from.

method - - -string - - - - - - - - - - -

The name of the method to invoke on the found class instance.

params - - -* - - - - - - - - - - repeatable - - -

Additional arguments to pass to the invoked method as-is.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - null - - - Returns the return value of the invoked method if a class -instance and method has been found. Returns null if either -no bound class instance could be found, or if the found -instance didn't have the requested method.
- - - - -
- - - -
-
-

- - content(node, children){Node|null} -

- - - - -
- - -
-
- - -
-

Replaces the content of the given node with the given children.

-

This function first removes any children of the given DOM -Node and then adds the given given children following the -rules outlined below.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -* - - - - - - - - - - -

The Node argument to replace the children of.

children - - -* - - - - - - - optional - - - - - -

The childrens to replace into the given node.

-

When children is an array, then each item of the array -will be either appended as child element or text node, -depending on whether the item is a DOM Node instance or -some other non-null value. Non-Node, non-null values -will be converted to strings first before being passed as -argument to createTextNode().

-

When children is a function, it will be invoked with -the passed node argument as sole parameter and the append -function will be invoked again, with the given node argument -as first and the return value of the children function as -second parameter.

-

When children is is a DOM Node instance, it will be -appended to the given node.

-

When children is any other non-null value, it will be -converted to a string and appened to the innerHTML property -of the given node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - null - - - Returns the last children Node appended to the node or null -if either the node argument was no valid DOM node or if the -children was null or didn't result in further DOM nodes.
- - - - -
- - - -
-
-

- - create(html, attr, data){Node} -

- - - - -
- - -
-
- - -
-

Creates a new DOM Node from the given html, attr and -data parameters.

-

This function has multiple signatures, it can be either invoked -in the form create(html[, attr[, data]]) or in the form -create(html[, data]). The used variant is determined from the -type of the second argument.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
html - - -* - - - - - - - - - - -

Describes the node to create.

-

When the value of html is of type array, a DocumentFragment -node is created and each item of the array is first converted -to a DOM Node by passing it through create() and then added -as child to the fragment.

-

When the value of html is a DOM Node instance, no new -element will be created but the node will be used as-is.

-

When the value of html is a string starting with <, it will -be passed to dom.parse() and the resulting value is used.

-

When the value of html is any other string, it will be passed -to document.createElement() for creating a new DOM Node of -the given name.

attr - - -Object.<string, *> - - - - - - - optional - - - - - -

Specifies an Object of key, value pairs to set as attributes -or event handlers on the created node. Refer to -dom.attr() for details.

data - - -* - - - - - - - optional - - - - - -

Specifies children to append to the newly created element. -Refer to dom.append() for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InvalidCharacterError when the given html -argument contained malformed markup (such as not escaped -& characters in XHTML mode) or when the given node name -in html contains characters which are not legal in DOM -element names, such as spaces.

-
-
-
-
-
- Type -
-
- -InvalidCharacterError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns the newly created Node.
- - - - -
- - - -
-
-

- - data(node, key, val){*} -

- - - - -
- - -
-
- - -
-

Attaches or detaches arbitrary data to and from a DOM Node.

-

This function is useful to attach non-string values or runtime -data that is not serializable to DOM nodes. To decouple data -from the DOM, values are not added directly to nodes, but -inserted into a registry instead which is then referenced by a -string key stored as data-idref attribute in the node.

-

This function has multiple signatures and is sensitive to the -number of arguments passed to it.

-
    -
  • dom.data(node) - -Fetches all data associated with the given node.
  • -
  • dom.data(node, key) - -Fetches a specific key associated with the given node.
  • -
  • dom.data(node, key, val) - -Sets a specific key to the given value associated with the -given node.
  • -
  • dom.data(node, null) - -Clears any data associated with the node.
  • -
  • dom.data(node, key, null) - -Clears the given key associated with the node.
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - - - - - - -

The DOM Node instance to set or retrieve the data for.

key - - -string -| - -null - - - - - - - optional - - - - - -

This is either a string specifying the key to retrieve, or -null to unset the entire node data.

val - - -* -| - -null - - - - - - - optional - - - - - -

This is either a non-null value to set for a given key or -null to remove the given key from the specified node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the get or set value, or null when no value could -be found.
- - - - -
- - - -
-
-

- - elem(e){boolean} -

- - - - -
- - -
-
- - -
-

Tests whether the given argument is a valid DOM Node.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
e - - -* - - - - - -

The value to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the value is a DOM Node, else false.
- - - - -
- - - -
-
-

- - findClassInstance(node){Class|null} -

- - - - -
- - -
-
- - -
-

Finds a bound class instance on the given node itself or the -first bound instance on its closest parent node.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - -

The DOM Node instance to start from.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Class - | - - null - - - Returns the founds class instance if any or null if no bound -class could be found on the node itself or any of its parents.
- - - - -
- - - -
-
-

- - isEmpty(node, ignoreFn){boolean} -

- - - - -
- - -
-
- - -
-

Tests whether a given DOM Node instance is empty or appears -empty.

-

Any element child nodes which have the CSS class hidden set -or for which the optionally passed ignoreFn callback function -returns false are ignored.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - - - - - - -

The DOM Node instance to test.

ignoreFn - - -LuCI.dom~ignoreCallbackFn - - - - - - - optional - - - - - -

Specifies an optional function which is invoked for each child -node to decide whether the child node should be ignored or not.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the node does not have any children or if -any children node either has a hidden CSS class or a false -result when testing it using the given ignoreFn.
- - - - -
- - - -
-
-

- - matches(node, selector){boolean} -

- - - - -
- - -
-
- - -
-

Tests whether a given Node matches the given query selector.

-

This function is a convenience wrapper around the standard -Node.matches("selector") function with the added benefit that -the node argument may be a non-Node value, in which case -this function simply returns false.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -* - - - - - - - - - - -

The Node argument to test the selector against.

selector - - -string - - - - - - - optional - - - - - -

The query selector expression to test against the given node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the given node matches the specified selector -or false when the node argument is no valid DOM Node or the -selector didn't match.
- - - - -
- - - -
-
-

- - parent(node, selector){Node|null} -

- - - - -
- - -
-
- - -
-

Returns the closest parent node that matches the given query -selector expression.

-

This function is a convenience wrapper around the standard -Node.closest("selector") function with the added benefit that -the node argument may be a non-Node value, in which case -this function simply returns null.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -* - - - - - - - - - - -

The Node argument to find the closest parent for.

selector - - -string - - - - - - - optional - - - - - -

The query selector expression to test against each parent.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - null - - - Returns the closest parent node matching the selector or -null when the node argument is no valid DOM Node or the -selector didn't match any parent.
- - - - -
- - - -
-
-

- - parse(s){Node} -

- - - - -
- - -
-
- - -
-

Parses a given string as HTML and returns the first child node.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
s - - -string - - - - - -

A string containing an HTML fragment to parse. Note that only -the first result of the resulting structure is returned, so an -input value of <div>foo</div> <div>bar</div> will only return -the first div element node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns the first DOM Node extracted from the HTML fragment or -null on parsing failures or if no element could be found.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

- - ignoreCallbackFn(node){boolean} -

- - - - -
- - -
-
- - -
-

The ignore callback function is invoked by isEmpty() for each -child node to decide whether to ignore a child node or not.

-

When this function returns false, the node passed to it is -ignored, else not.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -Node - - - - - -

The child node to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Boolean indicating whether to ignore the node or not.
- - - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.AbstractElement.html b/docs/jsapi/LuCI.form.AbstractElement.html deleted file mode 100644 index 6e343d1feee2821eb11d65ba0c65f08d1980ed9c..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.AbstractElement.html +++ /dev/null @@ -1,4233 +0,0 @@ - - - - - Class: AbstractElement - - - - - - - - - - - - - - - - - -
- - -
-

Class: AbstractElement

- - - - -
- -
-

- LuCI.form. - - AbstractElement -

- -

The AbstractElement class serves as abstract base for the different form -elements implemented by LuCI.form. It provides the common logic for -loading and rendering values, for nesting elements and for defining common -properties.

-

This class is private and not directly accessible by user code.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.AbstractElement() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this elements form input.

-

The parse() function recursively walks the form element tree and -triggers input value reading and validation for each encountered element.

-

Elements which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once this element's value and the values of -all child elements have been parsed. The returned promise is rejected -if any parsed values are not meeting the validation constraints of their -respective elements.
- - - - -
- - - -
-
-

- - abstractrender(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.AbstractSection.html b/docs/jsapi/LuCI.form.AbstractSection.html deleted file mode 100644 index 0d4d49f5095c3e274f7e7b8f9edd23452bf3a1b6..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.AbstractSection.html +++ /dev/null @@ -1,6132 +0,0 @@ - - - - - Class: AbstractSection - - - - - - - - - - - - - - - - - -
- - -
-

Class: AbstractSection

- - - - -
- -
-

- LuCI.form. - - AbstractSection -

- -

The AbstractSection class serves as abstract base for the different form -section styles implemented by LuCI.form. It provides the common logic for -enumerating underlying configuration section instances, for registering -form options and for handling tabs to segment child options.

-

This class is private and not directly accessible by user code.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.AbstractSection() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

readonlyparentoptionLuCI.form.AbstractValue

-
- - -
-
- -
-

Access the parent option container instance.

-

In case this section is nested within an option element container, -this property will hold a reference to the parent option instance.

-

If this section is not nested, the property is null.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - abstractcfgsections(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Enumerate the UCI section IDs covered by this form section element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError exception if the function is not implemented.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of UCI section IDs covered by this form element. -The sections will be rendered in the same order as the returned array.
- - - - -
- - - -
-
-

- - cfgvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option configuration values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the configuration values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the configuration value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -configuration values or just a single configuration value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - abstractfilter(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Filter UCI section IDs to render.

-

The filter function is invoked for each UCI section ID of a given type -and controls whether the given UCI section is rendered or ignored by -the form section element.

-

The default implementation always returns true. User code or -classes extending AbstractSection may overwrite this function with -custom implementations.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The UCI section ID to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given UCI section ID should be handled and -false when it should be ignored.
- - - - -
- - - -
-
-

- - formvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option widget input values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the widget input values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the widget input value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - getOption(option){null|LuCI.form.AbstractValue|Object.<string, LuCI.form.AbstractValue>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option objects.

-

This function is sensitive to the amount of arguments passed to it; -if no option name is specified, all options within this section are -returned as dictionary.

-

If an option name is supplied, this function returns the matching -LuCI.form.AbstractValue instance only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
option - - -string - - - - - - - optional - - - - - -

The name of the option object to obtain

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.form.AbstractValue - | - - Object.<string, LuCI.form.AbstractValue> - - - Returns either a dictionary of option names and their corresponding -option instance objects or just a single object instance value, -depending on the amount of passed arguments.
- - - - -
- - - -
-
-

- - getUIElement(section_id, option){null|LuCI.ui.AbstractElement|Object.<string, (null|LuCI.ui.AbstractElement)>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option LuCI.ui widget instances.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the LuCI.ui widget instances of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the LuCI.ui widget instance value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.ui.AbstractElement - | - - Object.<string, (null|LuCI.ui.AbstractElement)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this section.

-

The load() function recursively walks the section element tree and -invokes the load function of each child option element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been loaded. The promise may reject with an error if any of the child -elements load functions rejected with an error.
- - - - -
- - - -
-
-

- - option(optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to the section.

-

Note that taboption() -should be used instead if this form section element uses tabs.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this sections form input.

-

The parse() function recursively walks the section element tree and -triggers input value reading and validation for each encountered child -option element.

-

Options which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been parsed. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - abstractrender(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - tab(name, title, description) -

- - - - -
- - -
-
- - -
-

Add an option tab to the section.

-

The child option elements of a section may be divided into multiple -tabs to provide a better overview to the user.

-

Before options can be moved into a tab pane, the corresponding tab -has to be defined first, which is done by calling this function.

-

Note that once tabs are defined, user code must use the taboption() -method to add options to specific tabs. Option elements added by -option() will not be assigned to any tab and not be rendered in this -case.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the tab to register. It may be freely chosen and just serves -as an identifier to differentiate tabs.

title - - -string - - - - - - - - - - -

The human readable caption of the tab.

description - - -string - - - - - - - optional - - - - - -

An additional description text for the corresponding tab pane. It is -displayed as text paragraph below the tab but before the tab pane -contents. If omitted, no description will be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an exeption if a tab with the same name already exists.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - taboption(tabname, optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to a tab of the section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tabname - - -string - - - - - - - - - - -

The name of the section tab to add the option element to.

optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a ReferenceError exception when the given tab name does not -exist.

    -
    -
    -
    -
    -
    - Type -
    -
    - -ReferenceError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.AbstractValue.html b/docs/jsapi/LuCI.form.AbstractValue.html deleted file mode 100644 index ec33a53399d58aa5474f5f2693dded60d50d604b..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.AbstractValue.html +++ /dev/null @@ -1,6991 +0,0 @@ - - - - - Class: AbstractValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: AbstractValue

- - - - -
- -
-

- LuCI.form. - - AbstractValue -

- -

The AbstractValue class serves as abstract base for the different form -option styles implemented by LuCI.form. It provides the common logic for -handling option input values, for dependencies among options and for -validation constraints that should be applied to entered values.

-

This class is private and not directly accessible by user code.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.AbstractValue() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - abstractrender(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - abstractvalidate(section_id, value){*} -

- - - - -
- - -
-
- - -
-

Apply custom validation logic.

-

This method is invoked whenever incremental validation is performed on -the user input, e.g. on keyup or blur events.

-

The default implementation of this method does nothing and always -returns true. User code may overwrite this method to provide -additional validation logic which is not covered by data type -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

value - - -* - - - - - -

The value to validate

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - The method shall return true to accept the given value. Any other -return value is treated as failure, converted to a string and displayed -as error message to the user.
- - - - -
- - - -
-
-

- - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.ButtonValue.html b/docs/jsapi/LuCI.form.ButtonValue.html deleted file mode 100644 index c3e7b5335cea93cfaf1d1c7f0d3fa7603631bdad..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.ButtonValue.html +++ /dev/null @@ -1,7312 +0,0 @@ - - - - - Class: ButtonValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: ButtonValue

- - - - -
- -
-

- LuCI.form. - - ButtonValue -

- -

The DummyValue element wraps an LuCI.ui.Hiddenfield widget and -renders the underlying UCI option or default value as readonly text.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.ButtonValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

inputstylestring

-
- - -
-
- -
-

Override the button style class.

-

By setting this property, a specific cbi-button-* CSS class can be -selected to influence the style of the resulting button.

-

Suitable values which are implemented by most themes are positive, -negative and primary.

-

The default is null, means a neutral button styling is used.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

inputtitlestring function

-
- - -
-
- -
-

Override the rendered button caption.

-

By default, the option title - which is passed as fourth argument to the -constructor - is used as caption for the button element. When setting -this property to a string, it is used as String.format() pattern with -the underlying UCI section name passed as first format argument. When -set to a function, it is invoked passing the section ID as sole argument -and the resulting return value is converted to a string before being -used as button caption.

-

The default is null, means the option title is used as caption.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onclickfunction

-
- - -
-
- -
-

Override the button click action.

-

By default, the underlying UCI option (or default property) value is -copied into a hidden field tied to the button element and the save -action is triggered on the parent form element.

-

When this property is set to a function, it is invoked instead of -performing the default actions. The handler function will receive the -DOM click element as first and the underlying configuration section ID -as second argument.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.DummyValue.html b/docs/jsapi/LuCI.form.DummyValue.html deleted file mode 100644 index e2df4f55f3869ae260d97bba352f73c20b5f1eea..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.DummyValue.html +++ /dev/null @@ -1,7249 +0,0 @@ - - - - - Class: DummyValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: DummyValue

- - - - -
- -
-

- LuCI.form. - - DummyValue -

- -

The DummyValue element wraps an LuCI.ui.Hiddenfield widget and -renders the underlying UCI option or default value as readonly text.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.DummyValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

hrefstring

-
- - -
-
- -
-

Set an URL which is opened when clicking on the dummy value text.

-

By setting this property, the dummy value text is wrapped in an <a> -element with the property value used as href attribute.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

rawhtmlboolean

-
- - -
-
- -
-

Treat the UCI option value (or the default property value) as HTML.

-

By default, the value text is HTML escaped before being rendered as -text. In some cases it may be needed to actually interpret and render -HTML contents as-is. When set to true, HTML escaping is disabled.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.DynamicList.html b/docs/jsapi/LuCI.form.DynamicList.html deleted file mode 100644 index 2cb34a0c6b88673d40b5bdbba680105b320081ea..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.DynamicList.html +++ /dev/null @@ -1,7149 +0,0 @@ - - - - - Class: DynamicList - - - - - - - - - - - - - - - - - -
- - -
-

Class: DynamicList

- - - - -
- -
-

- LuCI.form. - - DynamicList -

- -

The DynamicList class represents a multi value widget allowing the user -to enter multiple unique values, optionally selected from a set of -predefined choices. It builds upon the LuCI.ui.DynamicList widget.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.DynamicList(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.FileUpload.html b/docs/jsapi/LuCI.form.FileUpload.html deleted file mode 100644 index 182ded7dfecf825e01c8d5d072a71ad5ada04e7f..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.FileUpload.html +++ /dev/null @@ -1,7360 +0,0 @@ - - - - - Class: FileUpload - - - - - - - - - - - - - - - - - -
- - -
-

Class: FileUpload

- - - - -
- -
-

- LuCI.form. - - FileUpload -

- -

The FileUpload element wraps an LuCI.ui.FileUpload widget and -offers the ability to browse, upload and select remote files.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.FileUpload(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

enable_removeboolean

-
- - -
-
- -
-

Toggle remote file delete functionality.

-

When set to true, the underlying widget provides a buttons which let -the user delete files from remote directories. Note that this is merely -a cosmetic feature, remote delete permissions are controlled by the -session ACL rules.

-

The default is true, means file removal buttons are displayed.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

enable_uploadboolean

-
- - -
-
- -
-

Toggle file upload functionality.

-

When set to true, the underlying widget provides a button which lets -the user select and upload local files to the remote system. -Note that this is merely a cosmetic feature, remote upload access is -controlled by the session ACL rules.

-

The default is true, means file upload functionality is displayed.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

root_directorystring

-
- - -
-
- -
-

Specify the root directory for file browsing.

-

This property defines the topmost directory the file browser widget may -navigate to, the UI will not allow browsing directories outside this -prefix. Note that this is merely a cosmetic feature, remote file access -and directory listing permissions are controlled by the session ACL -rules.

-

The default is /etc/luci-uploads.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • /etc/luci-uploads
- - - - - - - -
- - - -
- - - -
-
-

show_hiddenboolean

-
- - -
-
- -
-

Toggle display of hidden files.

-

Display hidden files when rendering the remote directory listing. -Note that this is merely a cosmetic feature, hidden files are always -included in received remote file listings.

-

The default is false, means hidden files are not displayed.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.FlagValue.html b/docs/jsapi/LuCI.form.FlagValue.html deleted file mode 100644 index a1a1c68955c86dc216243ef06cb018597e640241..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.FlagValue.html +++ /dev/null @@ -1,7238 +0,0 @@ - - - - - Class: FlagValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: FlagValue

- - - - -
- -
-

- LuCI.form. - - FlagValue -

- -

The FlagValue element builds upon the LuCI.ui.Checkbox widget to -implement a simple checkbox element.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.FlagValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

disablednumber

-
- - -
-
- -
-

Sets the input value to use for the checkbox unchecked state.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • 0
- - - - - - - -
- - - -
- - - -
-
-

enablednumber

-
- - -
-
- -
-

Sets the input value to use for the checkbox checked state.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • 1
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the checked state of the underlying checkbox widget and return -either the enabled or the disabled property value, depending on -the checked state.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Query the checked state of the underlying checkbox widget and return -either a localized Yes or No string, depending on the checked state.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.GridSection.html b/docs/jsapi/LuCI.form.GridSection.html deleted file mode 100644 index 664658ae113e2b8cb28c11a67688c4b2a5d933d1..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.GridSection.html +++ /dev/null @@ -1,6892 +0,0 @@ - - - - - Class: GridSection - - - - - - - - - - - - - - - - - -
- - -
-

Class: GridSection

- - - - -
- -
-

- LuCI.form. - - GridSection -

- -

The GridSection class maps all or - if filter() is overwritten - a -subset of the underlying UCI configuration sections of a given type.

-

A grid section functions similar to a LuCI.form.TableSection but -supports tabbing in the modal overlay. Option elements added with -option() are shown in the table while -elements added with taboption() -are displayed in the modal popup.

-

Another important difference is that the table cells show a readonly text -preview of the corresponding option elements by default, unless the child -option element is explicitely made writable by setting the editable -property to true.

-

Additionally, the grid section honours a modalonly property of child -option elements. Refer to the AbstractValue -documentation for details.

-

Layout wise, a grid section looks mostly identical to table sections.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.GridSection(form, section_type, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by section().

section_type - - -string - - - - - - - - - - -

The type of the UCI section to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form section element.

description - - -string - - - - - - - optional - - - - - -

The description text of the form section element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

addbtntitlestring function

-
- - -
-
- -
-

Override the caption used for the section add button at the bottom of -the section form element. If set to a string, it will be used as-is, -if set to a function, the function will be invoked and its return value -is used as caption, after converting it to a string. If this property -is not set, the default is Add.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

addremoveboolean

-
- - -
-
- -
-

If set to true, the user may add or remove instances from the form -section widget, otherwise only preexisting sections may be edited. -The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

anonymousboolean

-
- - -
-
- -
-

If set to true, mapped section instances are treated as anonymous -UCI sections, which means that section instance elements will be -rendered without title element and that no name is required when adding -new sections. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

exteditstring function

-
- - -
-
- -
-

Enables a per-section instance row Edit button which triggers a certain -action when clicked. If set to a string, the string value is used -as String.format() pattern with the name of the underlying UCI section -as first format argument. The result is then interpreted as URL which -LuCI will navigate to when the user clicks the edit button.

-

If set to a function, this function will be registered as click event -handler on the rendered edit button, receiving the section instance -name as first and the DOM click event as second argument.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

max_colsnumber

-
- - -
-
- -
-

Specify a maximum amount of columns to display. By default, one table -column is rendered for each child option of the form section element. -When this option is set to a positive number, then no more columns than -the given amount are rendered. When the number of child options exceeds -the specified amount, a More… button is rendered in the last column, -opening a modal dialog presenting all options elements in NamedSection -style when clicked.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

modaltitlestring function

-
- - -
-
- -
-

Override the per-section instance modal popup title caption shown when -clicking the More… button in a section specifying max_cols. If set -to a string, it will be used as String.format() pattern with the name -of the underlying UCI section as first argument, if set to a function, -the function will be invoked with the section name as first argument and -its return value is used as caption, after converting it to a string. -If this property is not set, the default is the name of the underlying -UCI configuration section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

nodescriptionsboolean

-
- - -
-
- -
-

If set to true, the header row with the options descriptions will -not be displayed. By default, descriptions row is automatically displayed -when at least one option has a description.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

readonlyparentoptionLuCI.form.AbstractValue

-
- - -
-
- -
-

Access the parent option container instance.

-

In case this section is nested within an option element container, -this property will hold a reference to the parent option instance.

-

If this section is not nested, the property is null.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

rowcolorsboolean

-
- - -
-
- -
-

If set to true, alternating cbi-rowstyle-1 and cbi-rowstyle-2 CSS -classes are added to the table row elements. Not all LuCI themes -implement these row style classes. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

sectiontitlestring function

-
- - -
-
- -
-

Override the per-section instance title caption shown in the first -column of the table unless anonymous is set to true. If set to a -string, it will be used as String.format() pattern with the name of -the underlying UCI section as first argument, if set to a function, the -function will be invoked with the section name as first argument and -its return value is used as caption, after converting it to a string. -If this property is not set, the default is the name of the underlying -UCI configuration section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

sortableboolean

-
- - -
-
- -
-

If set to true, a sort button is added to the last column, allowing -the user to reorder the section instances mapped by the section form -element.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

tabbedboolean

-
- - -
-
- -
-

When set to true, instead of rendering section instances one below -another, treat each instance as separate tab pane and render a tab menu -at the top of the form section element, allowing the user to switch -among instances. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the section IDs from. By -default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified. -The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - abstractaddModalOptions(modalSection, section_id, ev){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Add further options to the per-section instanced modal popup.

-

This function may be overwritten by user code to perform additional -setup steps before displaying the more options modal which is useful to -e.g. query additional data or to inject further option elements.

-

The default implementation of this function does nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
modalSection - - -LuCI.form.NamedSection - - - - - -

The NamedSection instance about to be rendered in the modal popup.

section_id - - -string - - - - - -

The ID of the underlying UCI section the modal popup belongs to.

ev - - -Event - - - - - -

The DOM event emitted by clicking the More… button.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Return values of this function are ignored but if a promise is returned, -it is run to completion before the rendering is continued, allowing -custom logic to perform asynchroneous work before the modal dialog -is shown.
- - - - -
- - - -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option configuration values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the configuration values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the configuration value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -configuration values or just a single configuration value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - abstractfilter(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Filter UCI section IDs to render.

-

The filter function is invoked for each UCI section ID of a given type -and controls whether the given UCI section is rendered or ignored by -the form section element.

-

The default implementation always returns true. User code or -classes extending AbstractSection may overwrite this function with -custom implementations.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The UCI section ID to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given UCI section ID should be handled and -false when it should be ignored.
- - - - -
- - - -
-
-

- - inherited - - formvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option widget input values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the widget input values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the widget input value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getOption(option){null|LuCI.form.AbstractValue|Object.<string, LuCI.form.AbstractValue>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option objects.

-

This function is sensitive to the amount of arguments passed to it; -if no option name is specified, all options within this section are -returned as dictionary.

-

If an option name is supplied, this function returns the matching -LuCI.form.AbstractValue instance only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
option - - -string - - - - - - - optional - - - - - -

The name of the option object to obtain

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.form.AbstractValue - | - - Object.<string, LuCI.form.AbstractValue> - - - Returns either a dictionary of option names and their corresponding -option instance objects or just a single object instance value, -depending on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id, option){null|LuCI.ui.AbstractElement|Object.<string, (null|LuCI.ui.AbstractElement)>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option LuCI.ui widget instances.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the LuCI.ui widget instances of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the LuCI.ui widget instance value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.ui.AbstractElement - | - - Object.<string, (null|LuCI.ui.AbstractElement)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this section.

-

The load() function recursively walks the section element tree and -invokes the load function of each child option element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been loaded. The promise may reject with an error if any of the child -elements load functions rejected with an error.
- - - - -
- - - -
-
-

- - inherited - - option(optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to the section.

-

Note that taboption() -should be used instead if this form section element uses tabs.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this sections form input.

-

The parse() function recursively walks the section element tree and -triggers input value reading and validation for each encountered child -option element.

-

Options which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been parsed. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - tab(name, title, description) -

- - - - -
- - -
-
- - -
-

Add an option tab to the section.

-

The modal option elements of a grid section may be divided into multiple -tabs to provide a better overview to the user.

-

Before options can be moved into a tab pane, the corresponding tab -has to be defined first, which is done by calling this function.

-

Note that tabs are only effective in modal popups, options added with -option() will not be assigned to a specific tab and are rendered in -the table view only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the tab to register. It may be freely chosen and just serves -as an identifier to differentiate tabs.

title - - -string - - - - - - - - - - -

The human readable caption of the tab.

description - - -string - - - - - - - optional - - - - - -

An additional description text for the corresponding tab pane. It is -displayed as text paragraph below the tab but before the tab pane -contents. If omitted, no description will be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an exeption if a tab with the same name already exists.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - inherited - - taboption(tabname, optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to a tab of the section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tabname - - -string - - - - - - - - - - -

The name of the section tab to add the option element to.

optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a ReferenceError exception when the given tab name does not -exist.

    -
    -
    -
    -
    -
    - Type -
    -
    - -ReferenceError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.HiddenValue.html b/docs/jsapi/LuCI.form.HiddenValue.html deleted file mode 100644 index 85362cdb73eadb2af9c0187fdedddcc871277c0d..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.HiddenValue.html +++ /dev/null @@ -1,7153 +0,0 @@ - - - - - Class: HiddenValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: HiddenValue

- - - - -
- -
-

- LuCI.form. - - HiddenValue -

- -

The HiddenValue element wraps an LuCI.ui.Hiddenfield widget.

-

Hidden value widgets used to be necessary in legacy code which actually -submitted the underlying HTML form the server. With client side handling of -forms, there are more efficient ways to store hidden state data.

-

Since this widget has no visible content, the title and description values -of this form element should be set to null as well to avoid a broken or -distorted form layout when rendering the option element.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.HiddenValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.JSONMap.html b/docs/jsapi/LuCI.form.JSONMap.html deleted file mode 100644 index 17a0217d919ac43d511d23cdf0c70343d9e0449c..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.JSONMap.html +++ /dev/null @@ -1,5812 +0,0 @@ - - - - - Class: JSONMap - - - - - - - - - - - - - - - - - -
- - -
-

Class: JSONMap

- - - - -
- -
-

- LuCI.form. - - JSONMap -

- -

A JSONMap class functions similar to LuCI.form.Map -but uses a multidimensional JavaScript object instead of UCI configuration -as data source.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.JSONMap(data, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
data - - -Object.<string, (Object.<string, *>|Array.<Object.<string, *>>)> - - - - - - - - - - -

The JavaScript object to use as data source. Internally, the object is -converted into an UCI-like format. Its toplevel keys are treated like UCI -section types while the object or array-of-object values are treated as -section contents.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form. A form title is usually rendered as separate -headline element before the actual form contents. If omitted, the -corresponding headline element will not be rendered.

description - - -string - - - - - - - optional - - - - - -

The description text of the form which is usually rendered as text -paragraph below the form title and before the actual form conents. -If omitted, the corresponding paragraph element will not be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

readonlyboolean

-
- - -
-
- -
-

Toggle readonly state of the form.

-

If set to true, the Map instance is marked readonly and any form -option elements added to it will inherit the readonly state.

-

If left unset, the Map will test the access permission of the primary -uci configuration upon loading and mark the form readonly if no write -permissions are granted.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - chain(config) -

- - - - -
- - -
-
- - -
-

Tie another UCI configuration to the map.

-

By default, a map instance will only load the UCI configuration file -specified in the constructor but sometimes access to values from -further configuration files is required. This function allows for such -use cases by registering further UCI configuration files which are -needed by the map.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The additional UCI configuration file to tie to the map. If the given -config already is in the list of required files, it will be ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - findElement(selector_or_attrname, attrvalue){Node|null} -

- - - - -
- - -
-
- - -
-

Find the first DOM node within this Map which matches the given search -parameters. This function is essentially a convenience wrapper around -findElements() which only returns the first found node.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, it is used as selector-expression -as-is. When two arguments are passed, the first argument is treated -as attribute name, the second one as attribute value to match.

-

As an example, map.findElement('input') would find the first <input> -node while map.findElement('type', 'text') would find the first DOM -node with a type="text" attribute.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
selector_or_attrname - - -string - - - - - - - - - - -

If invoked with only one parameter, this argument is a querySelector() -compatible selector expression. If invoked with two parameters, this -argument is the attribute name to filter for.

attrvalue - - -string - - - - - - - optional - - - - - -

In case the function is invoked with two parameters, this argument -specifies the attribute value to match.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError if more than two function parameters are -passed.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - null - - - Returns the first found DOM node or null if no element matched.
- - - - -
- - - -
-
-

- - inherited - - findElements(selector_or_attrname, attrvalue){NodeList} -

- - - - -
- - -
-
- - -
-

Find all DOM nodes within this Map which match the given search -parameters. This function is essentially a convenience wrapper around -querySelectorAll().

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, it is used as selector-expression -as-is. When two arguments are passed, the first argument is treated -as attribute name, the second one as attribute value to match.

-

As an example, map.findElements('input') would find all <input> -nodes while map.findElements('type', 'text') would find any DOM node -with a type="text" attribute.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
selector_or_attrname - - -string - - - - - - - - - - -

If invoked with only one parameter, this argument is a -querySelectorAll() compatible selector expression. If invoked with -two parameters, this argument is the attribute name to filter for.

attrvalue - - -string - - - - - - - optional - - - - - -

In case the function is invoked with two parameters, this argument -specifies the attribute value to match.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError if more than two function parameters are -passed.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - NodeList - - - Returns a (possibly empty) DOM NodeList containing the found DOM nodes.
- - - - -
- - - -
-
-

- - inherited - - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this map.

-

The load() function first loads all referenced UCI configurations, -then it recursively walks the form element tree and invokes the -load function of each child element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire form completed loading all -data. The promise may reject with an error if any configuration failed -to load or if any of the child elements load functions rejected with -an error.
- - - - -
- - - -
-
-

- - inherited - - lookupOption(name_or_id, section_id, config){Array.<LuCI.form.AbstractValue, string>|null} -

- - - - -
- - -
-
- - -
-

Find a form option element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name_or_id - - -string - - - - - - - - - - -

The name or the full ID of the option element to look up.

section_id - - -string - - - - - - - optional - - - - - -

The ID of the UCI section containing the option to look up. May be -omitted if a full ID is passed as first argument.

config - - -string - - - - - - - optional - - - - - -

The name of the UCI configuration the option instance is belonging to. -Defaults to the main UCI configuration of the map if omitted.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.form.AbstractValue, string> - | - - null - - - Returns a two-element array containing the form option instance as -first item and the corresponding UCI section ID as second item. -Returns null if the option could not be found.
- - - - -
- - - -
-
-

- - inherited - - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the form input values.

-

The parse() function recursively walks the form element tree and -triggers input value reading and validation for each child element.

-

Elements which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire form completed parsing all -input values. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - render(){Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Node> - - - Returns a promise resolving to the toplevel form DOM node once the -rendering is complete.
- - - - -
- - - -
-
-

- - inherited - - reset(){Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Reset the form by re-rendering its contents. This will revert all -unsaved user inputs to their initial form state.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Node> - - - Returns a promise resolving to the toplevel form DOM node once the -re-rendering is complete.
- - - - -
- - - -
-
-

- - inherited - - save(cb, silent){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Save the form input values.

-

This function parses the current form, saves the resulting UCI changes, -reloads the UCI configuration data and redraws the form elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
cb - - -function - - - - - - - - - optional - - - - - -

An optional callback function that is invoked after the form is parsed -but before the changed UCI data is saved. This is useful to perform -additional data manipulation steps before saving the changes.

silent - - -boolean - - - - - - false - - - - - optional - - - - - -

If set to true, trigger an alert message to the user in case saving -the form data failes. Otherwise fail silently.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire save operation is complete. -The returned promise is rejected if any step of the save operation -failed.
- - - - -
- - - -
-
-

- - inherited - - section(sectionclass, classargs){LuCI.form.AbstractSection} -

- - - - -
- - -
-
- - -
-

Add a configuration section to the map.

-

LuCI forms follow the structure of the underlying UCI configurations, -means that a map, which represents a single UCI configuration, is -divided into multiple sections which in turn contain an arbitrary -number of options.

-

While UCI itself only knows two kinds of sections - named and anonymous -ones - the form class offers various flavors of form section elements -to present configuration sections in different ways. Refer to the -documentation of the different section classes for details.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sectionclass - - -LuCI.form.AbstractSection - - - - - - - - - - -

The section class to use for rendering the configuration section. -Note that this value must be the class itself, not a class instance -obtained from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -string - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given section class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractSection - - - Returns the instantiated section class instance.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.ListValue.html b/docs/jsapi/LuCI.form.ListValue.html deleted file mode 100644 index e173e5f9b95d81b72efb37e79622600eee5c752f..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.ListValue.html +++ /dev/null @@ -1,7298 +0,0 @@ - - - - - Class: ListValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: ListValue

- - - - -
- -
-

- LuCI.form. - - ListValue -

- -

The ListValue class implements a simple static HTML select element -allowing the user to chose a single value from a set of predefined choices. -It builds upon the LuCI.ui.Select widget.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.ListValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

orientationstring

-
- - -
-
- -
-

Set the orientation of the underlying radio or checkbox elements.

-

May be one of horizontal or vertical. Only applies to non-select -widget types.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • horizontal
- - - - - - - -
- - - -
- - - -
-
-

sizenumber

-
- - -
-
- -
-

Set the size attribute of the underlying HTML select element.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widgetstring

-
- - -
-
- -
-

Set the type of the underlying form controls.

-

May be one of select or radio. If set to select, an HTML -select element is rendered, otherwise a collection of radio -elements is used.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • select
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.Map.html b/docs/jsapi/LuCI.form.Map.html deleted file mode 100644 index 47afe794d6fb00854aa4c94660d7515607eea017..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.Map.html +++ /dev/null @@ -1,5791 +0,0 @@ - - - - - Class: Map - - - - - - - - - - - - - - - - - -
- - -
-

Class: Map

- - - - -
- -
-

- LuCI.form. - - Map -

- -

The Map class represents one complete form. A form usually maps one UCI -configuraton file and is divided into multiple sections containing multiple -fields each.

-

It serves as main entry point into the LuCI.form for typical view code.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.Map(config, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The UCI configuration to map. It is automatically loaded along when the -resulting map instance.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form. A form title is usually rendered as separate -headline element before the actual form contents. If omitted, the -corresponding headline element will not be rendered.

description - - -string - - - - - - - optional - - - - - -

The description text of the form which is usually rendered as text -paragraph below the form title and before the actual form conents. -If omitted, the corresponding paragraph element will not be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

readonlyboolean

-
- - -
-
- -
-

Toggle readonly state of the form.

-

If set to true, the Map instance is marked readonly and any form -option elements added to it will inherit the readonly state.

-

If left unset, the Map will test the access permission of the primary -uci configuration upon loading and mark the form readonly if no write -permissions are granted.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - chain(config) -

- - - - -
- - -
-
- - -
-

Tie another UCI configuration to the map.

-

By default, a map instance will only load the UCI configuration file -specified in the constructor but sometimes access to values from -further configuration files is required. This function allows for such -use cases by registering further UCI configuration files which are -needed by the map.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The additional UCI configuration file to tie to the map. If the given -config already is in the list of required files, it will be ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - findElement(selector_or_attrname, attrvalue){Node|null} -

- - - - -
- - -
-
- - -
-

Find the first DOM node within this Map which matches the given search -parameters. This function is essentially a convenience wrapper around -findElements() which only returns the first found node.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, it is used as selector-expression -as-is. When two arguments are passed, the first argument is treated -as attribute name, the second one as attribute value to match.

-

As an example, map.findElement('input') would find the first <input> -node while map.findElement('type', 'text') would find the first DOM -node with a type="text" attribute.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
selector_or_attrname - - -string - - - - - - - - - - -

If invoked with only one parameter, this argument is a querySelector() -compatible selector expression. If invoked with two parameters, this -argument is the attribute name to filter for.

attrvalue - - -string - - - - - - - optional - - - - - -

In case the function is invoked with two parameters, this argument -specifies the attribute value to match.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError if more than two function parameters are -passed.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - null - - - Returns the first found DOM node or null if no element matched.
- - - - -
- - - -
-
-

- - findElements(selector_or_attrname, attrvalue){NodeList} -

- - - - -
- - -
-
- - -
-

Find all DOM nodes within this Map which match the given search -parameters. This function is essentially a convenience wrapper around -querySelectorAll().

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, it is used as selector-expression -as-is. When two arguments are passed, the first argument is treated -as attribute name, the second one as attribute value to match.

-

As an example, map.findElements('input') would find all <input> -nodes while map.findElements('type', 'text') would find any DOM node -with a type="text" attribute.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
selector_or_attrname - - -string - - - - - - - - - - -

If invoked with only one parameter, this argument is a -querySelectorAll() compatible selector expression. If invoked with -two parameters, this argument is the attribute name to filter for.

attrvalue - - -string - - - - - - - optional - - - - - -

In case the function is invoked with two parameters, this argument -specifies the attribute value to match.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError if more than two function parameters are -passed.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - NodeList - - - Returns a (possibly empty) DOM NodeList containing the found DOM nodes.
- - - - -
- - - -
-
-

- - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this map.

-

The load() function first loads all referenced UCI configurations, -then it recursively walks the form element tree and invokes the -load function of each child element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire form completed loading all -data. The promise may reject with an error if any configuration failed -to load or if any of the child elements load functions rejected with -an error.
- - - - -
- - - -
-
-

- - lookupOption(name_or_id, section_id, config){Array.<LuCI.form.AbstractValue, string>|null} -

- - - - -
- - -
-
- - -
-

Find a form option element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name_or_id - - -string - - - - - - - - - - -

The name or the full ID of the option element to look up.

section_id - - -string - - - - - - - optional - - - - - -

The ID of the UCI section containing the option to look up. May be -omitted if a full ID is passed as first argument.

config - - -string - - - - - - - optional - - - - - -

The name of the UCI configuration the option instance is belonging to. -Defaults to the main UCI configuration of the map if omitted.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.form.AbstractValue, string> - | - - null - - - Returns a two-element array containing the form option instance as -first item and the corresponding UCI section ID as second item. -Returns null if the option could not be found.
- - - - -
- - - -
-
-

- - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the form input values.

-

The parse() function recursively walks the form element tree and -triggers input value reading and validation for each child element.

-

Elements which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire form completed parsing all -input values. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - render(){Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Node> - - - Returns a promise resolving to the toplevel form DOM node once the -rendering is complete.
- - - - -
- - - -
-
-

- - reset(){Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Reset the form by re-rendering its contents. This will revert all -unsaved user inputs to their initial form state.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Node> - - - Returns a promise resolving to the toplevel form DOM node once the -re-rendering is complete.
- - - - -
- - - -
-
-

- - save(cb, silent){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Save the form input values.

-

This function parses the current form, saves the resulting UCI changes, -reloads the UCI configuration data and redraws the form elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
cb - - -function - - - - - - - - - optional - - - - - -

An optional callback function that is invoked after the form is parsed -but before the changed UCI data is saved. This is useful to perform -additional data manipulation steps before saving the changes.

silent - - -boolean - - - - - - false - - - - - optional - - - - - -

If set to true, trigger an alert message to the user in case saving -the form data failes. Otherwise fail silently.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the entire save operation is complete. -The returned promise is rejected if any step of the save operation -failed.
- - - - -
- - - -
-
-

- - section(sectionclass, classargs){LuCI.form.AbstractSection} -

- - - - -
- - -
-
- - -
-

Add a configuration section to the map.

-

LuCI forms follow the structure of the underlying UCI configurations, -means that a map, which represents a single UCI configuration, is -divided into multiple sections which in turn contain an arbitrary -number of options.

-

While UCI itself only knows two kinds of sections - named and anonymous -ones - the form class offers various flavors of form section elements -to present configuration sections in different ways. Refer to the -documentation of the different section classes for details.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sectionclass - - -LuCI.form.AbstractSection - - - - - - - - - - -

The section class to use for rendering the configuration section. -Note that this value must be the class itself, not a class instance -obtained from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -string - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given section class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractSection - - - Returns the instantiated section class instance.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.MultiValue.html b/docs/jsapi/LuCI.form.MultiValue.html deleted file mode 100644 index b3d9896f397f5ca3aa319eaac8a2fd780f8a3757..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.MultiValue.html +++ /dev/null @@ -1,7249 +0,0 @@ - - - - - Class: MultiValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: MultiValue

- - - - -
- -
-

- LuCI.form. - - MultiValue -

- -

The MultiValue class is a modified variant of the DynamicList element -which leverages the LuCI.ui.Dropdown widget to implement a multi -select dropdown element.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.MultiValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

display_sizenumber

-
- - -
-
- -
-

Allows to specify the display_items -property of the underlying dropdown widget. If omitted, the value of -the size property is used or 3 when size is unspecified as well.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
- -
- - -
-
- -
-

Allows to specify the dropdown_items -property of the underlying dropdown widget. If omitted, the value of -the size property is used or -1 when size is unspecified as well.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.NamedSection.html b/docs/jsapi/LuCI.form.NamedSection.html deleted file mode 100644 index d4a538c1859768d0138e8388597501b9f293e707..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.NamedSection.html +++ /dev/null @@ -1,6396 +0,0 @@ - - - - - Class: NamedSection - - - - - - - - - - - - - - - - - -
- - -
-

Class: NamedSection

- - - - -
- -
-

- LuCI.form. - - NamedSection -

- -

The NamedSection class maps exactly one UCI section instance which is -specified when constructing the class instance.

-

Layout and functionality wise, a named section is essentially a -TypedSection which allows exactly one section node.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.NamedSection(form, section_id, section_type, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by section().

section_id - - -string - - - - - - - - - - -

The name (ID) of the UCI section to map.

section_type - - -string - - - - - - - - - - -

The type of the UCI section to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form section element.

description - - -string - - - - - - - optional - - - - - -

The description text of the form section element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

addremoveboolean

-
- - -
-
- -
-

If set to true, the user may remove or recreate the sole mapped -configuration instance from the form section widget, otherwise only a -preexisting section may be edited. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the section IDs from. By -default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified. -The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyparentoptionLuCI.form.AbstractValue

-
- - -
-
- -
-

Access the parent option container instance.

-

In case this section is nested within an option element container, -this property will hold a reference to the parent option instance.

-

If this section is not nested, the property is null.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - cfgsections(){Array.<string>} -

- - - - -
- - -
-
- - -
-

The NamedSection class overwrites the generic cfgsections() -implementation to return a one-element array containing the mapped -section ID as sole element. User code should not normally change this.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns a one-element array containing the mapped section ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option configuration values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the configuration values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the configuration value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -configuration values or just a single configuration value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - abstractfilter(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Filter UCI section IDs to render.

-

The filter function is invoked for each UCI section ID of a given type -and controls whether the given UCI section is rendered or ignored by -the form section element.

-

The default implementation always returns true. User code or -classes extending AbstractSection may overwrite this function with -custom implementations.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The UCI section ID to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given UCI section ID should be handled and -false when it should be ignored.
- - - - -
- - - -
-
-

- - inherited - - formvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option widget input values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the widget input values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the widget input value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getOption(option){null|LuCI.form.AbstractValue|Object.<string, LuCI.form.AbstractValue>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option objects.

-

This function is sensitive to the amount of arguments passed to it; -if no option name is specified, all options within this section are -returned as dictionary.

-

If an option name is supplied, this function returns the matching -LuCI.form.AbstractValue instance only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
option - - -string - - - - - - - optional - - - - - -

The name of the option object to obtain

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.form.AbstractValue - | - - Object.<string, LuCI.form.AbstractValue> - - - Returns either a dictionary of option names and their corresponding -option instance objects or just a single object instance value, -depending on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id, option){null|LuCI.ui.AbstractElement|Object.<string, (null|LuCI.ui.AbstractElement)>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option LuCI.ui widget instances.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the LuCI.ui widget instances of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the LuCI.ui widget instance value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.ui.AbstractElement - | - - Object.<string, (null|LuCI.ui.AbstractElement)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this section.

-

The load() function recursively walks the section element tree and -invokes the load function of each child option element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been loaded. The promise may reject with an error if any of the child -elements load functions rejected with an error.
- - - - -
- - - -
-
-

- - inherited - - option(optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to the section.

-

Note that taboption() -should be used instead if this form section element uses tabs.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this sections form input.

-

The parse() function recursively walks the section element tree and -triggers input value reading and validation for each encountered child -option element.

-

Options which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been parsed. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - render(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - tab(name, title, description) -

- - - - -
- - -
-
- - -
-

Add an option tab to the section.

-

The child option elements of a section may be divided into multiple -tabs to provide a better overview to the user.

-

Before options can be moved into a tab pane, the corresponding tab -has to be defined first, which is done by calling this function.

-

Note that once tabs are defined, user code must use the taboption() -method to add options to specific tabs. Option elements added by -option() will not be assigned to any tab and not be rendered in this -case.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the tab to register. It may be freely chosen and just serves -as an identifier to differentiate tabs.

title - - -string - - - - - - - - - - -

The human readable caption of the tab.

description - - -string - - - - - - - optional - - - - - -

An additional description text for the corresponding tab pane. It is -displayed as text paragraph below the tab but before the tab pane -contents. If omitted, no description will be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an exeption if a tab with the same name already exists.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - inherited - - taboption(tabname, optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to a tab of the section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tabname - - -string - - - - - - - - - - -

The name of the section tab to add the option element to.

optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a ReferenceError exception when the given tab name does not -exist.

    -
    -
    -
    -
    -
    - Type -
    -
    - -ReferenceError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.SectionValue.html b/docs/jsapi/LuCI.form.SectionValue.html deleted file mode 100644 index ab6844436b78a0a99aab3711aa18c51f5c4fe53b..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.SectionValue.html +++ /dev/null @@ -1,7180 +0,0 @@ - - - - - Class: SectionValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: SectionValue

- - - - -
- -
-

- LuCI.form. - - SectionValue -

- -

The SectionValue widget embeds a form section element within an option -element container, allowing to nest form sections into other sections.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.SectionValue(form, section, option, subsection_class, class_args) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The internal name of the option element holding the section. Since a section -container element does not read or write any configuration itself, the name -is only used internally and does not need to relate to any underlying UCI -option name.

subsection_class - - -LuCI.form.AbstractSection - - - - - - - - - - -

The class to use for instantiating the nested section element. Note that -the class value itself is expected here, not a class instance obtained by -calling new. The given class argument must be a subclass of the -AbstractSection class.

class_args - - -* - - - - - - - optional - - - - - repeatable - - -

All further arguments are passed as-is to the subclass constructor. Refer -to the corresponding class constructor documentations for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

readonlysubsectionLuCI.form.AbstractSection

-
- - -
-
- -
-

Access the embedded section instance.

-

This property holds a reference to the instantiated nested section.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){null} -

- - - - -
- - -
-
- - -
-

Since the section container is not tied to any UCI configuration, -its cfgvalue() implementation will always return null.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - - -
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){null} -

- - - - -
- - -
-
- - -
-

Since the section container is not tied to any UCI configuration, -its formvalue() implementation will always return null.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - - -
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Since the section container is not tied to any UCI configuration, -its remove() implementation is a no-op.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - value(key, value) -

- - - - -
- - -
-
- - -
-

Since the section container is not rendering an own widget, -its value() implementation is a no-op.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Since the section container is not tied to any UCI configuration, -its write() implementation is a no-op.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.TableSection.html b/docs/jsapi/LuCI.form.TableSection.html deleted file mode 100644 index ba6fe9b88a78b9a2ee1ad98bbc43a62724d76796..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.TableSection.html +++ /dev/null @@ -1,7068 +0,0 @@ - - - - - Class: TableSection - - - - - - - - - - - - - - - - - -
- - -
-

Class: TableSection

- - - - -
- -
-

- LuCI.form. - - TableSection -

- -

The TableSection class maps all or - if filter() is overwritten - a -subset of the underlying UCI configuration sections of a given type.

-

Layout wise, the configuration section instances mapped by the section -element (sometimes referred to as "section nodes") are rendered as rows -within an HTML table element, with an optional section remove button in the -last column and a section add button below the table, depending on the -value of the addremove property.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.TableSection(form, section_type, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by section().

section_type - - -string - - - - - - - - - - -

The type of the UCI section to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form section element.

description - - -string - - - - - - - optional - - - - - -

The description text of the form section element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

addbtntitlestring function

-
- - -
-
- -
-

Override the caption used for the section add button at the bottom of -the section form element. If set to a string, it will be used as-is, -if set to a function, the function will be invoked and its return value -is used as caption, after converting it to a string. If this property -is not set, the default is Add.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

addremoveboolean

-
- - -
-
- -
-

If set to true, the user may add or remove instances from the form -section widget, otherwise only preexisting sections may be edited. -The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

anonymousboolean

-
- - -
-
- -
-

If set to true, mapped section instances are treated as anonymous -UCI sections, which means that section instance elements will be -rendered without title element and that no name is required when adding -new sections. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

exteditstring function

-
- - -
-
- -
-

Enables a per-section instance row Edit button which triggers a certain -action when clicked. If set to a string, the string value is used -as String.format() pattern with the name of the underlying UCI section -as first format argument. The result is then interpreted as URL which -LuCI will navigate to when the user clicks the edit button.

-

If set to a function, this function will be registered as click event -handler on the rendered edit button, receiving the section instance -name as first and the DOM click event as second argument.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

max_colsnumber

-
- - -
-
- -
-

Specify a maximum amount of columns to display. By default, one table -column is rendered for each child option of the form section element. -When this option is set to a positive number, then no more columns than -the given amount are rendered. When the number of child options exceeds -the specified amount, a More… button is rendered in the last column, -opening a modal dialog presenting all options elements in NamedSection -style when clicked.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

modaltitlestring function

-
- - -
-
- -
-

Override the per-section instance modal popup title caption shown when -clicking the More… button in a section specifying max_cols. If set -to a string, it will be used as String.format() pattern with the name -of the underlying UCI section as first argument, if set to a function, -the function will be invoked with the section name as first argument and -its return value is used as caption, after converting it to a string. -If this property is not set, the default is the name of the underlying -UCI configuration section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

nodescriptionsboolean

-
- - -
-
- -
-

If set to true, the header row with the options descriptions will -not be displayed. By default, descriptions row is automatically displayed -when at least one option has a description.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rowcolorsboolean

-
- - -
-
- -
-

If set to true, alternating cbi-rowstyle-1 and cbi-rowstyle-2 CSS -classes are added to the table row elements. Not all LuCI themes -implement these row style classes. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

sectiontitlestring function

-
- - -
-
- -
-

Override the per-section instance title caption shown in the first -column of the table unless anonymous is set to true. If set to a -string, it will be used as String.format() pattern with the name of -the underlying UCI section as first argument, if set to a function, the -function will be invoked with the section name as first argument and -its return value is used as caption, after converting it to a string. -If this property is not set, the default is the name of the underlying -UCI configuration section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

sortableboolean

-
- - -
-
- -
-

If set to true, a sort button is added to the last column, allowing -the user to reorder the section instances mapped by the section form -element.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the section IDs from. By -default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified. -The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

addbtntitlestring function

-
- - -
-
- -
-

Override the caption used for the section add button at the bottom of -the section form element. If set to a string, it will be used as-is, -if set to a function, the function will be invoked and its return value -is used as caption, after converting it to a string. If this property -is not set, the default is Add.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

addremoveboolean

-
- - -
-
- -
-

If set to true, the user may add or remove instances from the form -section widget, otherwise only preexisting sections may be edited. -The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

anonymousboolean

-
- - -
-
- -
-

If set to true, mapped section instances are treated as anonymous -UCI sections, which means that section instance elements will be -rendered without title element and that no name is required when adding -new sections. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

readonlyparentoptionLuCI.form.AbstractValue

-
- - -
-
- -
-

Access the parent option container instance.

-

In case this section is nested within an option element container, -this property will hold a reference to the parent option instance.

-

If this section is not nested, the property is null.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

tabbedboolean

-
- - -
-
- -
-

When set to true, instead of rendering section instances one below -another, treat each instance as separate tab pane and render a tab menu -at the top of the form section element, allowing the user to switch -among instances. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the section IDs from. By -default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified. -The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - abstractaddModalOptions(modalSection, section_id, ev){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Add further options to the per-section instanced modal popup.

-

This function may be overwritten by user code to perform additional -setup steps before displaying the more options modal which is useful to -e.g. query additional data or to inject further option elements.

-

The default implementation of this function does nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
modalSection - - -LuCI.form.NamedSection - - - - - -

The NamedSection instance about to be rendered in the modal popup.

section_id - - -string - - - - - -

The ID of the underlying UCI section the modal popup belongs to.

ev - - -Event - - - - - -

The DOM event emitted by clicking the More… button.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Return values of this function are ignored but if a promise is returned, -it is run to completion before the rendering is continued, allowing -custom logic to perform asynchroneous work before the modal dialog -is shown.
- - - - -
- - - -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option configuration values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the configuration values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the configuration value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -configuration values or just a single configuration value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - abstractfilter(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Filter UCI section IDs to render.

-

The filter function is invoked for each UCI section ID of a given type -and controls whether the given UCI section is rendered or ignored by -the form section element.

-

The default implementation always returns true. User code or -classes extending AbstractSection may overwrite this function with -custom implementations.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The UCI section ID to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given UCI section ID should be handled and -false when it should be ignored.
- - - - -
- - - -
-
-

- - inherited - - formvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option widget input values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the widget input values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the widget input value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getOption(option){null|LuCI.form.AbstractValue|Object.<string, LuCI.form.AbstractValue>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option objects.

-

This function is sensitive to the amount of arguments passed to it; -if no option name is specified, all options within this section are -returned as dictionary.

-

If an option name is supplied, this function returns the matching -LuCI.form.AbstractValue instance only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
option - - -string - - - - - - - optional - - - - - -

The name of the option object to obtain

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.form.AbstractValue - | - - Object.<string, LuCI.form.AbstractValue> - - - Returns either a dictionary of option names and their corresponding -option instance objects or just a single object instance value, -depending on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id, option){null|LuCI.ui.AbstractElement|Object.<string, (null|LuCI.ui.AbstractElement)>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option LuCI.ui widget instances.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the LuCI.ui widget instances of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the LuCI.ui widget instance value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.ui.AbstractElement - | - - Object.<string, (null|LuCI.ui.AbstractElement)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this section.

-

The load() function recursively walks the section element tree and -invokes the load function of each child option element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been loaded. The promise may reject with an error if any of the child -elements load functions rejected with an error.
- - - - -
- - - -
-
-

- - inherited - - option(optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to the section.

-

Note that taboption() -should be used instead if this form section element uses tabs.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this sections form input.

-

The parse() function recursively walks the section element tree and -triggers input value reading and validation for each encountered child -option element.

-

Options which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been parsed. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - tab(name, title, description) -

- - - - -
- - -
-
- - -
-

The TableSection implementation does not support option tabbing, so -its implementation of tab() will always throw an exception when -invoked.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the tab to register. It may be freely chosen and just serves -as an identifier to differentiate tabs.

title - - -string - - - - - - - - - - -

The human readable caption of the tab.

description - - -string - - - - - - - optional - - - - - -

An additional description text for the corresponding tab pane. It is -displayed as text paragraph below the tab but before the tab pane -contents. If omitted, no description will be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
- -

Throws an exception when invoked.

- -
- - - - - - - -
- - - -
-
-

- - inherited - - taboption(tabname, optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to a tab of the section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tabname - - -string - - - - - - - - - - -

The name of the section tab to add the option element to.

optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a ReferenceError exception when the given tab name does not -exist.

    -
    -
    -
    -
    -
    - Type -
    -
    - -ReferenceError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.TextValue.html b/docs/jsapi/LuCI.form.TextValue.html deleted file mode 100644 index 3e4c4f1238e4188f0cc7e0c88a04e90c40273d67..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.TextValue.html +++ /dev/null @@ -1,7196 +0,0 @@ - - - - - Class: TextValue - - - - - - - - - - - - - - - - - -
- - -
-

Class: TextValue

- - - - -
- -
-

- LuCI.form. - - TextValue -

- -

The TextValue class implements a multi-line textarea input using -LuCI.ui.Textarea.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.TextValue(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

colsnumber

-
- - -
-
- -
-

Allows to specify the cols -property of the underlying textarea widget.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

monospaceboolean

-
- - -
-
- -
-

Enforces the use of a monospace font for the textarea contents when set -to true.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rowsnumber

-
- - -
-
- -
-

Allows to specify the rows -property of the underlying textarea widget.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

wrapnumber

-
- - -
-
- -
-

Allows to specify the wrap -property of the underlying textarea widget.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.TypedSection.html b/docs/jsapi/LuCI.form.TypedSection.html deleted file mode 100644 index e947b65056b95591c89d9732ce2d5b408fdf54a8..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.TypedSection.html +++ /dev/null @@ -1,6553 +0,0 @@ - - - - - Class: TypedSection - - - - - - - - - - - - - - - - - -
- - -
-

Class: TypedSection

- - - - -
- -
-

- LuCI.form. - - TypedSection -

- -

The TypedSection class maps all or - if filter() is overwritten - a -subset of the underlying UCI configuration sections of a given type.

-

Layout wise, the configuration section instances mapped by the section -element (sometimes referred to as "section nodes") are stacked beneath -each other in a single column, with an optional section remove button next -to each section node and a section add button at the end, depending on the -value of the addremove property.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.TypedSection(form, section_type, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by section().

section_type - - -string - - - - - - - - - - -

The type of the UCI section to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the form section element.

description - - -string - - - - - - - optional - - - - - -

The description text of the form section element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

addbtntitlestring function

-
- - -
-
- -
-

Override the caption used for the section add button at the bottom of -the section form element. If set to a string, it will be used as-is, -if set to a function, the function will be invoked and its return value -is used as caption, after converting it to a string. If this property -is not set, the default is Add.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

addremoveboolean

-
- - -
-
- -
-

If set to true, the user may add or remove instances from the form -section widget, otherwise only preexisting sections may be edited. -The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

anonymousboolean

-
- - -
-
- -
-

If set to true, mapped section instances are treated as anonymous -UCI sections, which means that section instance elements will be -rendered without title element and that no name is required when adding -new sections. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

tabbedboolean

-
- - -
-
- -
-

When set to true, instead of rendering section instances one below -another, treat each instance as separate tab pane and render a tab menu -at the top of the form section element, allowing the user to switch -among instances. The default is false.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the section IDs from. By -default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified. -The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

readonlyparentoptionLuCI.form.AbstractValue

-
- - -
-
- -
-

Access the parent option container instance.

-

In case this section is nested within an option element container, -this property will hold a reference to the parent option instance.

-

If this section is not nested, the property is null.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cfgsections(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Enumerate the UCI section IDs covered by this form section element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError exception if the function is not implemented.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of UCI section IDs covered by this form element. -The sections will be rendered in the same order as the returned array.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option configuration values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the configuration values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the configuration value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -configuration values or just a single configuration value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - abstractfilter(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Filter UCI section IDs to render.

-

The filter function is invoked for each UCI section ID of a given type -and controls whether the given UCI section is rendered or ignored by -the form section element.

-

The default implementation always returns true. User code or -classes extending AbstractSection may overwrite this function with -custom implementations.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The UCI section ID to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the given UCI section ID should be handled and -false when it should be ignored.
- - - - -
- - - -
-
-

- - inherited - - formvalue(section_id, option){null|string|Array.<string>|Object.<string, (null|string|Array.<string>)>} -

- - - - -
- - -
-
- - -
-

Query underlying option widget input values.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the widget input values of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the widget input value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - Object.<string, (null|string|Array.<string>)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getOption(option){null|LuCI.form.AbstractValue|Object.<string, LuCI.form.AbstractValue>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option objects.

-

This function is sensitive to the amount of arguments passed to it; -if no option name is specified, all options within this section are -returned as dictionary.

-

If an option name is supplied, this function returns the matching -LuCI.form.AbstractValue instance only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
option - - -string - - - - - - - optional - - - - - -

The name of the option object to obtain

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.form.AbstractValue - | - - Object.<string, LuCI.form.AbstractValue> - - - Returns either a dictionary of option names and their corresponding -option instance objects or just a single object instance value, -depending on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id, option){null|LuCI.ui.AbstractElement|Object.<string, (null|LuCI.ui.AbstractElement)>} -

- - - - -
- - -
-
- - -
-

Obtain underlying option LuCI.ui widget instances.

-

This function is sensitive to the amount of arguments passed to it; -if only one argument is specified, the LuCI.ui widget instances of all -options within this section are returned as dictionary.

-

If both the section ID and an option name are supplied, this function -returns the LuCI.ui widget instance value of the specified option only.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - - - - - - -

The configuration section ID

option - - -string - - - - - - - optional - - - - - -

The name of the option to query

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.ui.AbstractElement - | - - Object.<string, (null|LuCI.ui.AbstractElement)> - - - Returns either a dictionary of option names and their corresponding -widget input values or just a single widget input value, depending -on the amount of passed arguments.
- - - - -
- - - -
-
-

- - inherited - - load(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Load the configuration covered by this section.

-

The load() function recursively walks the section element tree and -invokes the load function of each child option element.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been loaded. The promise may reject with an error if any of the child -elements load functions rejected with an error.
- - - - -
- - - -
-
-

- - inherited - - option(optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to the section.

-

Note that taboption() -should be used instead if this form section element uses tabs.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - parse(){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse this sections form input.

-

The parse() function recursively walks the section element tree and -triggers input value reading and validation for each encountered child -option element.

-

Options which are hidden due to unsatisified dependencies are skipped.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the values of all child elements have -been parsed. The returned promise is rejected if any parsed values are -not meeting the validation constraints of their respective elements.
- - - - -
- - - -
-
-

- - inherited - - render(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - tab(name, title, description) -

- - - - -
- - -
-
- - -
-

Add an option tab to the section.

-

The child option elements of a section may be divided into multiple -tabs to provide a better overview to the user.

-

Before options can be moved into a tab pane, the corresponding tab -has to be defined first, which is done by calling this function.

-

Note that once tabs are defined, user code must use the taboption() -method to add options to specific tabs. Option elements added by -option() will not be assigned to any tab and not be rendered in this -case.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the tab to register. It may be freely chosen and just serves -as an identifier to differentiate tabs.

title - - -string - - - - - - - - - - -

The human readable caption of the tab.

description - - -string - - - - - - - optional - - - - - -

An additional description text for the corresponding tab pane. It is -displayed as text paragraph below the tab but before the tab pane -contents. If omitted, no description will be rendered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an exeption if a tab with the same name already exists.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - inherited - - taboption(tabname, optionclass, classargs){LuCI.form.AbstractValue} -

- - - - -
- - -
-
- - -
-

Add a configuration option widget to a tab of the section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
tabname - - -string - - - - - - - - - - -

The name of the section tab to add the option element to.

optionclass - - -LuCI.form.AbstractValue - - - - - - - - - - -

The option class to use for rendering the configuration option. Note -that this value must be the class itself, not a class instance obtained -from calling new. It must also be a class dervied from -LuCI.form.AbstractSection.

classargs - - -* - - - - - - - - - - repeatable - - -

Additional arguments which are passed as-is to the contructor of the -given option class. Refer to the class specific constructor -documentation for details.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a ReferenceError exception when the given tab name does not -exist.

    -
    -
    -
    -
    -
    - Type -
    -
    - -ReferenceError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws a TypeError exception in case the passed class value is not a -descendent of AbstractValue.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.form.AbstractValue - - - Returns the instantiated option class instance.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.Value.html b/docs/jsapi/LuCI.form.Value.html deleted file mode 100644 index 87ffeed5877ae207d7bd6aa7d0198aac653707de..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.Value.html +++ /dev/null @@ -1,7255 +0,0 @@ - - - - - Class: Value - - - - - - - - - - - - - - - - - -
- - -
-

Class: Value

- - - - -
- -
-

- LuCI.form. - - Value -

- -

The Value class represents a simple one-line form input using the -LuCI.ui.Textfield or - in case choices are added - the -LuCI.ui.Combobox class as underlying widget.

- -
- -
-
- - - - -
-
-

- - new LuCI.form.Value(form, section, option, title, description) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
form - - -LuCI.form.Map -| - -LuCI.form.JSONMap - - - - - - - - - - -

The configuration form this section is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

section - - -LuCI.form.AbstractSection - - - - - - - - - - -

The configuration section this option is added to. It is automatically passed -by option() or -taboption() when adding the -option to the section.

option - - -string - - - - - - - - - - -

The name of the UCI option to map.

title - - -string - - - - - - - optional - - - - - -

The title caption of the option element.

description - - -string - - - - - - - optional - - - - - -

The description text of the option element.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - -

Members

- -
- -
-
-

passwordboolean

-
- - -
-
- -
-

If set to true, the field is rendered as password input, otherwise -as plain text input.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

placeholderstring

-
- - -
-
- -
-

Set a placeholder string to use when the input field is empty.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

datatypestring

-
- - -
-
- -
-

Specifies a datatype constraint expression to validate input values -against. Refer to LuCI.validation for details on the format.

-

If the user entered input does not match the datatype validation, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

default*

-
- - -
-
- -
-

Sets a default value to use when the underlying UCI option is not set.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

editableboolean

-
- - -
-
- -
-

Mark grid section option element as editable.

-

Options which are displayed in the table portion of a GridSection -instance are rendered as readonly text by default. By setting the -editable property of a child option element to true, that element -is rendered as full input widget within its cell instead of a text only -preview.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

modalonlyboolean

-
- - -
-
- -
-

Move grid section option element into the table, the modal popup or both.

-

If this property is null (the default), the option element is -displayed in both the table preview area and the per-section instance -modal popup of a grid section. When it is set to false the option -is only shown in the table but not the modal popup. When set to true, -the option is only visible in the modal popup but not the table.

-

This property has no effect on options that are not children of grid -section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

onchangefunction

-
- - -
-
- -
-

Register a custom value change handler.

-

If this property is set to a function value, the function is invoked -whenever the value of the underlying UI input element is changing.

-

The invoked handler function will receive the DOM click element as -first and the underlying configuration section ID as well as the input -value as second and third argument respectively.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

optionalboolean

-
- - -
-
- -
-

If set to true, the underlying ui input widget is allowed to be empty, -otherwise the option element is marked invalid when no value is entered -or selected by the user.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

readonlyboolean

-
- - -
-
- -
-

Make option element readonly.

-

This property defaults to the readonly state of the parent form element. -When set to true, the underlying widget is rendered in disabled state, -means its contents cannot be changed and the widget cannot be interacted -with.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • false
- - - - - - - -
- - - -
- - - -
-
-

rmemptyboolean

-
- - -
-
- -
-

If set to false, the underlying option value is retained upon saving -the form when the option element is disabled due to unsatisfied -dependency constraints.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • true
- - - - - - - -
- - - -
- - - -
-
-

uciconfigstring

-
- - -
-
- -
-

Override the UCI configuration name to read the option value from.

-

By default, the configuration name is inherited from the parent Map. -By setting this property, a deviating configuration may be specified.

-

The default is null, means inheriting from the parent form.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucioptionstring

-
- - -
-
- -
-

Override the UCI option name to read the value from.

-

By default, the elements name, which is passed as third argument to -the constructor, is used as UCI option name. By setting this property, -a deviating UCI option may be specified.

-

The default is null, means using the option element name.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

ucisectionstring

-
- - -
-
- -
-

Override the UCI section name to read the option value from.

-

By default, the section ID is inherited from the parent section element. -By setting this property, a deviating section may be specified.

-

The default is null, means inheriting from the parent section.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

validatefunction

-
- - -
-
- -
-

Specifies a custom validation function to test the user input for -validity. The validation function must return true to accept the -value. Any other return value type is converted to a string and -displayed to the user as validation error message.

-

If the user entered input does not pass the validation function, the -option element is marked as invalid.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- - - -
-
-

widthnumber string

-
- - -
-
- -
-

Override the cell width of a table or grid section child option.

-

If the property is set to a numeric value, it is treated as pixel width -which is set on the containing cell element of the option, essentially -forcing a certain column width. When the property is set to a string -value, it is applied as-is to the CSS width property.

-

This property has no effect on options that are not children of grid or -table section elements.

-
- - - -
- - - - - - - - - - - - - - - -
Default Value:
-
  • null
- - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - inherited - - append(element) -

- - - - -
- - -
-
- - -
-

Add another form element as children to this element.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
element - - -AbstractElement - - - - - -

The form element to add.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - cbid(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain the internal ID ("cbid") of the element instance.

-

Since each form section element may map multiple underlying -configuration sections, the configuration section ID is required to -form a fully qualified ID pointing to the specific element instance -within the given specific section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the element ID.
- - - - -
- - - -
-
-

- - inherited - - cfgvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the underlying configuration value.

-

The default implementation of this method returns the cached return -value of load(). It may be -overwritten by user code to obtain the configuration value in a -different way.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the configuration value.
- - - - -
- - - -
-
-

- - inherited - - depends(optionname_or_depends, optionvalue|RegExp) -

- - - - -
- - -
-
- - -
-

Add a dependency contraint to the option.

-

Dependency constraints allow making the presence of option elements -dependant on the current values of certain other options within the -same form. An option element with unsatisfied dependencies will be -hidden from the view and its current value is omitted when saving.

-

Multiple constraints (that is, multiple calls to depends()) are -treated as alternatives, forming a logical "or" expression.

-

By passing an object of name => value pairs as first argument, it is -possible to depend on multiple options simultaneously, allowing to form -a logical "and" expression.

-

Option names may be given in "dot notation" which allows to reference -option elements outside of the current form section. If a name without -dot is specified, it refers to an option within the same configuration -section. If specified as configname.sectionid.optionname, -options anywhere within the same form may be specified.

-

The object notation also allows for a number of special keys which are -not treated as option names but as modifiers to influence the dependency -constraint evaluation. The associated value of these special "tag" keys -is ignored. The recognized tags are:

-
    -
  • - !reverse
    - Invert the dependency, instead of requiring another option to be - equal to the dependency value, that option should not be - equal. -
  • -
  • - !contains
    - Instead of requiring an exact match, the dependency is considered - satisfied when the dependency value is contained within the option - value. -
  • -
  • - !default
    - The dependency is always satisfied -
  • -
-

Examples:

-
    -
  • - opt.depends("foo", "test")
    - Require the value of `foo` to be `test`. -
  • -
  • - opt.depends({ foo: "test" })
    - Equivalent to the previous example. -
  • -
  • - opt.depends({ foo: /test/ })
    - Require the value of `foo` to match the regular expression `/test/`. -
  • -
  • - opt.depends({ foo: "test", bar: "qrx" })
    - Require the value of `foo` to be `test` and the value of `bar` to be - `qrx`. -
  • -
  • - opt.depends({ foo: "test" })
    - opt.depends({ bar: "qrx" })

    - Require either foo to be set to test, - or the bar option to be qrx. -
  • -
  • - opt.depends("test.section1.foo", "bar")
    - Require the "foo" form option within the "section1" section to be - set to "bar". -
  • -
  • - opt.depends({ foo: "test", "!contains": true })
    - Require the "foo" option value to contain the substring "test". -
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
optionname_or_depends - - -string -| - -Object.<string, (string|RegExp)> - - - - - -

The name of the option to depend on or an object describing multiple -dependencies which must be satified (a logical "and" expression).

optionvalue|RegExp - - -string - - - - - -

When invoked with a plain option name as first argument, this parameter -specifies the expected value. In case an object is passed as first -argument, this parameter is ignored.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - formvalue(section_id){*} -

- - - - -
- - -
-
- - -
-

Query the current form input value.

-

The default implementation of this method returns the current input -value of the underlying LuCI.ui widget. -It may be overwritten by user code to handle input values differently.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the current input value.
- - - - -
- - - -
-
-

- - inherited - - getUIElement(section_id){LuCI.ui.AbstractElement|null} -

- - - - -
- - -
-
- - -
-

Obtain the underlying LuCI.ui element instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.ui.AbstractElement - | - - null - - - Returns the LuCI.ui element instance or null in case the form -option implementation does not use LuCI.ui widgets.
- - - - -
- - - -
-
-

- - inherited - - isActive(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the option element is currently active.

-

An element is active when it is not hidden due to unsatisfied dependency -constraints.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the option element currently is active, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - isValid(section_id){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the input value is currently valid.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value currently is valid, otherwise it -returns false.
- - - - -
- - - -
-
-

- - inherited - - load(section_id){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Load the underlying configuration value.

-

The default implementation of this method reads and returns the -underlying UCI option value (or the related JavaScript property for -JSONMap instances). It may be overwritten by user code to load data -from nonstandard sources.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Returns the configuration value to initialize the option element with. -The return value of this function is filtered through Promise.resolve() -so it may return promises if overridden by user code.
- - - - -
- - - -
-
-

- - inherited - - parse(section_id){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Parse the option element input.

-

The function is invoked when the parse() method has been invoked on -the parent form and triggers input value reading and validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving once the input value has been read and -validated or rejecting in case the input value does not meet the -validation constraints.
- - - - -
- - - -
-
-

- - inherited - - remove(section_id) -

- - - - -
- - -
-
- - -
-

Remove the corresponding value from the configuration.

-

This function is invoked upon saving the parent form when the option -element has been hidden due to unsatisfied dependencies or when the -user cleared the input value and the option is marked optional.

-

The default implementation simply removes the associated option from the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative removal logic, e.g. to retain the original value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

Render the form element.

-

The render() function recursively walks the form element tree and -renders the markup for each element, returning the assembled DOM tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - May return a DOM Node or a promise resolving to a DOM node containing -the form element's markup, including the markup of any child elements.
- - - - -
- - - -
-
-

- - inherited - - stripTags(input){string} -

- - - - -
- - -
-
- - -
-

Strip any HTML tags from the given input string.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
input - - -string - - - - - -

The input string to clean.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The cleaned input string with HTML removes removed.
- - - - -
- - - -
-
-

- - inherited - - textvalue(section_id){string} -

- - - - -
- - -
-
- - -
-

Obtain a textual input representation.

-

The default implementation of this method returns the HTML escaped -current input value of the underlying -LuCI.ui widget. User code or specific -option element implementations may overwrite this function to apply a -different logic, e.g. to return Yes or No depending on the checked -state of checkbox elements.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws a TypeError exception when no section_id was specified.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the text representation of the current input value.
- - - - -
- - - -
-
-

- - inherited - - titleFn(property, fmt_args){string|null} -

- - - - -
- - -
-
- - -
-

Format the given named property as title string.

-

This function looks up the given named property and formats its value -suitable for use as element caption or description string. It also -strips any HTML tags from the result.

-

If the property value is a string, it is passed to String.format() -along with any additional parameters passed to titleFn().

-

If the property value is a function, it is invoked with any additional -titleFn() parameters as arguments and the obtained return value is -converted to a string.

-

In all other cases, null is returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
property - - -string - - - - - - - - - - -

The name of the element property to use.

fmt_args - - -* - - - - - - - - - - repeatable - - -

Extra values to format the title string with.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The formatted title string or null if the property did not exist or -was neither a string nor a function.
- - - - -
- - - -
-
-

- - value(key, value) -

- - - - -
- - -
-
- - -
-

Add a predefined choice to the form option. By adding one or more -choices, the plain text input field is turned into a combobox widget -which prompts the user to select a predefined choice, or to enter a -custom value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The choice value to add.

value - - -Node -| - -string - - - - - -

The caption for the choice value. May be a DOM node, a document fragment -or a plain text string. If omitted, the key value is used as caption.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - write(section_id, formvalue) -

- - - - -
- - -
-
- - -
-

Write the current input value into the configuration.

-

This function is invoked upon saving the parent form when the option -element is valid and when its input value has been changed compared to -the initial value returned by -cfgvalue().

-

The default implementation simply sets the given input value in the -UCI configuration (or the associated JavaScript object property in -case of JSONMap forms). It may be overwritten by user code to -implement alternative save logic, e.g. to transform the input value -before it is written.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section_id - - -string - - - - - -

The configuration section ID

formvalue - - -string -| - -Array.<string> - - - - - -

The input value to write.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.form.html b/docs/jsapi/LuCI.form.html deleted file mode 100644 index d16fdf455ac5a878587001a29369b271bc9ca63f..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.form.html +++ /dev/null @@ -1,3654 +0,0 @@ - - - - - Class: form - - - - - - - - - - - - - - - - - -
- - -
-

Class: form

- - - - -
- -
-

- LuCI. - - form -

- -

The LuCI form class provides high level abstractions for creating creating -UCI- or JSON backed configurations forms.

-

To import the class in views, use 'require form', to import it in -external JavaScript, use L.require("form").then(...).

-

A typical form is created by first constructing a -LuCI.form.Map or LuCI.form.JSONMap instance using new and -by subsequently adding sections and options to it. Finally -render() is invoked on the instance to -assemble the HTML markup and insert it into the DOM.

-

Example:

-
-'use strict';
-'require form';
-
-var m, s, o;
-
-m = new form.Map('example', 'Example form',
-	'This is an example form mapping the contents of /etc/config/example');
-
-s = m.section(form.NamedSection, 'first_section', 'example', 'The first section',
-	'This sections maps "config example first_section" of /etc/config/example');
-
-o = s.option(form.Flag, 'some_bool', 'A checkbox option');
-
-o = s.option(form.ListValue, 'some_choice', 'A select element');
-o.value('choice1', 'The first choice');
-o.value('choice2', 'The second choice');
-
-m.render().then(function(node) {
-	document.body.appendChild(node);
-});
-
- -
- -
-
- - - - -
-
-

- - new LuCI.form() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - -

Classes

- -
-
AbstractElement
-
- -
AbstractSection
-
- -
AbstractValue
-
- -
ButtonValue
-
- -
DummyValue
-
- -
DynamicList
-
- -
FileUpload
-
- -
FlagValue
-
- -
GridSection
-
- -
HiddenValue
-
- -
JSONMap
-
- -
ListValue
-
- -
Map
-
- -
MultiValue
-
- -
NamedSection
-
- -
SectionValue
-
- -
TableSection
-
- -
TextValue
-
- -
TypedSection
-
- -
Value
-
-
- - - - - - - - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.fs.html b/docs/jsapi/LuCI.fs.html deleted file mode 100644 index 2787f35cac907652e71c54be747d95bd43135583..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.fs.html +++ /dev/null @@ -1,5831 +0,0 @@ - - - - - Class: fs - - - - - - - - - - - - - - - - - -
- - -
-

Class: fs

- - - - -
- -
-

- LuCI. - - fs -

- -

Provides high level utilities to wrap file system related RPC calls. -To import the class in views, use 'require fs', to import it in -external JavaScript, use L.require("fs").then(...).

- -
- -
-
- - - - -
-
-

- - new LuCI.fs() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - exec(command, params, env){Promise.<LuCI.fs.FileExecResult>} -

- - - - -
- - -
-
- - -
-

Execute the specified command, optionally passing params and -environment variables.

-

Note: The command must be either the path to an executable, -or a basename without arguments in which case it will be searched -in $PATH. If specified, the values given in params will be passed -as arguments to the command.

-

The key/value pairs in the optional env table are translated to -setenv() calls prior to running the command.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
command - - -string - - - - - - - - - - -

The command to invoke.

params - - -Array.<string> - - - - - - - optional - - - - - -

The arguments to pass to the command.

env - - -Object.<string, string> - - - - - - - optional - - - - - -

Environment variables to set.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.fs.FileExecResult> - - - Returns a promise resolving to an object describing the execution -results or rejecting with an error stating the failure reason.
- - - - -
- - - -
-
-

- - exec_direct(command, params, type, latin1){Promise.<*>} -

- - - - -
- - -
-
- - -
-

Execute the specified command, bypassing ubus.

-

Note: The command must be either the path to an executable, -or a basename without arguments in which case it will be searched -in $PATH. If specified, the values given in params will be passed -as arguments to the command.

-

This function will invoke the requested commands through the cgi-io -helper applet at /cgi-bin/cgi-exec which bypasses the ubus rpc -transport. This is useful to fetch large command outputs which might -exceed the ubus message size limits or which contain binary data.

-

The cgi-io helper will enforce the same access permission rules as -the ubus based exec call.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
command - - -string - - - - - - - - - - - - -

The command to invoke.

params - - -Array.<string> - - - - - - - - - optional - - - - - -

The arguments to pass to the command.

type - - -string - - - - - - text - - - - - optional - - - - - -

The expected output type of the invoked program. Valid values are -text to interpret the output as string, json to parse the output -as JSON or blob to return the output as Blob instance.

latin1 - - -boolean - - - - - - false - - - - - optional - - - - - -

Whether to encode the command line as Latin1 instead of UTF-8. This -is usually not needed but can be useful for programs that cannot -handle UTF-8 input.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<*> - - - Returns a promise resolving with the command stdout output interpreted -according to the specified type or rejecting with an error stating the -failure reason.
- - - - -
- - - -
-
-

- - lines(path){Promise.<Array.<string>>} -

- - - - -
- - -
-
- - -
-

Read the contents of the given file, split it into lines, trim -leading and trailing white space of each line and return the -resulting array.

-

This function is guaranteed to not reject its promises, on failure, -an empty array will be returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The file path to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<string>> - - - Returns a promise resolving to an array containing the stripped lines -of the given file or [] on failure.
- - - - -
- - - -
-
-

- - list(path){Promise.<Array.<LuCI.fs.FileStatEntry>>} -

- - - - -
- - -
-
- - -
-

Obtains a listing of the specified directory.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The directory path to list.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.fs.FileStatEntry>> - - - Returns a promise resolving to an array of stat detail objects or -rejecting with an error stating the failure reason.
- - - - -
- - - -
-
-

- - read(path){Promise.<string>} -

- - - - -
- - -
-
- - -
-

Read the contents of the given file and return them. -Note: this function is unsuitable for obtaining binary data.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The file path to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<string> - - - Returns a promise resolving to a string containing the file contents or -rejecting with an error stating the failure reason.
- - - - -
- - - -
-
-

- - read_direct(path, type){Promise.<*>} -

- - - - -
- - -
-
- - -
-

Read the contents of the given file and return them, bypassing ubus.

-

This function will read the requested file through the cgi-io -helper applet at /cgi-bin/cgi-download which bypasses the ubus rpc -transport. This is useful to fetch large file contents which might -exceed the ubus message size limits or which contain binary data.

-

The cgi-io helper will enforce the same access permission rules as -the ubus based read call.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
path - - -string - - - - - - - - - - - - -

The file path to read.

type - - -string - - - - - - text - - - - - optional - - - - - -

The expected type of read file contents. Valid values are text to -interpret the contents as string, json to parse the contents as JSON -or blob to return the contents as Blob instance.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<*> - - - Returns a promise resolving with the file contents interpreted according -to the specified type or rejecting with an error stating the failure -reason.
- - - - -
- - - -
-
-

- - remove(The){Promise.<number>} -

- - - - -
- - -
-
- - -
-

Unlink the given file.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
The - - -string - - - - - -

file path to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<number> - - - Returns a promise resolving to 0 or rejecting with an error stating -the failure reason.
- - - - -
- - - -
-
-

- - stat(path){Promise.<LuCI.fs.FileStatEntry>} -

- - - - -
- - -
-
- - -
-

Return file stat information on the specified path.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The filesystem path to stat.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.fs.FileStatEntry> - - - Returns a promise resolving to a stat detail object or -rejecting with an error stating the failure reason.
- - - - -
- - - -
-
-

- - trimmed(path){Promise.<string>} -

- - - - -
- - -
-
- - -
-

Read the contents of the given file, trim leading and trailing white -space and return the trimmed result. In case of errors, return an empty -string instead.

-

Note: this function is useful to read single-value files in /sys -or /proc.

-

This function is guaranteed to not reject its promises, on failure, -an empty string will be returned.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The file path to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<string> - - - Returns a promise resolving to the file contents or the empty string -on failure.
- - - - -
- - - -
-
-

- - write(path, data, mode){Promise.<number>} -

- - - - -
- - -
-
- - -
-

Write the given data to the specified file path. -If the specified file path does not exist, it will be created, given -sufficient permissions.

-

Note: data will be converted to a string using String(data) or to -'' when it is null.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - - - - - - -

The file path to write to.

data - - -* - - - - - - - optional - - - - - -

The file data to write. If it is null, it will be set to an empty -string.

mode - - -number - - - - - - - optional - - - - - -

The permissions to use on file creation. Default is 420 (0644).

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<number> - - - Returns a promise resolving to 0 or rejecting with an error stating -the failure reason.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.fs.FileExecResultObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
code - - -number - - - - - - - -

The exit code of the invoked command

stdout - - -string - - - - - - <optional>
- - - -

The stdout produced by the command, if any

stderr - - -string - - - - - - <optional>
- - - -

The stderr produced by the command, if any

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.fs.FileStatEntryObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - -

Name of the directory entry

type - - -string - - - -

Type of the entry, one of block, char, directory, fifo, symlink, file, socket or unknown

size - - -number - - - -

Size in bytes

mode - - -number - - - -

Access permissions

atime - - -number - - - -

Last access time in seconds since epoch

mtime - - -number - - - -

Last modification time in seconds since epoch

ctime - - -number - - - -

Last change time in seconds since epoch

inode - - -number - - - -

Inode number

uid - - -number - - - -

Numeric owner id

gid - - -number - - - -

Numeric group id

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.headers.html b/docs/jsapi/LuCI.headers.html deleted file mode 100644 index 1296c12af973c85cf1c0c02d34385268ebc95e74..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.headers.html +++ /dev/null @@ -1,3859 +0,0 @@ - - - - - Class: headers - - - - - - - - - - - - - - - - - -
- - -
-

Class: headers

- - - - -
- -
-

- LuCI. - - headers -

- -

The Headers class is an internal utility class exposed in HTTP -response objects using the response.headers property.

- -
- -
-
- - - - -
-
-

- - new LuCI.headers() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - get(name){string|null} -

- - - - -
- - -
-
- - -
-

Returns the value of the given header name. -Note: Header-Names are case-insensitive.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The header name to read

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - The value of the given header name or null if the header isn't present.
- - - - -
- - - -
-
-

- - has(name){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether the given header name is present. -Note: Header-Names are case-insensitive.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The header name to check

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the header name is present, false otherwise
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.html b/docs/jsapi/LuCI.html deleted file mode 100644 index 4247c346458f1b1eb20cfd1b390d429916e6dc32..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.html +++ /dev/null @@ -1,8054 +0,0 @@ - - - - - Class: LuCI - - - - - - - - - - - - - - - - - -
- - -
-

Class: LuCI

- - - - -
- -
-

- LuCI -

- -

This is the LuCI base class. It is automatically instantiated and -accessible using the global L variable.

- -
- -
-
- - - - -
-
-

- - new LuCI(env) -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
env - - -Object - - - - - -

The environment settings to use for the LuCI runtime.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - -

Classes

- -
-
baseclass
-
- -
dom
-
- -
form
-
- -
fs
-
- -
headers
-
- -
network
-
- -
poll
-
- -
request
-
- -
response
-
- -
rpc
-
- -
session
-
- -
uci
-
- -
ui
-
- -
view
-
- -
xhr
-
-
- - - - - -

Members

- -
- -
-
-

Class

-
- - -
-
- -
-

Legacy L.Class class alias. New view code should use 'require baseclass'; -to request the LuCI.baseclass class.

-
- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

dom

-
- - -
-
- -
-

Legacy L.dom class alias. New view code should use 'require dom'; -to request the LuCI.dom class.

-
- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

env

-
- - -
-
- -
-

The env object holds environment settings used by LuCI, such -as request timeouts, base URLs etc.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

Poll

-
- - -
-
- -
-

Legacy L.Poll class alias. New view code should use 'require poll'; -to request the LuCI.poll class.

-
- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

Request

-
- - -
-
- -
-

Legacy L.Request class alias. New view code should use 'require request'; -to request the LuCI.request class.

-
- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

view

-
- - -
-
- -
-

Legacy L.view class alias. New view code should use 'require view'; -to request the LuCI.view class.

-
- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - bind(fn, self, args){function} -

- - - - -
- - -
-
- - -
-

Return a bound function using the given self as this context -and any further arguments as parameters to the bound function.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
fn - - -function - - - - - - - - - - -

The function to bind.

self - - -* - - - - - - - - - - -

The value to bind as this context to the specified function.

args - - -* - - - - - - - optional - - - - - repeatable - - -

Zero or more variable arguments which are bound to the function -as parameters.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - function - - - Returns the bound function.
- - - - -
- - - -
-
-

- - error(type, fmt, args) -

- - - - -
- - -
-
- - -
-

A wrapper around raise() which also renders -the error either as modal overlay when ui.js is already loaed -or directly into the view body.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
type - - -Error -| - -string - - - - - - Error - - - - - optional - - - - - -

Either a string specifying the type of the error to throw or an -existing Error instance to copy.

fmt - - -string - - - - - - Unspecified error - - - - - optional - - - - - -

A format string which is used to form the error message, together -with all subsequent optional arguments.

args - - -* - - - - - - - - - optional - - - - - repeatable - - -

Zero or more variable arguments to the supplied format string.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws the created error object with the captured stack trace -appended to the message and the type set to the given type -argument or copied from the given error instance.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - fspath(parts){string} -

- - - - -
- - -
-
- - -
-

Construct an absolute filesystem path relative to the server -document root.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parts - - -string - - - - - - - optional - - - - - repeatable - - -

An array of parts to join into a path.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Return the joined path.
- - - - -
- - - -
-
-

- - get(url, args, cb){Promise.<null>} -

- - - - -
- - -
-
- - -
-

Issues a GET request to the given url and invokes the specified -callback function. The function is a wrapper around -Request.request().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - -string - - - - - - - - - - -

The URL to request.

args - - -Object.<string, string> - - - - - - - optional - - - - - -

Additional query string arguments to append to the URL.

cb - - -LuCI.requestCallbackFn - - - - - - - - - - -

The callback function to invoke when the request finishes.

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<null> - - - Returns a promise resolving to null when concluded.
- - - - -
- - - -
-
-

- - halt(){boolean} -

- - - - -
- - -
-
- - -
-

Deprecated wrapper around Poll.stop().

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the polling loop has been stopped or false -when it didn't run to begin with.
- - - - -
- - - -
-
-

- - hasSystemFeature(feature, subfeature){boolean|null} -

- - - - -
- - -
-
- - -
-

Test whether a particular system feature is available, such as -hostapd SAE support or an installed firewall. The features are -queried once at the beginning of the LuCI session and cached in -SessionStorage throughout the lifetime of the associated tab or -browser window.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
feature - - -string - - - - - - - - - - -

The feature to test. For detailed list of known feature flags, -see /modules/luci-base/root/usr/libexec/rpcd/luci.

subfeature - - -string - - - - - - - optional - - - - - -

Some feature classes like hostapd provide sub-feature flags, -such as sae or 11w support. The subfeature argument can -be used to query these.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - | - - null - - - Return true if the queried feature (and sub-feature) is available -or false if the requested feature isn't present or known. -Return null when a sub-feature was queried for a feature which -has no sub-features.
- - - - -
- - - -
-
-

- - hasViewPermission(){boolean|null} -

- - - - -
- - -
-
- - -
-

Check whether a view has sufficient permissions.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - | - - null - - - Returns null if the current session has no permission at all to -load resources required by the view. Returns false if readonly -permissions are granted or true if at least one required ACL -group is granted with write permissions.
- - - - -
- - - -
-
-

- - isObject(val){boolean} -

- - - - -
- - -
-
- - -
-

Tests whether the passed argument is a JavaScript object. -This function is meant to be an object counterpart to the -standard Array.isArray() function.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
val - - -* - - - - - - - optional - - - - - -

The value to test

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the given value is of type object and -not null, else returns false.
- - - - -
- - - -
-
-

- - location(){string} -

- - - - -
- - -
-
- - -
-

Return the complete URL path to the current view.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the URL path to the current view.
- - - - -
- - - -
-
-

- - media(parts){string} -

- - - - -
- - -
-
- - -
-

Construct an URL path relative to the media resource path of the -LuCI ui (usually /luci-static/$theme_name).

-

The resulting URL is guaranteed to only contain the characters -a-z, A-Z, 0-9, _, ., %, ,, ;, and - as well -as / for the path separator.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parts - - -Array.<string> - - - - - - - optional - - - - - -

An array of parts to join into an URL path. Parts may contain -slashes and any of the other characters mentioned above.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the resulting URL path.
- - - - -
- - - -
-
-

- - path(prefix, parts){string} -

- - - - -
- - -
-
- - -
-

Construct a relative URL path from the given prefix and parts. -The resulting URL is guaranteed to only contain the characters -a-z, A-Z, 0-9, _, ., %, ,, ;, and - as well -as / for the path separator.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prefix - - -string - - - - - - - optional - - - - - -

The prefix to join the given parts with. If the prefix is -omitted, it defaults to an empty string.

parts - - -Array.<string> - - - - - - - optional - - - - - -

An array of parts to join into an URL path. Parts may contain -slashes and any of the other characters mentioned above.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Return the joined URL path.
- - - - -
- - - -
-
-

- - poll(interval, url, args, cb, post){function} -

- - - - -
- - -
-
- - -
-

Register a polling HTTP request that invokes the specified -callback function. The function is a wrapper around -Request.poll.add().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
interval - - -number - - - - - - - - - - - - -

The poll interval to use. If set to a value less than or equal -to 0, it will default to the global poll interval configured -in LuCI.env.pollinterval.

url - - -string - - - - - - - - - - - - -

The URL to request.

args - - -Object.<string, string> - - - - - - - - - optional - - - - - -

Specifies additional arguments for the request. For GET requests, -the arguments are appended to the URL as query string, for POST -requests, they'll be added to the request body.

cb - - -LuCI.requestCallbackFn - - - - - - - - - - - - -

The callback function to invoke whenever a request finishes.

post - - -boolean - - - - - - false - - - - - optional - - - - - -

When set to false or not specified, poll requests will be made -using the GET method. When set to true, POST requests will be -issued. In case of POST requests, the request body will contain -an argument token with the current value of LuCI.env.token by -default, regardless of the parameters specified with args.

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - function - - - Returns the internally created function that has been passed to -Request.poll.add(). This value can -be passed to Poll.remove() to remove the -polling request.
- - - - -
- - - -
-
-

- - post(url, args, cb){Promise.<null>} -

- - - - -
- - -
-
- - -
-

Issues a POST request to the given url and invokes the specified -callback function. The function is a wrapper around -Request.request(). The request is -sent using application/x-www-form-urlencoded encoding and will -contain a field token with the current value of LuCI.env.token -by default.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - -string - - - - - - - - - - -

The URL to request.

args - - -Object.<string, string> - - - - - - - optional - - - - - -

Additional post arguments to append to the request body.

cb - - -LuCI.requestCallbackFn - - - - - - - - - - -

The callback function to invoke when the request finishes.

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<null> - - - Returns a promise resolving to null when concluded.
- - - - -
- - - -
-
-

- - raise(type, fmt, args) -

- - - - -
- - -
-
- - -
-

Captures the current stack trace and throws an error of the -specified type as a new exception. Also logs the exception as -error to the debug console if it is available.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
type - - -Error -| - -string - - - - - - Error - - - - - optional - - - - - -

Either a string specifying the type of the error to throw or an -existing Error instance to copy.

fmt - - -string - - - - - - Unspecified error - - - - - optional - - - - - -

A format string which is used to form the error message, together -with all subsequent optional arguments.

args - - -* - - - - - - - - - optional - - - - - repeatable - - -

Zero or more variable arguments to the supplied format string.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws the created error object with the captured stack trace -appended to the message and the type set to the given type -argument or copied from the given error instance.

-
-
-
-
-
- Type -
-
- -Error - - -
-
-
-
- - - - - - - -
- - - -
-
-

- - require(name){Promise.<LuCI.baseclass>} -

- - - - -
- - -
-
- - -
-

Load an additional LuCI JavaScript class and its dependencies, -instantiate it and return the resulting class instance. Each -class is only loaded once. Subsequent attempts to load the same -class will return the already instantiated class.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The name of the class to load in dotted notation. Dots will -be replaced by spaces and joined with the runtime-determined -base URL of LuCI.js to form an absolute URL to load the class -file from.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
-
    -
  • - -
    -
    -
    -

    Throws a DependencyError when the class to load includes -circular dependencies.

    -
    -
    -
    -
    -
    - Type -
    -
    - -DependencyError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws NetworkError when the underlying LuCI.request -call failed.

    -
    -
    -
    -
    -
    - Type -
    -
    - -NetworkError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws SyntaxError when the loaded class file code cannot -be interpreted by eval.

    -
    -
    -
    -
    -
    - Type -
    -
    - -SyntaxError - - -
    -
    -
    -
    - -
  • - -
  • - -
    -
    -
    -

    Throws TypeError when the class file could be loaded and -interpreted, but when invoking its code did not yield a valid -class instance.

    -
    -
    -
    -
    -
    - Type -
    -
    - -TypeError - - -
    -
    -
    -
    - -
  • -
- - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.baseclass> - - - Returns the instantiated class.
- - - - -
- - - -
-
-

- - resolveDefault(value, defvalue){Promise.<*>} -

- - - - -
- - -
-
- - -
-

Returns a promise resolving with either the given value or or with -the given default in case the input value is a rejecting promise.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -* - - - - - -

The value to resolve the promise with.

defvalue - - -* - - - - - -

The default value to resolve the promise with in case the given -input value is a rejecting promise.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<*> - - - Returns a new promise resolving either to the given input value or -to the given default value on error.
- - - - -
- - - -
-
-

- - resource(parts){string} -

- - - - -
- - -
-
- - -
-

Construct an URL path relative to the global static resource path -of the LuCI ui (usually /luci-static/resources).

-

The resulting URL is guaranteed to only contain the characters -a-z, A-Z, 0-9, _, ., %, ,, ;, and - as well -as / for the path separator.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parts - - -Array.<string> - - - - - - - optional - - - - - -

An array of parts to join into an URL path. Parts may contain -slashes and any of the other characters mentioned above.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the resulting URL path.
- - - - -
- - - -
-
-

- - run(){boolean} -

- - - - -
- - -
-
- - -
-

Deprecated wrapper around Poll.start().

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the polling loop has been started or false -when it was already running.
- - - - -
- - - -
-
-

- - sortedKeys(obj, key, sortmode){Array.<string>} -

- - - - -
- - -
-
- - -
-

Return an array of sorted object keys, optionally sorted by -a different key or a different sorting mode.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
obj - - -object - - - - - - - - - - -

The object to extract the keys from. If the given value is -not an object, the function will return an empty array.

key - - -string - - - - - - - optional - - - - - -

Specifies the key to order by. This is mainly useful for -nested objects of objects or objects of arrays when sorting -shall not be performed by the primary object keys but by -some other key pointing to a value within the nested values.

sortmode - - -string - - - - - - - optional - - - - - -

May be either addr or num to override the natural -lexicographic sorting with a sorting suitable for IP/MAC style -addresses or numeric values respectively.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array containing the sorted keys of the given object.
- - - - -
- - - -
-
-

- - stop(entry){boolean} -

- - - - -
- - -
-
- - -
-

Deprecated wrapper around Poll.remove().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
entry - - -function - - - - - -

The polling function to remove.

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the function has been removed or false if -it could not be found.
- - - - -
- - - -
-
-

- - toArray(val){Array.<*>} -

- - - - -
- - -
-
- - -
-

Converts the given value to an array. If the given value is of -type array, it is returned as-is, values of type object are -returned as one-element array containing the object, empty -strings and null values are returned as empty array, all other -values are converted using String(), trimmed, split on white -space and returned as array.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
val - - -* - - - - - -

The value to convert into an array.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<*> - - - Returns the resulting array.
- - - - -
- - - -
-
-

- - url(parts){string} -

- - - - -
- - -
-
- - -
-

Construct an URL pathrelative to the script path of the server -side LuCI application (usually /cgi-bin/luci).

-

The resulting URL is guaranteed to only contain the characters -a-z, A-Z, 0-9, _, ., %, ,, ;, and - as well -as / for the path separator.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
parts - - -Array.<string> - - - - - - - optional - - - - - -

An array of parts to join into an URL path. Parts may contain -slashes and any of the other characters mentioned above.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the resulting URL path.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

- - LuCI.requestCallbackFn(xhr, data, duration) -

- - - - -
- - -
-
- - -
-

The request callback function is invoked whenever an HTTP -reply to a request made using the L.get(), L.post() or -L.poll() function is timed out or received successfully.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
xhr - - -XMLHTTPRequest - - - - - -

The XMLHTTPRequest instance used to make the request.

data - - -* - - - - - -

The response JSON if the response could be parsed as such, -else null.

duration - - -number - - - - - -

The total duration of the request in milliseconds.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.Device.html b/docs/jsapi/LuCI.network.Device.html deleted file mode 100644 index d3b2cf914169bd86be9802e7d017be797cff00d3..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.Device.html +++ /dev/null @@ -1,5804 +0,0 @@ - - - - - Class: Device - - - - - - - - - - - - - - - - - -
- - -
-

Class: Device

- - - - -
- -
-

- LuCI.network. - - Device -

- -

A Network.Device class instance represents an underlying Linux network -device and allows querying device details such as packet statistics or MTU.

- -
- -
-
- - - - -
-
-

- - new LuCI.network.Device() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - getBridgeID(){null|string} -

- - - - -
- - -
-
- - -
-

Get the bridge ID

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the ID of this network bridge or null if this network -device is not a Linux bridge.
- - - - -
- - - -
-
-

- - getBridgeSTP(){boolean} -

- - - - -
- - -
-
- - -
-

Get the bridge STP setting

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when this device is a Linux bridge and has stp -enabled, else false.
- - - - -
- - - -
-
-

- - getI18n(){string} -

- - - - -
- - -
-
- - -
-

Get a long description string for the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string containing the type description and device name -for non-wifi devices or operation mode and ssid for wifi ones.
- - - - -
- - - -
-
-

- - getIP6Addrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Get the IPv6 addresses configured on the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv6 address strings.
- - - - -
- - - -
-
-

- - getIPAddrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Get the IPv4 addresses configured on the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv4 address strings.
- - - - -
- - - -
-
-

- - getMAC(){null|string} -

- - - - -
- - -
-
- - -
-

Get the MAC address of the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the MAC address of the device or null if not applicable, -e.g. for non-ethernet tunnel devices.
- - - - -
- - - -
-
-

- - getMTU(){number} -

- - - - -
- - -
-
- - -
-

Get the MTU of the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the MTU of the device.
- - - - -
- - - -
-
-

- - getName(){string} -

- - - - -
- - -
-
- - -
-

Get the name of the network device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the name of the device, e.g. eth0 or wlan0.
- - - - -
- - - -
-
-

- - getNetwork(){null|LuCI.network.Protocol} -

- - - - -
- - -
-
- - -
-

Get the primary logical interface this device is assigned to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.network.Protocol - - - Returns a Network.Protocol instance representing the logical -interface this device is attached to or null if it is not -assigned to any logical interface.
- - - - -
- - - -
-
-

- - getNetworks(){Array.<LuCI.network.Protocol>} -

- - - - -
- - -
-
- - -
-

Get the logical interfaces this device is assigned to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.network.Protocol> - - - Returns an array of Network.Protocol instances representing the -logical interfaces this device is assigned to.
- - - - -
- - - -
-
-

- - getPorts(){null|Array.<LuCI.network.Device>} -

- - - - -
- - -
-
- - -
-

Get the associated bridge ports of the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - Array.<LuCI.network.Device> - - - Returns an array of Network.Device instances representing the ports -(slave interfaces) of the bridge or null when this device isn't -a Linux bridge.
- - - - -
- - - -
-
-

- - getRXBytes(){number} -

- - - - -
- - -
-
- - -
-

Get the amount of received bytes.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the amount of bytes received by the network device.
- - - - -
- - - -
-
-

- - getRXPackets(){number} -

- - - - -
- - -
-
- - -
-

Get the amount of received packets.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the amount of packets received by the network device.
- - - - -
- - - -
-
-

- - getShortName(){string} -

- - - - -
- - -
-
- - -
-

Get a short description string for the device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the device name for non-wifi devices or a string containing -the operation mode and SSID for wifi devices.
- - - - -
- - - -
-
-

- - getTXBytes(){number} -

- - - - -
- - -
-
- - -
-

Get the amount of transmitted bytes.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the amount of bytes transmitted by the network device.
- - - - -
- - - -
-
-

- - getTXPackets(){number} -

- - - - -
- - -
-
- - -
-

Get the amount of transmitted packets.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the amount of packets transmitted by the network device.
- - - - -
- - - -
-
-

- - getType(){string} -

- - - - -
- - -
-
- - -
-

Get the type of the device..

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string describing the type of the network device: -
    -
  • alias if it is an abstract alias device (@ notation)
  • -
  • wifi if it is a wireless interface (e.g. wlan0)
  • -
  • bridge if it is a bridge device (e.g. br-lan)
  • -
  • tunnel if it is a tun or tap device (e.g. tun0)
  • -
  • vlan if it is a vlan device (e.g. eth0.1)
  • -
  • switch if it is a switch device (e.g.eth1 connected to switch0)
  • -
  • ethernet for all other device types
  • -
- - - - -
- - - -
-
-

- - getTypeI18n(){string} -

- - - - -
- - -
-
- - -
-

Get a string describing the device type.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string describing the type, e.g. "Wireless Adapter" or -"Bridge".
- - - - -
- - - -
-
-

- - getWifiNetwork(){null|LuCI.network.WifiNetwork} -

- - - - -
- - -
-
- - -
-

Get the related wireless network this device is related to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.network.WifiNetwork - - - Returns a Network.WifiNetwork instance representing the wireless -network corresponding to this network device or null if this device -is not a wireless device.
- - - - -
- - - -
-
-

- - isBridge(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this device is a Linux bridge.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the network device is present and a Linux bridge, -else false.
- - - - -
- - - -
-
-

- - isBridgePort(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this device is part of a Linux bridge.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when this network device is part of a bridge, -else false.
- - - - -
- - - -
-
-

- - isUp(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this device is up.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the associated device is running pr false -when it is down or absent.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.Hosts.html b/docs/jsapi/LuCI.network.Hosts.html deleted file mode 100644 index d44e172c54e5a8cea0baae6e42f373448fc520d0..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.Hosts.html +++ /dev/null @@ -1,4785 +0,0 @@ - - - - - Class: Hosts - - - - - - - - - - - - - - - - - -
- - -
-

Class: Hosts

- - - - -
- -
-

- LuCI.network. - - Hosts -

- -

The LuCI.network.Hosts class encapsulates host information aggregated -from multiple sources and provides convenience functions to access the -host information by different criteria.

- -
- -
-
- - - - -
-
-

- - new LuCI.network.Hosts() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - getHostnameByIP6Addr(ipaddr){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the hostname associated with the given IPv6 address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ipaddr - - -string - - - - - -

The IPv6 address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the hostname associated with the given IPv6 or null if -no matching host could be found or if no hostname is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getHostnameByIPAddr(ipaddr){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the hostname associated with the given IPv4 address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ipaddr - - -string - - - - - -

The IPv4 address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the hostname associated with the given IPv4 or null if -no matching host could be found or if no hostname is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getHostnameByMACAddr(mac){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the hostname associated with the given MAC address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mac - - -string - - - - - -

The MAC address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the hostname associated with the given MAC or null if -no matching host could be found or if no hostname is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getIP6AddrByMACAddr(mac){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the IPv6 address associated with the given MAC address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mac - - -string - - - - - -

The MAC address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the IPv6 address associated with the given MAC or null if -no matching host could be found or if no IPv6 address is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getIPAddrByMACAddr(mac){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the IPv4 address associated with the given MAC address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
mac - - -string - - - - - -

The MAC address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the IPv4 address associated with the given MAC or null if -no matching host could be found or if no IPv4 address is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getMACAddrByIP6Addr(ipaddr){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the MAC address associated with the given IPv6 address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ipaddr - - -string - - - - - -

The IPv6 address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the MAC address associated with the given IPv6 or null if -no matching host could be found or if no MAC address is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getMACAddrByIPAddr(ipaddr){null|string} -

- - - - -
- - -
-
- - -
-

Lookup the MAC address associated with the given IPv4 address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ipaddr - - -string - - - - - -

The IPv4 address to lookup.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the MAC address associated with the given IPv4 or null if -no matching host could be found or if no MAC address is known for -the corresponding host.
- - - - -
- - - -
-
-

- - getMACHints(preferIp6){Array.<Array.<string>>} -

- - - - -
- - -
-
- - -
-

Return an array of (MAC address, name hint) tuples sorted by -MAC address.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
preferIp6 - - -boolean - - - - - - false - - - - - optional - - - - - -

Whether to prefer IPv6 addresses (true) or IPv4 addresses (false) -as name hint when no hostname is known for a specific MAC address.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<Array.<string>> - - - Returns an array of arrays containing a name hint for each found -MAC address on the system. The array is sorted ascending by MAC. -Each item of the resulting array is a two element array with the -MAC being the first element and the name hint being the second -element. The name hint is either the hostname, an IPv4 or an IPv6 -address related to the MAC address. -If no hostname but both IPv4 and IPv6 addresses are known, the -preferIP6 flag specifies whether the IPv6 or the IPv4 address -is used as hint.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.Protocol.html b/docs/jsapi/LuCI.network.Protocol.html deleted file mode 100644 index 465b751a687e2e61228c43e9450a423ff7db68e9..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.Protocol.html +++ /dev/null @@ -1,8015 +0,0 @@ - - - - - Class: Protocol - - - - - - - - - - - - - - - - - -
- - -
-

Class: Protocol

- - - - -
- -
-

- LuCI.network. - - Protocol -

- -

The Network.Protocol class serves as base for protocol specific -subclasses which describe logical UCI networks defined by config interface sections in /etc/config/network.

- -
- -
-
- - - - -
-
-

- - new LuCI.network.Protocol() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addDevice(device){boolean} -

- - - - -
- - -
-
- - -
-

Add the given network device to the logical interface.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
device - - -LuCI.network.Protocol -| - -LuCI.network.Device -| - -LuCI.network.WifiDevice -| - -LuCI.network.WifiNetwork -| - -string - - - - - -

The object or device name to add to the logical interface. In case the -given argument is not a string, it is resolved though the -Network.getIfnameOf() function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the device name has been added or false if any -argument was invalid, if the device was already part of the logical -interface or if the logical interface is virtual.
- - - - -
- - - -
-
-

- - containsDevice(device){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this logical interface contains the given device -object.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
device - - -LuCI.network.Protocol -| - -LuCI.network.Device -| - -LuCI.network.WifiDevice -| - -LuCI.network.WifiNetwork -| - -string - - - - - -

The object or device name to check. In case the given argument is not -a string, it is resolved though the -Network.getIfnameOf() function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when this logical interface contains the given network -device or false if not.
- - - - -
- - - -
-
-

- - abstractdeleteConfiguration(){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

Cleanup related configuration entries.

-

This function will be invoked if an interface is about to be removed -from the configuration and is responsible for performing any required -cleanup tasks, such as unsetting uci entries in related configurations.

-

It should be overwritten by protocol specific subclasses.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - This function may return a promise which is awaited before the rest of -the configuration is removed. Any non-promise return value and any -resolved promise value is ignored. If the returned promise is rejected, -the interface removal will be aborted.
- - - - -
- - - -
-
-

- - deleteDevice(device){boolean} -

- - - - -
- - -
-
- - -
-

Remove the given network device from the logical interface.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
device - - -LuCI.network.Protocol -| - -LuCI.network.Device -| - -LuCI.network.WifiDevice -| - -LuCI.network.WifiNetwork -| - -string - - - - - -

The object or device name to remove from the logical interface. In case -the given argument is not a string, it is resolved though the -Network.getIfnameOf() function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the device name has been added or false if any -argument was invalid, if the device was already part of the logical -interface or if the logical interface is virtual.
- - - - -
- - - -
-
-

- - get(opt){null|string|Array.<string>} -

- - - - -
- - -
-
- - -
-

Read the given UCI option value of this network.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The UCI option name to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - - - Returns the UCI option value or null if the requested option is -not found.
- - - - -
- - - -
-
-

- - getDevice(){LuCI.network.Device} -

- - - - -
- - -
-
- - -
-

Returns the Linux network device associated with this logical -interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.network.Device - - - Returns a Network.Device class instance representing the -expected Linux network device according to the configuration.
- - - - -
- - - -
-
-

- - getDevices(){null|Array.<LuCI.network.Device>} -

- - - - -
- - -
-
- - -
-

Returns a list of network sub-devices associated with this logical -interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - Array.<LuCI.network.Device> - - - Returns an array of of Network.Device class instances representing -the sub-devices attached to this logical interface or null if the -logical interface does not support sub-devices, e.g. because it is -virtual and not a bridge.
- - - - -
- - - -
-
-

- - getDNS6Addrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Query the IPv6 DNS servers associated with the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv6 DNS servers registered by the remote -protocol backend.
- - - - -
- - - -
-
-

- - getDNSAddrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Query the IPv4 DNS servers associated with the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv4 DNS servers registered by the remote -protocol backend.
- - - - -
- - - -
-
-

- - getErrors(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Query interface error messages published in ubus runtime state.

-

Interface errors are emitted by remote protocol handlers if the setup -of the underlying logical interface failed, e.g. due to bad -configuration or network connectivity issues.

-

This function will translate the found error codes to human readable -messages using the descriptions registered by -Network.registerErrorCode() -and fall back to "Unknown error (%s)" where %s is replaced by the -error code in case no translation can be found.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of translated interface error messages.
- - - - -
- - - -
-
-

- - getExpiry(){number} -

- - - - -
- - -
-
- - -
-

Get the logical interface expiry time in seconds.

-

For protocols that have a concept of a lease, such as DHCP or -DHCPv6, this function returns the remaining time in seconds -until the lease expires.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the amount of seconds until the lease expires or -1 -if it isn't applicable to the associated protocol.
- - - - -
- - - -
-
-

- - getGateway6Addr(){string} -

- - - - -
- - -
-
- - -
-

Query the gateway (nexthop) of the IPv6 default route associated with -this logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string containing the IPv6 nexthop address of the associated -default route or null if no default route was found.
- - - - -
- - - -
-
-

- - getGatewayAddr(){string} -

- - - - -
- - -
-
- - -
-

Query the gateway (nexthop) of the default route associated with -this logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string containing the IPv4 nexthop address of the associated -default route or null if no default route was found.
- - - - -
- - - -
-
-

- - abstractgetI18n(){string} -

- - - - -
- - -
-
- - -
-

Return a human readable description for the protcol, such as -Static address or DHCP client.

-

This function should be overwritten by subclasses.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the description string.
- - - - -
- - - -
-
-

- - getIfname(){null|string} -

- - - - -
- - -
-
- - -
-

Get the associared Linux network device of this network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the name of the associated network device or null if -it could not be determined.
- - - - -
- - - -
-
-

- - getIP6Addr(){null|string} -

- - - - -
- - -
-
- - -
-

Query the first (primary) IPv6 address of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the primary IPv6 address registered by the protocol handler -in CIDR notation or null if no IPv6 addresses were set.
- - - - -
- - - -
-
-

- - getIP6Addrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Query all IPv6 addresses of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv6 addresses in CIDR notation which have been -registered by the protocol handler. The order of the resulting array -follows the order of the addresses in ubus runtime information.
- - - - -
- - - -
-
-

- - getIP6Prefix(){null|string} -

- - - - -
- - -
-
- - -
-

Query the routed IPv6 prefix associated with the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the routed IPv6 prefix registered by the remote protocol -handler or null if no prefix is present.
- - - - -
- - - -
-
-

- - getIPAddr(){null|string} -

- - - - -
- - -
-
- - -
-

Query the first (primary) IPv4 address of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the primary IPv4 address registered by the protocol handler -or null if no IPv4 addresses were set.
- - - - -
- - - -
-
-

- - getIPAddrs(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Query all IPv4 addresses of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of IPv4 addresses in CIDR notation which have been -registered by the protocol handler. The order of the resulting array -follows the order of the addresses in ubus runtime information.
- - - - -
- - - -
-
-

- - getL2Device(){LuCI.network.Device} -

- - - - -
- - -
-
- - -
-

Returns the layer 2 linux network device currently associated -with this logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.network.Device - - - Returns a Network.Device class instance representing the Linux -network device currently associated with the logical interface.
- - - - -
- - - -
-
-

- - getL3Device(){LuCI.network.Device} -

- - - - -
- - -
-
- - -
-

Returns the layer 3 linux network device currently associated -with this logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.network.Device - - - Returns a Network.Device class instance representing the Linux -network device currently associated with the logical interface.
- - - - -
- - - -
-
-

- - getMetric(){number} -

- - - - -
- - -
-
- - -
-

Get the metric value of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the current metric value used for device and network -routes spawned by the associated logical interface.
- - - - -
- - - -
-
-

- - getName(){string} -

- - - - -
- - -
-
- - -
-

Get the name of the associated logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the logical interface name, such as lan or wan.
- - - - -
- - - -
-
-

- - getNetmask(){null|string} -

- - - - -
- - -
-
- - -
-

Query the first (primary) IPv4 netmask of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the netmask of the primary IPv4 address registered by the -protocol handler or null if no IPv4 addresses were set.
- - - - -
- - - -
-
-

- - abstractgetOpkgPackage(){string} -

- - - - -
- - -
-
- - -
-

Get the name of the opkg package providing the protocol functionality.

-

This function should be overwritten by protocol specific subclasses.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the name of the opkg package required for the protocol to -function, e.g. odhcp6c for the dhcpv6 prototocol.
- - - - -
- - - -
-
-

- - abstractgetProtocol(){string} -

- - - - -
- - -
-
- - -
-

Get the name of this network protocol class.

-

This function will be overwritten by subclasses created by -Network.registerProtocol().

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the name of the network protocol implementation, e.g. -static or dhcp.
- - - - -
- - - -
-
-

- - getType(){null|string} -

- - - - -
- - -
-
- - -
-

Get the type of the underlying interface.

-

This function actually is a convenience wrapper around -proto.get("type") and is mainly used by other LuCI.network code -to check whether the interface is declared as bridge in UCI.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the value of the type option of the associated logical -interface or null if no type option is set.
- - - - -
- - - -
-
-

- - getUptime(){number} -

- - - - -
- - -
-
- - -
-

Get the uptime of the logical interface.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the uptime of the associated interface in seconds.
- - - - -
- - - -
-
-

- - getZoneName(){null|string} -

- - - - -
- - -
-
- - -
-

Get the requested firewall zone name of the logical interface.

-

Some protocol implementations request a specific firewall zone -to trigger inclusion of their resulting network devices into the -firewall rule set.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the requested firewall zone name as published in the -ubus runtime information or null if the remote protocol -handler didn't request a zone.
- - - - -
- - - -
-
-

- - isAlias(){null|string} -

- - - - -
- - -
-
- - -
-

Checks whether this interface is an alias interface.

-

Alias interfaces are interfaces layering on top of another interface -and are denoted by a special @interfacename notation in the -underlying ifname option.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the name of the parent interface if this logical interface -is an alias or null if it is not an alias interface.
- - - - -
- - - -
-
-

- - isBridge(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether the underlying logical interface is declared as bridge.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the interface is declared with option type bridge -and when the associated protocol implementation is not marked virtual -or false when the logical interface is no bridge.
- - - - -
- - - -
-
-

- - abstractisCreateable(ifname){Promise.<void>} -

- - - - -
- - -
-
- - -
-

Check function for the protocol handler if a new interface is createable.

-

This function should be overwritten by protocol specific subclasses.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ifname - - -string - - - - - -

The name of the interface to be created.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<void> - - - Returns a promise resolving if new interface is createable, else -rejects with an error message string.
- - - - -
- - - -
-
-

- - isDynamic(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this logical interface is dynamic.

-

A dynamic interface is an interface which has been created at runtime, -e.g. as sub-interface of another interface, but which is not backed by -any user configuration. Such dynamic interfaces cannot be edited but -only brought down or restarted.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns a boolean indicating whether this interface is dynamic (true) -or not (false).
- - - - -
- - - -
-
-

- - isEmpty(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this logical interface is "empty", meaning that ut -has no network devices attached.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if this logical interface is empty, else false.
- - - - -
- - - -
-
-

- - isFloating(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this protocol is "floating".

-

A "floating" protocol is a protocol which spawns its own interfaces -on demand, like a virtual one but which relies on an existinf lower -level interface to initiate the connection.

-

An example for such a protocol is "pppoe".

-

This function exists for backwards compatibility with older code -but should not be used anymore.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns a boolean indicating whether this protocol is floating (true) -or not (false).
- - - - -
- - - -
-
-

- - abstractisInstalled(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether the protocol functionality is installed.

-

This function exists for compatibility with old code, it always -returns true.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the protocol support is installed, else false.
- - - - -
- - - -
-
-

- - isUp(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this logical interface is configured and running.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the interface is active or false when it is not.
- - - - -
- - - -
-
-

- - isVirtual(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this protocol is "virtual".

-

A "virtual" protocol is a protocol which spawns its own interfaces -on demand instead of using existing physical interfaces.

-

Examples for virtual protocols are 6in4 which gre spawn tunnel -network device on startup, examples for non-virtual protcols are -dhcp or static which apply IP configuration to existing interfaces.

-

This function should be overwritten by subclasses.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns a boolean indicating whether the underlying protocol spawns -dynamic interfaces (true) or not (false).
- - - - -
- - - -
-
-

- - set(opt, val) -

- - - - -
- - -
-
- - -
-

Set the given UCI option of this network to the given value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The name of the UCI option to set.

val - - -null -| - -string -| - -Array.<string> - - - - - -

The value to set or null to remove the given option from the -configuration.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.WifiDevice.html b/docs/jsapi/LuCI.network.WifiDevice.html deleted file mode 100644 index fc20c640a205ef311645d1e2879ad58007f97355..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.WifiDevice.html +++ /dev/null @@ -1,5151 +0,0 @@ - - - - - Class: WifiDevice - - - - - - - - - - - - - - - - - -
- - -
-

Class: WifiDevice

- - - - -
- -
-

- LuCI.network. - - WifiDevice -

- -

A Network.WifiDevice class instance represents a wireless radio device -present on the system and provides wireless capability information as -well as methods for enumerating related wireless networks.

- -
- -
-
- - - - -
-
-

- - new LuCI.network.WifiDevice() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addWifiNetwork(options){Promise.<(null|LuCI.network.WifiNetwork)>} -

- - - - -
- - -
-
- - -
-

Adds a new wireless network associated with this radio device to the -configuration and sets its options to the provided values.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
options - - -Object.<string, (string|Array.<string>)> - - - - - - - optional - - - - - -

The options to set for the newly added wireless network.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.WifiNetwork)> - - - Returns a promise resolving to a WifiNetwork instance describing -the newly added wireless network or null if the given options -were invalid.
- - - - -
- - - -
-
-

- - deleteWifiNetwork(network){Promise.<boolean>} -

- - - - -
- - -
-
- - -
-

Deletes the wireless network with the given name associated with this -radio device.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
network - - -string - - - - - -

The name of the wireless network to lookup. This may be either an uci -configuration section ID, a network ID in the form radio#.network# -or a Linux network device name like wlan0 which is resolved to the -corresponding configuration section through ubus runtime information.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<boolean> - - - Returns a promise resolving to true when the wireless network was -successfully deleted from the configuration or false when the given -network could not be found or if the found network was not associated -with this wireless radio device.
- - - - -
- - - -
-
-

- - get(opt){null|string|Array.<string>} -

- - - - -
- - -
-
- - -
-

Read the given UCI option value of this wireless device.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The UCI option name to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - - - Returns the UCI option value or null if the requested option is -not found.
- - - - -
- - - -
-
-

- - getHTModes(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Gets a list of supported htmodes.

-

The htmode values describe the wide-frequency options supported by -the wireless phy.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of valid htmode values for this radio. Currently -known mode values are: -
    -
  • HT20 - applicable to IEEE 802.11n, 20 MHz wide channels
  • -
  • HT40 - applicable to IEEE 802.11n, 40 MHz wide channels
  • -
  • VHT20 - applicable to IEEE 802.11ac, 20 MHz wide channels
  • -
  • VHT40 - applicable to IEEE 802.11ac, 40 MHz wide channels
  • -
  • VHT80 - applicable to IEEE 802.11ac, 80 MHz wide channels
  • -
  • VHT160 - applicable to IEEE 802.11ac, 160 MHz wide channels
  • -
- - - - -
- - - -
-
-

- - getHWModes(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Gets a list of supported hwmodes.

-

The hwmode values describe the frequency band and wireless standard -versions supported by the wireless phy.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of valid hwmode values for this radio. Currently -known mode values are: -
    -
  • a - Legacy 802.11a mode, 5 GHz, up to 54 Mbit/s
  • -
  • b - Legacy 802.11b mode, 2.4 GHz, up to 11 Mbit/s
  • -
  • g - Legacy 802.11g mode, 2.4 GHz, up to 54 Mbit/s
  • -
  • n - IEEE 802.11n mode, 2.4 or 5 GHz, up to 600 Mbit/s
  • -
  • ac - IEEE 802.11ac mode, 5 GHz, up to 6770 Mbit/s
  • -
- - - - -
- - - -
-
-

- - getI18n(){string} -

- - - - -
- - -
-
- - -
-

Get a string describing the wireless radio hardware.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the description string.
- - - - -
- - - -
-
-

- - getName(){string} -

- - - - -
- - -
-
- - -
-

Get the configuration name of this wireless radio.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the UCI section name (e.g. radio0) of the corresponding -radio configuration which also serves as unique logical identifier -for the wireless phy.
- - - - -
- - - -
-
-

- - getScanList(){Promise.<Array.<LuCI.network.WifiScanResult>>} -

- - - - -
- - -
-
- - -
-

Trigger a wireless scan on this radio device and obtain a list of -nearby networks.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.WifiScanResult>> - - - Returns a promise resolving to an array of scan result objects -describing the networks found in the vincinity.
- - - - -
- - - -
-
-

- - getWifiNetwork(network){Promise.<LuCI.network.WifiNetwork>} -

- - - - -
- - -
-
- - -
-

Get the wifi network of the given name belonging to this radio device

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
network - - -string - - - - - -

The name of the wireless network to lookup. This may be either an uci -configuration section ID, a network ID in the form radio#.network# -or a Linux network device name like wlan0 which is resolved to the -corresponding configuration section through ubus runtime information.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.network.WifiNetwork> - - - Returns a promise resolving to a Network.WifiNetwork instance -representing the wireless network and rejecting with null if -the given network could not be found or is not associated with -this radio device.
- - - - -
- - - -
-
-

- - getWifiNetworks(){Promise.<Array.<LuCI.network.WifiNetwork>>} -

- - - - -
- - -
-
- - -
-

Get all wireless networks associated with this wireless radio device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.WifiNetwork>> - - - Returns a promise resolving to an array of Network.WifiNetwork -instances respresenting the wireless networks associated with this -radio device.
- - - - -
- - - -
-
-

- - isDisabled(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this wireless radio is disabled.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the wireless radio is marked as disabled in ubus -runtime state or when the disabled option is set in the corresponding -UCI configuration.
- - - - -
- - - -
-
-

- - isUp(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the wireless radio is marked as up in the ubus -runtime state.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the radio device is up, else false.
- - - - -
- - - -
-
-

- - set(opt, val) -

- - - - -
- - -
-
- - -
-

Set the given UCI option of this network to the given value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The name of the UCI option to set.

val - - -null -| - -string -| - -Array.<string> - - - - - -

The value to set or null to remove the given option from the -configuration.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.WifiNetwork.html b/docs/jsapi/LuCI.network.WifiNetwork.html deleted file mode 100644 index f9e91e4a861d248234f0c4a34c9f045a5417a7bc..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.WifiNetwork.html +++ /dev/null @@ -1,7644 +0,0 @@ - - - - - Class: WifiNetwork - - - - - - - - - - - - - - - - - -
- - -
-

Class: WifiNetwork

- - - - -
- -
-

- LuCI.network. - - WifiNetwork -

- -

A Network.WifiNetwork instance represents a wireless network (vif) -configured on top of a radio device and provides functions for querying -the runtime state of the network. Most radio devices support multiple -such networks in parallel.

- -
- -
-
- - - - -
-
-

- - new LuCI.network.WifiNetwork() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - disconnectClient(mac, deauth, reason, ban_time){Promise.<number>} -

- - - - -
- - -
-
- - -
-

Forcibly disconnect the given client from the wireless network.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
mac - - -string - - - - - - - - - - - - -

The MAC address of the client to disconnect.

deauth - - -boolean - - - - - - false - - - - - optional - - - - - -

Specifies whether to deauthenticate (true) or disassociate (false) -the client.

reason - - -number - - - - - - 1 - - - - - optional - - - - - -

Specifies the IEEE 802.11 reason code to disassoc/deauth the client -with. Default is 1 which corresponds to Unspecified reason.

ban_time - - -number - - - - - - 0 - - - - - optional - - - - - -

Specifies the amount of milliseconds to ban the client from -reconnecting. By default, no ban time is set which allows the client -to reassociate / reauthenticate immediately.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<number> - - - Returns a promise resolving to the underlying ubus call result code -which is typically 0, even for not existing MAC addresses. -The promise might reject with an error in case invalid arguments -are passed.
- - - - -
- - - -
-
-

- - get(opt){null|string|Array.<string>} -

- - - - -
- - -
-
- - -
-

Read the given UCI option value of this wireless network.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The UCI option name to read.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - - - Returns the UCI option value or null if the requested option is -not found.
- - - - -
- - - -
-
-

- - getActiveBSSID(){string} -

- - - - -
- - -
-
- - -
-

Query the current BSSID from runtime information.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the current BSSID or Mesh ID as reported by ubus runtime -information.
- - - - -
- - - -
-
-

- - getActiveEncryption(){string} -

- - - - -
- - -
-
- - -
-

Query the current encryption settings from runtime information.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string describing the current encryption or - if the the -encryption state could not be found in ubus runtime information.
- - - - -
- - - -
-
-

- - getActiveMode(){string} -

- - - - -
- - -
-
- - -
-

Query the current operation mode from runtime information.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the human readable mode name as reported by ubus runtime -state. Possible returned values are: -
    -
  • Master
  • -
  • Ad-Hoc
  • -
  • Client
  • -
  • Monitor
  • -
  • Master (VLAN)
  • -
  • WDS
  • -
  • Mesh Point
  • -
  • P2P Client
  • -
  • P2P Go
  • -
  • Unknown
  • -
- - - - -
- - - -
-
-

- - getActiveModeI18n(){string} -

- - - - -
- - -
-
- - -
-

Query the current operation mode from runtime information as -translated string.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the translated, human readable mode name as reported by -ubus runtime state.
- - - - -
- - - -
-
-

- - getActiveSSID(){string} -

- - - - -
- - -
-
- - -
-

Query the current SSID from runtime information.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the current SSID or Mesh ID as reported by ubus runtime -information.
- - - - -
- - - -
-
-

- - getAssocList(){Promise.<Array.<LuCI.network.WifiPeerEntry>>} -

- - - - -
- - -
-
- - -
-

Fetch the list of associated peers.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.WifiPeerEntry>> - - - Returns a promise resolving to an array of wireless peers associated -with this network.
- - - - -
- - - -
-
-

- - getBitRate(){null|number} -

- - - - -
- - -
-
- - -
-

Query the current average bitrate of all peers associated to this -wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - number - - - Returns the average bit rate among all peers associated to the network -as reported by ubus runtime information or null if the information -is not available.
- - - - -
- - - -
-
-

- - getBSSID(){null|string} -

- - - - -
- - -
-
- - -
-

Get the configured BSSID of the wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the BSSID value or null if none has been specified.
- - - - -
- - - -
-
-

- - getChannel(){null|number} -

- - - - -
- - -
-
- - -
-

Query the current wireless channel.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - number - - - Returns the wireless channel as reported by ubus runtime information -or null if it cannot be determined.
- - - - -
- - - -
-
-

- - getCountryCode(){string} -

- - - - -
- - -
-
- - -
-

Query the current country code.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the wireless country code as reported by ubus runtime -information or 00 if it cannot be determined.
- - - - -
- - - -
-
-

- - getDevice(){LuCI.network.Device} -

- - - - -
- - -
-
- - -
-

Get the associated Linux network device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.network.Device - - - Returns a Network.Device instance representing the Linux network -device associted with this wireless network.
- - - - -
- - - -
-
-

- - getFrequency(){null|string} -

- - - - -
- - -
-
- - -
-

Query the current operating frequency of the wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the current operating frequency of the network from ubus -runtime information in GHz or null if the information is not -available.
- - - - -
- - - -
-
-

- - getI18n(){string} -

- - - - -
- - -
-
- - -
-

Get a description string for this wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string describing this network, consisting of the -term Wireless Network, followed by the active operation mode, -the SSID, BSSID or internal network ID and the Linux network device -name, depending on which information is available.
- - - - -
- - - -
-
-

- - getID(){string} -

- - - - -
- - -
-
- - -
-

Get the internal network ID of this wireless network.

-

The network ID is a LuCI specific identifer in the form -radio#.network# to identify wireless networks by their corresponding -radio and network index numbers.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the LuCI specific network ID.
- - - - -
- - - -
-
-

- - getIfname(){null|string} -

- - - - -
- - -
-
- - -
-

Get the Linux network device name.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the current Linux network device name as resolved from -ubus runtime information or null if this network has no -associated network device, e.g. when not configured or up.
- - - - -
- - - -
-
-

- - getMeshID(){null|string} -

- - - - -
- - -
-
- - -
-

Get the configured Mesh ID of the wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the configured mesh ID value or null when this network -is not in mesh mode.
- - - - -
- - - -
-
-

- - getMode(){string} -

- - - - -
- - -
-
- - -
-

Get the configured operation mode of the wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the configured operation mode. Possible values are: -
    -
  • ap - Master (Access Point) mode
  • -
  • sta - Station (client) mode
  • -
  • adhoc - Ad-Hoc (IBSS) mode
  • -
  • mesh - Mesh (IEEE 802.11s) mode
  • -
  • monitor - Monitor mode
  • -
- - - - -
- - - -
-
-

- - getName(){string} -

- - - - -
- - -
-
- - -
-

Get the configuration ID of this wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the corresponding UCI section ID of the network.
- - - - -
- - - -
-
-

- - getNetwork(){null|LuCI.network.Protocol} -

- - - - -
- - -
-
- - -
-

Get the primary logical interface this wireless network is attached to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.network.Protocol - - - Returns a Network.Protocol instance representing the logical -interface or null if this network is not attached to any logical -interface.
- - - - -
- - - -
-
-

- - getNetworkNames(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Get the names of the logical interfaces this wireless network is -attached to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns an array of logical interface names.
- - - - -
- - - -
-
-

- - getNetworks(){Array.<LuCI.network.Protocol>} -

- - - - -
- - -
-
- - -
-

Get the logical interfaces this wireless network is attached to.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.network.Protocol> - - - Returns an array of Network.Protocol instances representing the -logical interfaces this wireless network is attached to.
- - - - -
- - - -
-
-

- - getNoise(){number} -

- - - - -
- - -
-
- - -
-

Query the current radio noise floor.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the radio noise floor in dBm as reported by ubus runtime -information or 0 if it cannot be determined.
- - - - -
- - - -
-
-

- - getShortName(){string} -

- - - - -
- - -
-
- - -
-

Get a short description string for this wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns a string describing this network, consisting of the -active operation mode, followed by either the SSID, BSSID or -internal network ID, depending on which information is available.
- - - - -
- - - -
-
-

- - getSignal(){null|number} -

- - - - -
- - -
-
- - -
-

Query the current wireless signal.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - number - - - Returns the wireless signal in dBm as reported by ubus runtime -information or null if it cannot be determined.
- - - - -
- - - -
-
-

- - getSignalLevel(){number} -

- - - - -
- - -
-
- - -
-

Calculate the current signal.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the calculated signal level, which is the difference between -noise and signal (SNR), divided by 5.
- - - - -
- - - -
-
-

- - getSignalPercent(){number} -

- - - - -
- - -
-
- - -
-

Calculate the current signal quality percentage.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the calculated signal quality in percent. The value is -calculated from the quality and quality_max indicators reported -by ubus runtime state.
- - - - -
- - - -
-
-

- - getSSID(){null|string} -

- - - - -
- - -
-
- - -
-

Get the configured SSID of the wireless network.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the configured SSID value or null when this network is -in mesh mode.
- - - - -
- - - -
-
-

- - getTXPower(){null|number} -

- - - - -
- - -
-
- - -
-

Query the current radio TX power.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - number - - - Returns the wireless network transmit power in dBm as reported by -ubus runtime information or null if it cannot be determined.
- - - - -
- - - -
-
-

- - getTXPowerOffset(){number} -

- - - - -
- - -
-
- - -
-

Query the radio TX power offset.

-

Some wireless radios have a fixed power offset, e.g. due to the -use of external amplifiers.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - number - - - Returns the wireless network transmit power offset in dBm as reported -by ubus runtime information or 0 if there is no offset, or if it -cannot be determined.
- - - - -
- - - -
-
-

- - getWifiDevice(){null|LuCI.network.WifiDevice} -

- - - - -
- - -
-
- - -
-

Get the corresponding wifi radio device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.network.WifiDevice - - - Returns a Network.WifiDevice instance representing the corresponding -wifi radio device or null if the related radio device could not be -found.
- - - - -
- - - -
-
-

- - getWifiDeviceName(){null|string} -

- - - - -
- - -
-
- - -
-

Get the name of the corresponding wifi radio device.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the name of the radio device this network is configured on -or null if it cannot be determined.
- - - - -
- - - -
-
-

- - isClientDisconnectSupported(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether this wifi network supports deauthenticating clients.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when this wifi network instance supports forcibly -deauthenticating clients, otherwise false.
- - - - -
- - - -
-
-

- - isDisabled(){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether this wireless network is disabled.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the wireless radio is marked as disabled in ubus -runtime state or when the disabled option is set in the corresponding -UCI configuration.
- - - - -
- - - -
-
-

- - isUp(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the radio network is up.

-

This function actually queries the up state of the related radio -device and assumes this network to be up as well when the parent -radio is up. This is due to the fact that OpenWrt does not control -virtual interfaces individually but within one common hostapd -instance.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the network is up, else false.
- - - - -
- - - -
-
-

- - set(opt, val) -

- - - - -
- - -
-
- - -
-

Set the given UCI option of this network to the given value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
opt - - -string - - - - - -

The name of the UCI option to set.

val - - -null -| - -string -| - -Array.<string> - - - - - -

The value to set or null to remove the given option from the -configuration.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.network.html b/docs/jsapi/LuCI.network.html deleted file mode 100644 index 8760ded0376d9e52ec4f0216db778f891a039905..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.network.html +++ /dev/null @@ -1,9499 +0,0 @@ - - - - - Class: network - - - - - - - - - - - - - - - - - -
- - -
-

Class: network

- - - - -
- -
-

- LuCI. - - network -

- -

The LuCI.network class combines data from multiple ubus apis to -provide an abstraction of the current network configuration state.

-

It provides methods to enumerate interfaces and devices, to query -current configuration details and to manipulate settings.

- -
- -
-
- - - - -
-
-

- - new LuCI.network() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - -

Classes

- -
-
Device
-
- -
Hosts
-
- -
Protocol
-
- -
WifiDevice
-
- -
WifiNetwork
-
-
- - - - - - - -

Methods

- -
- -
-
-

- - addNetwork(name, options){Promise.<(null|LuCI.network.Protocol)>} -

- - - - -
- - -
-
- - -
-

Adds a new network of the given name and update it with the given -uci option values.

-

If a network with the given name already exist but is empty, then -this function will update its option, otherwise it will do nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - - - - - - -

The name of the network to add. Must be in the format [a-zA-Z0-9_]+.

options - - -Object.<string, (string|Array.<string>)> - - - - - - - optional - - - - - -

An object of uci option values to set on the new network or to -update in an existing, empty network.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.Protocol)> - - - Returns a promise resolving to the Protocol subclass instance -describing the added network or resolving to null if the name -was invalid or if a non-empty network of the given name already -existed.
- - - - -
- - - -
-
-

- - addWifiNetwork(options){Promise.<(null|LuCI.network.WifiNetwork)>} -

- - - - -
- - -
-
- - -
-

Adds a new wireless network to the configuration and sets its options -to the provided values.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
options - - -Object.<string, (string|Array.<string>)> - - - - - -

The options to set for the newly added wireless network. This object -must at least contain a device property which is set to the radio -name the new network belongs to.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.WifiNetwork)> - - - Returns a promise resolving to a WifiNetwork instance describing -the newly added wireless network or null if the given options -were invalid or if the associated radio device could not be found.
- - - - -
- - - -
-
-

- - deleteNetwork(name){Promise.<boolean>} -

- - - - -
- - -
-
- - -
-

Deletes the given network and its references from the network and -firewall configuration.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The name of the network to delete.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<boolean> - - - Returns a promise resolving to either true if the network and -references to it were successfully deleted from the configuration or -false if the given network could not be found.
- - - - -
- - - -
-
-

- - deleteWifiNetwork(netname){Promise.<boolean>} -

- - - - -
- - -
-
- - -
-

Deletes the given wireless network from the configuration.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
netname - - -string - - - - - -

The name of the network to remove. This may be either a -network ID in the form radio#.network# or a Linux network device -name like wlan0 which is resolved to the corresponding configuration -section through ubus runtime information.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<boolean> - - - Returns a promise resolving to true if the wireless network has been -successfully deleted from the configuration or false if it could not -be found.
- - - - -
- - - -
-
-

- - flushCache(){Promise.<Object>} -

- - - - -
- - -
-
- - -
-

Flushes the local network state cache and fetches updated information -from the remote ubus apis.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Object> - - - Returns a promise resolving to the internal network state object.
- - - - -
- - - -
-
-

- - formatWifiEncryption(encryption){null|string} -

- - - - -
- - -
-
- - -
-

Converts a given encryption entry -into a human readable string such as mixed WPA/WPA2 PSK (TKIP, CCMP) -or WPA3 SAE (CCMP).

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
encryption - - -LuCI.network.WifiEncryption - - - - - -

The wireless encryption entry to convert.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns the description string for the given encryption entry or -null if the given entry was invalid.
- - - - -
- - - -
-
-

- - getDevice(name){Promise.<(null|LuCI.network.Device)>} -

- - - - -
- - -
-
- - -
-

Get a Device instance describing the -given network device.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The name of the network device to get, e.g. eth0 or br-lan.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.Device)> - - - Returns a promise resolving to the Device instance describing -the network device or null if the given device name could not -be found.
- - - - -
- - - -
-
-

- - getDevices(){Promise.<Array.<LuCI.network.Device>>} -

- - - - -
- - -
-
- - -
-

Get a sorted list of all found network devices.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.Device>> - - - Returns a promise resolving to a sorted array of Device class -instances describing the network devices found on the system.
- - - - -
- - - -
-
-

- - getDSLModemType(){Promise.<(null|string)>} -

- - - - -
- - -
-
- - -
-

Queries the internal DSL modem type from board information.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|string)> - - - Returns a promise resolving to the type of the internal modem -(e.g. vdsl) or to null if no internal modem is present.
- - - - -
- - - -
-
-

- - getHostHints(){Promise.<LuCI.network.Hosts>} -

- - - - -
- - -
-
- - -
-

Queries aggregated information about known hosts.

-

This function aggregates information from various sources such as -DHCP lease databases, ARP and IPv6 neighbour entries, wireless -association list etc. and returns a Hosts -class instance describing the found hosts.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.network.Hosts> - - - Returns a Hosts instance describing host known on the system.
- - - - -
- - - -
-
-

- - getIfnameOf(obj){null|string} -

- - - - -
- - -
-
- - -
-

Obtains the the network device name of the given object.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
obj - - -LuCI.network.Protocol -| - -LuCI.network.Device -| - -LuCI.network.WifiDevice -| - -LuCI.network.WifiNetwork -| - -string - - - - - -

The object to get the device name from.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns a string containing the device name or null if the given -object could not be converted to a name.
- - - - -
- - - -
-
-

- - getNetwork(name){Promise.<(null|LuCI.network.Protocol)>} -

- - - - -
- - -
-
- - -
-

Get a Protocol instance describing -the network with the given name.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The logical interface name of the network get, e.g. lan or wan.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.Protocol)> - - - Returns a promise resolving to a -Protocol subclass instance describing -the network or null if the network did not exist.
- - - - -
- - - -
-
-

- - getNetworks(){Promise.<Array.<LuCI.network.Protocol>>} -

- - - - -
- - -
-
- - -
-

Gets an array containing all known networks.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.Protocol>> - - - Returns a promise resolving to a name-sorted array of -Protocol subclass instances -describing all known networks.
- - - - -
- - - -
-
-

- - getProtocol(protoname, netname){null|LuCI.network.Protocol} -

- - - - -
- - -
-
- - -
-

Instantiates the given Protocol backend, -optionally using the given network name.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
protoname - - -string - - - - - - - - - - - - -

The protocol backend to use, e.g. static or dhcp.

netname - - -string - - - - - - __dummy__ - - - - - optional - - - - - -

The network name to use for the instantiated protocol. This should be -usually set to one of the interfaces described in /etc/config/network -but it is allowed to omit it, e.g. to query protocol capabilities -without the need for an existing interface.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - LuCI.network.Protocol - - - Returns the instantiated protocol backend class or null if the given -protocol isn't known.
- - - - -
- - - -
-
-

- - getProtocols(){Array.<LuCI.network.Protocol>} -

- - - - -
- - -
-
- - -
-

Obtains instances of all known Protocol -backend classes.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.network.Protocol> - - - Returns an array of protocol class instances.
- - - - -
- - - -
-
-

- - getSwitchTopologies(){Promise.<Object.<string, LuCI.network.SwitchTopology>>} -

- - - - -
- - -
-
- - -
-

Returns the topologies of all swconfig switches found on the system.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Object.<string, LuCI.network.SwitchTopology>> - - - Returns a promise resolving to an object containing the topologies -of each switch. The object keys correspond to the name of the switches -such as switch0, the values are -SwitchTopology objects describing -the layout.
- - - - -
- - - -
-
-

- - getWAN6Networks(){Promise.<Array.<LuCI.network.Protocol>>} -

- - - - -
- - -
-
- - -
-

Get IPv6 wan networks.

-

This function looks up all networks having a default ::/0 route -and returns them as array.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.Protocol>> - - - Returns a promise resolving to an array of Protocol subclass -instances describing the found IPv6 default route interfaces.
- - - - -
- - - -
-
-

- - getWANNetworks(){Promise.<Array.<LuCI.network.Protocol>>} -

- - - - -
- - -
-
- - -
-

Get IPv4 wan networks.

-

This function looks up all networks having a default 0.0.0.0/0 route -and returns them as array.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.Protocol>> - - - Returns a promise resolving to an array of Protocol subclass -instances describing the found default route interfaces.
- - - - -
- - - -
-
-

- - getWifiDevice(devname){Promise.<(null|LuCI.network.WifiDevice)>} -

- - - - -
- - -
-
- - -
-

Get a WifiDevice instance describing -the given wireless radio.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
devname - - -string - - - - - -

The configuration name of the wireless radio to lookup, e.g. radio0 -for the first mac80211 phy on the system.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.WifiDevice)> - - - Returns a promise resolving to the WifiDevice instance describing -the underlying radio device or null if the wireless radio could not -be found.
- - - - -
- - - -
-
-

- - getWifiDevices(){Promise.<Array.<LuCI.network.WifiDevice>>} -

- - - - -
- - -
-
- - -
-

Obtain a list of all configured radio devices.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.WifiDevice>> - - - Returns a promise resolving to an array of WifiDevice instances -describing the wireless radios configured in the system. -The order of the array corresponds to the order of the radios in -the configuration.
- - - - -
- - - -
-
-

- - getWifiNetwork(netname){Promise.<(null|LuCI.network.WifiNetwork)>} -

- - - - -
- - -
-
- - -
-

Get a WifiNetwork instance describing -the given wireless network.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
netname - - -string - - - - - -

The name of the wireless network to lookup. This may be either an uci -configuration section ID, a network ID in the form radio#.network# -or a Linux network device name like wlan0 which is resolved to the -corresponding configuration section through ubus runtime information.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(null|LuCI.network.WifiNetwork)> - - - Returns a promise resolving to the WifiNetwork instance describing -the wireless network or null if the corresponding network could not -be found.
- - - - -
- - - -
-
-

- - getWifiNetworks(){Promise.<Array.<LuCI.network.WifiNetwork>>} -

- - - - -
- - -
-
- - -
-

Get an array of all WifiNetwork -instances describing the wireless networks present on the system.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<LuCI.network.WifiNetwork>> - - - Returns a promise resolving to an array of WifiNetwork instances -describing the wireless networks. The array will be empty if no networks -are found.
- - - - -
- - - -
-
-

- - isIgnoredDevice(name){boolean} -

- - - - -
- - -
-
- - -
-

Test if a given network device name is in the list of patterns for -device names to ignore.

-

Ignored device names are usually Linux network devices which are -spawned implicitly by kernel modules such as tunl0 or hwsim0 -and which are unsuitable for use in network configuration.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - - - -

The device name to test.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the given name is in the ignore pattern list, -else returns false.
- - - - -
- - - -
-
-

- - maskToPrefix(netmask, v6){null|number} -

- - - - -
- - -
-
- - -
-

Converts the given netmask to a prefix size in bits.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
netmask - - -string - - - - - - - - - - - - -

The netmask to convert into a bit count.

v6 - - -boolean - - - - - - false - - - - - optional - - - - - -

Whether to parse the given netmask as IPv4 (false) or IPv6 (true) -address.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - number - - - Returns the number of prefix bits contained in the netmask or null -if the given netmask value was invalid.
- - - - -
- - - -
-
-

- - prefixToMask(bits, v6){null|string} -

- - - - -
- - -
-
- - -
-

Converts the given prefix size in bits to a netmask.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
bits - - -number - - - - - - - - - - - - -

The prefix size in bits.

v6 - - -boolean - - - - - - false - - - - - optional - - - - - -

Whether to convert the bits value into an IPv4 netmask (false) or -an IPv6 netmask (true).

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - - - Returns a string containing the netmask corresponding to the bit count -or null when the given amount of bits exceeds the maximum possible -value of 32 for IPv4 or 128 for IPv6.
- - - - -
- - - -
-
-

- - registerErrorCode(code, message){boolean} -

- - - - -
- - -
-
- - -
-

Registers a new human readable translation string for a Protocol -error code.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
code - - -string - - - - - -

The ubus protocol error code to register a translation for, e.g. -NO_DEVICE.

message - - -string - - - - - -

The message to use as translation for the given protocol error code.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the error code description has been added or false -if either the arguments were invalid or if there already was a -description for the given code.
- - - - -
- - - -
-
-

- - registerPatternVirtual(pat) -

- - - - -
- - -
-
- - -
-

Registers a new regular expression pattern to recognize -virtual interfaces.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
pat - - -RegExp - - - - - -

A RegExp instance to match a virtual interface name -such as 6in4-wan or tun0.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - registerProtocol(protoname, methods){LuCI.network.Protocol} -

- - - - -
- - -
-
- - -
-

Registers a new Protocol subclass -with the given methods and returns the resulting subclass value.

-

This functions internally calls -Class.extend() on the Network.Protocol -base class.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
protoname - - -string - - - - - -

The name of the new protocol to register.

methods - - -Object.<string, *> - - - - - -

The member methods and values of the new Protocol subclass to -be passed to Class.extend().

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.network.Protocol - - - Returns the new Protocol subclass.
- - - - -
- - - -
-
-

- - renameNetwork(oldName, newName){Promise.<boolean>} -

- - - - -
- - -
-
- - -
-

Rename the given network and its references to a new name.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
oldName - - -string - - - - - -

The current name of the network.

newName - - -string - - - - - -

The name to rename the network to, must be in the format -[a-z-A-Z0-9_]+.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<boolean> - - - Returns a promise resolving to either true if the network was -successfully renamed or false if the new name was invalid, if -a network with the new name already exists or if the network to -rename could not be found.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.network.SwitchTopologyObject.<string, (Object|Array)>

-
- - -
-
- -
-

Describes an swconfig switch topology by specifying the CPU -connections and external port labels of a switch.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
netdevs - - -Object.<number, string> - - - -

The netdevs property points to an object describing the CPU port -connections of the switch. The numeric key of the enclosed object is -the port number, the value contains the Linux network device name the -port is hardwired to.

ports - - -Array.<Object.<string, (boolean|number|string)>> - - - -

The ports property points to an array describing the populated -ports of the switch in the external label order. Each array item is -an object containg the following keys:

-
    -
  • num - the internal switch port number
  • -
  • label - the label of the port, e.g. LAN 1 or CPU (eth0)
  • -
  • device - the connected Linux network device name (CPU ports only)
  • -
  • tagged - a boolean indicating whether the port must be tagged to -function (CPU ports only)
  • -
- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.network.WifiEncryptionObject.<string, (boolean|Array.<(number|string)>)>

-
- - -
-
- -
-

An encryption entry describes active wireless encryption settings -such as the used key management protocols, active ciphers and -protocol versions.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
enabled - - -boolean - - - - - - - -

Specifies whether any kind of encryption, such as WEP or WPA is -enabled. If set to false, then no encryption is active and the -corresponding network is open.

wep - - -Array.<string> - - - - - - <optional>
- - - -

When the wep property exists, the network uses WEP encryption. -In this case, the property is set to an array of active WEP modes -which might be either open, shared or both.

wpa - - -Array.<number> - - - - - - <optional>
- - - -

When the wpa property exists, the network uses WPA security. -In this case, the property is set to an array containing the WPA -protocol versions used, e.g. [ 1, 2 ] for WPA/WPA2 mixed mode or -[ 3 ] for WPA3-SAE.

authentication - - -Array.<string> - - - - - - <optional>
- - - -

The authentication property only applies to WPA encryption and -is defined when the wpa property is set as well. It points to -an array of active authentication suites used by the network, e.g. -[ "psk" ] for a WPA(2)-PSK network or [ "psk", "sae" ] for -mixed WPA2-PSK/WPA3-SAE encryption.

ciphers - - -Array.<string> - - - - - - <optional>
- - - -

If either WEP or WPA encryption is active, then the ciphers -property will be set to an array describing the active encryption -ciphers used by the network, e.g. [ "tkip", "ccmp" ] for a -WPA/WPA2-PSK mixed network or [ "wep-40", "wep-104" ] for an -WEP network.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.network.WifiPeerEntryObject.<string, (boolean|number|string|LuCI.network.WifiRateEntry)>

-
- - -
-
- -
-

A wireless peer entry describes the properties of a remote wireless -peer associated with a local network.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
mac - - -string - - - - - - - -

The MAC address (BSSID).

signal - - -number - - - - - - - -

The received signal strength.

signal_avg - - -number - - - - - - <optional>
- - - -

The average signal strength if supported by the driver.

noise - - -number - - - - - - <optional>
- - - -

The current noise floor of the radio. May be 0 or absent if not -supported by the driver.

inactive - - -number - - - - - - - -

The amount of milliseconds the peer has been inactive, e.g. due -to powersave.

connected_time - - -number - - - - - - - -

The amount of milliseconds the peer is associated to this network.

thr - - -number - - - - - - <optional>
- - - -

The estimated throughput of the peer, May be 0 or absent if not -supported by the driver.

authorized - - -boolean - - - - - - - -

Specifies whether the peer is authorized to associate to this network.

authenticated - - -boolean - - - - - - - -

Specifies whether the peer completed authentication to this network.

preamble - - -string - - - - - - - -

The preamble mode used by the peer. May be long or short.

wme - - -boolean - - - - - - - -

Specifies whether the peer supports WME/WMM capabilities.

mfp - - -boolean - - - - - - - -

Specifies whether management frame protection is active.

tdls - - -boolean - - - - - - - -

Specifies whether TDLS is active.

mesh llid - - -number - - - - - - <optional>
- - - -

The mesh LLID, may be 0 or absent if not applicable or supported -by the driver.

mesh plid - - -number - - - - - - <optional>
- - - -

The mesh PLID, may be 0 or absent if not applicable or supported -by the driver.

mesh plink - - -string - - - - - - <optional>
- - - -

The mesh peer link state description, may be an empty string ('') -or absent if not applicable or supported by the driver.

-

The following states are known:

-
    -
  • LISTEN
  • -
  • OPN_SNT
  • -
  • OPN_RCVD
  • -
  • CNF_RCVD
  • -
  • ESTAB
  • -
  • HOLDING
  • -
  • BLOCKED
  • -
  • UNKNOWN
  • -
mesh local PS - - -number - - - - - - <optional>
- - - -

The local powersafe mode for the peer link, may be an empty -string ('') or absent if not applicable or supported by -the driver.

-

The following modes are known:

-
    -
  • ACTIVE (no power save)
  • -
  • LIGHT SLEEP
  • -
  • DEEP SLEEP
  • -
  • UNKNOWN
  • -
mesh peer PS - - -number - - - - - - <optional>
- - - -

The remote powersafe mode for the peer link, may be an empty -string ('') or absent if not applicable or supported by -the driver.

-

The following modes are known:

-
    -
  • ACTIVE (no power save)
  • -
  • LIGHT SLEEP
  • -
  • DEEP SLEEP
  • -
  • UNKNOWN
  • -
mesh non-peer PS - - -number - - - - - - <optional>
- - - -

The powersafe mode for all non-peer neigbours, may be an empty -string ('') or absent if not applicable or supported by the driver.

-

The following modes are known:

-
    -
  • ACTIVE (no power save)
  • -
  • LIGHT SLEEP
  • -
  • DEEP SLEEP
  • -
  • UNKNOWN
  • -
rx - - -LuCI.network.WifiRateEntry - - - - - - - -

Describes the receiving wireless rate from the peer.

tx - - -LuCI.network.WifiRateEntry - - - - - - - -

Describes the transmitting wireless rate to the peer.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.network.WifiRateEntryObject.<string, (boolean|number)>

-
- - -
-
- -
-

A wireless rate entry describes the properties of a wireless -transmission rate to or from a peer.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
drop_misc - - -number - - - - - - <optional>
- - - -

The amount of received misc. packages that have been dropped, e.g. -due to corruption or missing authentication. Only applicable to -receiving rates.

packets - - -number - - - - - - - -

The amount of packets that have been received or sent.

bytes - - -number - - - - - - - -

The amount of bytes that have been received or sent.

failed - - -number - - - - - - <optional>
- - - -

The amount of failed tranmission attempts. Only applicable to -transmit rates.

retries - - -number - - - - - - <optional>
- - - -

The amount of retried transmissions. Only applicable to transmit -rates.

is_ht - - -boolean - - - - - - - -

Specifies whether this rate is an HT (IEEE 802.11n) rate.

is_vht - - -boolean - - - - - - - -

Specifies whether this rate is an VHT (IEEE 802.11ac) rate.

mhz - - -number - - - - - - - -

The channel width in MHz used for the transmission.

rate - - -number - - - - - - - -

The bitrate in bit/s of the transmission.

mcs - - -number - - - - - - <optional>
- - - -

The MCS index of the used transmission rate. Only applicable to -HT or VHT rates.

40mhz - - -number - - - - - - <optional>
- - - -

Specifies whether the tranmission rate used 40MHz wide channel. -Only applicable to HT or VHT rates.

-

Note: this option exists for backwards compatibility only and its -use is discouraged. The mhz field should be used instead to -determine the channel width.

short_gi - - -boolean - - - - - - <optional>
- - - -

Specifies whether a short guard interval is used for the transmission. -Only applicable to HT or VHT rates.

nss - - -number - - - - - - <optional>
- - - -

Specifies the number of spatial streams used by the transmission. -Only applicable to VHT rates.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.network.WifiScanResultObject.<string, (number|string|LuCI.network.WifiEncryption)>

-
- - -
-
- -
-

A wireless scan result object describes a neighbouring wireless -network found in the vincinity.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ssid - - -string - - - -

The SSID / Mesh ID of the network.

bssid - - -string - - - -

The BSSID if the network.

mode - - -string - - - -

The operation mode of the network (Master, Ad-Hoc, Mesh Point).

channel - - -number - - - -

The wireless channel of the network.

signal - - -number - - - -

The received signal strength of the network in dBm.

quality - - -number - - - -

The numeric quality level of the signal, can be used in conjunction -with quality_max to calculate a quality percentage.

quality_max - - -number - - - -

The maximum possible quality level of the signal, can be used in -conjunction with quality to calculate a quality percentage.

encryption - - -LuCI.network.WifiEncryption - - - -

The encryption used by the wireless network.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.poll.html b/docs/jsapi/LuCI.poll.html deleted file mode 100644 index 7e958bcb26677420d4cb41aec966e6b43a4e02d9..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.poll.html +++ /dev/null @@ -1,4242 +0,0 @@ - - - - - Class: poll - - - - - - - - - - - - - - - - - -
- - -
-

Class: poll

- - - - -
- -
-

- LuCI. - - poll -

- -

The Poll class allows registering and unregistering poll actions, -as well as starting, stopping and querying the state of the polling -loop.

- -
- -
-
- - - - -
-
-

- - new LuCI.poll() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - active(){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the polling loop is running.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - -
    -
  • Returns true if polling is active, else false.
  • -
- - - - -
- - - -
-
-

- - add(fn, interval){boolean} -

- - - - -
- - -
-
- - -
-

Add a new operation to the polling loop. If the polling loop is not -already started at this point, it will be implicitely started.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
fn - - -function - - - - - -

The function to invoke on each poll interval.

interval - - -number - - - - - -

The poll interval in seconds.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws TypeError when an invalid interval was passed.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the function has been added or false if it -already is registered.
- - - - -
- - - -
-
-

- - remove(fn){boolean} -

- - - - -
- - -
-
- - -
-

Remove an operation from the polling loop. If no further operatons -are registered, the polling loop is implicitely stopped.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
fn - - -function - - - - - -

The function to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws TypeError when the given argument isn't a function.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the function has been removed or false if it -wasn't found.
- - - - -
- - - -
-
-

- - start(){boolean} -

- - - - -
- - -
-
- - -
-

(Re)start the polling loop. Dispatches a custom poll-start event -to the document object upon successful start.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if polling has been started (or if no functions -where registered) or false when the polling loop already runs.
- - - - -
- - - -
-
-

- - stop(){boolean} -

- - - - -
- - -
-
- - -
-

Stop the polling loop. Dispatches a custom poll-stop event -to the document object upon successful stop.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if polling has been stopped or false if it din't -run to begin with.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.request.html b/docs/jsapi/LuCI.request.html deleted file mode 100644 index dc1ef1794610f42faaf66050558a89ba36f9ea47..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.request.html +++ /dev/null @@ -1,5177 +0,0 @@ - - - - - Class: request - - - - - - - - - - - - - - - - - -
- - -
-

Class: request

- - - - -
- -
-

- LuCI. - - request -

- -

The Request class allows initiating HTTP requests and provides utilities -for dealing with responses.

- -
- -
-
- - - - -
-
-

- - new LuCI.request() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - -

Classes

- -
-
poll
-
-
- - - - - - - -

Methods

- -
- -
-
-

- - addInterceptor(interceptorFn){LuCI.request.interceptorFn} -

- - - - -
- - -
-
- - -
-

Register an HTTP response interceptor function. Interceptor -functions are useful to perform default actions on incoming HTTP -responses, such as checking for expired authentication or for -implementing request retries before returning a failure.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interceptorFn - - -LuCI.request.interceptorFn - - - - - -

The interceptor function to register.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.request.interceptorFn - - - The registered function.
- - - - -
- - - -
-
-

- - expandURL(url){string} -

- - - - -
- - -
-
- - -
-

Turn the given relative URL into an absolute URL if necessary.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - -string - - - - - -

The URL to convert.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The absolute URL derived from the given one, or the original URL -if it already was absolute.
- - - - -
- - - -
-
-

- - get(target, options){Promise.<LuCI.response>} -

- - - - -
- - -
-
- - -
-

Initiate an HTTP GET request to the given target.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
target - - -string - - - - - - - - - - -

The URL to request.

options - - -LuCI.request.RequestOptions - - - - - - - optional - - - - - -

Additional options to configure the request.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.response> - - - The resulting HTTP response.
- - - - -
- - - -
-
-

- - post(target, data, options){Promise.<LuCI.response>} -

- - - - -
- - -
-
- - -
-

Initiate an HTTP POST request to the given target.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
target - - -string - - - - - - - - - - -

The URL to request.

data - - -* - - - - - - - optional - - - - - -

The request data to send, see LuCI.request.RequestOptions for details.

options - - -LuCI.request.RequestOptions - - - - - - - optional - - - - - -

Additional options to configure the request.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.response> - - - The resulting HTTP response.
- - - - -
- - - -
-
-

- - removeInterceptor(interceptorFn){boolean} -

- - - - -
- - -
-
- - -
-

Remove an HTTP response interceptor function. The passed function -value must be the very same value that was used to register the -function.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interceptorFn - - -LuCI.request.interceptorFn - - - - - -

The interceptor function to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if any function has been removed, else false.
- - - - -
- - - -
-
-

- - request(target, options){Promise.<LuCI.response>} -

- - - - -
- - -
-
- - -
-

Initiate an HTTP request to the given target.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
target - - -string - - - - - - - - - - -

The URL to request.

options - - -LuCI.request.RequestOptions - - - - - - - optional - - - - - -

Additional options to configure the request.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.response> - - - The resulting HTTP response.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

- - LuCI.request.interceptorFn(res) -

- - - - -
- - -
-
- - -
-

Interceptor functions are invoked whenever an HTTP reply is received, in the order -these functions have been registered.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
res - - -LuCI.response - - - - - -

The HTTP response object

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

LuCI.request.RequestOptionsObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
method - - -string - - - - - - <optional>
- - - -
- - GET - -

The HTTP method to use, e.g. GET or POST.

query - - -Object.<string, (Object|string)> - - - - - - <optional>
- - - -
- -

Query string data to append to the URL. Non-string values of the -given object will be converted to JSON.

cache - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the HTTP response may be retrieved from cache.

username - - -string - - - - - - <optional>
- - - -
- -

Provides a username for HTTP basic authentication.

password - - -string - - - - - - <optional>
- - - -
- -

Provides a password for HTTP basic authentication.

timeout - - -number - - - - - - <optional>
- - - -
- -

Specifies the request timeout in seconds.

credentials - - -boolean - - - - - - <optional>
- - - -
- - false - -

Whether to include credentials such as cookies in the request.

responseType - - -string - - - - - - <optional>
- - - -
- - text - -

Overrides the request response type. Valid values or text to -interpret the response as UTF-8 string or blob to handle the -response as binary Blob data.

content - - -* - - - - - - <optional>
- - - -
- -

Specifies the HTTP message body to send along with the request. -If the value is a function, it is invoked and the return value -used as content, if it is a FormData instance, it is used as-is, -if it is an object, it will be converted to JSON, in all other -cases it is converted to a string.

header - - -Object.<string, string> - - - - - - <optional>
- - - -
- -

Specifies HTTP headers to set for the request.

progress - - -function - - - - - - <optional>
- - - -
- -

An optional request callback function which receives ProgressEvent -instances as sole argument during the HTTP request transfer.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.request.poll.html b/docs/jsapi/LuCI.request.poll.html deleted file mode 100644 index ef83287f01b65dfd005bc361491c871be45b78b0..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.request.poll.html +++ /dev/null @@ -1,4361 +0,0 @@ - - - - - Class: poll - - - - - - - - - - - - - - - - - -
- - -
-

Class: poll

- - - - -
- -
-

- LuCI.request. - - poll -

- -

The Request.poll class provides some convience wrappers around -LuCI.poll mainly to simplify registering repeating HTTP -request calls as polling functions.

- -
- -
-
- - - - -
-
-

- - new LuCI.request.poll() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - active() -

- - - - -
- - -
-
- - -
-

Alias for LuCI.poll.active().

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - add(interval, url, options, callback){function} -

- - - - -
- - -
-
- - -
-

Register a repeating HTTP request with an optional callback -to invoke whenever a response for the request is received.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interval - - -number - - - - - - - - - - -

The poll interval in seconds.

url - - -string - - - - - - - - - - -

The URL to request on each poll.

options - - -LuCI.request.RequestOptions - - - - - - - optional - - - - - -

Additional options to configure the request.

callback - - -LuCI.request.poll~callbackFn - - - - - - - optional - - - - - -

Callback function to -invoke for each HTTP reply.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws TypeError when an invalid interval was passed.

-
-
-
-
-
- Type -
-
- -TypeError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - function - - - Returns the internally created poll function.
- - - - -
- - - -
-
-

- - remove(entry){boolean} -

- - - - -
- - -
-
- - -
-

Remove a polling request that has been previously added using add(). -This function is essentially a wrapper around -LuCI.poll.remove().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
entry - - -function - - - - - -

The poll function returned by add().

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if any function has been removed, else false.
- - - - -
- - - -
-
-

- - start() -

- - - - -
- - -
-
- - -
-

Alias for LuCI.poll.start().

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - stop() -

- - - - -
- - -
-
- - -
-

Alias for LuCI.poll.stop().

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

- - callbackFn(res, data, duration) -

- - - - -
- - -
-
- - -
-

The callback function is invoked whenever an HTTP reply to a -polled request is received or when the polled request timed -out.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
res - - -LuCI.response - - - - - -

The HTTP response object.

data - - -* - - - - - -

The response JSON if the response could be parsed as such, -else null.

duration - - -number - - - - - -

The total duration of the request in milliseconds.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.response.html b/docs/jsapi/LuCI.response.html deleted file mode 100644 index a7d483d76bdfbad15899286d7d4a64d9e1e20cd0..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.response.html +++ /dev/null @@ -1,4319 +0,0 @@ - - - - - Class: response - - - - - - - - - - - - - - - - - -
- - -
-

Class: response

- - - - -
- -
-

- LuCI. - - response -

- -

The Response class is an internal utility class representing HTTP responses.

- -
- -
-
- - - - -
-
-

- - new LuCI.response() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - -

Members

- -
- -
-
-

durationnumber

-
- - -
-
- -
-

The total duration of the HTTP request in milliseconds

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

headersLuCI.headers

-
- - -
-
- -
-

The HTTP headers of the response

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

okboolean

-
- - -
-
- -
-

Describes whether the response is successful (status codes 200..299) or not

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

statusnumber

-
- - -
-
- -
-

The numeric HTTP status code of the response

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

statusTextstring

-
- - -
-
- -
-

The HTTP status description message of the response

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

urlstring

-
- - -
-
- -
-

The final URL of the request, i.e. after following redirects.

-
- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - -

Methods

- -
- -
-
-

- - blob(){Blob} -

- - - - -
- - -
-
- - -
-

Access the response content as blob.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Blob - - - The response content as blob.
- - - - -
- - - -
-
-

- - clone(content){LuCI.response} -

- - - - -
- - -
-
- - -
-

Clones the given response object, optionally overriding the content -of the cloned instance.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
content - - -* - - - - - - - optional - - - - - -

Override the content of the cloned response. Object values will be -treated as JSON response data, all other types will be converted -using String() and treated as response text.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.response - - - The cloned Response instance.
- - - - -
- - - -
-
-

- - json(){*} -

- - - - -
- - -
-
- - -
-

Access the response content as JSON data.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws SyntaxError if the content isn't valid JSON.

-
-
-
-
-
- Type -
-
- -SyntaxError - - -
-
-
-
- - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - The parsed JSON data.
- - - - -
- - - -
-
-

- - text(){string} -

- - - - -
- - -
-
- - -
-

Access the response content as string.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - The response content.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.rpc.html b/docs/jsapi/LuCI.rpc.html deleted file mode 100644 index 976a3aab7978804ba7b164dd35c0dfeb7ac377b6..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.rpc.html +++ /dev/null @@ -1,5650 +0,0 @@ - - - - - Class: rpc - - - - - - - - - - - - - - - - - -
- - -
-

Class: rpc

- - - - -
- -
-

- LuCI. - - rpc -

- -

The LuCI.rpc class provides high level ubus JSON-RPC abstractions -and means for listing and invoking remove RPC methods.

- -
- -
-
- - - - -
-
-

- - new LuCI.rpc() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addInterceptor(interceptorFn){LuCI.rpc~interceptorFn} -

- - - - -
- - -
-
- - -
-

Registers a new interceptor function.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interceptorFn - - -LuCI.rpc~interceptorFn - - - - - -

The inteceptor function to register.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.rpc~interceptorFn - - - Returns the given function value.
- - - - -
- - - -
-
-

- - declare(options){LuCI.rpc~invokeFn} -

- - - - -
- - -
-
- - -
-

Describes a remote RPC call procedure and returns a function -implementing it.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
options - - -LuCI.rpc.DeclareOptions - - - - - -

If any object names are given, this function will return the method -signatures of each given object.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - LuCI.rpc~invokeFn - - - Returns a new function implementing the method call described in -options.
- - - - -
- - - -
-
-

- - getBaseURL(){string} -

- - - - -
- - -
-
- - -
-

Returns the current RPC base URL.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the RPC URL endpoint to issue requests against.
- - - - -
- - - -
-
-

- - getSessionID(){string} -

- - - - -
- - -
-
- - -
-

Returns the current RPC session id.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the 32 byte session ID string used for authenticating remote -requests.
- - - - -
- - - -
-
-

- - getStatusText(statusCode){string} -

- - - - -
- - -
-
- - -
-

Translates a numeric ubus error code into a human readable -description.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
statusCode - - -number - - - - - -

The numeric status code.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the textual description of the code.
- - - - -
- - - -
-
-

- - list(objectNames){Promise.<(Array.<string>|Object.<string, Object.<string, Object.<string, string>>>)>} -

- - - - -
- - -
-
- - -
-

Lists available remote ubus objects or the method signatures of -specific objects.

-

This function has two signatures and is sensitive to the number of -arguments passed to it:

-
    -
  • list() - -Returns an array containing the names of all remote ubus objects
  • -
  • list("objname", ...) -Returns method signatures for each given ubus object name.
  • -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
objectNames - - -string - - - - - - - optional - - - - - repeatable - - -

If any object names are given, this function will return the method -signatures of each given object.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<(Array.<string>|Object.<string, Object.<string, Object.<string, string>>>)> - - - When invoked without arguments, this function will return a promise -resolving to an array of ubus object names. When invoked with one or -more arguments, a promise resolving to an object describing the method -signatures of each requested ubus object name will be returned.
- - - - -
- - - -
-
-

- - removeInterceptor(interceptorFn){boolean} -

- - - - -
- - -
-
- - -
-

Removes a registered interceptor function.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
interceptorFn - - -LuCI.rpc~interceptorFn - - - - - -

The inteceptor function to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the given function has been removed or false -if it has not been found.
- - - - -
- - - -
-
-

- - setBaseURL(sid) -

- - - - -
- - -
-
- - -
-

Set the RPC base URL to use.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sid - - -string - - - - - -

Sets the RPC URL endpoint to issue requests against.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - setSessionID(sid) -

- - - - -
- - -
-
- - -
-

Set the RPC session id to use.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
sid - - -string - - - - - -

Sets the 32 byte session ID string used for authenticating remote -requests.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.rpc.DeclareOptionsObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
object - - -string - - - - - - - - - -

The name of the remote ubus object to invoke.

method - - -string - - - - - - - - - -

The name of the remote ubus method to invoke.

params - - -Array.<string> - - - - - - <optional>
- - - -
- -

Lists the named parameters expected by the remote ubus RPC method. -The arguments passed to the resulting generated method call function -will be mapped to named parameters in the order they appear in this -array.

-

Extraneous parameters passed to the generated function will not be -sent to the remote procedure but are passed to the -filter function if one is specified.

-

Examples:

-
    -
  • params: [ "foo", "bar" ] - -When the resulting call function is invoked with fn(true, false), -the corresponding args object sent to the remote procedure will be -{ foo: true, bar: false }.
  • -
  • params: [ "test" ], filter: function(reply, args, extra) { ... } - -When the resultung generated function is invoked with -fn("foo", "bar", "baz") then { "test": "foo" } will be sent as -argument to the remote procedure and the filter function will be -invoked with filterFn(reply, [ "foo" ], "bar", "baz")
  • -
expect - - -Object.<string, *> - - - - - - <optional>
- - - -
- -

Describes the expected return data structure. The given object is -supposed to contain a single key selecting the value to use from -the returned ubus reply object. The value of the sole key within -the expect object is used to infer the expected type of the received -ubus reply data.

-

If the received data does not contain expect's key, or if the -type of the data differs from the type of the value in the expect -object, the expect object's value is returned as default instead.

-

The key in the expect object may be an empty string ('') in which -case the entire reply object is selected instead of one of its subkeys.

-

If the expect option is omitted, the received reply will be returned -as-is, regardless of its format or type.

-

Examples:

-
    -
  • expect: { '': { error: 'Invalid response' } } - -This requires the entire ubus reply to be a plain JavaScript -object. If the reply isn't an object but e.g. an array or a numeric -error code instead, it will get replaced with -{ error: 'Invalid response' } instead.
  • -
  • expect: { results: [] } - -This requires the received ubus reply to be an object containing -a key results with an array as value. If the received reply does -not contain such a key, or if reply.results points to a non-array -value, the empty array ([]) will be used instead.
  • -
  • expect: { success: false } - -This requires the received ubus reply to be an object containing -a key success with a boolean value. If the reply does not contain -success or if reply.success is not a boolean value, false will -be returned as default instead.
  • -
filter - - -LuCI.rpc~filterFn - - - - - - <optional>
- - - -
- -

Specfies an optional filter function which is invoked to transform the -received reply data before it is returned to the caller.

reject - - -boolean - - - - - - <optional>
- - - -
- - false - -

If set to true, non-zero ubus call status codes are treated as fatal -error and lead to the rejection of the call promise. The default -behaviour is to resolve with the call return code value instead.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

- - filterFn(data, args, extraArgs){*} -

- - - - -
- - -
-
- - -
-

The filter function is invoked to transform a received ubus RPC call -reply before returning it to the caller.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
data - - -* - - - - - - - - - - -

The received ubus reply data or a subset of it as described in the -expect option of the RPC call declaration. In case of remote call -errors, data is numeric ubus error code instead.

args - - -Array.<*> - - - - - - - - - - -

The arguments the RPC method has been invoked with.

extraArgs - - -* - - - - - - - - - - repeatable - - -

All extraneous arguments passed to the RPC method exceeding the number -of arguments describes in the RPC call declaration.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - The return value of the filter function will be returned to the caller -of the RPC method as-is.
- - - - -
- - - -
-
-

- - interceptorFn(msg, req){Promise.<*>|*} -

- - - - -
- - -
-
- - -
-

Registered interceptor functions are invoked before the standard reply -parsing and handling logic.

-

By returning rejected promises, interceptor functions can cause the -invocation function to fail, regardless of the received reply.

-

Interceptors may also modify their message argument in-place to -rewrite received replies before they're processed by the standard -response handling code.

-

A common use case for such functions is to detect failing RPC replies -due to expired authentication in order to trigger a new login.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
msg - - -* - - - - - -

The unprocessed, JSON decoded remote RPC method call reply.

-

Since interceptors run before the standard parsing logic, the reply -data is not verified for correctness or filtered according to -expect and filter specifications in the declarations.

req - - -Object - - - - - -

The related request object which is an extended variant of the -declaration object, allowing access to internals of the invocation -function such as filter, expect or params values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<*> - | - - * - - - Interceptor functions may return a promise to defer response -processing until some delayed work completed. Any values the returned -promise resolves to are ignored. -When the returned promise rejects with an error, the invocation -function will fail too, forwarding the error to the caller.
- - - - -
- - - -
-
-

- - invokeFn(params){Promise.<*>} -

- - - - -
- - -
-
- - -
-

The generated invocation function is returned by -rpc.declare() and encapsulates a single -RPC method call.

-

Calling this function will execute a remote ubus HTTP call request -using the arguments passed to it as arguments and return a promise -resolving to the received reply values.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
params - - -* - - - - - - - - - - repeatable - - -

The parameters to pass to the remote procedure call. The given -positional arguments will be named to named RPC parameters according -to the names specified in the params array of the method declaration.

-

Any additional parameters exceeding the amount of arguments in the -params declaration are passed as private extra arguments to the -declared filter function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<*> - - - Returns a promise resolving to the result data of the remote ubus -RPC method invocation, optionally substituted and filtered according -to the expect and filter declarations.
- - - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.session.html b/docs/jsapi/LuCI.session.html deleted file mode 100644 index 298f6dbd500c70fe0942bb5b1045b12280d37793..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.session.html +++ /dev/null @@ -1,4089 +0,0 @@ - - - - - Class: session - - - - - - - - - - - - - - - - - -
- - -
-

Class: session

- - - - -
- -
-

- LuCI. - - session -

- -

The session class provides various session related functionality.

- -
- -
-
- - - - -
-
-

- - new LuCI.session() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - getID(){string} -

- - - - -
- - -
-
- - -
-

Retrieve the current session ID.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the current session ID.
- - - - -
- - - -
-
-

- - getLocalData(key){*} -

- - - - -
- - -
-
- - -
-

Retrieve data from the local session storage.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - - - optional - - - - - -

The key to retrieve from the session data store. If omitted, all -session data will be returned.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - - - Returns the stored session data or null if the given key wasn't -found.
- - - - -
- - - -
-
-

- - getToken(){string|null} -

- - - - -
- - -
-
- - -
-

Retrieve the current session token.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - Returns the current session token or null if not logged in.
- - - - -
- - - -
-
-

- - setLocalData(key, value){boolean} -

- - - - -
- - -
-
- - -
-

Set data in the local session storage.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
key - - -string - - - - - -

The key to set in the session data store.

value - - -* - - - - - -

The value to store. It will be internally converted to JSON before -being put in the session store.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the data could be stored or false on error.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.uci.html b/docs/jsapi/LuCI.uci.html deleted file mode 100644 index 81ef9cb020831db413b4ceb41813aa15344dc4d5..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.uci.html +++ /dev/null @@ -1,7137 +0,0 @@ - - - - - Class: uci - - - - - - - - - - - - - - - - - -
- - -
-

Class: uci

- - - - -
- -
-

- LuCI. - - uci -

- -

The LuCI.uci class utilizes LuCI.rpc to declare low level -remote UCI ubus procedures and implements a local caching and data -manipulation layer on top to allow for synchroneous operations on -UCI configuration data.

- -
- -
-
- - - - -
-
-

- - new LuCI.uci() -

- - -
- uci.js, line 5 -
- -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - add(config, type, name){string} -

- - - - -
- - -
-
- - -
-

Adds a new section of the given type to the given configuration, -optionally named according to the given name.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to add the section to.

type - - -string - - - - - - - - - - -

The type of the section to add.

name - - -string - - - - - - - optional - - - - - -

The name of the section to add. If the name is omitted, an anonymous -section will be added instead.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - Returns the section ID of the newly added section which is equivalent -to the given name for non-anonymous sections.
- - - - -
- - - -
-
-

- - apply(timeout){Promise.<number>} -

- - - - -
- - -
-
- - -
-

Instructs the remote ubus UCI api to commit all saved changes with -rollback protection and attempts to confirm the pending commit -operation to cancel the rollback timer.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
timeout - - -number - - - - - - 10 - - - - - optional - - - - - -

Override the confirmation timeout after which a rollback is triggered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<number> - - - Returns a promise resolving/rejecting with the ubus RPC status code.
- - - - -
- - - -
-
-

- - changes(){Promise.<Object.<string, Array.<LuCI.uci.ChangeRecord>>>} -

- - - - -
- - -
-
- - -
-

Fetches uncommitted UCI changes from the remote ubus RPC api.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Object.<string, Array.<LuCI.uci.ChangeRecord>>> - - - Returns a promise resolving to an object containing the configuration -names as keys and arrays of related change records as values.
- - - - -
- - - -
-
-

- - createSID(config){string} -

- - - - -
- - -
-
- - -
-

Generates a new, unique section ID for the given configuration.

-

Note that the generated ID is temporary, it will get replaced by an -identifier in the form cfgXXXXXX once the configuration is saved -by the remote ubus UCI api.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The configuration to generate the new section ID for.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - - - A newly generated, unique section ID in the form newXXXXXX -where X denotes a hexadecimal digit.
- - - - -
- - - -
-
-

- - get(config, sid, option){null|string|Array.<string>|LuCI.uci.SectionObject} -

- - - - -
- - -
-
- - -
-

Gets the value of the given option within the specified section -of the given configuration or the entire section object if the -option name is omitted.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to read the value from.

sid - - -string - - - - - - - - - - -

The name or ID of the section to read.

option - - -string - - - - - - - optional - - - - - -

The option name to read the value from. If the option name is -omitted or null, the entire section is returned instead.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - LuCI.uci.SectionObject - - -
    -
  • Returns a string containing the option value in case of a -plain UCI option.
  • -
  • Returns an array of strings containing the option values in -case of option pointing to an UCI list.
  • -
  • Returns a section object if -the option argument has been omitted or is null.
  • -
  • Returns null if the config, section or option has not been -found or if the corresponding configuration is not loaded.
  • -
- - - - -
- - - -
-
-

- - get_first(config, type, option){null|string|Array.<string>|LuCI.uci.SectionObject} -

- - - - -
- - -
-
- - -
-

Gets the value of the given option or the entire section object of -the first found section of the specified type or the first found -section of the entire configuration if no type is specfied.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to read the value from.

type - - -string - - - - - - - optional - - - - - -

The type of the first section to find. If it is null, the first -section of the entire config is read, otherwise the first section -matching the given type.

option - - -string - - - - - - - optional - - - - - -

The option name to read the value from. If the option name is -omitted or null, the entire section is returned instead.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - null - | - - string - | - - Array.<string> - | - - LuCI.uci.SectionObject - - -
    -
  • Returns a string containing the option value in case of a -plain UCI option.
  • -
  • Returns an array of strings containing the option values in -case of option pointing to an UCI list.
  • -
  • Returns a section object if -the option argument has been omitted or is null.
  • -
  • Returns null if the config, section or option has not been -found or if the corresponding configuration is not loaded.
  • -
- - - - -
- - - -
-
-

- - load(config){Promise.<Array.<string>>} -

- - - - -
- - -
-
- - -
-

Loads the given UCI configurations from the remote ubus api.

-

Loaded configurations are cached and only loaded once. Subsequent -load operations of the same configurations will return the cached -data.

-

To force reloading a configuration, it has to be unloaded with -uci.unload() first.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string -| - -Array.<string> - - - - - -

The name of the configuration or an array of configuration -names to load.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Array.<string>> - - - Returns a promise resolving to the names of the configurations -that have been successfully loaded.
- - - - -
- - - -
-
-

- - move(config, sid1, sid2, after){boolean} -

- - - - -
- - -
-
- - -
-

Move the first specified section within the given configuration -before or after the second specified section.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
config - - -string - - - - - - - - - - - - -

The configuration to move the section within.

sid1 - - -string - - - - - - - - - - - - -

The ID of the section to move within the configuration.

sid2 - - -string - - - - - - - - - optional - - - - - -

The ID of the target section for the move operation. If the -after argument is false or not specified, the section named by -sid1 will be moved before this target section, if the after -argument is true, the sid1 section will be moved after this -section.

-

When the sid2 argument is null, the section specified by sid1 -is moved to the end of the configuration.

after - - -boolean - - - - - - false - - - - - optional - - - - - -

When true, the section sid1 is moved after the section sid2, -when false, the section sid1 is moved before sid2.

-

If sid2 is null, then this parameter has no effect and the section -sid1 is moved to the end of the configuration instead.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the section was successfully moved, or false -when either the section specified by sid1 or by sid2 is not found.
- - - - -
- - - -
-
-

- - remove(config, sid) -

- - - - -
- - -
-
- - -
-

Removes the section with the given ID from the given configuration.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The name of the configuration to remove the section from.

sid - - -string - - - - - -

The ID of the section to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - resolveSID(config, sid){string|null} -

- - - - -
- - -
-
- - -
-

Resolves a given section ID in extended notation to the internal -section ID value.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The configuration to resolve the section ID for.

sid - - -string - - - - - -

The section ID to resolve. If the ID is in the form @typename[#], -it will get resolved to an internal anonymous ID in the forms -cfgXXXXXX/newXXXXXX or to the name of a section in case it points -to a named section. When the given ID is not in extended notation, -it will be returned as-is.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - null - - - Returns the resolved section ID or the original given ID if it was -not in extended notation. Returns null when an extended ID could -not be resolved to existing section ID.
- - - - -
- - - -
-
-

- - save(){Array.<string>} -

- - - - -
- - -
-
- - -
-

Submits all local configuration changes to the remove ubus api, -adds, removes and reorders remote sections as needed and reloads -all loaded configurations to resynchronize the local state with -the remote configuration values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<string> - - - Returns a promise resolving to an array of configuration names which -have been reloaded by the save operation.
- - - - -
- - - -
-
-

- - sections(config, type, cb){Array.<LuCI.uci.SectionObject>} -

- - - - -
- - -
-
- - -
-

Enumerates the sections of the given configuration, optionally -filtered by type.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to enumerate the sections for.

type - - -string - - - - - - - optional - - - - - -

Enumerate only sections of the given type. If omitted, enumerate -all sections.

cb - - -LuCI.uci~sectionsFn - - - - - - - optional - - - - - -

An optional callback to invoke for each enumerated section.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.uci.SectionObject> - - - Returns a sorted array of the section objects within the given -configuration, filtered by type of a type has been specified.
- - - - -
- - - -
-
-

- - set(config, sid, option, value) -

- - - - -
- - -
-
- - -
-

Sets the value of the given option within the specified section -of the given configuration.

-

If either config, section or option is null, or if option begins -with a dot, the function will do nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The name of the configuration to set the option value in.

sid - - -string - - - - - -

The name or ID of the section to set the option value in.

option - - -string - - - - - -

The option name to set the value for.

value - - -null -| - -string -| - -Array.<string> - - - - - -

The option value to set. If the value is null or an empty string, -the option will be removed, otherwise it will be set or overwritten -with the given value.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - set_first(config, type, option, value) -

- - - - -
- - -
-
- - -
-

Sets the value of the given option within the first found section -of the given configuration matching the specified type or within -the first section of the entire config when no type has is specified.

-

If either config, type or option is null, or if option begins -with a dot, the function will do nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to set the option value in.

type - - -string - - - - - - - optional - - - - - -

The type of the first section to find. If it is null, the first -section of the entire config is written to, otherwise the first -section matching the given type is used.

option - - -string - - - - - - - - - - -

The option name to set the value for.

value - - -null -| - -string -| - -Array.<string> - - - - - - - - - - -

The option value to set. If the value is null or an empty string, -the option will be removed, otherwise it will be set or overwritten -with the given value.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - unload(config) -

- - - - -
- - -
-
- - -
-

Unloads the given UCI configurations from the local cache.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string -| - -Array.<string> - - - - - -

The name of the configuration or an array of configuration -names to unload.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - unset(config, sid, option) -

- - - - -
- - -
-
- - -
-

Remove the given option within the specified section of the given -configuration.

-

This function is a convenience wrapper around -uci.set(config, section, option, null).

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - -

The name of the configuration to remove the option from.

sid - - -string - - - - - -

The name or ID of the section to remove the option from.

option - - -string - - - - - -

The name of the option to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - unset_first(config, type, option) -

- - - - -
- - -
-
- - -
-

Removes the given option within the first found section of the given -configuration matching the specified type or within the first section -of the entire config when no type has is specified.

-

This function is a convenience wrapper around -uci.set_first(config, type, option, null).

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
config - - -string - - - - - - - - - - -

The name of the configuration to set the option value in.

type - - -string - - - - - - - optional - - - - - -

The type of the first section to find. If it is null, the first -section of the entire config is written to, otherwise the first -section matching the given type is used.

option - - -string - - - - - - - - - - -

The option name to set the value for.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.uci.ChangeRecordArray.<string>

-
- - -
-
- -
-

An UCI change record is a plain array containing the change operation -name as first element, the affected section ID as second argument -and an optional third and fourth argument whose meanings depend on -the operation.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
0 - - -string - - - -

The operation name - may be one of add, set, remove, order, -list-add, list-del or rename.

1 - - -string - - - -

The section ID targeted by the operation.

2 - - -string - - - -

The meaning of the third element depends on the operation.

-
    -
  • For add it is type of the section that has been added
  • -
  • For set it either is the option name if a fourth element exists, -or the type of a named section which has been added when the change -entry only contains three elements.
  • -
  • For remove it contains the name of the option that has been -removed.
  • -
  • For order it specifies the new sort index of the section.
  • -
  • For list-add it contains the name of the list option a new value -has been added to.
  • -
  • For list-del it contains the name of the list option a value has -been removed from.
  • -
  • For rename it contains the name of the option that has been -renamed if a fourth element exists, else it contains the new name -a section has been renamed to if the change entry only contains -three elements.
  • -
4 - - -string - - - -

The meaning of the fourth element depends on the operation.

-
    -
  • For set it is the value an option has been set to.
  • -
  • For list-add it is the new value that has been added to a -list option.
  • -
  • For rename it is the new name of an option that has been -renamed.
  • -
- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

LuCI.uci.SectionObjectObject.<string, (boolean|number|string|Array.<string>)>

-
- - -
-
- -
-

A section object represents the options and their corresponding values -enclosed within a configuration section, as well as some additional -meta data such as sort indexes and internal ID.

-

Any internal metadata fields are prefixed with a dot which is isn't -an allowed character for normal option names.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
.anonymous - - -boolean - - - -

The .anonymous property specifies whether the configuration is -anonymous (true) or named (false).

.index - - -number - - - -

The .index property specifes the sort order of the section.

.name - - -string - - - -

The .name property holds the name of the section object. It may be -either an anonymous ID in the form cfgXXXXXX or newXXXXXX with X -being a hexadecimal digit or a string holding the name of the section.

.type - - -string - - - -

The .type property contains the type of the corresponding uci -section.

* - - -string -| - -Array.<string> - - - -

A section object may contain an arbitrary number of further properties -representing the uci option enclosed in the section.

-

All option property names will be in the form [A-Za-z0-9_]+ and -either contain a string value or an array of strings, in case the -underlying option is an UCI list.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- - - -
-
-

- - sectionsFn(section, sid) -

- - - - -
- - -
-
- - -
-

The sections callback is invoked for each section found within -the given configuration and receives the section object and its -associated name as arguments.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
section - - -LuCI.uci.SectionObject - - - - - -

The section object.

sid - - -string - - - - - -

The name or ID of the section.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.AbstractElement.html b/docs/jsapi/LuCI.ui.AbstractElement.html deleted file mode 100644 index b76d2bb805a843af27423db1293e03bec87c0f47..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.AbstractElement.html +++ /dev/null @@ -1,5093 +0,0 @@ - - - - - Class: AbstractElement - - - - - - - - - - - - - - - - - -
- - -
-

Class: AbstractElement

- - - - -
- -
-

- LuCI.ui. - - AbstractElement -

- -

The AbstractElement class serves as abstract base for the different widgets -implemented by LuCI.ui. It provides the common logic for getting and -setting values, for checking the validity state and for wiring up required -events.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.AbstractElement. To import -it in external JavaScript, use L.require("ui").then(...) and access the -AbstractElement property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.AbstractElement() -

- - -
- ui.js, line 17 -
- -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - getValue(){string|Array.<string>|null} -

- - -
- ui.js, line 81 -
- -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - setValue(value) -

- - -
- ui.js, line 99 -
- -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.AbstractElement.InitOptionsObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
id - - -string - - - - - - <optional>
- - - -
- -

Specifies the widget ID to use. It will be used as HTML id attribute -on the toplevel widget DOM node.

name - - -string - - - - - - <optional>
- - - -
- -

Specifies the widget name which is set as HTML name attribute on the -corresponding <input> element.

optional - - -boolean - - - - - - <optional>
- - - -
- - true - -

Specifies whether the input field allows empty values.

datatype - - -string - - - - - - <optional>
- - - -
- - string - -

An expression describing the input data validation constraints. -It defaults to string which will allow any value. -See LuCI.validation for details on the expression format.

validator - - -function - - - - - - <optional>
- - - -
- -

Specifies a custom validator function which is invoked after the -standard validation constraints are checked. The function should return -true to accept the given input value. Any other return value type is -converted to a string and treated as validation error message.

disabled - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the widget should be rendered in disabled state -(true) or not (false). Disabled widgets cannot be interacted with -and are displayed in a slightly faded style.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Checkbox.html b/docs/jsapi/LuCI.ui.Checkbox.html deleted file mode 100644 index 66ede807fefb8d5cbd63c8c56e65462a1443ea43..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Checkbox.html +++ /dev/null @@ -1,5205 +0,0 @@ - - - - - Class: Checkbox - - - - - - - - - - - - - - - - - -
- - -
-

Class: Checkbox

- - - - -
- -
-

- LuCI.ui. - - Checkbox -

- -

The Checkbox class implements a simple checkbox input field.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Checkbox. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Checkbox property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Checkbox(value, options) -

- - - - -
- - -
-
- - -
-

Instantiate a checkbox widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string - - - - - - null - - - - - optional - - - - - -

The initial input value.

options - - -LuCI.ui.Checkbox.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the input.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - isChecked(){boolean} -

- - - - -
- - -
-
- - -
-

Test whether the checkbox is currently checked.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the checkbox is currently checked, otherwise false.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Checkbox.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
value_enabled - - -string - - - - - - <optional>
- - - -
- - 1 - -

Specifies the value corresponding to a checked checkbox.

value_disabled - - -string - - - - - - <optional>
- - - -
- - 0 - -

Specifies the value corresponding to an unchecked checkbox.

hiddenname - - -string - - - - - - <optional>
- - - -
- -

Specifies the HTML name attribute of the hidden input backing the -checkbox. This is a legacy property existing for compatibility reasons, -it is required for HTML based form submissions.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.ComboButton.html b/docs/jsapi/LuCI.ui.ComboButton.html deleted file mode 100644 index 70d72cebb3b13e07511e9798aea3c0172305a941..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.ComboButton.html +++ /dev/null @@ -1,5235 +0,0 @@ - - - - - Class: ComboButton - - - - - - - - - - - - - - - - - -
- - -
-

Class: ComboButton

- - - - -
- -
-

- LuCI.ui. - - ComboButton -

- -

The ComboButton class implements a button element which can be expanded -into a dropdown to chose from a set of different action choices.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.ComboButton. To import it in -external JavaScript, use L.require("ui").then(...) and access the -ComboButton property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.ComboButton(value, choices, options) -

- - - - -
- - -
-
- - -
-

Instantiate a combo button widget offering multiple action choices.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value(s).

choices - - -Object.<string, *> - - - - - - - - - - - - -

Object containing the selectable choices of the widget. The object keys -serve as values for the different choices while the values are used as -choice labels.

options - - -LuCI.ui.ComboButton.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the button.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - addChoices(values, labels) -

- - - - -
- - -
-
- - -
-

Add new choices to the dropdown menu.

-

This function adds further choices to an existing dropdown menu, -ignoring choice values which are already present.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
values - - -Array.<string> - - - - - -

The choice values to add to the dropdown widget.

labels - - -Object.<string, *> - - - - - -

The choice label values to use when adding dropdown choices. If no -label is found for a particular choice value, the value itself is used -as label text. Choice labels may be any valid value accepted by -LuCI.dom#content.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - clearChoices(reset_value) -

- - - - -
- - -
-
- - -
-

Remove all existing choices from the dropdown menu.

-

This function removes all preexisting dropdown choices from the widget, -keeping only choices currently being selected unless reset_values is -given, in which case all choices and deselected and removed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
reset_value - - -boolean - - - - - - false - - - - - optional - - - - - -

If set to true, deselect and remove selected choices as well instead -of keeping them.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - closeAllDropdowns() -

- - - - -
- - -
-
- - -
-

Close all open dropdown widgets in the current document.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.ComboButton.InitOptionsLuCI.ui.Dropdown.InitOptions

-
- - -
-
- -
-

ComboButtons support the same properties as -Dropdown.InitOptions but enforce -specific values for some properties and add aditional button specific -properties.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
multiple - - -boolean - - - - - - - - - - false - -

Since ComboButtons never allow selecting multiple actions, this property -is forcibly set to false.

create - - -boolean - - - - - - - - - - false - -

Since ComboButtons never allow creating custom choices, this property -is forcibly set to false.

optional - - -boolean - - - - - - - - - - false - -

Since ComboButtons must always select one action, this property is -forcibly set to false.

classes - - -Object.<string, string> - - - - - - <optional>
- - - -
- -

Specifies a mapping of choice values to CSS class names. If an action -choice is selected by the user and if a corresponding entry exists in -the classes object, the class names corresponding to the selected -value are set on the button element.

-

This is useful to apply different button styles, such as colors, to the -combined button depending on the selected action.

click - - -function - - - - - - <optional>
- - - -
- -

Specifies a handler function to invoke when the user clicks the button. -This function will be called with the button DOM node as this context -and receive the DOM click event as first as well as the selected action -choice value as second argument.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Combobox.html b/docs/jsapi/LuCI.ui.Combobox.html deleted file mode 100644 index 8ff47fc9fb670de483714994621b5d9f1d8e8987..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Combobox.html +++ /dev/null @@ -1,5138 +0,0 @@ - - - - - Class: Combobox - - - - - - - - - - - - - - - - - -
- - -
-

Class: Combobox

- - - - -
- -
-

- LuCI.ui. - - Combobox -

- -

The Combobox class implements a rich, stylable dropdown menu which allows -to enter custom values. Historically, comboboxes used to be a dedicated -widget type in LuCI but nowadays they are direct aliases of dropdown widgets -with a set of enforced default properties for easier instantiation.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Combobox. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Combobox property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Combobox(value, choices, options) -

- - - - -
- - -
-
- - -
-

Instantiate a rich dropdown choice widget allowing custom values.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value(s).

choices - - -Object.<string, *> - - - - - - - - - - - - -

Object containing the selectable choices of the widget. The object keys -serve as values for the different choices while the values are used as -choice labels.

options - - -LuCI.ui.Combobox.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the dropdown.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - addChoices(values, labels) -

- - - - -
- - -
-
- - -
-

Add new choices to the dropdown menu.

-

This function adds further choices to an existing dropdown menu, -ignoring choice values which are already present.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
values - - -Array.<string> - - - - - -

The choice values to add to the dropdown widget.

labels - - -Object.<string, *> - - - - - -

The choice label values to use when adding dropdown choices. If no -label is found for a particular choice value, the value itself is used -as label text. Choice labels may be any valid value accepted by -LuCI.dom#content.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - clearChoices(reset_value) -

- - - - -
- - -
-
- - -
-

Remove all existing choices from the dropdown menu.

-

This function removes all preexisting dropdown choices from the widget, -keeping only choices currently being selected unless reset_values is -given, in which case all choices and deselected and removed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
reset_value - - -boolean - - - - - - false - - - - - optional - - - - - -

If set to true, deselect and remove selected choices as well instead -of keeping them.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - closeAllDropdowns() -

- - - - -
- - -
-
- - -
-

Close all open dropdown widgets in the current document.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Combobox.InitOptionsLuCI.ui.Dropdown.InitOptions

-
- - -
-
- -
-

Comboboxes support the same properties as -Dropdown.InitOptions but enforce -specific values for the following properties:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
multiple - - -boolean - - - - - - false - -

Since Comboboxes never allow selecting multiple values, this property -is forcibly set to false.

create - - -boolean - - - - - - true - -

Since Comboboxes always allow custom choice values, this property is -forcibly set to true.

optional - - -boolean - - - - - - true - -

Since Comboboxes are always optional, this property is forcibly set to -true.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Dropdown.html b/docs/jsapi/LuCI.ui.Dropdown.html deleted file mode 100644 index 83d71ead2fe3e82049731f525023ec370b5a1d04..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Dropdown.html +++ /dev/null @@ -1,5936 +0,0 @@ - - - - - Class: Dropdown - - - - - - - - - - - - - - - - - -
- - -
-

Class: Dropdown

- - - - -
- -
-

- LuCI.ui. - - Dropdown -

- -

The Dropdown class implements a rich, stylable dropdown menu which -supports non-text choice labels.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Dropdown. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Dropdown property of the class instance value.

- -
- -
-
- - - - -
-
- - - - - -
- - -
-
- - -
-

Instantiate a rich dropdown choice widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value(s).

choices - - -Object.<string, *> - - - - - - - - - - - - -

Object containing the selectable choices of the widget. The object keys -serve as values for the different choices while the values are used as -choice labels.

options - - -LuCI.ui.Dropdown.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the dropdown.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addChoices(values, labels) -

- - - - -
- - -
-
- - -
-

Add new choices to the dropdown menu.

-

This function adds further choices to an existing dropdown menu, -ignoring choice values which are already present.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
values - - -Array.<string> - - - - - -

The choice values to add to the dropdown widget.

labels - - -Object.<string, *> - - - - - -

The choice label values to use when adding dropdown choices. If no -label is found for a particular choice value, the value itself is used -as label text. Choice labels may be any valid value accepted by -LuCI.dom#content.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - clearChoices(reset_value) -

- - - - -
- - -
-
- - -
-

Remove all existing choices from the dropdown menu.

-

This function removes all preexisting dropdown choices from the widget, -keeping only choices currently being selected unless reset_values is -given, in which case all choices and deselected and removed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
reset_value - - -boolean - - - - - - false - - - - - optional - - - - - -

If set to true, deselect and remove selected choices as well instead -of keeping them.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - closeAllDropdowns() -

- - - - -
- - -
-
- - -
-

Close all open dropdown widgets in the current document.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Dropdown.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
optional - - -boolean - - - - - - <optional>
- - - -
- - true - -

Specifies whether the dropdown selection is optional. In contrast to -other widgets, the optional constraint of dropdowns works differently; -instead of marking the widget invalid on empty values when set to false, -the user is not allowed to deselect all choices.

-

For single value dropdowns that means that no empty "please select" -choice is offered and for multi value dropdowns, the last selected choice -may not be deselected without selecting another choice first.

multiple - - -boolean - - - - - - <optional>
- - - -
- -

Specifies whether multiple choice values may be selected. It defaults -to true when an array is passed as input value to the constructor.

sort - - -boolean -| - -Array.<string> - - - - - - <optional>
- - - -
- - false - -

Specifies if and how to sort choice values. If set to true, the choice -values will be sorted alphabetically. If set to an array of strings, the -choice sort order is derived from the array.

select_placeholder - - -string - - - - - - <optional>
- - - -
- - -- Please choose -- - -

Specifies a placeholder text which is displayed when no choice is -selected yet.

custom_placeholder - - -string - - - - - - <optional>
- - - -
- - -- custom -- - -

Specifies a placeholder text which is displayed in the text input -field allowing to enter custom choice values. Only applicable if the -create option is set to true.

create - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether custom choices may be entered into the dropdown -widget.

create_query - - -string - - - - - - <optional>
- - - -
- - .create-item-input - -

Specifies a CSS selector expression used to find the input element -which is used to enter custom choice values. This should not normally -be used except by widgets derived from the Dropdown class.

create_template - - -string - - - - - - <optional>
- - - -
- - script[type="item-template"] - -

Specifies a CSS selector expression used to find an HTML element -serving as template for newly added custom choice values.

-

Any {{value}} placeholder string within the template elements text -content will be replaced by the user supplied choice value, the -resulting string is parsed as HTML and appended to the end of the -choice list. The template markup may specify one HTML element with a -data-label-placeholder attribute which is replaced by a matching -label value from the choices object or with the user supplied value -itself in case choices contains no matching choice label.

-

If the template element is not found or if no create_template selector -expression is specified, the default markup for newly created elements is -<li data-value="{{value}}"><span data-label-placeholder="true" /></li>.

create_markup - - -string - - - - - - <optional>
- - - -
- -

This property allows specifying the markup for custom choices directly -instead of referring to a template element through CSS selectors.

-

Apart from that it works exactly like create_template.

display_items - - -number - - - - - - <optional>
- - - -
- - 3 - -

Specifies the maximum amount of choice labels that should be shown in -collapsed dropdown state before further selected choices are cut off.

-

Only applicable when multiple is true.

dropdown_items - - -number - - - - - - <optional>
- - - -
- - -1 - -

Specifies the maximum amount of choices that should be shown when the -dropdown is open. If the amount of available choices exceeds this number, -the dropdown area must be scrolled to reach further items.

-

If set to -1, the dropdown menu will attempt to show all choice values -and only resort to scrolling if the amount of choices exceeds the available -screen space above and below the dropdown widget.

placeholder - - -string - - - - - - <optional>
- - - -
- -

This property serves as a shortcut to set both select_placeholder and -custom_placeholder. Either of these properties will fallback to -placeholder if not specified.

readonly - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the custom choice input field should be rendered -readonly. Only applicable when create is true.

maxlength - - -number - - - - - - <optional>
- - - -
- -

Specifies the HTML maxlength attribute to set on the custom choice -<input> element. Note that this a legacy property that exists for -compatibility reasons. It is usually better to maxlength(N) validation -expression. Only applicable when create is true.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.DynamicList.html b/docs/jsapi/LuCI.ui.DynamicList.html deleted file mode 100644 index 9ceda34eaa884d9ffdea1dc65229a46f882c869b..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.DynamicList.html +++ /dev/null @@ -1,5313 +0,0 @@ - - - - - Class: DynamicList - - - - - - - - - - - - - - - - - -
- - -
-

Class: DynamicList

- - - - -
- -
-

- LuCI.ui. - - DynamicList -

- -

The DynamicList class implements a widget which allows the user to specify -an arbitrary amount of input values, either from free formed text input or -from a set of predefined choices.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.DynamicList. To import it in -external JavaScript, use L.require("ui").then(...) and access the -DynamicList property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.DynamicList(value, choices, options) -

- - - - -
- - -
-
- - -
-

Instantiate a dynamic list widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value(s).

choices - - -Object.<string, *> - - - - - - - - - optional - - - - - -

Object containing the selectable choices of the widget. The object keys -serve as values for the different choices while the values are used as -choice labels. If omitted, no default choices are presented to the user, -instead a plain text input field is rendered allowing the user to add -arbitrary values to the dynamic list.

options - - -LuCI.ui.DynamicList.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the dynamic list.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addChoices(values, labels) -

- - - - -
- - -
-
- - -
-

Add new suggested choices to the dynamic list.

-

This function adds further choices to an existing dynamic list, -ignoring choice values which are already present.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
values - - -Array.<string> - - - - - -

The choice values to add to the dynamic lists suggestion dropdown.

labels - - -Object.<string, *> - - - - - -

The choice label values to use when adding suggested choices. If no -label is found for a particular choice value, the value itself is used -as label text. Choice labels may be any valid value accepted by -LuCI.dom#content.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - clearChoices() -

- - - - -
- - -
-
- - -
-

Remove all existing choices from the dynamic list.

-

This function removes all preexisting suggested choices from the widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.DynamicList.InitOptionsLuCI.ui.Dropdown.InitOptions

-
- - -
-
- -
-

In case choices are passed to the dynamic list contructor, the widget -supports the same properties as Dropdown.InitOptions -but enforces specific values for some dropdown properties.

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
multiple - - -boolean - - - - - - false - -

Since dynamic lists never allow selecting multiple choices when adding -another list item, this property is forcibly set to false.

optional - - -boolean - - - - - - true - -

Since dynamic lists use an embedded dropdown to present a list of -predefined choice values, the dropdown must be made optional to allow -it to remain unselected.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.FileUpload.html b/docs/jsapi/LuCI.ui.FileUpload.html deleted file mode 100644 index 38ce2352819534d1b6f0e037cc07c558bd531204..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.FileUpload.html +++ /dev/null @@ -1,5162 +0,0 @@ - - - - - Class: FileUpload - - - - - - - - - - - - - - - - - -
- - -
-

Class: FileUpload

- - - - -
- -
-

- LuCI.ui. - - FileUpload -

- -

The FileUpload class implements a widget which allows the user to upload, -browse, select and delete files beneath a predefined remote directory.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.FileUpload. To import it in -external JavaScript, use L.require("ui").then(...) and access the -FileUpload property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.FileUpload(value, options) -

- - - - -
- - -
-
- - -
-

Instantiate a file upload widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value.

options - - -LuCI.ui.DynamicList.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the file -upload control.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.FileUpload.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
show_hidden - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether hidden files should be displayed when browsing remote -files. Note that this is not a security feature, hidden files are always -present in the remote file listings received, this option merely controls -whether they're displayed or not.

enable_upload - - -boolean - - - - - - <optional>
- - - -
- - true - -

Specifies whether the widget allows the user to upload files. If set to -false, only existing files may be selected. Note that this is not a -security feature. Whether file upload requests are accepted remotely -depends on the ACL setup for the current session. This option merely -controls whether the upload controls are rendered or not.

enable_remove - - -boolean - - - - - - <optional>
- - - -
- - true - -

Specifies whether the widget allows the user to delete remove files. -If set to false, existing files may not be removed. Note that this is -not a security feature. Whether file delete requests are accepted -remotely depends on the ACL setup for the current session. This option -merely controls whether the file remove controls are rendered or not.

root_directory - - -string - - - - - - <optional>
- - - -
- - /etc/luci-uploads - -

Specifies the remote directory the upload and file browsing actions take -place in. Browsing to directories outside of the root directory is -prevented by the widget. Note that this is not a security feature. -Whether remote directories are browseable or not solely depends on the -ACL setup for the current session.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Hiddenfield.html b/docs/jsapi/LuCI.ui.Hiddenfield.html deleted file mode 100644 index cbba5efa47bfdce0b43d1d1200f172ac7d80c5c7..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Hiddenfield.html +++ /dev/null @@ -1,4916 +0,0 @@ - - - - - Class: Hiddenfield - - - - - - - - - - - - - - - - - -
- - -
-

Class: Hiddenfield

- - - - -
- -
-

- LuCI.ui. - - Hiddenfield -

- -

The Hiddenfield class implements an HTML <input type="hidden"> field -which allows to store form data without exposing it to the user.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Hiddenfield. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Hiddenfield property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Hiddenfield(value, options) -

- - - - -
- - -
-
- - -
-

Instantiate a hidden input field widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value.

options - - -LuCI.ui.AbstractElement.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the hidden input.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Select.html b/docs/jsapi/LuCI.ui.Select.html deleted file mode 100644 index 6d1d1bd68e2b636ba6bf7d653e068e4a2e363a4e..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Select.html +++ /dev/null @@ -1,5265 +0,0 @@ - - - - - Class: Select - - - - - - - - - - - - - - - - - -
- - -
-

Class: Select

- - - - -
- -
-

- LuCI.ui. - - Select -

- -

The Select class implements either a traditional HTML <select> element -or a group of checkboxes or radio buttons, depending on whether multiple -values are enabled or not.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Select. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Select property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Select(value, choices, options) -

- - - - -
- - -
-
- - -
-

Instantiate a select dropdown or checkbox/radiobutton group.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string -| - -Array.<string> - - - - - - null - - - - - optional - - - - - -

The initial input value(s).

choices - - -Object.<string, string> - - - - - - - - - - - - -

Object containing the selectable choices of the widget. The object keys -serve as values for the different choices while the values are used as -choice labels.

options - - -LuCI.ui.Select.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the inputs.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Select.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
multiple - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether multiple choice values may be selected.

widget - - -string - - - - - - <optional>
- - - -
- - select - -

Specifies the kind of widget to render. May be either select or -individual. When set to select an HTML <select> element will be -used, otherwise a group of checkbox or radio button elements is created, -depending on the value of the multiple option.

orientation - - -string - - - - - - <optional>
- - - -
- - horizontal - -

Specifies whether checkbox / radio button groups should be rendered -in a horizontal or vertical manner. Does not apply to the select -widget type.

sort - - -boolean -| - -Array.<string> - - - - - - <optional>
- - - -
- - false - -

Specifies if and how to sort choice values. If set to true, the choice -values will be sorted alphabetically. If set to an array of strings, the -choice sort order is derived from the array.

size - - -number - - - - - - <optional>
- - - -
- -

Specifies the HTML size attribute to set on the <select> element. -Only applicable to the select widget type.

placeholder - - -string - - - - - - <optional>
- - - -
- - -- Please choose -- - -

Specifies a placeholder text which is displayed when no choice is -selected yet. Only applicable to the select widget type.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Textarea.html b/docs/jsapi/LuCI.ui.Textarea.html deleted file mode 100644 index 1a87f6c8d15c3578d5d6d563d0042821a6c359bd..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Textarea.html +++ /dev/null @@ -1,5214 +0,0 @@ - - - - - Class: Textarea - - - - - - - - - - - - - - - - - -
- - -
-

Class: Textarea

- - - - -
- -
-

- LuCI.ui. - - Textarea -

- -

The Textarea class implements a multiline text area input field.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Textarea. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Textarea property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Textarea(value, options) -

- - - - -
- - -
-
- - -
-

Instantiate a textarea widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string - - - - - - null - - - - - optional - - - - - -

The initial input value.

options - - -LuCI.ui.Textarea.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the input.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Textarea.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
readonly - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the input widget should be rendered readonly.

placeholder - - -string - - - - - - <optional>
- - - -
- -

Specifies the HTML placeholder attribute which is displayed when the -corresponding <textarea> element is empty.

monospace - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether a monospace font should be forced for the textarea -contents.

cols - - -number - - - - - - <optional>
- - - -
- -

Specifies the HTML cols attribute to set on the corresponding -<textarea> element.

rows - - -number - - - - - - <optional>
- - - -
- -

Specifies the HTML rows attribute to set on the corresponding -<textarea> element.

wrap - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the HTML wrap attribute should be set.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.Textfield.html b/docs/jsapi/LuCI.ui.Textfield.html deleted file mode 100644 index 1e8f0b55a9279717559b662a67ed34d244f324b8..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.Textfield.html +++ /dev/null @@ -1,5142 +0,0 @@ - - - - - Class: Textfield - - - - - - - - - - - - - - - - - -
- - -
-

Class: Textfield

- - - - -
- -
-

- LuCI.ui. - - Textfield -

- -

The Textfield class implements a standard single line text input field.

-

UI widget instances are usually not supposed to be created by view code -directly, instead they're implicitely created by LuCI.form when -instantiating CBI forms.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.Textfield. To import it in -external JavaScript, use L.require("ui").then(...) and access the -Textfield property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.Textfield(value, options) -

- - - - -
- - -
-
- - -
-

Instantiate a text input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
value - - -string - - - - - - null - - - - - optional - - - - - -

The initial input value.

options - - -LuCI.ui.Textfield.InitOptions - - - - - - - - - optional - - - - - -

Object describing the widget specific options to initialize the input.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - -

Extends

- - - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - inherited - - getValue(){string|Array.<string>|null} -

- - - - -
- - -
-
- - -
-

Read the current value of the input widget.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - string - | - - Array.<string> - | - - null - - - The current value of the input element. For simple inputs like text -fields or selects, the return value type will be a - possibly empty - -string. Complex widgets such as DynamicList instances may result in -an array of strings or null for unset values.
- - - - -
- - - -
-
-

- - inherited - - isChanged(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the input value was altered by the user.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the input value has been altered by the user or -false if it is unchaged. Note that if the user modifies the initial -value and changes it back to the original state, it is still reported -as changed.
- - - - -
- - - -
-
-

- - inherited - - isValid(){boolean} -

- - - - -
- - -
-
- - -
-

Check whether the current input value is valid.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the current input value is valid or false if it does -not meet the validation constraints.
- - - - -
- - - -
-
-

- - inherited - - registerEvents(targetNode, synevent, events) -

- - - - -
- - -
-
- - -
-

Dispatch a custom (synthetic) event in response to received events.

-

Sets up event handlers on the given target DOM node for the given event -names that dispatch a custom event of the given type to the widget root -DOM node.

-

The primary purpose of this function is to set up a series of custom -uniform standard events such as widget-update, validation-success, -validation-failure etc. which are triggered by various different -widget specific native DOM events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - -

Specifies the DOM node on which the native event listeners should be -registered.

synevent - - -string - - - - - -

The name of the custom event to dispatch to the widget root DOM node.

events - - -Array.<string> - - - - - -

The native DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - render(){Node} -

- - - - -
- - -
-
- - -
-

Render the widget, setup event listeners and return resulting markup.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node or DocumentFragment containing the rendered -widget markup.
- - - - -
- - - -
-
-

- - inherited - - setChangeEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may change the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to change completely, such as -change events in a select menu. In contrast to update events, such -change events will not trigger input value validation but they may cause -field dependencies to get re-evaluated and will mark the input widget -as dirty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setPlaceholder(value) -

- - - - -
- - -
-
- - -
-

Set the current placeholder value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The placeholder to set for the input element. Only applicable to text -inputs, not to radio buttons, selects or similar.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setUpdateEvents(targetNode, events) -

- - - - -
- - -
-
- - -
-

Setup listeners for native DOM events that may update the widget value.

-

Sets up event handlers on the given target DOM node for the given event -names which may cause the input value to update, such as keyup or -onclick events. In contrast to change events, such update events will -trigger input value validation.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
targetNode - - -Node - - - - - - - - - - -

Specifies the DOM node on which the event listeners should be registered.

events - - -string - - - - - - - - - - repeatable - - -

The DOM events for which event handlers should be registered.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - setValue(value) -

- - - - -
- - -
-
- - -
-

Set the current value of the input widget.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
value - - -string -| - -Array.<string> -| - -null - - - - - -

The value to set the input element to. For simple inputs like text -fields or selects, the value should be a - possibly empty - string. -Complex widgets such as DynamicList instances may accept string array -or null values.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - inherited - - triggerValidation() -

- - - - -
- - -
-
- - -
-

Force validation of the current input value.

-

Usually input validation is automatically triggered by various DOM events -bound to the input widget. In some cases it is required though to manually -trigger validation runs, e.g. when programmatically altering values.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.Textfield.InitOptionsLuCI.ui.AbstractElement.InitOptions

-
- - -
-
- -
-

In addition to the AbstractElement.InitOptions -the following properties are recognized:

-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDefaultDescription
password - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the input should be rendered as concealed password field.

readonly - - -boolean - - - - - - <optional>
- - - -
- - false - -

Specifies whether the input widget should be rendered readonly.

maxlength - - -number - - - - - - <optional>
- - - -
- -

Specifies the HTML maxlength attribute to set on the corresponding -<input> element. Note that this a legacy property that exists for -compatibility reasons. It is usually better to maxlength(N) validation -expression.

placeholder - - -string - - - - - - <optional>
- - - -
- -

Specifies the HTML placeholder attribute which is displayed when the -corresponding <input> element is empty.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.changes.html b/docs/jsapi/LuCI.ui.changes.html deleted file mode 100644 index dff9edec4572ee36426d4468c8ae64a11a4dba38..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.changes.html +++ /dev/null @@ -1,4096 +0,0 @@ - - - - - Class: changes - - - - - - - - - - - - - - - - - -
- - -
-

Class: changes

- - - - -
- -
-

- LuCI.ui. - - changes -

- -

The changes class encapsulates logic for visualizing, applying, -confirming and reverting staged UCI changesets.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.changes. To import it in -external JavaScript, use L.require("ui").then(...) and access the -changes property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.changes() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - apply(checked) -

- - - - -
- - -
-
- - -
-

Apply the staged configuration changes.

-

Start applying staged configuration changes and open a modal dialog -with a progress indication to prevent interaction with the view -during the apply process. The modal dialog will be automatically -closed and the current view reloaded once the apply process is -complete.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
checked - - -boolean - - - - - - false - - - - - optional - - - - - -

Whether to perform a checked (true) configuration apply or an -unchecked (false) one. -In case of a checked apply, the configuration changes must be -confirmed within a specific time interval, otherwise the device -will begin to roll back the changes in order to restore the previous -settings.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - displayChanges() -

- - - - -
- - -
-
- - -
-

Display the current changelog.

-

Open a modal dialog visualizing the currently staged UCI changes -and offer options to revert or apply the shown changes.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - renderChangeIndicator(changes) -

- - - - -
- - -
-
- - -
-

Update the change count indicator.

-

This function updates the UCI change count indicator from the given -UCI changeset structure.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
changes - - -Object.<string, Array.<LuCI.uci.ChangeRecord>> - - - - - -

The UCI changeset to count.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - revert() -

- - - - -
- - -
-
- - -
-

Revert the staged configuration changes.

-

Start reverting staged configuration changes and open a modal dialog -with a progress indication to prevent interaction with the view -during the revert process. The modal dialog will be automatically -closed and the current view reloaded once the revert process is -complete.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - setIndicator(numChanges) -

- - - - -
- - -
-
- - -
-

Set the change count indicator.

-

This function updates or hides the UCI change count indicator, -depending on the passed change count. When the count is greater -than 0, the change indicator is displayed or updated, otherwise it -is removed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
numChanges - - -number - - - - - -

The number of changes to indicate.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.html b/docs/jsapi/LuCI.ui.html deleted file mode 100644 index 26cc0be867671039a8cbba8957433b0e94659c98..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.html +++ /dev/null @@ -1,6189 +0,0 @@ - - - - - Class: ui - - - - - - - - - - - - - - - - - -
- - -
-

Class: ui

- - - - -
- -
-

- LuCI. - - ui -

- -

Provides high level UI helper functionality. -To import the class in views, use 'require ui', to import it in -external JavaScript, use L.require("ui").then(...).

- -
- -
-
- - - - -
-
-

- - new LuCI.ui() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - -

Classes

- -
-
AbstractElement
-
- -
changes
-
- -
Checkbox
-
- -
Combobox
-
- -
ComboButton
-
- -
Dropdown
-
- -
DynamicList
-
- -
FileUpload
-
- -
Hiddenfield
-
- -
menu
-
- -
Select
-
- -
tabs
-
- -
Textarea
-
- -
Textfield
-
-
- - - - - - - -

Methods

- -
- -
-
-

- - addNotification(title, contents, classes){Node} -

- - - - -
- - -
-
- - -
-

Add a notification banner at the top of the current view.

-

A notification banner is an alert message usually displayed at the -top of the current view, spanning the entire availibe width. -Notification banners will stay in place until dismissed by the user. -Multiple banners may be shown at the same time.

-

Additional CSS class names may be passed to influence the appearence of -the banner. Valid values for the classes depend on the underlying theme.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
title - - -string - - - - - - - optional - - - - - -

The title of the notification banner. If null, no title element -will be rendered.

contents - - -* - - - - - - - - - - -

The contents to add to the notification banner. This should be a DOM -node or a document fragment in most cases. The value is passed as-is -to the dom.content() function - refer to its documentation for -applicable values.

classes - - -string - - - - - - - optional - - - - - repeatable - - -

A number of extra CSS class names which are set on the notification -banner element.

- - - -
- - - - - - - - - - - - - - - - - - - -
See:
-
-
    -
  • LuCI.dom.content
  • -
-
- - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node representing the notification banner element.
- - - - -
- - - -
-
-

- - addValidator(field, type, optional, vfunc, events){function} -

- - - - -
- - -
-
- - -
-

Add validation constraints to an input element.

-

Compile the given type expression and optional validator function into -a validation function and bind it to the specified input element events.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
field - - -Node - - - - - - - - - - - - -

The DOM input element node to bind the validation constraints to.

type - - -string - - - - - - - - - - - - -

The datatype specification to describe validation constraints. -Refer to the LuCI.validation class documentation for details.

optional - - -boolean - - - - - - false - - - - - optional - - - - - -

Specifies whether empty values are allowed (true) or not (false). -If an input element is not marked optional it must not be empty, -otherwise it will be marked as invalid.

vfunc - - -function - - - - - - - - - optional - - - - - -

Specifies a custom validation function which is invoked after the -other validation constraints are applied. The validation must return -true to accept the passed value. Any other return type is converted -to a string and treated as validation error message.

events - - -string - - - - - - blur, keyup - - - - - optional - - - - - repeatable - - -

The list of events to bind. Each received event will trigger a field -validation. If omitted, the keyup and blur events are bound by -default.

- - - -
- - - - - - - - - - - - - - - - - - - -
See:
-
-
    -
  • LuCI.validation
  • -
-
- - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - function - - - Returns the compiled validator function which can be used to manually -trigger field validation or to bind it to further events.
- - - - -
- - - -
-
-

- - awaitReconnect(hosts) -

- - - - -
- - -
-
- - -
-

Wait for device to come back online and reconnect to it.

-

Poll each given hostname or IP address and navigate to it as soon as -one of the addresses becomes reachable.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
hosts - - -string - - - - - - [window.location.host] - - - - - optional - - - - - repeatable - - -

The list of IP addresses and host names to check for reachability. -If omitted, the current value of window.location.host is used by -default.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - createHandlerFn(ctx, fn, extra_args){function|null} -

- - - - -
- - -
-
- - -
-

Create a pre-bound event handler function.

-

Generate and bind a function suitable for use in event handlers. The -generated function automatically disables the event source element -and adds an active indication to it by adding appropriate CSS classes.

-

It will also await any promises returned by the wrapped function and -re-enable the source element after the promises ran to completion.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ctx - - -* - - - - - - - - - - -

The this context to use for the wrapped function.

fn - - -function -| - -string - - - - - - - - - - -

Specifies the function to wrap. In case of a function value, the -function is used as-is. If a string is specified instead, it is looked -up in ctx to obtain the function to wrap. In both cases the bound -function will be invoked with ctx as this context

extra_args - - -* - - - - - - - - - - repeatable - - -

Any further parameter as passed as-is to the bound event handler -function in the same order as passed to createHandlerFn().

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - function - | - - null - - - Returns the pre-bound handler function which is suitable to be passed -to addEventListener(). Returns null if the given fn argument is -a string which could not be found in ctx or if ctx[fn] is not a -valid function value.
- - - - -
- - - -
-
-

- - hideIndicator(id){boolean} -

- - - - -
- - -
-
- - -
-

Remove an header area indicator.

-

This function removes the given indicator label from the header indicator -area. When the given indicator is not found, this function does nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
id - - -string - - - - - -

The ID of the indicator to remove.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the indicator has been removed or false when the -requested indicator was not found.
- - - - -
- - - -
-
-

- - hideModal() -

- - - - -
- - -
-
- - -
-

Close the open modal overlay dialog.

-

This function will close an open modal dialog and restore the normal view -behaviour. It has no effect if no modal dialog is currently open.

-

Note that this function is stand-alone, it does not rely on this and -will not invoke other class functions so it suitable to be used as event -handler as-is without the need to bind it first.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - instantiateView(path){Promise.<LuCI.view>} -

- - - - -
- - -
-
- - -
-

Load specified view class path and set it up.

-

Transforms the given view path into a class name, requires it -using LuCI.require() and asserts that the -resulting class instance is a descendant of -LuCI.view.

-

By instantiating the view class, its corresponding contents are -rendered and included into the view area. Any runtime errors are -catched and rendered using LuCI.error().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - -

The view path to render.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.view> - - - Returns a promise resolving to the loaded view instance.
- - - - -
- - - -
-
-

- - itemlist(node, items, separators){Node} -

- - - - -
- - -
-
- - -
-

Formats a series of label/value pairs into list-like markup.

-

This function transforms a flat array of alternating label and value -elements into a list-like markup, using the values in separators as -separators and appends the resulting nodes to the given parent DOM node.

-

Each label is suffixed with : and wrapped into a <strong> tag, the -<strong> element and the value corresponding to the label are -subsequently wrapped into a <span class="nowrap"> element.

-

The resulting <span> element tuples are joined by the given separators -to form the final markup which is appened to the given parent DOM node.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
node - - -Node - - - - - - - - - - - - -

The parent DOM node to append the markup to. Any previous child elements -will be removed.

items - - -Array.<*> - - - - - - - - - - - - -

An alternating array of labels and values. The label values will be -converted to plain strings, the values are used as-is and may be of -any type accepted by LuCI.dom.content().

separators - - -* -| - -Array.<*> - - - - - - [E('br')] - - - - - optional - - - - - -

A single value or an array of separator values to separate each -label/value pair with. The function will cycle through the separators -when joining the pairs. If omitted, the default separator is a sole HTML -<br> element. Separator values are used as-is and may be of any type -accepted by LuCI.dom.content().

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns the parent DOM node the formatted markup has been added to.
- - - - -
- - - -
-
-

- - pingDevice(proto, host){Promise.<Event>} -

- - - - -
- - -
-
- - -
-

Perform a device connectivity test.

-

Attempt to fetch a well known ressource from the remote device via HTTP -in order to test connectivity. This function is mainly useful to wait -for the router to come back online after a reboot or reconfiguration.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
proto - - -string - - - - - - http - - - - - optional - - - - - -

The protocol to use for fetching the resource. May be either http -(the default) or https.

host - - -string - - - - - - window.location.host - - - - - optional - - - - - -

Override the host address to probe. By default the current host as seen -in the address bar is probed.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<Event> - - - Returns a promise resolving to a load event in case the device is -reachable or rejecting with an error event in case it is not reachable -or rejecting with null when the connectivity check timed out.
- - - - -
- - - -
-
-

- - showIndicator(id, label, handler, style){boolean} -

- - - - -
- - -
-
- - -
-

Display or update an header area indicator.

-

An indicator is a small label displayed in the header area of the screen -providing few amounts of status information such as item counts or state -toggle indicators.

-

Multiple indicators may be shown at the same time and indicator labels -may be made clickable to display extended information or to initiate -further actions.

-

Indicators can either use a default active or a less accented inactive -style which is useful for indicators representing state toggles.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDefaultDescription
id - - -string - - - - - - - - - - - - -

The ID of the indicator. If an indicator with the given ID already exists, -it is updated with the given label and style.

label - - -string - - - - - - - - - - - - -

The text to display in the indicator label.

handler - - -function - - - - - - - - - optional - - - - - -

A handler function to invoke when the indicator label is clicked/touched -by the user. If omitted, the indicator is not clickable/touchable.

-

Note that this parameter only applies to new indicators, when updating -existing labels it is ignored.

style - - -string - - - - - - active - - - - - optional - - - - - -

The indicator style to use. May be either active or inactive.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true when the indicator has been updated or false when no -changes were made.
- - - - -
- - - -
-
-

- - showModal(title, contents, classes){Node} -

- - - - -
- - -
-
- - -
-

Display a modal overlay dialog with the specified contents.

-

The modal overlay dialog covers the current view preventing interaction -with the underlying view contents. Only one modal dialog instance can -be opened. Invoking showModal() while a modal dialog is already open will -replace the open dialog with a new one having the specified contents.

-

Additional CSS class names may be passed to influence the appearence of -the dialog. Valid values for the classes depend on the underlying theme.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
title - - -string - - - - - - - optional - - - - - -

The title of the dialog. If null, no title element will be rendered.

contents - - -* - - - - - - - - - - -

The contents to add to the modal dialog. This should be a DOM node or -a document fragment in most cases. The value is passed as-is to the -dom.content() function - refer to its documentation for applicable -values.

classes - - -string - - - - - - - optional - - - - - repeatable - - -

A number of extra CSS class names which are set on the modal dialog -element.

- - - -
- - - - - - - - - - - - - - - - - - - -
See:
-
-
    -
  • LuCI.dom.content
  • -
-
- - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - - - Returns a DOM Node representing the modal dialog element.
- - - - -
- - - -
-
-

- - uploadFile(path, progessStatusNode){Promise.<LuCI.ui.FileUploadReply>} -

- - - - -
- - -
-
- - -
-

Display a modal file upload prompt.

-

This function opens a modal dialog prompting the user to select and -upload a file to a predefined remote destination path.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - - -string - - - - - - - - - - -

The remote file path to upload the local file to.

progessStatusNode - - -Node - - - - - - - optional - - - - - -

An optional DOM text node whose content text is set to the progress -percentage value during file upload.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.ui.FileUploadReply> - - - Returns a promise resolving to a file upload status object on success -or rejecting with an error in case the upload failed or has been -cancelled by the user.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.FileUploadReplyObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
name - - -string - - - -

Name of the uploaded file without directory components

size - - -number - - - -

Size of the uploaded file in bytes

checksum - - -string - - - -

The MD5 checksum of the received file data

sha256sum - - -string - - - -

The SHA256 checksum of the received file data

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.menu.html b/docs/jsapi/LuCI.ui.menu.html deleted file mode 100644 index 2b63fe159ba4c4bf117dc36f930615cf71839308..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.menu.html +++ /dev/null @@ -1,4143 +0,0 @@ - - - - - Class: menu - - - - - - - - - - - - - - - - - -
- - -
-

Class: menu

- - - - -
- -
-

- LuCI.ui. - - menu -

- -

Handles menus.

- -
- -
-
- - - - -
-
- - - - - -
- - -
-
- - -
-

Handle menu.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - flushCache() -

- - - - -
- - -
-
- - -
-

Flush the internal menu cache to force loading a new structure on the -next page load.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - getChildren(node){Array.<LuCI.ui.menu.MenuNode>} -

- - - - -
- - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
node - - -LuCI.ui.menu.MenuNode - - - - - - - optional - - - - - -

The menu node to retrieve the children for. Defaults to the menu's -internal root node if omitted.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Array.<LuCI.ui.menu.MenuNode> - - - Returns an array of child menu nodes.
- - - - -
- - - -
-
-

- - load(){Promise.<LuCI.ui.menu.MenuNode>} -

- - - - -
- - -
-
- - -
-

Load and cache current menu tree.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<LuCI.ui.menu.MenuNode> - - - Returns a promise resolving to the root element of the menu tree.
- - - - -
- -
- - - -

Type Definitions

- -
- -
-
-

LuCI.ui.menu.MenuNodeObject

-
- - -
-
- - - -
- - -
Properties:
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeArgumentDescription
name - - -string - - - - - - - -

The internal name of the node, as used in the URL

order - - -number - - - - - - - -

The sort index of the menu node

title - - -string - - - - - - <optional>
- - - -

The title of the menu node, null if the node should be hidden

boolean - - -satisified - - - - - - - -

Boolean indicating whether the menu enries dependencies are satisfied

boolean - - -readonly - - - - - - <optional>
- - - -

Boolean indicating whether the menu entries underlying ACLs are readonly

children - - -Array.<LuCI.ui.menu.MenuNode> - - - - - - <optional>
- - - -

Array of child menu nodes.

- - - - - - - - - - - - - - - - - - - - - - -
- - - -
- -
- - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.ui.tabs.html b/docs/jsapi/LuCI.ui.tabs.html deleted file mode 100644 index e87d8b9665ebca2e2e94c2eaa8953bd3027ab3cd..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.ui.tabs.html +++ /dev/null @@ -1,3843 +0,0 @@ - - - - - Class: tabs - - - - - - - - - - - - - - - - - -
- - -
-

Class: tabs

- - - - -
- -
-

- LuCI.ui. - - tabs -

- -

The tabs class handles tab menu groups used throughout the view area. -It takes care of setting up tab groups, tracking their state and handling -related events.

-

This class is automatically instantiated as part of LuCI.ui. To use it -in views, use 'require ui' and refer to ui.tabs. To import it in -external JavaScript, use L.require("ui").then(...) and access the -tabs property of the class instance value.

- -
- -
-
- - - - -
-
-

- - new LuCI.ui.tabs() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - initTabGroup(panes) -

- - - - -
- - -
-
- - -
-

Initializes a new tab group from the given tab pane collection.

-

This function cycles through the given tab pane DOM nodes, extracts -their tab IDs, titles and active states, renders a corresponding -tab menu and prepends it to the tab panes common parent DOM node.

-

The tab menu labels will be set to the value of the data-tab-title -attribute of each corresponding pane. The last pane with the -data-tab-active attribute set to true will be selected by default.

-

If no pane is marked as active, the first one will be preselected.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
panes - - -Array.<Node> -| - -NodeList - - - - - -

A collection of tab panes to build a tab group menu for. May be a -plain array of DOM nodes or a NodeList collection, such as the result -of a querySelectorAll() call or the .childNodes property of a -DOM node.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - isEmptyPane(pane){boolean} -

- - - - -
- - -
-
- - -
-

Checks whether the given tab pane node is empty.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
pane - - -Node - - - - - -

The tab pane to check.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the pane is empty, else false.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.view.html b/docs/jsapi/LuCI.view.html deleted file mode 100644 index 1aac99ea0bf615018a5413f01fd1fa0135b5fb1d..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.view.html +++ /dev/null @@ -1,4447 +0,0 @@ - - - - - Class: view - - - - - - - - - - - - - - - - - -
- - -
-

Class: view

- - - - -
- -
-

- LuCI. - - view -

- -

The view class forms the basis of views and provides a standard -set of methods to inherit from.

- -
- -
-
- - - - -
-
-

- - new LuCI.view() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - addFooter(){DocumentFragment} -

- - - - -
- - -
-
- - -
-

Renders a standard page action footer if any of the -handleSave(), handleSaveApply() or handleReset() -functions are defined.

-

The default implementation should be sufficient for most -views - it will render a standard page footer with action -buttons labeled Save, Save & Apply and Reset -triggering the handleSave(), handleSaveApply() and -handleReset() functions respectively.

-

When any of these handle*() functions is overwritten -with null by a view extending this class, the -corresponding button will not be rendered.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - DocumentFragment - - - Returns a DocumentFragment containing the footer bar -with buttons for each corresponding handle*() action -or an empty DocumentFragment if all three handle*() -methods are overwritten with null.
- - - - -
- - - -
-
-

- - handleReset(ev){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

The handleReset function is invoked when the user clicks -the Reset button in the page action footer.

-

The default implementation should be sufficient for most -views using form.Map() based forms - it -will iterate all forms present in the view and invoke -the Map.reset() method on each form.

-

Views not using Map instances or requiring other special -logic should overwrite handleReset() with a custom -implementation.

-

To disable the Reset page footer button, views extending -this base class should overwrite the handleReset function -with null.

-

The invocation of this function is wrapped by -Promise.resolve() so it may return Promises if needed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ev - - -Event - - - - - -

The DOM event that triggered the function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Any return values of this function are discarded, but -passed through Promise.resolve() to ensure that any -returned promise runs to completion before the button -is reenabled.
- - - - -
- - - -
-
-

- - handleSave(ev){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

The handleSave function is invoked when the user clicks -the Save button in the page action footer.

-

The default implementation should be sufficient for most -views using form.Map() based forms - it -will iterate all forms present in the view and invoke -the Map.save() method on each form.

-

Views not using Map instances or requiring other special -logic should overwrite handleSave() with a custom -implementation.

-

To disable the Save page footer button, views extending -this base class should overwrite the handleSave function -with null.

-

The invocation of this function is wrapped by -Promise.resolve() so it may return Promises if needed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ev - - -Event - - - - - -

The DOM event that triggered the function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Any return values of this function are discarded, but -passed through Promise.resolve() to ensure that any -returned promise runs to completion before the button -is reenabled.
- - - - -
- - - -
-
-

- - handleSaveApply(ev){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

The handleSaveApply function is invoked when the user clicks -the Save & Apply button in the page action footer.

-

The default implementation should be sufficient for most -views using form.Map() based forms - it -will first invoke -view.handleSave() and then -call ui.changes.apply() to start the -modal config apply and page reload flow.

-

Views not using Map instances or requiring other special -logic should overwrite handleSaveApply() with a custom -implementation.

-

To disable the Save & Apply page footer button, views -extending this base class should overwrite the -handleSaveApply function with null.

-

The invocation of this function is wrapped by -Promise.resolve() so it may return Promises if needed.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
ev - - -Event - - - - - -

The DOM event that triggered the function.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - Any return values of this function are discarded, but -passed through Promise.resolve() to ensure that any -returned promise runs to completion before the button -is reenabled.
- - - - -
- - - -
-
-

- - abstractload(){*|Promise.<*>} -

- - - - -
- - -
-
- - -
-

The load function is invoked before the view is rendered.

-

The invocation of this function is wrapped by -Promise.resolve() so it may return Promises if needed.

-

The return value of the function (or the resolved values -of the promise returned by it) will be passed as first -argument to render().

-

This function is supposed to be overwritten by subclasses, -the default implementation does nothing.

-
- - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - * - | - - Promise.<*> - - - May return any value or a Promise resolving to any value.
- - - - -
- - - -
-
-

- - abstractrender(load_results){Node|Promise.<Node>} -

- - - - -
- - -
-
- - -
-

The render function is invoked after the -load() function and responsible -for setting up the view contents. It must return a DOM -Node or DocumentFragment holding the contents to -insert into the view area.

-

The invocation of this function is wrapped by -Promise.resolve() so it may return Promises if needed.

-

The return value of the function (or the resolved values -of the promise returned by it) will be inserted into the -main content area using -dom.append().

-

This function is supposed to be overwritten by subclasses, -the default implementation does nothing.

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
load_results - - -* -| - -null - - - - - -

This function will receive the return value of the -view.load() function as first -argument.

- - - -
- - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Node - | - - Promise.<Node> - - - Should return a DOM Node value or a Promise resolving -to a Node value.
- - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/LuCI.xhr.html b/docs/jsapi/LuCI.xhr.html deleted file mode 100644 index 776abbad2e0429f165477a4dce41389f10ec131b..0000000000000000000000000000000000000000 --- a/docs/jsapi/LuCI.xhr.html +++ /dev/null @@ -1,4411 +0,0 @@ - - - - - Class: xhr - - - - - - - - - - - - - - - - - -
- - -
-

Class: xhr

- - - - -
- -
-

- LuCI. - - xhr -

- -

The LuCI.xhr class is a legacy compatibility shim for the -functionality formerly provided by xhr.js. It is registered as global -window.XHR symbol for compatibility with legacy code.

-

New code should use LuCI.request instead to implement HTTP -request handling.

- -
- -
-
- - - - -
-
-

- - new LuCI.xhr() -

- - - - -
- - -
-
- - - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - -
- - - - - - - - - - - - - - -

Methods

- -
- -
-
-

- - abort() -

- - - - -
- - -
-
- - -
-

Ignored for backwards compatibility.

-

This function does nothing.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - busy(){boolean} -

- - - - -
- - -
-
- - -
-

Checks the running state of the request.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - boolean - - - Returns true if the request is still running or false if it -already completed.
- - - - -
- - - -
-
-

- - cancel() -

- - - - -
- - -
-
- - -
-

Cancels a running request.

-

This function does not actually cancel the underlying -XMLHTTPRequest request but it sets a flag which prevents the -invocation of the callback function when the request eventually -finishes or timed out.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - -
- - - -
-
-

- - get(url, data, callback, timeout){Promise.<null>} -

- - - - -
- - -
-
- - -
-

This function is a legacy wrapper around -LuCI.get().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - -string - - - - - - - - - - -

The URL to request

data - - -Object - - - - - - - optional - - - - - -

Additional query string data

callback - - -LuCI.requestCallbackFn - - - - - - - optional - - - - - -

Callback function to invoke on completion

timeout - - -number - - - - - - - optional - - - - - -

Request timeout to use

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<null> - - -
- - - - -
- - - -
-
-

- - post(url, data, callback, timeout){Promise.<null>} -

- - - - -
- - -
-
- - -
-

This function is a legacy wrapper around -LuCI.post().

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
url - - -string - - - - - - - - - - -

The URL to request

data - - -Object - - - - - - - optional - - - - - -

Additional data to append to the request body.

callback - - -LuCI.requestCallbackFn - - - - - - - optional - - - - - -

Callback function to invoke on completion

timeout - - -number - - - - - - - optional - - - - - -

Request timeout to use

- - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - - - -
Returns:
- - - - - - - - - - - - - - - - - - - - -
TypeDescription
- - Promise.<null> - - -
- - - - -
- - - -
-
-

- - send_form() -

- - - - -
- - -
-
- - -
-

Existing for backwards compatibility.

-

This function simply throws an InternalError when invoked.

-
- - - - - - - - - -
- - - - - - - -
Deprecated
  • Yes
- - - - - - - - - - - - - - - -
- - - - - - - - - -
Throws:
- - - -
-
-
-

Throws an InternalError with the message Not implemented -when invoked.

-
-
-
-
-
- Type -
-
- -InternalError - - -
-
-
-
- - - - - - - -
- -
- - - - - - - -
- -
- - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/README.md b/docs/jsapi/README.md deleted file mode 100644 index 41dd17b641734eae16f52bb5259bbe61940c7d76..0000000000000000000000000000000000000000 --- a/docs/jsapi/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# LuCI client side API documentation - -You can browse the JavaScript apis provided by LuCI here. A good starting point is the central -[luci.js class](LuCI.html). diff --git a/docs/jsapi/fonts/OpenSans-Bold-webfont.eot b/docs/jsapi/fonts/OpenSans-Bold-webfont.eot deleted file mode 100644 index 5d20d916338a5890a033952e2e07ba7380f5a7d3..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Bold-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Bold-webfont.svg b/docs/jsapi/fonts/OpenSans-Bold-webfont.svg deleted file mode 100644 index 3ed7be4bc5b2908326eddde6a32eff453a5cb319..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-Bold-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-Bold-webfont.woff b/docs/jsapi/fonts/OpenSans-Bold-webfont.woff deleted file mode 100644 index 1205787b0ed50db71ebd4f8a7f85d106721ff258..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Bold-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.eot b/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.eot deleted file mode 100644 index 1f639a15ff3cc66d3b22b55a7f28a8cf0d821b03..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.svg b/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.svg deleted file mode 100644 index 6a2607b9dafcfd369a5440b1e6c2d5e30579ea66..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.woff b/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.woff deleted file mode 100644 index ed760c0628b6a0026041f5b8bba466a0471fd2e0..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-BoldItalic-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Italic-webfont.eot b/docs/jsapi/fonts/OpenSans-Italic-webfont.eot deleted file mode 100644 index 0c8a0ae06ed09f6a7be1b84defae7ccda65cc2e0..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Italic-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Italic-webfont.svg b/docs/jsapi/fonts/OpenSans-Italic-webfont.svg deleted file mode 100644 index e1075dcc2464f8a8f913383e3891da709b9feeb8..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-Italic-webfont.svg +++ /dev/null @@ -1,1830 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-Italic-webfont.woff b/docs/jsapi/fonts/OpenSans-Italic-webfont.woff deleted file mode 100644 index ff652e64356b538c001423b6aedefcf1ee66cd17..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Italic-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Light-webfont.eot b/docs/jsapi/fonts/OpenSans-Light-webfont.eot deleted file mode 100644 index 14868406aa7d728a88d63963f119635813b5d30e..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Light-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Light-webfont.svg b/docs/jsapi/fonts/OpenSans-Light-webfont.svg deleted file mode 100644 index 11a472ca8a5111187b4269b1407bbfd8dcf8fffd..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-Light-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-Light-webfont.woff b/docs/jsapi/fonts/OpenSans-Light-webfont.woff deleted file mode 100644 index e786074813a27d0a7a249047832988d5bf0fe756..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Light-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.eot b/docs/jsapi/fonts/OpenSans-LightItalic-webfont.eot deleted file mode 100644 index 8f445929ffb03b50e98c2a2f7d831a0cb1b276a2..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.svg b/docs/jsapi/fonts/OpenSans-LightItalic-webfont.svg deleted file mode 100644 index 431d7e35463dc240b890917ddd533219b2a9ae2e..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.svg +++ /dev/null @@ -1,1835 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.woff b/docs/jsapi/fonts/OpenSans-LightItalic-webfont.woff deleted file mode 100644 index 43e8b9e6cc061ff17fd2903075cbde12715512b3..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-LightItalic-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Regular-webfont.eot b/docs/jsapi/fonts/OpenSans-Regular-webfont.eot deleted file mode 100644 index 6bbc3cf58cb011a6b4bf3cb1612ce212608f7274..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Regular-webfont.eot and /dev/null differ diff --git a/docs/jsapi/fonts/OpenSans-Regular-webfont.svg b/docs/jsapi/fonts/OpenSans-Regular-webfont.svg deleted file mode 100644 index 25a3952340fc727f6571e182d63a7938a2f27b32..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/OpenSans-Regular-webfont.svg +++ /dev/null @@ -1,1831 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/OpenSans-Regular-webfont.woff b/docs/jsapi/fonts/OpenSans-Regular-webfont.woff deleted file mode 100644 index e231183dce4c7b452afc9e7799586fd285e146f4..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/OpenSans-Regular-webfont.woff and /dev/null differ diff --git a/docs/jsapi/fonts/glyphicons-halflings-regular.eot b/docs/jsapi/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/glyphicons-halflings-regular.eot and /dev/null differ diff --git a/docs/jsapi/fonts/glyphicons-halflings-regular.svg b/docs/jsapi/fonts/glyphicons-halflings-regular.svg deleted file mode 100644 index 4469488747892e5d72de3752a17705b0f02bec91..0000000000000000000000000000000000000000 --- a/docs/jsapi/fonts/glyphicons-halflings-regular.svg +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/jsapi/fonts/glyphicons-halflings-regular.ttf b/docs/jsapi/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/glyphicons-halflings-regular.ttf and /dev/null differ diff --git a/docs/jsapi/fonts/glyphicons-halflings-regular.woff b/docs/jsapi/fonts/glyphicons-halflings-regular.woff deleted file mode 100644 index d83c539b8266366dc331c5f746714caefb84c47d..0000000000000000000000000000000000000000 Binary files a/docs/jsapi/fonts/glyphicons-halflings-regular.woff and /dev/null differ diff --git a/docs/jsapi/form.js.html b/docs/jsapi/form.js.html deleted file mode 100644 index a3c8a154800ec482371822d17397bbc5a66e9fcb..0000000000000000000000000000000000000000 --- a/docs/jsapi/form.js.html +++ /dev/null @@ -1,7854 +0,0 @@ - - - - - Source: form.js - - - - - - - - - - - - - - - - - -
- - -
-

Source: form.js

- - - - -
-
-
'use strict';
-'require ui';
-'require uci';
-'require rpc';
-'require dom';
-'require baseclass';
-
-var scope = this;
-
-var callSessionAccess = rpc.declare({
-	object: 'session',
-	method: 'access',
-	params: [ 'scope', 'object', 'function' ],
-	expect: { 'access': false }
-});
-
-var CBIJSONConfig = baseclass.extend({
-	__init__: function(data) {
-		data = Object.assign({}, data);
-
-		this.data = {};
-
-		var num_sections = 0,
-		    section_ids = [];
-
-		for (var sectiontype in data) {
-			if (!data.hasOwnProperty(sectiontype))
-				continue;
-
-			if (Array.isArray(data[sectiontype])) {
-				for (var i = 0, index = 0; i < data[sectiontype].length; i++) {
-					var item = data[sectiontype][i],
-					    anonymous, name;
-
-					if (!L.isObject(item))
-						continue;
-
-					if (typeof(item['.name']) == 'string') {
-						name = item['.name'];
-						anonymous = false;
-					}
-					else {
-						name = sectiontype + num_sections;
-						anonymous = true;
-					}
-
-					if (!this.data.hasOwnProperty(name))
-						section_ids.push(name);
-
-					this.data[name] = Object.assign(item, {
-						'.index': num_sections++,
-						'.anonymous': anonymous,
-						'.name': name,
-						'.type': sectiontype
-					});
-				}
-			}
-			else if (L.isObject(data[sectiontype])) {
-				this.data[sectiontype] = Object.assign(data[sectiontype], {
-					'.anonymous': false,
-					'.name': sectiontype,
-					'.type': sectiontype
-				});
-
-				section_ids.push(sectiontype);
-				num_sections++;
-			}
-		}
-
-		section_ids.sort(L.bind(function(a, b) {
-			var indexA = (this.data[a]['.index'] != null) ? +this.data[a]['.index'] : 9999,
-			    indexB = (this.data[b]['.index'] != null) ? +this.data[b]['.index'] : 9999;
-
-			if (indexA != indexB)
-				return (indexA - indexB);
-
-			return (a > b);
-		}, this));
-
-		for (var i = 0; i < section_ids.length; i++)
-			this.data[section_ids[i]]['.index'] = i;
-	},
-
-	load: function() {
-		return Promise.resolve(this.data);
-	},
-
-	save: function() {
-		return Promise.resolve();
-	},
-
-	get: function(config, section, option) {
-		if (section == null)
-			return null;
-
-		if (option == null)
-			return this.data[section];
-
-		if (!this.data.hasOwnProperty(section))
-			return null;
-
-		var value = this.data[section][option];
-
-		if (Array.isArray(value))
-			return value;
-
-		if (value != null)
-			return String(value);
-
-		return null;
-	},
-
-	set: function(config, section, option, value) {
-		if (section == null || option == null || option.charAt(0) == '.')
-			return;
-
-		if (!this.data.hasOwnProperty(section))
-			return;
-
-		if (value == null)
-			delete this.data[section][option];
-		else if (Array.isArray(value))
-			this.data[section][option] = value;
-		else
-			this.data[section][option] = String(value);
-	},
-
-	unset: function(config, section, option) {
-		return this.set(config, section, option, null);
-	},
-
-	sections: function(config, sectiontype, callback) {
-		var rv = [];
-
-		for (var section_id in this.data)
-			if (sectiontype == null || this.data[section_id]['.type'] == sectiontype)
-				rv.push(this.data[section_id]);
-
-		rv.sort(function(a, b) { return a['.index'] - b['.index'] });
-
-		if (typeof(callback) == 'function')
-			for (var i = 0; i < rv.length; i++)
-				callback.call(this, rv[i], rv[i]['.name']);
-
-		return rv;
-	},
-
-	add: function(config, sectiontype, sectionname) {
-		var num_sections_type = 0, next_index = 0;
-
-		for (var name in this.data) {
-			num_sections_type += (this.data[name]['.type'] == sectiontype);
-			next_index = Math.max(next_index, this.data[name]['.index']);
-		}
-
-		var section_id = sectionname || sectiontype + num_sections_type;
-
-		if (!this.data.hasOwnProperty(section_id)) {
-			this.data[section_id] = {
-				'.name': section_id,
-				'.type': sectiontype,
-				'.anonymous': (sectionname == null),
-				'.index': next_index + 1
-			};
-		}
-
-		return section_id;
-	},
-
-	remove: function(config, section) {
-		if (this.data.hasOwnProperty(section))
-			delete this.data[section];
-	},
-
-	resolveSID: function(config, section_id) {
-		return section_id;
-	},
-
-	move: function(config, section_id1, section_id2, after) {
-		return uci.move.apply(this, [config, section_id1, section_id2, after]);
-	}
-});
-
-/**
- * @class AbstractElement
- * @memberof LuCI.form
- * @hideconstructor
- * @classdesc
- *
- * The `AbstractElement` class serves as abstract base for the different form
- * elements implemented by `LuCI.form`. It provides the common logic for
- * loading and rendering values, for nesting elements and for defining common
- * properties.
- *
- * This class is private and not directly accessible by user code.
- */
-var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.prototype */ {
-	__init__: function(title, description) {
-		this.title = title || '';
-		this.description = description || '';
-		this.children = [];
-	},
-
-	/**
-	 * Add another form element as children to this element.
-	 *
-	 * @param {AbstractElement} element
-	 * The form element to add.
-	 */
-	append: function(obj) {
-		this.children.push(obj);
-	},
-
-	/**
-	 * Parse this elements form input.
-	 *
-	 * The `parse()` function recursively walks the form element tree and
-	 * triggers input value reading and validation for each encountered element.
-	 *
-	 * Elements which are hidden due to unsatisified dependencies are skipped.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once this element's value and the values of
-	 * all child elements have been parsed. The returned promise is rejected
-	 * if any parsed values are not meeting the validation constraints of their
-	 * respective elements.
-	 */
-	parse: function() {
-		var args = arguments;
-		this.children.forEach(function(child) {
-			child.parse.apply(child, args);
-		});
-	},
-
-	/**
-	 * Render the form element.
-	 *
-	 * The `render()` function recursively walks the form element tree and
-	 * renders the markup for each element, returning the assembled DOM tree.
-	 *
-	 * @abstract
-	 * @returns {Node|Promise<Node>}
-	 * May return a DOM Node or a promise resolving to a DOM node containing
-	 * the form element's markup, including the markup of any child elements.
-	 */
-	render: function() {
-		L.error('InternalError', 'Not implemented');
-	},
-
-	/** @private */
-	loadChildren: function(/* ... */) {
-		var tasks = [];
-
-		if (Array.isArray(this.children))
-			for (var i = 0; i < this.children.length; i++)
-				if (!this.children[i].disable)
-					tasks.push(this.children[i].load.apply(this.children[i], arguments));
-
-		return Promise.all(tasks);
-	},
-
-	/** @private */
-	renderChildren: function(tab_name /*, ... */) {
-		var tasks = [],
-		    index = 0;
-
-		if (Array.isArray(this.children))
-			for (var i = 0; i < this.children.length; i++)
-				if (tab_name === null || this.children[i].tab === tab_name)
-					if (!this.children[i].disable)
-						tasks.push(this.children[i].render.apply(
-							this.children[i], this.varargs(arguments, 1, index++)));
-
-		return Promise.all(tasks);
-	},
-
-	/**
-	 * Strip any HTML tags from the given input string.
-	 *
-	 * @param {string} input
-	 * The input string to clean.
-	 *
-	 * @returns {string}
-	 * The cleaned input string with HTML removes removed.
-	 */
-	stripTags: function(s) {
-		if (typeof(s) == 'string' && !s.match(/[<>]/))
-			return s;
-
-		var x = E('div', {}, s);
-		return x.textContent || x.innerText || '';
-	},
-
-	/**
-	 * Format the given named property as title string.
-	 *
-	 * This function looks up the given named property and formats its value
-	 * suitable for use as element caption or description string. It also
-	 * strips any HTML tags from the result.
-	 *
-	 * If the property value is a string, it is passed to `String.format()`
-	 * along with any additional parameters passed to `titleFn()`.
-	 *
-	 * If the property value is a function, it is invoked with any additional
-	 * `titleFn()` parameters as arguments and the obtained return value is
-	 * converted to a string.
-	 *
-	 * In all other cases, `null` is returned.
-	 *
-	 * @param {string} property
-	 * The name of the element property to use.
-	 *
-	 * @param {...*} fmt_args
-	 * Extra values to format the title string with.
-	 *
-	 * @returns {string|null}
-	 * The formatted title string or `null` if the property did not exist or
-	 * was neither a string nor a function.
-	 */
-	titleFn: function(attr /*, ... */) {
-		var s = null;
-
-		if (typeof(this[attr]) == 'function')
-			s = this[attr].apply(this, this.varargs(arguments, 1));
-		else if (typeof(this[attr]) == 'string')
-			s = (arguments.length > 1) ? ''.format.apply(this[attr], this.varargs(arguments, 1)) : this[attr];
-
-		if (s != null)
-			s = this.stripTags(String(s)).trim();
-
-		if (s == null || s == '')
-			return null;
-
-		return s;
-	}
-});
-
-/**
- * @constructor Map
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractElement
- *
- * @classdesc
- *
- * The `Map` class represents one complete form. A form usually maps one UCI
- * configuraton file and is divided into multiple sections containing multiple
- * fields each.
- *
- * It serves as main entry point into the `LuCI.form` for typical view code.
- *
- * @param {string} config
- * The UCI configuration to map. It is automatically loaded along when the
- * resulting map instance.
- *
- * @param {string} [title]
- * The title caption of the form. A form title is usually rendered as separate
- * headline element before the actual form contents. If omitted, the
- * corresponding headline element will not be rendered.
- *
- * @param {string} [description]
- * The description text of the form which is usually rendered as text
- * paragraph below the form title and before the actual form conents.
- * If omitted, the corresponding paragraph element will not be rendered.
- */
-var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
-	__init__: function(config /*, ... */) {
-		this.super('__init__', this.varargs(arguments, 1));
-
-		this.config = config;
-		this.parsechain = [ config ];
-		this.data = uci;
-	},
-
-	/**
-	 * Toggle readonly state of the form.
-	 *
-	 * If set to `true`, the Map instance is marked readonly and any form
-	 * option elements added to it will inherit the readonly state.
-	 *
-	 * If left unset, the Map will test the access permission of the primary
-	 * uci configuration upon loading and mark the form readonly if no write
-	 * permissions are granted.
-	 *
-	 * @name LuCI.form.Map.prototype#readonly
-	 * @type boolean
-	 */
-
-	/**
-	 * Find all DOM nodes within this Map which match the given search
-	 * parameters. This function is essentially a convenience wrapper around
-	 * `querySelectorAll()`.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if only one argument is specified, it is used as selector-expression
-	 * as-is. When two arguments are passed, the first argument is treated
-	 * as attribute name, the second one as attribute value to match.
-	 *
-	 * As an example, `map.findElements('input')` would find all `<input>`
-	 * nodes while `map.findElements('type', 'text')` would find any DOM node
-	 * with a `type="text"` attribute.
-	 *
-	 * @param {string} selector_or_attrname
-	 * If invoked with only one parameter, this argument is a
-	 * `querySelectorAll()` compatible selector expression. If invoked with
-	 * two parameters, this argument is the attribute name to filter for.
-	 *
-	 * @param {string} [attrvalue]
-	 * In case the function is invoked with two parameters, this argument
-	 * specifies the attribute value to match.
-	 *
-	 * @throws {InternalError}
-	 * Throws an `InternalError` if more than two function parameters are
-	 * passed.
-	 *
-	 * @returns {NodeList}
-	 * Returns a (possibly empty) DOM `NodeList` containing the found DOM nodes.
-	 */
-	findElements: function(/* ... */) {
-		var q = null;
-
-		if (arguments.length == 1)
-			q = arguments[0];
-		else if (arguments.length == 2)
-			q = '[%s="%s"]'.format(arguments[0], arguments[1]);
-		else
-			L.error('InternalError', 'Expecting one or two arguments to findElements()');
-
-		return this.root.querySelectorAll(q);
-	},
-
-	/**
-	 * Find the first DOM node within this Map which matches the given search
-	 * parameters. This function is essentially a convenience wrapper around
-	 * `findElements()` which only returns the first found node.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if only one argument is specified, it is used as selector-expression
-	 * as-is. When two arguments are passed, the first argument is treated
-	 * as attribute name, the second one as attribute value to match.
-	 *
-	 * As an example, `map.findElement('input')` would find the first `<input>`
-	 * node while `map.findElement('type', 'text')` would find the first DOM
-	 * node with a `type="text"` attribute.
-	 *
-	 * @param {string} selector_or_attrname
-	 * If invoked with only one parameter, this argument is a `querySelector()`
-	 * compatible selector expression. If invoked with two parameters, this
-	 * argument is the attribute name to filter for.
-	 *
-	 * @param {string} [attrvalue]
-	 * In case the function is invoked with two parameters, this argument
-	 * specifies the attribute value to match.
-	 *
-	 * @throws {InternalError}
-	 * Throws an `InternalError` if more than two function parameters are
-	 * passed.
-	 *
-	 * @returns {Node|null}
-	 * Returns the first found DOM node or `null` if no element matched.
-	 */
-	findElement: function(/* ... */) {
-		var res = this.findElements.apply(this, arguments);
-		return res.length ? res[0] : null;
-	},
-
-	/**
-	 * Tie another UCI configuration to the map.
-	 *
-	 * By default, a map instance will only load the UCI configuration file
-	 * specified in the constructor but sometimes access to values from
-	 * further configuration files is required. This function allows for such
-	 * use cases by registering further UCI configuration files which are
-	 * needed by the map.
-	 *
-	 * @param {string} config
-	 * The additional UCI configuration file to tie to the map. If the given
-	 * config already is in the list of required files, it will be ignored.
-	 */
-	chain: function(config) {
-		if (this.parsechain.indexOf(config) == -1)
-			this.parsechain.push(config);
-	},
-
-	/**
-	 * Add a configuration section to the map.
-	 *
-	 * LuCI forms follow the structure of the underlying UCI configurations,
-	 * means that a map, which represents a single UCI configuration, is
-	 * divided into multiple sections which in turn contain an arbitrary
-	 * number of options.
-	 *
-	 * While UCI itself only knows two kinds of sections - named and anonymous
-	 * ones - the form class offers various flavors of form section elements
-	 * to present configuration sections in different ways. Refer to the
-	 * documentation of the different section classes for details.
-	 *
-	 * @param {LuCI.form.AbstractSection} sectionclass
-	 * The section class to use for rendering the configuration section.
-	 * Note that this value must be the class itself, not a class instance
-	 * obtained from calling `new`. It must also be a class dervied from
-	 * `LuCI.form.AbstractSection`.
-	 *
-	 * @param {...string} classargs
-	 * Additional arguments which are passed as-is to the contructor of the
-	 * given section class. Refer to the class specific constructor
-	 * documentation for details.
-	 *
-	 * @returns {LuCI.form.AbstractSection}
-	 * Returns the instantiated section class instance.
-	 */
-	section: function(cbiClass /*, ... */) {
-		if (!CBIAbstractSection.isSubclass(cbiClass))
-			L.error('TypeError', 'Class must be a descendent of CBIAbstractSection');
-
-		var obj = cbiClass.instantiate(this.varargs(arguments, 1, this));
-		this.append(obj);
-		return obj;
-	},
-
-	/**
-	 * Load the configuration covered by this map.
-	 *
-	 * The `load()` function first loads all referenced UCI configurations,
-	 * then it recursively walks the form element tree and invokes the
-	 * load function of each child element.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the entire form completed loading all
-	 * data. The promise may reject with an error if any configuration failed
-	 * to load or if any of the child elements load functions rejected with
-	 * an error.
-	 */
-	load: function() {
-		var doCheckACL = (!(this instanceof CBIJSONMap) && this.readonly == null),
-		    loadTasks = [ doCheckACL ? callSessionAccess('uci', this.config, 'write') : true ],
-		    configs = this.parsechain || [ this.config ];
-
-		loadTasks.push.apply(loadTasks, configs.map(L.bind(function(config, i) {
-			return i ? L.resolveDefault(this.data.load(config)) : this.data.load(config);
-		}, this)));
-
-		return Promise.all(loadTasks).then(L.bind(function(res) {
-			if (res[0] === false)
-				this.readonly = true;
-
-			return this.loadChildren();
-		}, this));
-	},
-
-	/**
-	 * Parse the form input values.
-	 *
-	 * The `parse()` function recursively walks the form element tree and
-	 * triggers input value reading and validation for each child element.
-	 *
-	 * Elements which are hidden due to unsatisified dependencies are skipped.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the entire form completed parsing all
-	 * input values. The returned promise is rejected if any parsed values are
-	 * not meeting the validation constraints of their respective elements.
-	 */
-	parse: function() {
-		var tasks = [];
-
-		if (Array.isArray(this.children))
-			for (var i = 0; i < this.children.length; i++)
-				tasks.push(this.children[i].parse());
-
-		return Promise.all(tasks);
-	},
-
-	/**
-	 * Save the form input values.
-	 *
-	 * This function parses the current form, saves the resulting UCI changes,
-	 * reloads the UCI configuration data and redraws the form elements.
-	 *
-	 * @param {function} [cb]
-	 * An optional callback function that is invoked after the form is parsed
-	 * but before the changed UCI data is saved. This is useful to perform
-	 * additional data manipulation steps before saving the changes.
-	 *
-	 * @param {boolean} [silent=false]
-	 * If set to `true`, trigger an alert message to the user in case saving
-	 * the form data failes. Otherwise fail silently.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the entire save operation is complete.
-	 * The returned promise is rejected if any step of the save operation
-	 * failed.
-	 */
-	save: function(cb, silent) {
-		this.checkDepends();
-
-		return this.parse()
-			.then(cb)
-			.then(this.data.save.bind(this.data))
-			.then(this.load.bind(this))
-			.catch(function(e) {
-				if (!silent) {
-					ui.showModal(_('Save error'), [
-						E('p', {}, [ _('An error occurred while saving the form:') ]),
-						E('p', {}, [ E('em', { 'style': 'white-space:pre' }, [ e.message ]) ]),
-						E('div', { 'class': 'right' }, [
-							E('button', { 'class': 'btn', 'click': ui.hideModal }, [ _('Dismiss') ])
-						])
-					]);
-				}
-
-				return Promise.reject(e);
-			}).then(this.renderContents.bind(this));
-	},
-
-	/**
-	 * Reset the form by re-rendering its contents. This will revert all
-	 * unsaved user inputs to their initial form state.
-	 *
-	 * @returns {Promise<Node>}
-	 * Returns a promise resolving to the toplevel form DOM node once the
-	 * re-rendering is complete.
-	 */
-	reset: function() {
-		return this.renderContents();
-	},
-
-	/**
-	 * Render the form markup.
-	 *
-	 * @returns {Promise<Node>}
-	 * Returns a promise resolving to the toplevel form DOM node once the
-	 * rendering is complete.
-	 */
-	render: function() {
-		return this.load().then(this.renderContents.bind(this));
-	},
-
-	/** @private */
-	renderContents: function() {
-		var mapEl = this.root || (this.root = E('div', {
-			'id': 'cbi-%s'.format(this.config),
-			'class': 'cbi-map',
-			'cbi-dependency-check': L.bind(this.checkDepends, this)
-		}));
-
-		dom.bindClassInstance(mapEl, this);
-
-		return this.renderChildren(null).then(L.bind(function(nodes) {
-			var initialRender = !mapEl.firstChild;
-
-			dom.content(mapEl, null);
-
-			if (this.title != null && this.title != '')
-				mapEl.appendChild(E('h2', { 'name': 'content' }, this.title));
-
-			if (this.description != null && this.description != '')
-				mapEl.appendChild(E('div', { 'class': 'cbi-map-descr' }, this.description));
-
-			if (this.tabbed)
-				dom.append(mapEl, E('div', { 'class': 'cbi-map-tabbed' }, nodes));
-			else
-				dom.append(mapEl, nodes);
-
-			if (!initialRender) {
-				mapEl.classList.remove('flash');
-
-				window.setTimeout(function() {
-					mapEl.classList.add('flash');
-				}, 1);
-			}
-
-			this.checkDepends();
-
-			var tabGroups = mapEl.querySelectorAll('.cbi-map-tabbed, .cbi-section-node-tabbed');
-
-			for (var i = 0; i < tabGroups.length; i++)
-				ui.tabs.initTabGroup(tabGroups[i].childNodes);
-
-			return mapEl;
-		}, this));
-	},
-
-	/**
-	 * Find a form option element instance.
-	 *
-	 * @param {string} name_or_id
-	 * The name or the full ID of the option element to look up.
-	 *
-	 * @param {string} [section_id]
-	 * The ID of the UCI section containing the option to look up. May be
-	 * omitted if a full ID is passed as first argument.
-	 *
-	 * @param {string} [config]
-	 * The name of the UCI configuration the option instance is belonging to.
-	 * Defaults to the main UCI configuration of the map if omitted.
-	 *
-	 * @returns {Array<LuCI.form.AbstractValue,string>|null}
-	 * Returns a two-element array containing the form option instance as
-	 * first item and the corresponding UCI section ID as second item.
-	 * Returns `null` if the option could not be found.
-	 */
-	lookupOption: function(name, section_id, config_name) {
-		var id, elem, sid, inst;
-
-		if (name.indexOf('.') > -1)
-			id = 'cbid.%s'.format(name);
-		else
-			id = 'cbid.%s.%s.%s'.format(config_name || this.config, section_id, name);
-
-		elem = this.findElement('data-field', id);
-		sid  = elem ? id.split(/\./)[2] : null;
-		inst = elem ? dom.findClassInstance(elem) : null;
-
-		return (inst instanceof CBIAbstractValue) ? [ inst, sid ] : null;
-	},
-
-	/** @private */
-	checkDepends: function(ev, n) {
-		var changed = false;
-
-		for (var i = 0, s = this.children[0]; (s = this.children[i]) != null; i++)
-			if (s.checkDepends(ev, n))
-				changed = true;
-
-		if (changed && (n || 0) < 10)
-			this.checkDepends(ev, (n || 10) + 1);
-
-		ui.tabs.updateTabs(ev, this.root);
-	},
-
-	/** @private */
-	isDependencySatisfied: function(depends, config_name, section_id) {
-		var def = false;
-
-		if (!Array.isArray(depends) || !depends.length)
-			return true;
-
-		for (var i = 0; i < depends.length; i++) {
-			var istat = true,
-			    reverse = depends[i]['!reverse'],
-			    contains = depends[i]['!contains'];
-
-			for (var dep in depends[i]) {
-				if (dep == '!reverse' || dep == '!contains') {
-					continue;
-				}
-				else if (dep == '!default') {
-					def = true;
-					istat = false;
-				}
-				else {
-					var res = this.lookupOption(dep, section_id, config_name),
-					    val = (res && res[0].isActive(res[1])) ? res[0].formvalue(res[1]) : null;
-
-					var equal = contains
-						? isContained(val, depends[i][dep])
-						: isEqual(val, depends[i][dep]);
-
-					istat = (istat && equal);
-				}
-			}
-
-			if (istat ^ reverse)
-				return true;
-		}
-
-		return def;
-	}
-});
-
-/**
- * @constructor JSONMap
- * @memberof LuCI.form
- * @augments LuCI.form.Map
- *
- * @classdesc
- *
- * A `JSONMap` class functions similar to [LuCI.form.Map]{@link LuCI.form.Map}
- * but uses a multidimensional JavaScript object instead of UCI configuration
- * as data source.
- *
- * @param {Object<string, Object<string, *>|Array<Object<string, *>>>} data
- * The JavaScript object to use as data source. Internally, the object is
- * converted into an UCI-like format. Its toplevel keys are treated like UCI
- * section types while the object or array-of-object values are treated as
- * section contents.
- *
- * @param {string} [title]
- * The title caption of the form. A form title is usually rendered as separate
- * headline element before the actual form contents. If omitted, the
- * corresponding headline element will not be rendered.
- *
- * @param {string} [description]
- * The description text of the form which is usually rendered as text
- * paragraph below the form title and before the actual form conents.
- * If omitted, the corresponding paragraph element will not be rendered.
- */
-var CBIJSONMap = CBIMap.extend(/** @lends LuCI.form.JSONMap.prototype */ {
-	__init__: function(data /*, ... */) {
-		this.super('__init__', this.varargs(arguments, 1, 'json'));
-
-		this.config = 'json';
-		this.parsechain = [ 'json' ];
-		this.data = new CBIJSONConfig(data);
-	}
-});
-
-/**
- * @class AbstractSection
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractElement
- * @hideconstructor
- * @classdesc
- *
- * The `AbstractSection` class serves as abstract base for the different form
- * section styles implemented by `LuCI.form`. It provides the common logic for
- * enumerating underlying configuration section instances, for registering
- * form options and for handling tabs to segment child options.
- *
- * This class is private and not directly accessible by user code.
- */
-var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractSection.prototype */ {
-	__init__: function(map, sectionType /*, ... */) {
-		this.super('__init__', this.varargs(arguments, 2));
-
-		this.sectiontype = sectionType;
-		this.map = map;
-		this.config = map.config;
-
-		this.optional = true;
-		this.addremove = false;
-		this.dynamic = false;
-	},
-
-	/**
-	 * Access the parent option container instance.
-	 *
-	 * In case this section is nested within an option element container,
-	 * this property will hold a reference to the parent option instance.
-	 *
-	 * If this section is not nested, the property is `null`.
-	 *
-	 * @name LuCI.form.AbstractSection.prototype#parentoption
-	 * @type LuCI.form.AbstractValue
-	 * @readonly
-	 */
-
-	/**
-	 * Enumerate the UCI section IDs covered by this form section element.
-	 *
-	 * @abstract
-	 * @throws {InternalError}
-	 * Throws an `InternalError` exception if the function is not implemented.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of UCI section IDs covered by this form element.
-	 * The sections will be rendered in the same order as the returned array.
-	 */
-	cfgsections: function() {
-		L.error('InternalError', 'Not implemented');
-	},
-
-	/**
-	 * Filter UCI section IDs to render.
-	 *
-	 * The filter function is invoked for each UCI section ID of a given type
-	 * and controls whether the given UCI section is rendered or ignored by
-	 * the form section element.
-	 *
-	 * The default implementation always returns `true`. User code or
-	 * classes extending `AbstractSection` may overwrite this function with
-	 * custom implementations.
-	 *
-	 * @abstract
-	 * @param {string} section_id
-	 * The UCI section ID to test.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the given UCI section ID should be handled and
-	 * `false` when it should be ignored.
-	 */
-	filter: function(section_id) {
-		return true;
-	},
-
-	/**
-	 * Load the configuration covered by this section.
-	 *
-	 * The `load()` function recursively walks the section element tree and
-	 * invokes the load function of each child option element.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the values of all child elements have
-	 * been loaded. The promise may reject with an error if any of the child
-	 * elements load functions rejected with an error.
-	 */
-	load: function() {
-		var section_ids = this.cfgsections(),
-		    tasks = [];
-
-		if (Array.isArray(this.children))
-			for (var i = 0; i < section_ids.length; i++)
-				tasks.push(this.loadChildren(section_ids[i])
-					.then(Function.prototype.bind.call(function(section_id, set_values) {
-						for (var i = 0; i < set_values.length; i++)
-							this.children[i].cfgvalue(section_id, set_values[i]);
-					}, this, section_ids[i])));
-
-		return Promise.all(tasks);
-	},
-
-	/**
-	 * Parse this sections form input.
-	 *
-	 * The `parse()` function recursively walks the section element tree and
-	 * triggers input value reading and validation for each encountered child
-	 * option element.
-	 *
-	 * Options which are hidden due to unsatisified dependencies are skipped.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the values of all child elements have
-	 * been parsed. The returned promise is rejected if any parsed values are
-	 * not meeting the validation constraints of their respective elements.
-	 */
-	parse: function() {
-		var section_ids = this.cfgsections(),
-		    tasks = [];
-
-		if (Array.isArray(this.children))
-			for (var i = 0; i < section_ids.length; i++)
-				for (var j = 0; j < this.children.length; j++)
-					tasks.push(this.children[j].parse(section_ids[i]));
-
-		return Promise.all(tasks);
-	},
-
-	/**
-	 * Add an option tab to the section.
-	 *
-	 * The child option elements of a section may be divided into multiple
-	 * tabs to provide a better overview to the user.
-	 *
-	 * Before options can be moved into a tab pane, the corresponding tab
-	 * has to be defined first, which is done by calling this function.
-	 *
-	 * Note that once tabs are defined, user code must use the `taboption()`
-	 * method to add options to specific tabs. Option elements added by
-	 * `option()` will not be assigned to any tab and not be rendered in this
-	 * case.
-	 *
-	 * @param {string} name
-	 * The name of the tab to register. It may be freely chosen and just serves
-	 * as an identifier to differentiate tabs.
-	 *
-	 * @param {string} title
-	 * The human readable caption of the tab.
-	 *
-	 * @param {string} [description]
-	 * An additional description text for the corresponding tab pane. It is
-	 * displayed as text paragraph below the tab but before the tab pane
-	 * contents. If omitted, no description will be rendered.
-	 *
-	 * @throws {Error}
-	 * Throws an exeption if a tab with the same `name` already exists.
-	 */
-	tab: function(name, title, description) {
-		if (this.tabs && this.tabs[name])
-			throw 'Tab already declared';
-
-		var entry = {
-			name: name,
-			title: title,
-			description: description,
-			children: []
-		};
-
-		this.tabs = this.tabs || [];
-		this.tabs.push(entry);
-		this.tabs[name] = entry;
-
-		this.tab_names = this.tab_names || [];
-		this.tab_names.push(name);
-	},
-
-	/**
-	 * Add a configuration option widget to the section.
-	 *
-	 * Note that [taboption()]{@link LuCI.form.AbstractSection#taboption}
-	 * should be used instead if this form section element uses tabs.
-	 *
-	 * @param {LuCI.form.AbstractValue} optionclass
-	 * The option class to use for rendering the configuration option. Note
-	 * that this value must be the class itself, not a class instance obtained
-	 * from calling `new`. It must also be a class dervied from
-	 * [LuCI.form.AbstractSection]{@link LuCI.form.AbstractSection}.
-	 *
-	 * @param {...*} classargs
-	 * Additional arguments which are passed as-is to the contructor of the
-	 * given option class. Refer to the class specific constructor
-	 * documentation for details.
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception in case the passed class value is not a
-	 * descendent of `AbstractValue`.
-	 *
-	 * @returns {LuCI.form.AbstractValue}
-	 * Returns the instantiated option class instance.
-	 */
-	option: function(cbiClass /*, ... */) {
-		if (!CBIAbstractValue.isSubclass(cbiClass))
-			throw L.error('TypeError', 'Class must be a descendent of CBIAbstractValue');
-
-		var obj = cbiClass.instantiate(this.varargs(arguments, 1, this.map, this));
-		this.append(obj);
-		return obj;
-	},
-
-	/**
-	 * Add a configuration option widget to a tab of the section.
-	 *
-	 * @param {string} tabname
-	 * The name of the section tab to add the option element to.
-	 *
-	 * @param {LuCI.form.AbstractValue} optionclass
-	 * The option class to use for rendering the configuration option. Note
-	 * that this value must be the class itself, not a class instance obtained
-	 * from calling `new`. It must also be a class dervied from
-	 * [LuCI.form.AbstractSection]{@link LuCI.form.AbstractSection}.
-	 *
-	 * @param {...*} classargs
-	 * Additional arguments which are passed as-is to the contructor of the
-	 * given option class. Refer to the class specific constructor
-	 * documentation for details.
-	 *
-	 * @throws {ReferenceError}
-	 * Throws a `ReferenceError` exception when the given tab name does not
-	 * exist.
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception in case the passed class value is not a
-	 * descendent of `AbstractValue`.
-	 *
-	 * @returns {LuCI.form.AbstractValue}
-	 * Returns the instantiated option class instance.
-	 */
-	taboption: function(tabName /*, ... */) {
-		if (!this.tabs || !this.tabs[tabName])
-			throw L.error('ReferenceError', 'Associated tab not declared');
-
-		var obj = this.option.apply(this, this.varargs(arguments, 1));
-		obj.tab = tabName;
-		this.tabs[tabName].children.push(obj);
-		return obj;
-	},
-
-	/**
-	 * Query underlying option configuration values.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if only one argument is specified, the configuration values of all
-	 * options within this section are returned as dictionary.
-	 *
-	 * If both the section ID and an option name are supplied, this function
-	 * returns the configuration value of the specified option only.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @param {string} [option]
-	 * The name of the option to query
-	 *
-	 * @returns {null|string|string[]|Object<string, null|string|string[]>}
-	 * Returns either a dictionary of option names and their corresponding
-	 * configuration values or just a single configuration value, depending
-	 * on the amount of passed arguments.
-	 */
-	cfgvalue: function(section_id, option) {
-		var rv = (arguments.length == 1) ? {} : null;
-
-		for (var i = 0, o; (o = this.children[i]) != null; i++)
-			if (rv)
-				rv[o.option] = o.cfgvalue(section_id);
-			else if (o.option == option)
-				return o.cfgvalue(section_id);
-
-		return rv;
-	},
-
-	/**
-	 * Query underlying option widget input values.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if only one argument is specified, the widget input values of all
-	 * options within this section are returned as dictionary.
-	 *
-	 * If both the section ID and an option name are supplied, this function
-	 * returns the widget input value of the specified option only.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @param {string} [option]
-	 * The name of the option to query
-	 *
-	 * @returns {null|string|string[]|Object<string, null|string|string[]>}
-	 * Returns either a dictionary of option names and their corresponding
-	 * widget input values or just a single widget input value, depending
-	 * on the amount of passed arguments.
-	 */
-	formvalue: function(section_id, option) {
-		var rv = (arguments.length == 1) ? {} : null;
-
-		for (var i = 0, o; (o = this.children[i]) != null; i++) {
-			var func = this.map.root ? this.children[i].formvalue : this.children[i].cfgvalue;
-
-			if (rv)
-				rv[o.option] = func.call(o, section_id);
-			else if (o.option == option)
-				return func.call(o, section_id);
-		}
-
-		return rv;
-	},
-
-	/**
-	 * Obtain underlying option LuCI.ui widget instances.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if only one argument is specified, the LuCI.ui widget instances of all
-	 * options within this section are returned as dictionary.
-	 *
-	 * If both the section ID and an option name are supplied, this function
-	 * returns the LuCI.ui widget instance value of the specified option only.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @param {string} [option]
-	 * The name of the option to query
-	 *
-	 * @returns {null|LuCI.ui.AbstractElement|Object<string, null|LuCI.ui.AbstractElement>}
-	 * Returns either a dictionary of option names and their corresponding
-	 * widget input values or just a single widget input value, depending
-	 * on the amount of passed arguments.
-	 */
-	getUIElement: function(section_id, option) {
-		var rv = (arguments.length == 1) ? {} : null;
-
-		for (var i = 0, o; (o = this.children[i]) != null; i++)
-			if (rv)
-				rv[o.option] = o.getUIElement(section_id);
-			else if (o.option == option)
-				return o.getUIElement(section_id);
-
-		return rv;
-	},
-
-	/**
-	 * Obtain underlying option objects.
-	 *
-	 * This function is sensitive to the amount of arguments passed to it;
-	 * if no option name is specified, all options within this section are
-	 * returned as dictionary.
-	 *
-	 * If an option name is supplied, this function returns the matching
-	 * LuCI.form.AbstractValue instance only.
-	 *
-	 * @param {string} [option]
-	 * The name of the option object to obtain
-	 *
-	 * @returns {null|LuCI.form.AbstractValue|Object<string, LuCI.form.AbstractValue>}
-	 * Returns either a dictionary of option names and their corresponding
-	 * option instance objects or just a single object instance value,
-	 * depending on the amount of passed arguments.
-	 */
-	getOption: function(option) {
-		var rv = (arguments.length == 0) ? {} : null;
-
-		for (var i = 0, o; (o = this.children[i]) != null; i++)
-			if (rv)
-				rv[o.option] = o;
-			else if (o.option == option)
-				return o;
-
-		return rv;
-	},
-
-	/** @private */
-	renderUCISection: function(section_id) {
-		var renderTasks = [];
-
-		if (!this.tabs)
-			return this.renderOptions(null, section_id);
-
-		for (var i = 0; i < this.tab_names.length; i++)
-			renderTasks.push(this.renderOptions(this.tab_names[i], section_id));
-
-		return Promise.all(renderTasks)
-			.then(this.renderTabContainers.bind(this, section_id));
-	},
-
-	/** @private */
-	renderTabContainers: function(section_id, nodes) {
-		var config_name = this.uciconfig || this.map.config,
-		    containerEls = E([]);
-
-		for (var i = 0; i < nodes.length; i++) {
-			var tab_name = this.tab_names[i],
-			    tab_data = this.tabs[tab_name],
-			    containerEl = E('div', {
-			    	'id': 'container.%s.%s.%s'.format(config_name, section_id, tab_name),
-			    	'data-tab': tab_name,
-			    	'data-tab-title': tab_data.title,
-			    	'data-tab-active': tab_name === this.selected_tab
-			    });
-
-			if (tab_data.description != null && tab_data.description != '')
-				containerEl.appendChild(
-					E('div', { 'class': 'cbi-tab-descr' }, tab_data.description));
-
-			containerEl.appendChild(nodes[i]);
-			containerEls.appendChild(containerEl);
-		}
-
-		return containerEls;
-	},
-
-	/** @private */
-	renderOptions: function(tab_name, section_id) {
-		var in_table = (this instanceof CBITableSection);
-		return this.renderChildren(tab_name, section_id, in_table).then(function(nodes) {
-			var optionEls = E([]);
-			for (var i = 0; i < nodes.length; i++)
-				optionEls.appendChild(nodes[i]);
-			return optionEls;
-		});
-	},
-
-	/** @private */
-	checkDepends: function(ev, n) {
-		var changed = false,
-		    sids = this.cfgsections();
-
-		for (var i = 0, sid = sids[0]; (sid = sids[i]) != null; i++) {
-			for (var j = 0, o = this.children[0]; (o = this.children[j]) != null; j++) {
-				var isActive = o.isActive(sid),
-				    isSatisified = o.checkDepends(sid);
-
-				if (isActive != isSatisified) {
-					o.setActive(sid, !isActive);
-					isActive = !isActive;
-					changed = true;
-				}
-
-				if (!n && isActive)
-					o.triggerValidation(sid);
-			}
-		}
-
-		return changed;
-	}
-});
-
-
-var isEqual = function(x, y) {
-	if (typeof(y) == 'object' && y instanceof RegExp)
-		return (x == null) ? false : y.test(x);
-
-	if (x != null && y != null && typeof(x) != typeof(y))
-		return false;
-
-	if ((x == null && y != null) || (x != null && y == null))
-		return false;
-
-	if (Array.isArray(x)) {
-		if (x.length != y.length)
-			return false;
-
-		for (var i = 0; i < x.length; i++)
-			if (!isEqual(x[i], y[i]))
-				return false;
-	}
-	else if (typeof(x) == 'object') {
-		for (var k in x) {
-			if (x.hasOwnProperty(k) && !y.hasOwnProperty(k))
-				return false;
-
-			if (!isEqual(x[k], y[k]))
-				return false;
-		}
-
-		for (var k in y)
-			if (y.hasOwnProperty(k) && !x.hasOwnProperty(k))
-				return false;
-	}
-	else if (x != y) {
-		return false;
-	}
-
-	return true;
-};
-
-var isContained = function(x, y) {
-	if (Array.isArray(x)) {
-		for (var i = 0; i < x.length; i++)
-			if (x[i] == y)
-				return true;
-	}
-	else if (L.isObject(x)) {
-		if (x.hasOwnProperty(y) && x[y] != null)
-			return true;
-	}
-	else if (typeof(x) == 'string') {
-		return (x.indexOf(y) > -1);
-	}
-
-	return false;
-};
-
-/**
- * @class AbstractValue
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractElement
- * @hideconstructor
- * @classdesc
- *
- * The `AbstractValue` class serves as abstract base for the different form
- * option styles implemented by `LuCI.form`. It provides the common logic for
- * handling option input values, for dependencies among options and for
- * validation constraints that should be applied to entered values.
- *
- * This class is private and not directly accessible by user code.
- */
-var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractValue.prototype */ {
-	__init__: function(map, section, option /*, ... */) {
-		this.super('__init__', this.varargs(arguments, 3));
-
-		this.section = section;
-		this.option = option;
-		this.map = map;
-		this.config = map.config;
-
-		this.deps = [];
-		this.initial = {};
-		this.rmempty = true;
-		this.default = null;
-		this.size = null;
-		this.optional = false;
-	},
-
-	/**
-	 * If set to `false`, the underlying option value is retained upon saving
-	 * the form when the option element is disabled due to unsatisfied
-	 * dependency constraints.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#rmempty
-	 * @type boolean
-	 * @default true
-	 */
-
-	/**
-	 * If set to `true`, the underlying ui input widget is allowed to be empty,
-	 * otherwise the option element is marked invalid when no value is entered
-	 * or selected by the user.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#optional
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Sets a default value to use when the underlying UCI option is not set.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#default
-	 * @type *
-	 * @default null
-	 */
-
-	/**
-	 * Specifies a datatype constraint expression to validate input values
-	 * against. Refer to {@link LuCI.validation} for details on the format.
-	 *
-	 * If the user entered input does not match the datatype validation, the
-	 * option element is marked as invalid.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#datatype
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Specifies a custom validation function to test the user input for
-	 * validity. The validation function must return `true` to accept the
-	 * value. Any other return value type is converted to a string and
-	 * displayed to the user as validation error message.
-	 *
-	 * If the user entered input does not pass the validation function, the
-	 * option element is marked as invalid.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#validate
-	 * @type function
-	 * @default null
-	 */
-
-	/**
-	 * Override the UCI configuration name to read the option value from.
-	 *
-	 * By default, the configuration name is inherited from the parent Map.
-	 * By setting this property, a deviating configuration may be specified.
-	 *
-	 * The default is null, means inheriting from the parent form.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#uciconfig
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Override the UCI section name to read the option value from.
-	 *
-	 * By default, the section ID is inherited from the parent section element.
-	 * By setting this property, a deviating section may be specified.
-	 *
-	 * The default is null, means inheriting from the parent section.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#ucisection
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Override the UCI option name to read the value from.
-	 *
-	 * By default, the elements name, which is passed as third argument to
-	 * the constructor, is used as UCI option name. By setting this property,
-	 * a deviating UCI option may be specified.
-	 *
-	 * The default is null, means using the option element name.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#ucioption
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Mark grid section option element as editable.
-	 *
-	 * Options which are displayed in the table portion of a `GridSection`
-	 * instance are rendered as readonly text by default. By setting the
-	 * `editable` property of a child option element to `true`, that element
-	 * is rendered as full input widget within its cell instead of a text only
-	 * preview.
-	 *
-	 * This property has no effect on options that are not children of grid
-	 * section elements.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#editable
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Move grid section option element into the table, the modal popup or both.
-	 *
-	 * If this property is `null` (the default), the option element is
-	 * displayed in both the table preview area and the per-section instance
-	 * modal popup of a grid section. When it is set to `false` the option
-	 * is only shown in the table but not the modal popup. When set to `true`,
-	 * the option is only visible in the modal popup but not the table.
-	 *
-	 * This property has no effect on options that are not children of grid
-	 * section elements.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#modalonly
-	 * @type boolean
-	 * @default null
-	 */
-
-	/**
-	 * Make option element readonly.
-	 *
-	 * This property defaults to the readonly state of the parent form element.
-	 * When set to `true`, the underlying widget is rendered in disabled state,
-	 * means its contents cannot be changed and the widget cannot be interacted
-	 * with.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#readonly
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Override the cell width of a table or grid section child option.
-	 *
-	 * If the property is set to a numeric value, it is treated as pixel width
-	 * which is set on the containing cell element of the option, essentially
-	 * forcing a certain column width. When the property is set to a string
-	 * value, it is applied as-is to the CSS `width` property.
-	 *
-	 * This property has no effect on options that are not children of grid or
-	 * table section elements.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#width
-	 * @type number|string
-	 * @default null
-	 */
-
-	/**
-	 * Register a custom value change handler.
-	 *
-	 * If this property is set to a function value, the function is invoked
-	 * whenever the value of the underlying UI input element is changing.
-	 *
-	 * The invoked handler function will receive the DOM click element as
-	 * first and the underlying configuration section ID as well as the input
-	 * value as second and third argument respectively.
-	 *
-	 * @name LuCI.form.AbstractValue.prototype#onchange
-	 * @type function
-	 * @default null
-	 */
-
-	/**
-	 * Add a dependency contraint to the option.
-	 *
-	 * Dependency constraints allow making the presence of option elements
-	 * dependant on the current values of certain other options within the
-	 * same form. An option element with unsatisfied dependencies will be
-	 * hidden from the view and its current value is omitted when saving.
-	 *
-	 * Multiple constraints (that is, multiple calls to `depends()`) are
-	 * treated as alternatives, forming a logical "or" expression.
-	 *
-	 * By passing an object of name => value pairs as first argument, it is
-	 * possible to depend on multiple options simultaneously, allowing to form
-	 * a logical "and" expression.
-	 *
-	 * Option names may be given in "dot notation" which allows to reference
-	 * option elements outside of the current form section. If a name without
-	 * dot is specified, it refers to an option within the same configuration
-	 * section. If specified as <code>configname.sectionid.optionname</code>,
-	 * options anywhere within the same form may be specified.
-	 *
-	 * The object notation also allows for a number of special keys which are
-	 * not treated as option names but as modifiers to influence the dependency
-	 * constraint evaluation. The associated value of these special "tag" keys
-	 * is ignored. The recognized tags are:
-	 *
-	 * <ul>
-	 *   <li>
-	 *    <code>!reverse</code><br>
-	 *    Invert the dependency, instead of requiring another option to be
-	 *    equal to the dependency value, that option should <em>not</em> be
-	 *    equal.
-	 *   </li>
-	 *   <li>
-	 *    <code>!contains</code><br>
-	 *    Instead of requiring an exact match, the dependency is considered
-	 *    satisfied when the dependency value is contained within the option
-	 *    value.
-	 *   </li>
-	 *   <li>
-	 *    <code>!default</code><br>
-	 *    The dependency is always satisfied
-	 *   </li>
-	 * </ul>
-	 *
-	 * Examples:
-	 *
-	 * <ul>
-	 *  <li>
-	 *   <code>opt.depends("foo", "test")</code><br>
-	 *   Require the value of `foo` to be `test`.
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends({ foo: "test" })</code><br>
-	 *   Equivalent to the previous example.
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends({ foo: /test/ })</code><br>
-	 *   Require the value of `foo` to match the regular expression `/test/`.
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends({ foo: "test", bar: "qrx" })</code><br>
-	 *   Require the value of `foo` to be `test` and the value of `bar` to be
-	 *   `qrx`.
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends({ foo: "test" })<br>
-	 *         opt.depends({ bar: "qrx" })</code><br>
-	 *   Require either <code>foo</code> to be set to <code>test</code>,
-	 *   <em>or</em> the <code>bar</code> option to be <code>qrx</code>.
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends("test.section1.foo", "bar")</code><br>
-	 *   Require the "foo" form option within the "section1" section to be
-	 *   set to "bar".
-	 *  </li>
-	 *  <li>
-	 *   <code>opt.depends({ foo: "test", "!contains": true })</code><br>
-	 *   Require the "foo" option value to contain the substring "test".
-	 *  </li>
-	 * </ul>
-	 *
-	 * @param {string|Object<string, string|RegExp>} optionname_or_depends
-	 * The name of the option to depend on or an object describing multiple
-	 * dependencies which must be satified (a logical "and" expression).
-	 *
-	 * @param {string} optionvalue|RegExp
-	 * When invoked with a plain option name as first argument, this parameter
-	 * specifies the expected value. In case an object is passed as first
-	 * argument, this parameter is ignored.
-	 */
-	depends: function(field, value) {
-		var deps;
-
-		if (typeof(field) === 'string')
-			deps = {}, deps[field] = value;
-		else
-			deps = field;
-
-		this.deps.push(deps);
-	},
-
-	/** @private */
-	transformDepList: function(section_id, deplist) {
-		var list = deplist || this.deps,
-		    deps = [];
-
-		if (Array.isArray(list)) {
-			for (var i = 0; i < list.length; i++) {
-				var dep = {};
-
-				for (var k in list[i]) {
-					if (list[i].hasOwnProperty(k)) {
-						if (k.charAt(0) === '!')
-							dep[k] = list[i][k];
-						else if (k.indexOf('.') !== -1)
-							dep['cbid.%s'.format(k)] = list[i][k];
-						else
-							dep['cbid.%s.%s.%s'.format(
-								this.uciconfig || this.section.uciconfig || this.map.config,
-								this.ucisection || section_id,
-								k
-							)] = list[i][k];
-					}
-				}
-
-				for (var k in dep) {
-					if (dep.hasOwnProperty(k)) {
-						deps.push(dep);
-						break;
-					}
-				}
-			}
-		}
-
-		return deps;
-	},
-
-	/** @private */
-	transformChoices: function() {
-		if (!Array.isArray(this.keylist) || this.keylist.length == 0)
-			return null;
-
-		var choices = {};
-
-		for (var i = 0; i < this.keylist.length; i++)
-			choices[this.keylist[i]] = this.vallist[i];
-
-		return choices;
-	},
-
-	/** @private */
-	checkDepends: function(section_id) {
-		var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-		    active = this.map.isDependencySatisfied(this.deps, config_name, section_id);
-
-		if (active)
-			this.updateDefaultValue(section_id);
-
-		return active;
-	},
-
-	/** @private */
-	updateDefaultValue: function(section_id) {
-		if (!L.isObject(this.defaults))
-			return;
-
-		var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-		    cfgvalue = L.toArray(this.cfgvalue(section_id))[0],
-		    default_defval = null, satisified_defval = null;
-
-		for (var value in this.defaults) {
-			if (!this.defaults[value] || this.defaults[value].length == 0) {
-				default_defval = value;
-				continue;
-			}
-			else if (this.map.isDependencySatisfied(this.defaults[value], config_name, section_id)) {
-				satisified_defval = value;
-				break;
-			}
-		}
-
-		if (satisified_defval == null)
-			satisified_defval = default_defval;
-
-		var node = this.map.findElement('id', this.cbid(section_id));
-		if (node && node.getAttribute('data-changed') != 'true' && satisified_defval != null && cfgvalue == null)
-			dom.callClassMethod(node, 'setValue', satisified_defval);
-
-		this.default = satisified_defval;
-	},
-
-	/**
-	 * Obtain the internal ID ("cbid") of the element instance.
-	 *
-	 * Since each form section element may map multiple underlying
-	 * configuration sections, the configuration section ID is required to
-	 * form a fully qualified ID pointing to the specific element instance
-	 * within the given specific section.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @returns {string}
-	 * Returns the element ID.
-	 */
-	cbid: function(section_id) {
-		if (section_id == null)
-			L.error('TypeError', 'Section ID required');
-
-		return 'cbid.%s.%s.%s'.format(
-			this.uciconfig || this.section.uciconfig || this.map.config,
-			section_id, this.option);
-	},
-
-	/**
-	 * Load the underlying configuration value.
-	 *
-	 * The default implementation of this method reads and returns the
-	 * underlying UCI option value (or the related JavaScript property for
-	 * `JSONMap` instances). It may be overwritten by user code to load data
-	 * from nonstandard sources.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @returns {*|Promise<*>}
-	 * Returns the configuration value to initialize the option element with.
-	 * The return value of this function is filtered through `Promise.resolve()`
-	 * so it may return promises if overridden by user code.
-	 */
-	load: function(section_id) {
-		if (section_id == null)
-			L.error('TypeError', 'Section ID required');
-
-		return this.map.data.get(
-			this.uciconfig || this.section.uciconfig || this.map.config,
-			this.ucisection || section_id,
-			this.ucioption || this.option);
-	},
-
-	/**
-	 * Obtain the underlying `LuCI.ui` element instance.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @return {LuCI.ui.AbstractElement|null}
-	 * Returns the `LuCI.ui` element instance or `null` in case the form
-	 * option implementation does not use `LuCI.ui` widgets.
-	 */
-	getUIElement: function(section_id) {
-		var node = this.map.findElement('id', this.cbid(section_id)),
-		    inst = node ? dom.findClassInstance(node) : null;
-		return (inst instanceof ui.AbstractElement) ? inst : null;
-	},
-
-	/**
-	 * Query the underlying configuration value.
-	 *
-	 * The default implementation of this method returns the cached return
-	 * value of [load()]{@link LuCI.form.AbstractValue#load}. It may be
-	 * overwritten by user code to obtain the configuration value in a
-	 * different way.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @returns {*}
-	 * Returns the configuration value.
-	 */
-	cfgvalue: function(section_id, set_value) {
-		if (section_id == null)
-			L.error('TypeError', 'Section ID required');
-
-		if (arguments.length == 2) {
-			this.data = this.data || {};
-			this.data[section_id] = set_value;
-		}
-
-		return this.data ? this.data[section_id] : null;
-	},
-
-	/**
-	 * Query the current form input value.
-	 *
-	 * The default implementation of this method returns the current input
-	 * value of the underlying [LuCI.ui]{@link LuCI.ui.AbstractElement} widget.
-	 * It may be overwritten by user code to handle input values differently.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @returns {*}
-	 * Returns the current input value.
-	 */
-	formvalue: function(section_id) {
-		var elem = this.getUIElement(section_id);
-		return elem ? elem.getValue() : null;
-	},
-
-	/**
-	 * Obtain a textual input representation.
-	 *
-	 * The default implementation of this method returns the HTML escaped
-	 * current input value of the underlying
-	 * [LuCI.ui]{@link LuCI.ui.AbstractElement} widget. User code or specific
-	 * option element implementations may overwrite this function to apply a
-	 * different logic, e.g. to return `Yes` or `No` depending on the checked
-	 * state of checkbox elements.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @throws {TypeError}
-	 * Throws a `TypeError` exception when no `section_id` was specified.
-	 *
-	 * @returns {string}
-	 * Returns the text representation of the current input value.
-	 */
-	textvalue: function(section_id) {
-		var cval = this.cfgvalue(section_id);
-
-		if (cval == null)
-			cval = this.default;
-
-		return (cval != null) ? '%h'.format(cval) : null;
-	},
-
-	/**
-	 * Apply custom validation logic.
-	 *
-	 * This method is invoked whenever incremental validation is performed on
-	 * the user input, e.g. on keyup or blur events.
-	 *
-	 * The default implementation of this method does nothing and always
-	 * returns `true`. User code may overwrite this method to provide
-	 * additional validation logic which is not covered by data type
-	 * constraints.
-	 *
-	 * @abstract
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @param {*} value
-	 * The value to validate
-	 *
-	 * @returns {*}
-	 * The method shall return `true` to accept the given value. Any other
-	 * return value is treated as failure, converted to a string and displayed
-	 * as error message to the user.
-	 */
-	validate: function(section_id, value) {
-		return true;
-	},
-
-	/**
-	 * Test whether the input value is currently valid.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the input value currently is valid, otherwise it
-	 * returns `false`.
-	 */
-	isValid: function(section_id) {
-		var elem = this.getUIElement(section_id);
-		return elem ? elem.isValid() : true;
-	},
-
-	/**
-	 * Test whether the option element is currently active.
-	 *
-	 * An element is active when it is not hidden due to unsatisfied dependency
-	 * constraints.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the option element currently is active, otherwise it
-	 * returns `false`.
-	 */
-	isActive: function(section_id) {
-		var field = this.map.findElement('data-field', this.cbid(section_id));
-		return (field != null && !field.classList.contains('hidden'));
-	},
-
-	/** @private */
-	setActive: function(section_id, active) {
-		var field = this.map.findElement('data-field', this.cbid(section_id));
-
-		if (field && field.classList.contains('hidden') == active) {
-			field.classList[active ? 'remove' : 'add']('hidden');
-
-			if (dom.matches(field.parentNode, '.td.cbi-value-field'))
-				field.parentNode.classList[active ? 'remove' : 'add']('inactive');
-
-			return true;
-		}
-
-		return false;
-	},
-
-	/** @private */
-	triggerValidation: function(section_id) {
-		var elem = this.getUIElement(section_id);
-		return elem ? elem.triggerValidation() : true;
-	},
-
-	/**
-	 * Parse the option element input.
-	 *
-	 * The function is invoked when the `parse()` method has been invoked on
-	 * the parent form and triggers input value reading and validation.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving once the input value has been read and
-	 * validated or rejecting in case the input value does not meet the
-	 * validation constraints.
-	 */
-	parse: function(section_id) {
-		var active = this.isActive(section_id),
-		    cval = this.cfgvalue(section_id),
-		    fval = active ? this.formvalue(section_id) : null;
-
-		if (active && !this.isValid(section_id)) {
-			var title = this.stripTags(this.title).trim();
-			return Promise.reject(new TypeError(_('Option "%s" contains an invalid input value.').format(title || this.option)));
-		}
-
-		if (fval != '' && fval != null) {
-			if (this.forcewrite || !isEqual(cval, fval))
-				return Promise.resolve(this.write(section_id, fval));
-		}
-		else {
-			if (!active || this.rmempty || this.optional) {
-				return Promise.resolve(this.remove(section_id));
-			}
-			else if (!isEqual(cval, fval)) {
-				var title = this.stripTags(this.title).trim();
-				return Promise.reject(new TypeError(_('Option "%s" must not be empty.').format(title || this.option)));
-			}
-		}
-
-		return Promise.resolve();
-	},
-
-	/**
-	 * Write the current input value into the configuration.
-	 *
-	 * This function is invoked upon saving the parent form when the option
-	 * element is valid and when its input value has been changed compared to
-	 * the initial value returned by
-	 * [cfgvalue()]{@link LuCI.form.AbstractValue#cfgvalue}.
-	 *
-	 * The default implementation simply sets the given input value in the
-	 * UCI configuration (or the associated JavaScript object property in
-	 * case of `JSONMap` forms). It may be overwritten by user code to
-	 * implement alternative save logic, e.g. to transform the input value
-	 * before it is written.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 *
-	 * @param {string|string[]}	formvalue
-	 * The input value to write.
-	 */
-	write: function(section_id, formvalue) {
-		return this.map.data.set(
-			this.uciconfig || this.section.uciconfig || this.map.config,
-			this.ucisection || section_id,
-			this.ucioption || this.option,
-			formvalue);
-	},
-
-	/**
-	 * Remove the corresponding value from the configuration.
-	 *
-	 * This function is invoked upon saving the parent form when the option
-	 * element has been hidden due to unsatisfied dependencies or when the
-	 * user cleared the input value and the option is marked optional.
-	 *
-	 * The default implementation simply removes the associated option from the
-	 * UCI configuration (or the associated JavaScript object property in
-	 * case of `JSONMap` forms). It may be overwritten by user code to
-	 * implement alternative removal logic, e.g. to retain the original value.
-	 *
-	 * @param {string} section_id
-	 * The configuration section ID
-	 */
-	remove: function(section_id) {
-		return this.map.data.unset(
-			this.uciconfig || this.section.uciconfig || this.map.config,
-			this.ucisection || section_id,
-			this.ucioption || this.option);
-	}
-});
-
-/**
- * @class TypedSection
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractSection
- * @hideconstructor
- * @classdesc
- *
- * The `TypedSection` class maps all or - if `filter()` is overwritten - a
- * subset of the underlying UCI configuration sections of a given type.
- *
- * Layout wise, the configuration section instances mapped by the section
- * element (sometimes referred to as "section nodes") are stacked beneath
- * each other in a single column, with an optional section remove button next
- * to each section node and a section add button at the end, depending on the
- * value of the `addremove` property.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [section()]{@link LuCI.form.Map#section}.
- *
- * @param {string} section_type
- * The type of the UCI section to map.
- *
- * @param {string} [title]
- * The title caption of the form section element.
- *
- * @param {string} [description]
- * The description text of the form section element.
- */
-var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSection.prototype */ {
-	__name__: 'CBI.TypedSection',
-
-	/**
-	 * If set to `true`, the user may add or remove instances from the form
-	 * section widget, otherwise only preexisting sections may be edited.
-	 * The default is `false`.
-	 *
-	 * @name LuCI.form.TypedSection.prototype#addremove
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * If set to `true`, mapped section instances are treated as anonymous
-	 * UCI sections, which means that section instance elements will be
-	 * rendered without title element and that no name is required when adding
-	 * new sections. The default is `false`.
-	 *
-	 * @name LuCI.form.TypedSection.prototype#anonymous
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * When set to `true`, instead of rendering section instances one below
-	 * another, treat each instance as separate tab pane and render a tab menu
-	 * at the top of the form section element, allowing the user to switch
-	 * among instances. The default is `false`.
-	 *
-	 * @name LuCI.form.TypedSection.prototype#tabbed
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Override the caption used for the section add button at the bottom of
-	 * the section form element. If set to a string, it will be used as-is,
-	 * if set to a function, the function will be invoked and its return value
-	 * is used as caption, after converting it to a string. If this property
-	 * is not set, the default is `Add`.
-	 *
-	 * @name LuCI.form.TypedSection.prototype#addbtntitle
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * Override the UCI configuration name to read the section IDs from. By
-	 * default, the configuration name is inherited from the parent `Map`.
-	 * By setting this property, a deviating configuration may be specified.
-	 * The default is `null`, means inheriting from the parent form.
-	 *
-	 * @name LuCI.form.TypedSection.prototype#uciconfig
-	 * @type string
-	 * @default null
-	 */
-
-	/** @override */
-	cfgsections: function() {
-		return this.map.data.sections(this.uciconfig || this.map.config, this.sectiontype)
-			.map(function(s) { return s['.name'] })
-			.filter(L.bind(this.filter, this));
-	},
-
-	/** @private */
-	handleAdd: function(ev, name) {
-		var config_name = this.uciconfig || this.map.config;
-
-		this.map.data.add(config_name, this.sectiontype, name);
-		return this.map.save(null, true);
-	},
-
-	/** @private */
-	handleRemove: function(section_id, ev) {
-		var config_name = this.uciconfig || this.map.config;
-
-		this.map.data.remove(config_name, section_id);
-		return this.map.save(null, true);
-	},
-
-	/** @private */
-	renderSectionAdd: function(extra_class) {
-		if (!this.addremove)
-			return E([]);
-
-		var createEl = E('div', { 'class': 'cbi-section-create' }),
-		    config_name = this.uciconfig || this.map.config,
-		    btn_title = this.titleFn('addbtntitle');
-
-		if (extra_class != null)
-			createEl.classList.add(extra_class);
-
-		if (this.anonymous) {
-			createEl.appendChild(E('button', {
-				'class': 'cbi-button cbi-button-add',
-				'title': btn_title || _('Add'),
-				'click': ui.createHandlerFn(this, 'handleAdd'),
-				'disabled': this.map.readonly || null
-			}, [ btn_title || _('Add') ]));
-		}
-		else {
-			var nameEl = E('input', {
-				'type': 'text',
-				'class': 'cbi-section-create-name',
-				'disabled': this.map.readonly || null
-			});
-
-			dom.append(createEl, [
-				E('div', {}, nameEl),
-				E('input', {
-					'class': 'cbi-button cbi-button-add',
-					'type': 'submit',
-					'value': btn_title || _('Add'),
-					'title': btn_title || _('Add'),
-					'click': ui.createHandlerFn(this, function(ev) {
-						if (nameEl.classList.contains('cbi-input-invalid'))
-							return;
-
-						return this.handleAdd(ev, nameEl.value);
-					}),
-					'disabled': this.map.readonly || null
-				})
-			]);
-
-			ui.addValidator(nameEl, 'uciname', true, 'blur', 'keyup');
-		}
-
-		return createEl;
-	},
-
-	/** @private */
-	renderSectionPlaceholder: function() {
-		return E([
-			E('em', _('This section contains no values yet')),
-			E('br'), E('br')
-		]);
-	},
-
-	/** @private */
-	renderContents: function(cfgsections, nodes) {
-		var section_id = null,
-		    config_name = this.uciconfig || this.map.config,
-		    sectionEl = E('div', {
-				'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
-				'class': 'cbi-section',
-				'data-tab': (this.map.tabbed && !this.parentoption) ? this.sectiontype : null,
-				'data-tab-title': (this.map.tabbed && !this.parentoption) ? this.title || this.sectiontype : null
-			});
-
-		if (this.title != null && this.title != '')
-			sectionEl.appendChild(E('legend', {}, this.title));
-
-		if (this.description != null && this.description != '')
-			sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
-
-		for (var i = 0; i < nodes.length; i++) {
-			if (this.addremove) {
-				sectionEl.appendChild(
-					E('div', { 'class': 'cbi-section-remove right' },
-						E('button', {
-							'class': 'cbi-button',
-							'name': 'cbi.rts.%s.%s'.format(config_name, cfgsections[i]),
-							'data-section-id': cfgsections[i],
-							'click': ui.createHandlerFn(this, 'handleRemove', cfgsections[i]),
-							'disabled': this.map.readonly || null
-						}, [ _('Delete') ])));
-			}
-
-			if (!this.anonymous)
-				sectionEl.appendChild(E('h3', cfgsections[i].toUpperCase()));
-
-			sectionEl.appendChild(E('div', {
-				'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
-				'class': this.tabs
-					? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node',
-				'data-section-id': cfgsections[i]
-			}, nodes[i]));
-		}
-
-		if (nodes.length == 0)
-			sectionEl.appendChild(this.renderSectionPlaceholder());
-
-		sectionEl.appendChild(this.renderSectionAdd());
-
-		dom.bindClassInstance(sectionEl, this);
-
-		return sectionEl;
-	},
-
-	/** @override */
-	render: function() {
-		var cfgsections = this.cfgsections(),
-		    renderTasks = [];
-
-		for (var i = 0; i < cfgsections.length; i++)
-			renderTasks.push(this.renderUCISection(cfgsections[i]));
-
-		return Promise.all(renderTasks).then(this.renderContents.bind(this, cfgsections));
-	}
-});
-
-/**
- * @class TableSection
- * @memberof LuCI.form
- * @augments LuCI.form.TypedSection
- * @hideconstructor
- * @classdesc
- *
- * The `TableSection` class maps all or - if `filter()` is overwritten - a
- * subset of the underlying UCI configuration sections of a given type.
- *
- * Layout wise, the configuration section instances mapped by the section
- * element (sometimes referred to as "section nodes") are rendered as rows
- * within an HTML table element, with an optional section remove button in the
- * last column and a section add button below the table, depending on the
- * value of the `addremove` property.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [section()]{@link LuCI.form.Map#section}.
- *
- * @param {string} section_type
- * The type of the UCI section to map.
- *
- * @param {string} [title]
- * The title caption of the form section element.
- *
- * @param {string} [description]
- * The description text of the form section element.
- */
-var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.prototype */ {
-	__name__: 'CBI.TableSection',
-
-	/**
-	 * If set to `true`, the user may add or remove instances from the form
-	 * section widget, otherwise only preexisting sections may be edited.
-	 * The default is `false`.
-	 *
-	 * @name LuCI.form.TableSection.prototype#addremove
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * If set to `true`, mapped section instances are treated as anonymous
-	 * UCI sections, which means that section instance elements will be
-	 * rendered without title element and that no name is required when adding
-	 * new sections. The default is `false`.
-	 *
-	 * @name LuCI.form.TableSection.prototype#anonymous
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Override the caption used for the section add button at the bottom of
-	 * the section form element. If set to a string, it will be used as-is,
-	 * if set to a function, the function will be invoked and its return value
-	 * is used as caption, after converting it to a string. If this property
-	 * is not set, the default is `Add`.
-	 *
-	 * @name LuCI.form.TableSection.prototype#addbtntitle
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * Override the per-section instance title caption shown in the first
-	 * column of the table unless `anonymous` is set to true. If set to a
-	 * string, it will be used as `String.format()` pattern with the name of
-	 * the underlying UCI section as first argument, if set to a function, the
-	 * function will be invoked with the section name as first argument and
-	 * its return value is used as caption, after converting it to a string.
-	 * If this property is not set, the default is the name of the underlying
-	 * UCI configuration section.
-	 *
-	 * @name LuCI.form.TableSection.prototype#sectiontitle
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * Override the per-section instance modal popup title caption shown when
-	 * clicking the `More…` button in a section specifying `max_cols`. If set
-	 * to a string, it will be used as `String.format()` pattern with the name
-	 * of the underlying UCI section as first argument, if set to a function,
-	 * the function will be invoked with the section name as first argument and
-	 * its return value is used as caption, after converting it to a string.
-	 * If this property is not set, the default is the name of the underlying
-	 * UCI configuration section.
-	 *
-	 * @name LuCI.form.TableSection.prototype#modaltitle
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * Override the UCI configuration name to read the section IDs from. By
-	 * default, the configuration name is inherited from the parent `Map`.
-	 * By setting this property, a deviating configuration may be specified.
-	 * The default is `null`, means inheriting from the parent form.
-	 *
-	 * @name LuCI.form.TableSection.prototype#uciconfig
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Specify a maximum amount of columns to display. By default, one table
-	 * column is rendered for each child option of the form section element.
-	 * When this option is set to a positive number, then no more columns than
-	 * the given amount are rendered. When the number of child options exceeds
-	 * the specified amount, a `More…` button is rendered in the last column,
-	 * opening a modal dialog presenting all options elements in `NamedSection`
-	 * style when clicked.
-	 *
-	 * @name LuCI.form.TableSection.prototype#max_cols
-	 * @type number
-	 * @default null
-	 */
-
-	/**
-	 * If set to `true`, alternating `cbi-rowstyle-1` and `cbi-rowstyle-2` CSS
-	 * classes are added to the table row elements. Not all LuCI themes
-	 * implement these row style classes. The default is `false`.
-	 *
-	 * @name LuCI.form.TableSection.prototype#rowcolors
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Enables a per-section instance row `Edit` button which triggers a certain
-	 * action when clicked. If set to a string, the string value is used
-	 * as `String.format()` pattern with the name of the underlying UCI section
-	 * as first format argument. The result is then interpreted as URL which
-	 * LuCI will navigate to when the user clicks the edit button.
-	 *
-	 * If set to a function, this function will be registered as click event
-	 * handler on the rendered edit button, receiving the section instance
-	 * name as first and the DOM click event as second argument.
-	 *
-	 * @name LuCI.form.TableSection.prototype#extedit
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * If set to `true`, a sort button is added to the last column, allowing
-	 * the user to reorder the section instances mapped by the section form
-	 * element.
-	 *
-	 * @name LuCI.form.TableSection.prototype#sortable
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * If set to `true`, the header row with the options descriptions will
-	 * not be displayed. By default, descriptions row is automatically displayed
-	 * when at least one option has a description.
-	 *
-	 * @name LuCI.form.TableSection.prototype#nodescriptions
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * The `TableSection` implementation does not support option tabbing, so
-	 * its implementation of `tab()` will always throw an exception when
-	 * invoked.
-	 *
-	 * @override
-	 * @throws Throws an exception when invoked.
-	 */
-	tab: function() {
-		throw 'Tabs are not supported by TableSection';
-	},
-
-	/** @private */
-	renderContents: function(cfgsections, nodes) {
-		var section_id = null,
-		    config_name = this.uciconfig || this.map.config,
-		    max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
-		    has_more = max_cols < this.children.length,
-		    sectionEl = E('div', {
-				'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
-				'class': 'cbi-section cbi-tblsection',
-				'data-tab': (this.map.tabbed && !this.parentoption) ? this.sectiontype : null,
-				'data-tab-title': (this.map.tabbed && !this.parentoption) ? this.title || this.sectiontype : null
-			}),
-			tableEl = E('div', {
-				'class': 'table cbi-section-table'
-			});
-
-		if (this.title != null && this.title != '')
-			sectionEl.appendChild(E('h3', {}, this.title));
-
-		if (this.description != null && this.description != '')
-			sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
-
-		tableEl.appendChild(this.renderHeaderRows(max_cols));
-
-		for (var i = 0; i < nodes.length; i++) {
-			var sectionname = this.titleFn('sectiontitle', cfgsections[i]);
-
-			if (sectionname == null)
-				sectionname = cfgsections[i];
-
-			var trEl = E('div', {
-				'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
-				'class': 'tr cbi-section-table-row',
-				'data-sid': cfgsections[i],
-				'draggable': this.sortable ? true : null,
-				'mousedown': this.sortable ? L.bind(this.handleDragInit, this) : null,
-				'dragstart': this.sortable ? L.bind(this.handleDragStart, this) : null,
-				'dragover': this.sortable ? L.bind(this.handleDragOver, this) : null,
-				'dragenter': this.sortable ? L.bind(this.handleDragEnter, this) : null,
-				'dragleave': this.sortable ? L.bind(this.handleDragLeave, this) : null,
-				'dragend': this.sortable ? L.bind(this.handleDragEnd, this) : null,
-				'drop': this.sortable ? L.bind(this.handleDrop, this) : null,
-				'data-title': (sectionname && (!this.anonymous || this.sectiontitle)) ? sectionname : null,
-				'data-section-id': cfgsections[i]
-			});
-
-			if (this.extedit || this.rowcolors)
-				trEl.classList.add(!(tableEl.childNodes.length % 2)
-					? 'cbi-rowstyle-1' : 'cbi-rowstyle-2');
-
-			for (var j = 0; j < max_cols && nodes[i].firstChild; j++)
-				trEl.appendChild(nodes[i].firstChild);
-
-			trEl.appendChild(this.renderRowActions(cfgsections[i], has_more ? _('More…') : null));
-			tableEl.appendChild(trEl);
-		}
-
-		if (nodes.length == 0)
-			tableEl.appendChild(E('div', { 'class': 'tr cbi-section-table-row placeholder' },
-				E('div', { 'class': 'td' },
-					E('em', {}, _('This section contains no values yet')))));
-
-		sectionEl.appendChild(tableEl);
-
-		sectionEl.appendChild(this.renderSectionAdd('cbi-tblsection-create'));
-
-		dom.bindClassInstance(sectionEl, this);
-
-		return sectionEl;
-	},
-
-	/** @private */
-	renderHeaderRows: function(max_cols, has_action) {
-		var has_titles = false,
-		    has_descriptions = false,
-		    max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
-		    has_more = max_cols < this.children.length,
-		    anon_class = (!this.anonymous || this.sectiontitle) ? 'named' : 'anonymous',
-		    trEls = E([]);
-
-		for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
-			if (opt.modalonly)
-				continue;
-
-			has_titles = has_titles || !!opt.title;
-			has_descriptions = has_descriptions || !!opt.description;
-		}
-
-		if (has_titles) {
-			var trEl = E('div', {
-				'class': 'tr cbi-section-table-titles ' + anon_class,
-				'data-title': (!this.anonymous || this.sectiontitle) ? _('Name') : null
-			});
-
-			for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
-				if (opt.modalonly)
-					continue;
-
-				trEl.appendChild(E('div', {
-					'class': 'th cbi-section-table-cell',
-					'data-widget': opt.__name__
-				}));
-
-				if (opt.width != null)
-					trEl.lastElementChild.style.width =
-						(typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
-
-				if (opt.titleref)
-					trEl.lastElementChild.appendChild(E('a', {
-						'href': opt.titleref,
-						'class': 'cbi-title-ref',
-						'title': this.titledesc || _('Go to relevant configuration page')
-					}, opt.title));
-				else
-					dom.content(trEl.lastElementChild, opt.title);
-			}
-
-			if (this.sortable || this.extedit || this.addremove || has_more || has_action)
-				trEl.appendChild(E('div', {
-					'class': 'th cbi-section-table-cell cbi-section-actions'
-				}));
-
-			trEls.appendChild(trEl);
-		}
-
-		if (has_descriptions && !this.nodescriptions) {
-			var trEl = E('div', {
-				'class': 'tr cbi-section-table-descr ' + anon_class
-			});
-
-			for (var i = 0, opt; i < max_cols && (opt = this.children[i]) != null; i++) {
-				if (opt.modalonly)
-					continue;
-
-				trEl.appendChild(E('div', {
-					'class': 'th cbi-section-table-cell',
-					'data-widget': opt.__name__
-				}, opt.description));
-
-				if (opt.width != null)
-					trEl.lastElementChild.style.width =
-						(typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
-			}
-
-			if (this.sortable || this.extedit || this.addremove || has_more || has_action)
-				trEl.appendChild(E('div', {
-					'class': 'th cbi-section-table-cell cbi-section-actions'
-				}));
-
-			trEls.appendChild(trEl);
-		}
-
-		return trEls;
-	},
-
-	/** @private */
-	renderRowActions: function(section_id, more_label) {
-		var config_name = this.uciconfig || this.map.config;
-
-		if (!this.sortable && !this.extedit && !this.addremove && !more_label)
-			return E([]);
-
-		var tdEl = E('div', {
-			'class': 'td cbi-section-table-cell nowrap cbi-section-actions'
-		}, E('div'));
-
-		if (this.sortable) {
-			dom.append(tdEl.lastElementChild, [
-				E('div', {
-					'title': _('Drag to reorder'),
-					'class': 'btn cbi-button drag-handle center',
-					'style': 'cursor:move',
-					'disabled': this.map.readonly || null
-				}, '☰')
-			]);
-		}
-
-		if (this.extedit) {
-			var evFn = null;
-
-			if (typeof(this.extedit) == 'function')
-				evFn = L.bind(this.extedit, this);
-			else if (typeof(this.extedit) == 'string')
-				evFn = L.bind(function(sid, ev) {
-					location.href = this.extedit.format(sid);
-				}, this, section_id);
-
-			dom.append(tdEl.lastElementChild,
-				E('button', {
-					'title': _('Edit'),
-					'class': 'cbi-button cbi-button-edit',
-					'click': evFn
-				}, [ _('Edit') ])
-			);
-		}
-
-		if (more_label) {
-			dom.append(tdEl.lastElementChild,
-				E('button', {
-					'title': more_label,
-					'class': 'cbi-button cbi-button-edit',
-					'click': ui.createHandlerFn(this, 'renderMoreOptionsModal', section_id)
-				}, [ more_label ])
-			);
-		}
-
-		if (this.addremove) {
-			var btn_title = this.titleFn('removebtntitle', section_id);
-
-			dom.append(tdEl.lastElementChild,
-				E('button', {
-					'title': btn_title || _('Delete'),
-					'class': 'cbi-button cbi-button-remove',
-					'click': ui.createHandlerFn(this, 'handleRemove', section_id),
-					'disabled': this.map.readonly || null
-				}, [ btn_title || _('Delete') ])
-			);
-		}
-
-		return tdEl;
-	},
-
-	/** @private */
-	handleDragInit: function(ev) {
-		scope.dragState = { node: ev.target };
-	},
-
-	/** @private */
-	handleDragStart: function(ev) {
-		if (!scope.dragState || !scope.dragState.node.classList.contains('drag-handle')) {
-			scope.dragState = null;
-			ev.preventDefault();
-			return false;
-		}
-
-		scope.dragState.node = dom.parent(scope.dragState.node, '.tr');
-		ev.dataTransfer.setData('text', 'drag');
-		ev.target.style.opacity = 0.4;
-	},
-
-	/** @private */
-	handleDragOver: function(ev) {
-		var n = scope.dragState.targetNode,
-		    r = scope.dragState.rect,
-		    t = r.top + r.height / 2;
-
-		if (ev.clientY <= t) {
-			n.classList.remove('drag-over-below');
-			n.classList.add('drag-over-above');
-		}
-		else {
-			n.classList.remove('drag-over-above');
-			n.classList.add('drag-over-below');
-		}
-
-		ev.dataTransfer.dropEffect = 'move';
-		ev.preventDefault();
-		return false;
-	},
-
-	/** @private */
-	handleDragEnter: function(ev) {
-		scope.dragState.rect = ev.currentTarget.getBoundingClientRect();
-		scope.dragState.targetNode = ev.currentTarget;
-	},
-
-	/** @private */
-	handleDragLeave: function(ev) {
-		ev.currentTarget.classList.remove('drag-over-above');
-		ev.currentTarget.classList.remove('drag-over-below');
-	},
-
-	/** @private */
-	handleDragEnd: function(ev) {
-		var n = ev.target;
-
-		n.style.opacity = '';
-		n.classList.add('flash');
-		n.parentNode.querySelectorAll('.drag-over-above, .drag-over-below')
-			.forEach(function(tr) {
-				tr.classList.remove('drag-over-above');
-				tr.classList.remove('drag-over-below');
-			});
-	},
-
-	/** @private */
-	handleDrop: function(ev) {
-		var s = scope.dragState;
-
-		if (s.node && s.targetNode) {
-			var config_name = this.uciconfig || this.map.config,
-			    ref_node = s.targetNode,
-			    after = false;
-
-		    if (ref_node.classList.contains('drag-over-below')) {
-		    	ref_node = ref_node.nextElementSibling;
-		    	after = true;
-		    }
-
-		    var sid1 = s.node.getAttribute('data-sid'),
-		        sid2 = s.targetNode.getAttribute('data-sid');
-
-		    s.node.parentNode.insertBefore(s.node, ref_node);
-		    this.map.data.move(config_name, sid1, sid2, after);
-		}
-
-		scope.dragState = null;
-		ev.target.style.opacity = '';
-		ev.stopPropagation();
-		ev.preventDefault();
-		return false;
-	},
-
-	/** @private */
-	handleModalCancel: function(modalMap, ev) {
-		return Promise.resolve(ui.hideModal());
-	},
-
-	/** @private */
-	handleModalSave: function(modalMap, ev) {
-		return modalMap.save(null, true)
-			.then(L.bind(this.map.load, this.map))
-			.then(L.bind(this.map.reset, this.map))
-			.then(ui.hideModal)
-			.catch(function() {});
-	},
-
-	/**
-	 * Add further options to the per-section instanced modal popup.
-	 *
-	 * This function may be overwritten by user code to perform additional
-	 * setup steps before displaying the more options modal which is useful to
-	 * e.g. query additional data or to inject further option elements.
-	 *
-	 * The default implementation of this function does nothing.
-	 *
-	 * @abstract
-	 * @param {LuCI.form.NamedSection} modalSection
-	 * The `NamedSection` instance about to be rendered in the modal popup.
-	 *
-	 * @param {string} section_id
-	 * The ID of the underlying UCI section the modal popup belongs to.
-	 *
-	 * @param {Event} ev
-	 * The DOM event emitted by clicking the `More…` button.
-	 *
-	 * @returns {*|Promise<*>}
-	 * Return values of this function are ignored but if a promise is returned,
-	 * it is run to completion before the rendering is continued, allowing
-	 * custom logic to perform asynchroneous work before the modal dialog
-	 * is shown.
-	 */
-	addModalOptions: function(modalSection, section_id, ev) {
-
-	},
-
-	/** @private */
-	renderMoreOptionsModal: function(section_id, ev) {
-		var parent = this.map,
-		    title = parent.title,
-		    name = null,
-		    m = new CBIMap(this.map.config, null, null),
-		    s = m.section(CBINamedSection, section_id, this.sectiontype);
-
-		m.parent = parent;
-		m.readonly = parent.readonly;
-
-		s.tabs = this.tabs;
-		s.tab_names = this.tab_names;
-
-		if ((name = this.titleFn('modaltitle', section_id)) != null)
-			title = name;
-		else if ((name = this.titleFn('sectiontitle', section_id)) != null)
-			title = '%s - %s'.format(parent.title, name);
-		else if (!this.anonymous)
-			title = '%s - %s'.format(parent.title, section_id);
-
-		for (var i = 0; i < this.children.length; i++) {
-			var o1 = this.children[i];
-
-			if (o1.modalonly === false)
-				continue;
-
-			var o2 = s.option(o1.constructor, o1.option, o1.title, o1.description);
-
-			for (var k in o1) {
-				if (!o1.hasOwnProperty(k))
-					continue;
-
-				switch (k) {
-				case 'map':
-				case 'section':
-				case 'option':
-				case 'title':
-				case 'description':
-					continue;
-
-				default:
-					o2[k] = o1[k];
-				}
-			}
-		}
-
-		return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(L.bind(m.render, m)).then(L.bind(function(nodes) {
-			ui.showModal(title, [
-				nodes,
-				E('div', { 'class': 'right' }, [
-					E('button', {
-						'class': 'btn',
-						'click': ui.createHandlerFn(this, 'handleModalCancel', m)
-					}, [ _('Dismiss') ]), ' ',
-					E('button', {
-						'class': 'cbi-button cbi-button-positive important',
-						'click': ui.createHandlerFn(this, 'handleModalSave', m),
-						'disabled': m.readonly || null
-					}, [ _('Save') ])
-				])
-			], 'cbi-modal');
-		}, this)).catch(L.error);
-	}
-});
-
-/**
- * @class GridSection
- * @memberof LuCI.form
- * @augments LuCI.form.TableSection
- * @hideconstructor
- * @classdesc
- *
- * The `GridSection` class maps all or - if `filter()` is overwritten - a
- * subset of the underlying UCI configuration sections of a given type.
- *
- * A grid section functions similar to a {@link LuCI.form.TableSection} but
- * supports tabbing in the modal overlay. Option elements added with
- * [option()]{@link LuCI.form.GridSection#option} are shown in the table while
- * elements added with [taboption()]{@link LuCI.form.GridSection#taboption}
- * are displayed in the modal popup.
- *
- * Another important difference is that the table cells show a readonly text
- * preview of the corresponding option elements by default, unless the child
- * option element is explicitely made writable by setting the `editable`
- * property to `true`.
- *
- * Additionally, the grid section honours a `modalonly` property of child
- * option elements. Refer to the [AbstractValue]{@link LuCI.form.AbstractValue}
- * documentation for details.
- *
- * Layout wise, a grid section looks mostly identical to table sections.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [section()]{@link LuCI.form.Map#section}.
- *
- * @param {string} section_type
- * The type of the UCI section to map.
- *
- * @param {string} [title]
- * The title caption of the form section element.
- *
- * @param {string} [description]
- * The description text of the form section element.
- */
-var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.prototype */ {
-	/**
-	 * Add an option tab to the section.
-	 *
-	 * The modal option elements of a grid section may be divided into multiple
-	 * tabs to provide a better overview to the user.
-	 *
-	 * Before options can be moved into a tab pane, the corresponding tab
-	 * has to be defined first, which is done by calling this function.
-	 *
-	 * Note that tabs are only effective in modal popups, options added with
-	 * `option()` will not be assigned to a specific tab and are rendered in
-	 * the table view only.
-	 *
-	 * @param {string} name
-	 * The name of the tab to register. It may be freely chosen and just serves
-	 * as an identifier to differentiate tabs.
-	 *
-	 * @param {string} title
-	 * The human readable caption of the tab.
-	 *
-	 * @param {string} [description]
-	 * An additional description text for the corresponding tab pane. It is
-	 * displayed as text paragraph below the tab but before the tab pane
-	 * contents. If omitted, no description will be rendered.
-	 *
-	 * @throws {Error}
-	 * Throws an exeption if a tab with the same `name` already exists.
-	 */
-	tab: function(name, title, description) {
-		CBIAbstractSection.prototype.tab.call(this, name, title, description);
-	},
-
-	/** @private */
-	handleAdd: function(ev, name) {
-		var config_name = this.uciconfig || this.map.config,
-		    section_id = this.map.data.add(config_name, this.sectiontype, name);
-
-		this.addedSection = section_id;
-		return this.renderMoreOptionsModal(section_id);
-	},
-
-	/** @private */
-	handleModalSave: function(/* ... */) {
-		return this.super('handleModalSave', arguments)
-			.then(L.bind(function() { this.addedSection = null }, this));
-	},
-
-	/** @private */
-	handleModalCancel: function(/* ... */) {
-		var config_name = this.uciconfig || this.map.config;
-
-		if (this.addedSection != null) {
-			this.map.data.remove(config_name, this.addedSection);
-			this.addedSection = null;
-		}
-
-		return this.super('handleModalCancel', arguments);
-	},
-
-	/** @private */
-	renderUCISection: function(section_id) {
-		return this.renderOptions(null, section_id);
-	},
-
-	/** @private */
-	renderChildren: function(tab_name, section_id, in_table) {
-		var tasks = [], index = 0;
-
-		for (var i = 0, opt; (opt = this.children[i]) != null; i++) {
-			if (opt.disable || opt.modalonly)
-				continue;
-
-			if (opt.editable)
-				tasks.push(opt.render(index++, section_id, in_table));
-			else
-				tasks.push(this.renderTextValue(section_id, opt));
-		}
-
-		return Promise.all(tasks);
-	},
-
-	/** @private */
-	renderTextValue: function(section_id, opt) {
-		var title = this.stripTags(opt.title).trim(),
-		    descr = this.stripTags(opt.description).trim(),
-		    value = opt.textvalue(section_id);
-
-		return E('div', {
-			'class': 'td cbi-value-field',
-			'data-title': (title != '') ? title : null,
-			'data-description': (descr != '') ? descr : null,
-			'data-name': opt.option,
-			'data-widget': opt.typename || opt.__name__
-		}, (value != null) ? value : E('em', _('none')));
-	},
-
-	/** @private */
-	renderHeaderRows: function(section_id) {
-		return this.super('renderHeaderRows', [ NaN, true ]);
-	},
-
-	/** @private */
-	renderRowActions: function(section_id) {
-		return this.super('renderRowActions', [ section_id, _('Edit') ]);
-	},
-
-	/** @override */
-	parse: function() {
-		var section_ids = this.cfgsections(),
-		    tasks = [];
-
-		if (Array.isArray(this.children)) {
-			for (var i = 0; i < section_ids.length; i++) {
-				for (var j = 0; j < this.children.length; j++) {
-					if (!this.children[j].editable || this.children[j].modalonly)
-						continue;
-
-					tasks.push(this.children[j].parse(section_ids[i]));
-				}
-			}
-		}
-
-		return Promise.all(tasks);
-	}
-});
-
-/**
- * @class NamedSection
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractSection
- * @hideconstructor
- * @classdesc
- *
- * The `NamedSection` class maps exactly one UCI section instance which is
- * specified when constructing the class instance.
- *
- * Layout and functionality wise, a named section is essentially a
- * `TypedSection` which allows exactly one section node.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [section()]{@link LuCI.form.Map#section}.
- *
- * @param {string} section_id
- * The name (ID) of the UCI section to map.
- *
- * @param {string} section_type
- * The type of the UCI section to map.
- *
- * @param {string} [title]
- * The title caption of the form section element.
- *
- * @param {string} [description]
- * The description text of the form section element.
- */
-var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSection.prototype */ {
-	__name__: 'CBI.NamedSection',
-	__init__: function(map, section_id /*, ... */) {
-		this.super('__init__', this.varargs(arguments, 2, map));
-
-		this.section = section_id;
-	},
-
-	/**
-	 * If set to `true`, the user may remove or recreate the sole mapped
-	 * configuration instance from the form section widget, otherwise only a
-	 * preexisting section may be edited. The default is `false`.
-	 *
-	 * @name LuCI.form.NamedSection.prototype#addremove
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Override the UCI configuration name to read the section IDs from. By
-	 * default, the configuration name is inherited from the parent `Map`.
-	 * By setting this property, a deviating configuration may be specified.
-	 * The default is `null`, means inheriting from the parent form.
-	 *
-	 * @name LuCI.form.NamedSection.prototype#uciconfig
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * The `NamedSection` class overwrites the generic `cfgsections()`
-	 * implementation to return a one-element array containing the mapped
-	 * section ID as sole element. User code should not normally change this.
-	 *
-	 * @returns {string[]}
-	 * Returns a one-element array containing the mapped section ID.
-	 */
-	cfgsections: function() {
-		return [ this.section ];
-	},
-
-	/** @private */
-	handleAdd: function(ev) {
-		var section_id = this.section,
-		    config_name = this.uciconfig || this.map.config;
-
-		this.map.data.add(config_name, this.sectiontype, section_id);
-		return this.map.save(null, true);
-	},
-
-	/** @private */
-	handleRemove: function(ev) {
-		var section_id = this.section,
-		    config_name = this.uciconfig || this.map.config;
-
-		this.map.data.remove(config_name, section_id);
-		return this.map.save(null, true);
-	},
-
-	/** @private */
-	renderContents: function(data) {
-		var ucidata = data[0], nodes = data[1],
-		    section_id = this.section,
-		    config_name = this.uciconfig || this.map.config,
-		    sectionEl = E('div', {
-				'id': ucidata ? null : 'cbi-%s-%s'.format(config_name, section_id),
-				'class': 'cbi-section',
-				'data-tab': (this.map.tabbed && !this.parentoption) ? this.sectiontype : null,
-				'data-tab-title': (this.map.tabbed && !this.parentoption) ? this.title || this.sectiontype : null
-			});
-
-		if (typeof(this.title) === 'string' && this.title !== '')
-			sectionEl.appendChild(E('legend', {}, this.title));
-
-		if (typeof(this.description) === 'string' && this.description !== '')
-			sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
-
-		if (ucidata) {
-			if (this.addremove) {
-				sectionEl.appendChild(
-					E('div', { 'class': 'cbi-section-remove right' },
-						E('button', {
-							'class': 'cbi-button',
-							'click': ui.createHandlerFn(this, 'handleRemove'),
-							'disabled': this.map.readonly || null
-						}, [ _('Delete') ])));
-			}
-
-			sectionEl.appendChild(E('div', {
-				'id': 'cbi-%s-%s'.format(config_name, section_id),
-				'class': this.tabs
-					? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node',
-				'data-section-id': section_id
-			}, nodes));
-		}
-		else if (this.addremove) {
-			sectionEl.appendChild(
-				E('button', {
-					'class': 'cbi-button cbi-button-add',
-					'click': ui.createHandlerFn(this, 'handleAdd'),
-					'disabled': this.map.readonly || null
-				}, [ _('Add') ]));
-		}
-
-		dom.bindClassInstance(sectionEl, this);
-
-		return sectionEl;
-	},
-
-	/** @override */
-	render: function() {
-		var config_name = this.uciconfig || this.map.config,
-		    section_id = this.section;
-
-		return Promise.all([
-			this.map.data.get(config_name, section_id),
-			this.renderUCISection(section_id)
-		]).then(this.renderContents.bind(this));
-	}
-});
-
-/**
- * @class Value
- * @memberof LuCI.form
- * @augments LuCI.form.AbstractValue
- * @hideconstructor
- * @classdesc
- *
- * The `Value` class represents a simple one-line form input using the
- * {@link LuCI.ui.Textfield} or - in case choices are added - the
- * {@link LuCI.ui.Combobox} class as underlying widget.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
-	__name__: 'CBI.Value',
-
-	/**
-	 * If set to `true`, the field is rendered as password input, otherwise
-	 * as plain text input.
-	 *
-	 * @name LuCI.form.Value.prototype#password
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Set a placeholder string to use when the input field is empty.
-	 *
-	 * @name LuCI.form.Value.prototype#placeholder
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Add a predefined choice to the form option. By adding one or more
-	 * choices, the plain text input field is turned into a combobox widget
-	 * which prompts the user to select a predefined choice, or to enter a
-	 * custom value.
-	 *
-	 * @param {string} key
-	 * The choice value to add.
-	 *
-	 * @param {Node|string} value
-	 * The caption for the choice value. May be a DOM node, a document fragment
-	 * or a plain text string. If omitted, the `key` value is used as caption.
-	 */
-	value: function(key, val) {
-		this.keylist = this.keylist || [];
-		this.keylist.push(String(key));
-
-		this.vallist = this.vallist || [];
-		this.vallist.push(dom.elem(val) ? val : String(val != null ? val : key));
-	},
-
-	/** @override */
-	render: function(option_index, section_id, in_table) {
-		return Promise.resolve(this.cfgvalue(section_id))
-			.then(this.renderWidget.bind(this, section_id, option_index))
-			.then(this.renderFrame.bind(this, section_id, in_table, option_index));
-	},
-
-	/** @private */
-	handleValueChange: function(section_id, state, ev) {
-		if (typeof(this.onchange) != 'function')
-			return;
-
-		var value = this.formvalue(section_id);
-
-		if (isEqual(value, state.previousValue))
-			return;
-
-		state.previousValue = value;
-		this.onchange.call(this, ev, section_id, value);
-	},
-
-	/** @private */
-	renderFrame: function(section_id, in_table, option_index, nodes) {
-		var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
-		    depend_list = this.transformDepList(section_id),
-		    optionEl;
-
-		if (in_table) {
-			var title = this.stripTags(this.title).trim();
-			optionEl = E('div', {
-				'class': 'td cbi-value-field',
-				'data-title': (title != '') ? title : null,
-				'data-description': this.stripTags(this.description).trim(),
-				'data-name': this.option,
-				'data-widget': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
-			}, E('div', {
-				'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
-				'data-index': option_index,
-				'data-depends': depend_list,
-				'data-field': this.cbid(section_id)
-			}));
-		}
-		else {
-			optionEl = E('div', {
-				'class': 'cbi-value',
-				'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
-				'data-index': option_index,
-				'data-depends': depend_list,
-				'data-field': this.cbid(section_id),
-				'data-name': this.option,
-				'data-widget': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
-			});
-
-			if (this.last_child)
-				optionEl.classList.add('cbi-value-last');
-
-			if (typeof(this.title) === 'string' && this.title !== '') {
-				optionEl.appendChild(E('label', {
-					'class': 'cbi-value-title',
-					'for': 'widget.cbid.%s.%s.%s'.format(config_name, section_id, this.option),
-					'click': function(ev) {
-						var node = ev.currentTarget,
-						    elem = node.nextElementSibling.querySelector('#' + node.getAttribute('for')) || node.nextElementSibling.querySelector('[data-widget-id="' + node.getAttribute('for') + '"]');
-
-						if (elem) {
-							elem.click();
-							elem.focus();
-						}
-					}
-				},
-				this.titleref ? E('a', {
-					'class': 'cbi-title-ref',
-					'href': this.titleref,
-					'title': this.titledesc || _('Go to relevant configuration page')
-				}, this.title) : this.title));
-
-				optionEl.appendChild(E('div', { 'class': 'cbi-value-field' }));
-			}
-		}
-
-		if (nodes)
-			(optionEl.lastChild || optionEl).appendChild(nodes);
-
-		if (!in_table && typeof(this.description) === 'string' && this.description !== '')
-			dom.append(optionEl.lastChild || optionEl,
-				E('div', { 'class': 'cbi-value-description' }, this.description));
-
-		if (depend_list && depend_list.length)
-			optionEl.classList.add('hidden');
-
-		optionEl.addEventListener('widget-change',
-			L.bind(this.handleValueChange, this, section_id, {}));
-
-		optionEl.addEventListener('widget-change',
-			L.bind(this.map.checkDepends, this.map));
-
-		dom.bindClassInstance(optionEl, this);
-
-		return optionEl;
-	},
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default,
-		    choices = this.transformChoices(),
-		    widget;
-
-		if (choices) {
-			var placeholder = (this.optional || this.rmempty)
-				? E('em', _('unspecified')) : _('-- Please choose --');
-
-			widget = new ui.Combobox(Array.isArray(value) ? value.join(' ') : value, choices, {
-				id: this.cbid(section_id),
-				sort: this.keylist,
-				optional: this.optional || this.rmempty,
-				datatype: this.datatype,
-				select_placeholder: this.placeholder || placeholder,
-				validate: L.bind(this.validate, this, section_id),
-				disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-			});
-		}
-		else {
-			widget = new ui.Textfield(Array.isArray(value) ? value.join(' ') : value, {
-				id: this.cbid(section_id),
-				password: this.password,
-				optional: this.optional || this.rmempty,
-				datatype: this.datatype,
-				placeholder: this.placeholder,
-				validate: L.bind(this.validate, this, section_id),
-				disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-			});
-		}
-
-		return widget.render();
-	}
-});
-
-/**
- * @class DynamicList
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `DynamicList` class represents a multi value widget allowing the user
- * to enter multiple unique values, optionally selected from a set of
- * predefined choices. It builds upon the {@link LuCI.ui.DynamicList} widget.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype */ {
-	__name__: 'CBI.DynamicList',
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default,
-		    choices = this.transformChoices(),
-		    items = L.toArray(value);
-
-		var widget = new ui.DynamicList(items, choices, {
-			id: this.cbid(section_id),
-			sort: this.keylist,
-			optional: this.optional || this.rmempty,
-			datatype: this.datatype,
-			placeholder: this.placeholder,
-			validate: L.bind(this.validate, this, section_id),
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return widget.render();
-	},
-});
-
-/**
- * @class ListValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `ListValue` class implements a simple static HTML select element
- * allowing the user to chose a single value from a set of predefined choices.
- * It builds upon the {@link LuCI.ui.Select} widget.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
-	__name__: 'CBI.ListValue',
-
-	__init__: function() {
-		this.super('__init__', arguments);
-		this.widget = 'select';
-		this.orientation = 'horizontal';
-		this.deplist = [];
-	},
-
-	/**
-	 * Set the size attribute of the underlying HTML select element.
-	 *
-	 * @name LuCI.form.ListValue.prototype#size
-	 * @type number
-	 * @default null
-	 */
-
-	/**
-	 * Set the type of the underlying form controls.
-	 *
-	 * May be one of `select` or `radio`. If set to `select`, an HTML
-	 * select element is rendered, otherwise a collection of `radio`
-	 * elements is used.
-	 *
-	 * @name LuCI.form.ListValue.prototype#widget
-	 * @type string
-	 * @default select
-	 */
-
-	/**
-	 * Set the orientation of the underlying radio or checkbox elements.
-	 *
-	 * May be one of `horizontal` or `vertical`. Only applies to non-select
-	 * widget types.
-	 *
-	 * @name LuCI.form.ListValue.prototype#orientation
-	 * @type string
-	 * @default horizontal
-	 */
-
-	 /** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var choices = this.transformChoices();
-		var widget = new ui.Select((cfgvalue != null) ? cfgvalue : this.default, choices, {
-			id: this.cbid(section_id),
-			size: this.size,
-			sort: this.keylist,
-			widget: this.widget,
-			optional: this.optional,
-			orientation: this.orientation,
-			placeholder: this.placeholder,
-			validate: L.bind(this.validate, this, section_id),
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return widget.render();
-	},
-});
-
-/**
- * @class FlagValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `FlagValue` element builds upon the {@link LuCI.ui.Checkbox} widget to
- * implement a simple checkbox element.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
-	__name__: 'CBI.FlagValue',
-
-	__init__: function() {
-		this.super('__init__', arguments);
-
-		this.enabled = '1';
-		this.disabled = '0';
-		this.default = this.disabled;
-	},
-
-	/**
-	 * Sets the input value to use for the checkbox checked state.
-	 *
-	 * @name LuCI.form.FlagValue.prototype#enabled
-	 * @type number
-	 * @default 1
-	 */
-
-	/**
-	 * Sets the input value to use for the checkbox unchecked state.
-	 *
-	 * @name LuCI.form.FlagValue.prototype#disabled
-	 * @type number
-	 * @default 0
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var widget = new ui.Checkbox((cfgvalue != null) ? cfgvalue : this.default, {
-			id: this.cbid(section_id),
-			value_enabled: this.enabled,
-			value_disabled: this.disabled,
-			validate: L.bind(this.validate, this, section_id),
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return widget.render();
-	},
-
-	/**
-	 * Query the checked state of the underlying checkbox widget and return
-	 * either the `enabled` or the `disabled` property value, depending on
-	 * the checked state.
-	 *
-	 * @override
-	 */
-	formvalue: function(section_id) {
-		var elem = this.getUIElement(section_id),
-		    checked = elem ? elem.isChecked() : false;
-		return checked ? this.enabled : this.disabled;
-	},
-
-	/**
-	 * Query the checked state of the underlying checkbox widget and return
-	 * either a localized `Yes` or `No` string, depending on the checked state.
-	 *
-	 * @override
-	 */
-	textvalue: function(section_id) {
-		var cval = this.cfgvalue(section_id);
-
-		if (cval == null)
-			cval = this.default;
-
-		return (cval == this.enabled) ? _('Yes') : _('No');
-	},
-
-	/** @override */
-	parse: function(section_id) {
-		if (this.isActive(section_id)) {
-			var fval = this.formvalue(section_id);
-
-			if (!this.isValid(section_id)) {
-				var title = this.stripTags(this.title).trim();
-				return Promise.reject(new TypeError(_('Option "%s" contains an invalid input value.').format(title || this.option)));
-			}
-
-			if (fval == this.default && (this.optional || this.rmempty))
-				return Promise.resolve(this.remove(section_id));
-			else
-				return Promise.resolve(this.write(section_id, fval));
-		}
-		else {
-			return Promise.resolve(this.remove(section_id));
-		}
-	},
-});
-
-/**
- * @class MultiValue
- * @memberof LuCI.form
- * @augments LuCI.form.DynamicList
- * @hideconstructor
- * @classdesc
- *
- * The `MultiValue` class is a modified variant of the `DynamicList` element
- * which leverages the {@link LuCI.ui.Dropdown} widget to implement a multi
- * select dropdown element.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.prototype */ {
-	__name__: 'CBI.MultiValue',
-
-	__init__: function() {
-		this.super('__init__', arguments);
-		this.placeholder = _('-- Please choose --');
-	},
-
-	/**
-	 * Allows to specify the [display_items]{@link LuCI.ui.Dropdown.InitOptions}
-	 * property of the underlying dropdown widget. If omitted, the value of
-	 * the `size` property is used or `3` when `size` is unspecified as well.
-	 *
-	 * @name LuCI.form.MultiValue.prototype#display_size
-	 * @type number
-	 * @default null
-	 */
-
-	/**
-	 * Allows to specify the [dropdown_items]{@link LuCI.ui.Dropdown.InitOptions}
-	 * property of the underlying dropdown widget. If omitted, the value of
-	 * the `size` property is used or `-1` when `size` is unspecified as well.
-	 *
-	 * @name LuCI.form.MultiValue.prototype#dropdown_size
-	 * @type number
-	 * @default null
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default,
-		    choices = this.transformChoices();
-
-		var widget = new ui.Dropdown(L.toArray(value), choices, {
-			id: this.cbid(section_id),
-			sort: this.keylist,
-			multiple: true,
-			optional: this.optional || this.rmempty,
-			select_placeholder: this.placeholder,
-			display_items: this.display_size || this.size || 3,
-			dropdown_items: this.dropdown_size || this.size || -1,
-			validate: L.bind(this.validate, this, section_id),
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return widget.render();
-	},
-});
-
-/**
- * @class TextValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `TextValue` class implements a multi-line textarea input using
- * {@link LuCI.ui.Textarea}.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
-	__name__: 'CBI.TextValue',
-
-	/** @ignore */
-	value: null,
-
-	/**
-	 * Enforces the use of a monospace font for the textarea contents when set
-	 * to `true`.
-	 *
-	 * @name LuCI.form.TextValue.prototype#monospace
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Allows to specify the [cols]{@link LuCI.ui.Textarea.InitOptions}
-	 * property of the underlying textarea widget.
-	 *
-	 * @name LuCI.form.TextValue.prototype#cols
-	 * @type number
-	 * @default null
-	 */
-
-	/**
-	 * Allows to specify the [rows]{@link LuCI.ui.Textarea.InitOptions}
-	 * property of the underlying textarea widget.
-	 *
-	 * @name LuCI.form.TextValue.prototype#rows
-	 * @type number
-	 * @default null
-	 */
-
-	/**
-	 * Allows to specify the [wrap]{@link LuCI.ui.Textarea.InitOptions}
-	 * property of the underlying textarea widget.
-	 *
-	 * @name LuCI.form.TextValue.prototype#wrap
-	 * @type number
-	 * @default null
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default;
-
-		var widget = new ui.Textarea(value, {
-			id: this.cbid(section_id),
-			optional: this.optional || this.rmempty,
-			placeholder: this.placeholder,
-			monospace: this.monospace,
-			cols: this.cols,
-			rows: this.rows,
-			wrap: this.wrap,
-			validate: L.bind(this.validate, this, section_id),
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return widget.render();
-	}
-});
-
-/**
- * @class DummyValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `DummyValue` element wraps an {@link LuCI.ui.Hiddenfield} widget and
- * renders the underlying UCI option or default value as readonly text.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */ {
-	__name__: 'CBI.DummyValue',
-
-	/**
-	 * Set an URL which is opened when clicking on the dummy value text.
-	 *
-	 * By setting this property, the dummy value text is wrapped in an `<a>`
-	 * element with the property value used as `href` attribute.
-	 *
-	 * @name LuCI.form.DummyValue.prototype#href
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Treat the UCI option value (or the `default` property value) as HTML.
-	 *
-	 * By default, the value text is HTML escaped before being rendered as
-	 * text. In some cases it may be needed to actually interpret and render
-	 * HTML contents as-is. When set to `true`, HTML escaping is disabled.
-	 *
-	 * @name LuCI.form.DummyValue.prototype#rawhtml
-	 * @type boolean
-	 * @default null
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default,
-		    hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
-		    outputEl = E('div');
-
-		if (this.href && !((this.readonly != null) ? this.readonly : this.map.readonly))
-			outputEl.appendChild(E('a', { 'href': this.href }));
-
-		dom.append(outputEl.lastChild || outputEl,
-			this.rawhtml ? value : [ value ]);
-
-		return E([
-			outputEl,
-			hiddenEl.render()
-		]);
-	},
-
-	/** @override */
-	remove: function() {},
-
-	/** @override */
-	write: function() {}
-});
-
-/**
- * @class ButtonValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `DummyValue` element wraps an {@link LuCI.ui.Hiddenfield} widget and
- * renders the underlying UCI option or default value as readonly text.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype */ {
-	__name__: 'CBI.ButtonValue',
-
-	/**
-	 * Override the rendered button caption.
-	 *
-	 * By default, the option title - which is passed as fourth argument to the
-	 * constructor - is used as caption for the button element. When setting
-	 * this property to a string, it is used as `String.format()` pattern with
-	 * the underlying UCI section name passed as first format argument. When
-	 * set to a function, it is invoked passing the section ID as sole argument
-	 * and the resulting return value is converted to a string before being
-	 * used as button caption.
-	 *
-	 * The default is `null`, means the option title is used as caption.
-	 *
-	 * @name LuCI.form.ButtonValue.prototype#inputtitle
-	 * @type string|function
-	 * @default null
-	 */
-
-	/**
-	 * Override the button style class.
-	 *
-	 * By setting this property, a specific `cbi-button-*` CSS class can be
-	 * selected to influence the style of the resulting button.
-	 *
-	 * Suitable values which are implemented by most themes are `positive`,
-	 * `negative` and `primary`.
-	 *
-	 * The default is `null`, means a neutral button styling is used.
-	 *
-	 * @name LuCI.form.ButtonValue.prototype#inputstyle
-	 * @type string
-	 * @default null
-	 */
-
-	/**
-	 * Override the button click action.
-	 *
-	 * By default, the underlying UCI option (or default property) value is
-	 * copied into a hidden field tied to the button element and the save
-	 * action is triggered on the parent form element.
-	 *
-	 * When this property is set to a function, it is invoked instead of
-	 * performing the default actions. The handler function will receive the
-	 * DOM click element as first and the underlying configuration section ID
-	 * as second argument.
-	 *
-	 * @name LuCI.form.ButtonValue.prototype#onclick
-	 * @type function
-	 * @default null
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var value = (cfgvalue != null) ? cfgvalue : this.default,
-		    hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
-		    outputEl = E('div'),
-		    btn_title = this.titleFn('inputtitle', section_id) || this.titleFn('title', section_id);
-
-		if (value !== false)
-			dom.content(outputEl, [
-				E('button', {
-					'class': 'cbi-button cbi-button-%s'.format(this.inputstyle || 'button'),
-					'click': ui.createHandlerFn(this, function(section_id, ev) {
-						if (this.onclick)
-							return this.onclick(ev, section_id);
-
-						ev.currentTarget.parentNode.nextElementSibling.value = value;
-						return this.map.save();
-					}, section_id),
-					'disabled': ((this.readonly != null) ? this.readonly : this.map.readonly) || null
-				}, [ btn_title ])
-			]);
-		else
-			dom.content(outputEl, ' - ');
-
-		return E([
-			outputEl,
-			hiddenEl.render()
-		]);
-	}
-});
-
-/**
- * @class HiddenValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `HiddenValue` element wraps an {@link LuCI.ui.Hiddenfield} widget.
- *
- * Hidden value widgets used to be necessary in legacy code which actually
- * submitted the underlying HTML form the server. With client side handling of
- * forms, there are more efficient ways to store hidden state data.
- *
- * Since this widget has no visible content, the title and description values
- * of this form element should be set to `null` as well to avoid a broken or
- * distorted form layout when rendering the option element.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIHiddenValue = CBIValue.extend(/** @lends LuCI.form.HiddenValue.prototype */ {
-	__name__: 'CBI.HiddenValue',
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var widget = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : this.default, {
-			id: this.cbid(section_id)
-		});
-
-		return widget.render();
-	}
-});
-
-/**
- * @class FileUpload
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `FileUpload` element wraps an {@link LuCI.ui.FileUpload} widget and
- * offers the ability to browse, upload and select remote files.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The name of the UCI option to map.
- *
- * @param {string} [title]
- * The title caption of the option element.
- *
- * @param {string} [description]
- * The description text of the option element.
- */
-var CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */ {
-	__name__: 'CBI.FileSelect',
-
-	__init__: function(/* ... */) {
-		this.super('__init__', arguments);
-
-		this.show_hidden = false;
-		this.enable_upload = true;
-		this.enable_remove = true;
-		this.root_directory = '/etc/luci-uploads';
-	},
-
-	/**
-	 * Toggle display of hidden files.
-	 *
-	 * Display hidden files when rendering the remote directory listing.
-	 * Note that this is merely a cosmetic feature, hidden files are always
-	 * included in received remote file listings.
-	 *
-	 * The default is `false`, means hidden files are not displayed.
-	 *
-	 * @name LuCI.form.FileUpload.prototype#show_hidden
-	 * @type boolean
-	 * @default false
-	 */
-
-	/**
-	 * Toggle file upload functionality.
-	 *
-	 * When set to `true`, the underlying widget provides a button which lets
-	 * the user select and upload local files to the remote system.
-	 * Note that this is merely a cosmetic feature, remote upload access is
-	 * controlled by the session ACL rules.
-	 *
-	 * The default is `true`, means file upload functionality is displayed.
-	 *
-	 * @name LuCI.form.FileUpload.prototype#enable_upload
-	 * @type boolean
-	 * @default true
-	 */
-
-	/**
-	 * Toggle remote file delete functionality.
-	 *
-	 * When set to `true`, the underlying widget provides a buttons which let
-	 * the user delete files from remote directories. Note that this is merely
-	 * a cosmetic feature, remote delete permissions are controlled by the
-	 * session ACL rules.
-	 *
-	 * The default is `true`, means file removal buttons are displayed.
-	 *
-	 * @name LuCI.form.FileUpload.prototype#enable_remove
-	 * @type boolean
-	 * @default true
-	 */
-
-	/**
-	 * Specify the root directory for file browsing.
-	 *
-	 * This property defines the topmost directory the file browser widget may
-	 * navigate to, the UI will not allow browsing directories outside this
-	 * prefix. Note that this is merely a cosmetic feature, remote file access
-	 * and directory listing permissions are controlled by the session ACL
-	 * rules.
-	 *
-	 * The default is `/etc/luci-uploads`.
-	 *
-	 * @name LuCI.form.FileUpload.prototype#root_directory
-	 * @type string
-	 * @default /etc/luci-uploads
-	 */
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		var browserEl = new ui.FileUpload((cfgvalue != null) ? cfgvalue : this.default, {
-			id: this.cbid(section_id),
-			name: this.cbid(section_id),
-			show_hidden: this.show_hidden,
-			enable_upload: this.enable_upload,
-			enable_remove: this.enable_remove,
-			root_directory: this.root_directory,
-			disabled: (this.readonly != null) ? this.readonly : this.map.readonly
-		});
-
-		return browserEl.render();
-	}
-});
-
-/**
- * @class SectionValue
- * @memberof LuCI.form
- * @augments LuCI.form.Value
- * @hideconstructor
- * @classdesc
- *
- * The `SectionValue` widget embeds a form section element within an option
- * element container, allowing to nest form sections into other sections.
- *
- * @param {LuCI.form.Map|LuCI.form.JSONMap} form
- * The configuration form this section is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {LuCI.form.AbstractSection} section
- * The configuration section this option is added to. It is automatically passed
- * by [option()]{@link LuCI.form.AbstractSection#option} or
- * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
- * option to the section.
- *
- * @param {string} option
- * The internal name of the option element holding the section. Since a section
- * container element does not read or write any configuration itself, the name
- * is only used internally and does not need to relate to any underlying UCI
- * option name.
- *
- * @param {LuCI.form.AbstractSection} subsection_class
- * The class to use for instantiating the nested section element. Note that
- * the class value itself is expected here, not a class instance obtained by
- * calling `new`. The given class argument must be a subclass of the
- * `AbstractSection` class.
- *
- * @param {...*} [class_args]
- * All further arguments are passed as-is to the subclass constructor. Refer
- * to the corresponding class constructor documentations for details.
- */
-var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototype */ {
-	__name__: 'CBI.ContainerValue',
-	__init__: function(map, section, option, cbiClass /*, ... */) {
-		this.super('__init__', [map, section, option]);
-
-		if (!CBIAbstractSection.isSubclass(cbiClass))
-			throw 'Sub section must be a descendent of CBIAbstractSection';
-
-		this.subsection = cbiClass.instantiate(this.varargs(arguments, 4, this.map));
-		this.subsection.parentoption = this;
-	},
-
-	/**
-	 * Access the embedded section instance.
-	 *
-	 * This property holds a reference to the instantiated nested section.
-	 *
-	 * @name LuCI.form.SectionValue.prototype#subsection
-	 * @type LuCI.form.AbstractSection
-	 * @readonly
-	 */
-
-	/** @override */
-	load: function(section_id) {
-		return this.subsection.load(section_id);
-	},
-
-	/** @override */
-	parse: function(section_id) {
-		return this.subsection.parse(section_id);
-	},
-
-	/** @private */
-	renderWidget: function(section_id, option_index, cfgvalue) {
-		return this.subsection.render(section_id);
-	},
-
-	/** @private */
-	checkDepends: function(section_id) {
-		this.subsection.checkDepends(section_id);
-		return CBIValue.prototype.checkDepends.apply(this, [ section_id ]);
-	},
-
-	/**
-	 * Since the section container is not rendering an own widget,
-	 * its `value()` implementation is a no-op.
-	 *
-	 * @override
-	 */
-	value: function() {},
-
-	/**
-	 * Since the section container is not tied to any UCI configuration,
-	 * its `write()` implementation is a no-op.
-	 *
-	 * @override
-	 */
-	write: function() {},
-
-	/**
-	 * Since the section container is not tied to any UCI configuration,
-	 * its `remove()` implementation is a no-op.
-	 *
-	 * @override
-	 */
-	remove: function() {},
-
-	/**
-	 * Since the section container is not tied to any UCI configuration,
-	 * its `cfgvalue()` implementation will always return `null`.
-	 *
-	 * @override
-	 * @returns {null}
-	 */
-	cfgvalue: function() { return null },
-
-	/**
-	 * Since the section container is not tied to any UCI configuration,
-	 * its `formvalue()` implementation will always return `null`.
-	 *
-	 * @override
-	 * @returns {null}
-	 */
-	formvalue: function() { return null }
-});
-
-/**
- * @class form
- * @memberof LuCI
- * @hideconstructor
- * @classdesc
- *
- * The LuCI form class provides high level abstractions for creating creating
- * UCI- or JSON backed configurations forms.
- *
- * To import the class in views, use `'require form'`, to import it in
- * external JavaScript, use `L.require("form").then(...)`.
- *
- * A typical form is created by first constructing a
- * {@link LuCI.form.Map} or {@link LuCI.form.JSONMap} instance using `new` and
- * by subsequently adding sections and options to it. Finally
- * [render()]{@link LuCI.form.Map#render} is invoked on the instance to
- * assemble the HTML markup and insert it into the DOM.
- *
- * Example:
- *
- * <pre>
- * 'use strict';
- * 'require form';
- *
- * var m, s, o;
- *
- * m = new form.Map('example', 'Example form',
- *	'This is an example form mapping the contents of /etc/config/example');
- *
- * s = m.section(form.NamedSection, 'first_section', 'example', 'The first section',
- * 	'This sections maps "config example first_section" of /etc/config/example');
- *
- * o = s.option(form.Flag, 'some_bool', 'A checkbox option');
- *
- * o = s.option(form.ListValue, 'some_choice', 'A select element');
- * o.value('choice1', 'The first choice');
- * o.value('choice2', 'The second choice');
- *
- * m.render().then(function(node) {
- * 	document.body.appendChild(node);
- * });
- * </pre>
- */
-return baseclass.extend(/** @lends LuCI.form.prototype */ {
-	Map: CBIMap,
-	JSONMap: CBIJSONMap,
-	AbstractSection: CBIAbstractSection,
-	AbstractValue: CBIAbstractValue,
-
-	TypedSection: CBITypedSection,
-	TableSection: CBITableSection,
-	GridSection: CBIGridSection,
-	NamedSection: CBINamedSection,
-
-	Value: CBIValue,
-	DynamicList: CBIDynamicList,
-	ListValue: CBIListValue,
-	Flag: CBIFlagValue,
-	MultiValue: CBIMultiValue,
-	TextValue: CBITextValue,
-	DummyValue: CBIDummyValue,
-	Button: CBIButtonValue,
-	HiddenValue: CBIHiddenValue,
-	FileUpload: CBIFileUpload,
-	SectionValue: CBISectionValue
-});
-
-
-
- - - - - - - - - -
-
- - - - diff --git a/docs/jsapi/fs.js.html b/docs/jsapi/fs.js.html deleted file mode 100644 index 3645a8bcc5511056d5f1ac606e72175469a830e1..0000000000000000000000000000000000000000 --- a/docs/jsapi/fs.js.html +++ /dev/null @@ -1,3885 +0,0 @@ - - - - - Source: fs.js - - - - - - - - - - - - - - - - - -
- - -
-

Source: fs.js

- - - - -
-
-
'use strict';
-'require rpc';
-'require request';
-'require baseclass';
-
-/**
- * @typedef {Object} FileStatEntry
- * @memberof LuCI.fs
-
- * @property {string} name - Name of the directory entry
- * @property {string} type - Type of the entry, one of `block`, `char`, `directory`, `fifo`, `symlink`, `file`, `socket` or `unknown`
- * @property {number} size - Size in bytes
- * @property {number} mode - Access permissions
- * @property {number} atime - Last access time in seconds since epoch
- * @property {number} mtime - Last modification time in seconds since epoch
- * @property {number} ctime - Last change time in seconds since epoch
- * @property {number} inode - Inode number
- * @property {number} uid - Numeric owner id
- * @property {number} gid - Numeric group id
- */
-
-/**
- * @typedef {Object} FileExecResult
- * @memberof LuCI.fs
- *
- * @property {number} code - The exit code of the invoked command
- * @property {string} [stdout] - The stdout produced by the command, if any
- * @property {string} [stderr] - The stderr produced by the command, if any
- */
-
-var callFileList, callFileStat, callFileRead, callFileWrite, callFileRemove,
-    callFileExec, callFileMD5;
-
-callFileList = rpc.declare({
-	object: 'file',
-	method: 'list',
-	params: [ 'path' ]
-});
-
-callFileStat = rpc.declare({
-	object: 'file',
-	method: 'stat',
-	params: [ 'path' ]
-});
-
-callFileRead = rpc.declare({
-	object: 'file',
-	method: 'read',
-	params: [ 'path' ]
-});
-
-callFileWrite = rpc.declare({
-	object: 'file',
-	method: 'write',
-	params: [ 'path', 'data', 'mode' ]
-});
-
-callFileRemove = rpc.declare({
-	object: 'file',
-	method: 'remove',
-	params: [ 'path' ]
-});
-
-callFileExec = rpc.declare({
-	object: 'file',
-	method: 'exec',
-	params: [ 'command', 'params', 'env' ]
-});
-
-callFileMD5 = rpc.declare({
-	object: 'file',
-	method: 'md5',
-	params: [ 'path' ]
-});
-
-var rpcErrors = [
-	null,
-	'InvalidCommandError',
-	'InvalidArgumentError',
-	'MethodNotFoundError',
-	'NotFoundError',
-	'NoDataError',
-	'PermissionError',
-	'TimeoutError',
-	'UnsupportedError'
-];
-
-function handleRpcReply(expect, rc) {
-	if (typeof(rc) == 'number' && rc != 0) {
-		var e = new Error(rpc.getStatusText(rc)); e.name = rpcErrors[rc] || 'Error';
-		throw e;
-	}
-
-	if (expect) {
-		var type = Object.prototype.toString;
-
-		for (var key in expect) {
-			if (rc != null && key != '')
-				rc = rc[key];
-
-			if (rc == null || type.call(rc) != type.call(expect[key])) {
-				var e = new Error(_('Unexpected reply data format')); e.name = 'TypeError';
-				throw e;
-			}
-
-			break;
-		}
-	}
-
-	return rc;
-}
-
-function handleCgiIoReply(res) {
-	if (!res.ok || res.status != 200) {
-		var e = new Error(res.statusText);
-		switch (res.status) {
-		case 400:
-			e.name = 'InvalidArgumentError';
-			break;
-
-		case 403:
-			e.name = 'PermissionError';
-			break;
-
-		case 404:
-			e.name = 'NotFoundError';
-			break;
-
-		default:
-			e.name = 'Error';
-		}
-		throw e;
-	}
-
-	switch (this.type) {
-	case 'blob':
-		return res.blob();
-
-	case 'json':
-		return res.json();
-
-	default:
-		return res.text();
-	}
-}
-
-/**
- * @class fs
- * @memberof LuCI
- * @hideconstructor
- * @classdesc
- *
- * Provides high level utilities to wrap file system related RPC calls.
- * To import the class in views, use `'require fs'`, to import it in
- * external JavaScript, use `L.require("fs").then(...)`.
- */
-var FileSystem = baseclass.extend(/** @lends LuCI.fs.prototype */ {
-	/**
-	 * Obtains a listing of the specified directory.
-	 *
-	 * @param {string} path
-	 * The directory path to list.
-	 *
-	 * @returns {Promise<LuCI.fs.FileStatEntry[]>}
-	 * Returns a promise resolving to an array of stat detail objects or
-	 * rejecting with an error stating the failure reason.
-	 */
-	list: function(path) {
-		return callFileList(path).then(handleRpcReply.bind(this, { entries: [] }));
-	},
-
-	/**
-	 * Return file stat information on the specified path.
-	 *
-	 * @param {string} path
-	 * The filesystem path to stat.
-	 *
-	 * @returns {Promise<LuCI.fs.FileStatEntry>}
-	 * Returns a promise resolving to a stat detail object or
-	 * rejecting with an error stating the failure reason.
-	 */
-	stat: function(path) {
-		return callFileStat(path).then(handleRpcReply.bind(this, { '': {} }));
-	},
-
-	/**
-	 * Read the contents of the given file and return them.
-	 * Note: this function is unsuitable for obtaining binary data.
-	 *
-	 * @param {string} path
-	 * The file path to read.
-	 *
-	 * @returns {Promise<string>}
-	 * Returns a promise resolving to a string containing the file contents or
-	 * rejecting with an error stating the failure reason.
-	 */
-	read: function(path) {
-		return callFileRead(path).then(handleRpcReply.bind(this, { data: '' }));
-	},
-
-	/**
-	 * Write the given data to the specified file path.
-	 * If the specified file path does not exist, it will be created, given
-	 * sufficient permissions.
-	 *
-	 * Note: `data` will be converted to a string using `String(data)` or to
-	 * `''` when it is `null`.
-	 *
-	 * @param {string} path
-	 * The file path to write to.
-	 *
-	 * @param {*} [data]
-	 * The file data to write. If it is null, it will be set to an empty
-	 * string.
-	 *
-	 * @param {number} [mode]
-	 * The permissions to use on file creation. Default is 420 (0644).
-	 *
-	 * @returns {Promise<number>}
-	 * Returns a promise resolving to `0` or rejecting with an error stating
-	 * the failure reason.
-	 */
-	write: function(path, data, mode) {
-		data = (data != null) ? String(data) : '';
-		mode = (mode != null) ? mode : 420; // 0644
-		return callFileWrite(path, data, mode).then(handleRpcReply.bind(this, { '': 0 }));
-	},
-
-	/**
-	 * Unlink the given file.
-	 *
-	 * @param {string}
-	 * The file path to remove.
-	 *
-	 * @returns {Promise<number>}
-	 * Returns a promise resolving to `0` or rejecting with an error stating
-	 * the failure reason.
-	 */
-	remove: function(path) {
-		return callFileRemove(path).then(handleRpcReply.bind(this, { '': 0 }));
-	},
-
-	/**
-	 * Execute the specified command, optionally passing params and
-	 * environment variables.
-	 *
-	 * Note: The `command` must be either the path to an executable,
-	 * or a basename without arguments in which case it will be searched
-	 * in $PATH. If specified, the values given in `params` will be passed
-	 * as arguments to the command.
-	 *
-	 * The key/value pairs in the optional `env` table are translated to
-	 * `setenv()` calls prior to running the command.
-	 *
-	 * @param {string} command
-	 * The command to invoke.
-	 *
-	 * @param {string[]} [params]
-	 * The arguments to pass to the command.
-	 *
-	 * @param {Object.<string, string>} [env]
-	 * Environment variables to set.
-	 *
-	 * @returns {Promise<LuCI.fs.FileExecResult>}
-	 * Returns a promise resolving to an object describing the execution
-	 * results or rejecting with an error stating the failure reason.
-	 */
-	exec: function(command, params, env) {
-		if (!Array.isArray(params))
-			params = null;
-
-		if (!L.isObject(env))
-			env = null;
-
-		return callFileExec(command, params, env).then(handleRpcReply.bind(this, { '': {} }));
-	},
-
-	/**
-	 * Read the contents of the given file, trim leading and trailing white
-	 * space and return the trimmed result. In case of errors, return an empty
-	 * string instead.
-	 *
-	 * Note: this function is useful to read single-value files in `/sys`
-	 * or `/proc`.
-	 *
-	 * This function is guaranteed to not reject its promises, on failure,
-	 * an empty string will be returned.
-	 *
-	 * @param {string} path
-	 * The file path to read.
-	 *
-	 * @returns {Promise<string>}
-	 * Returns a promise resolving to the file contents or the empty string
-	 * on failure.
-	 */
-	trimmed: function(path) {
-		return L.resolveDefault(this.read(path), '').then(function(s) {
-			return s.trim();
-		});
-	},
-
-	/**
-	 * Read the contents of the given file, split it into lines, trim
-	 * leading and trailing white space of each line and return the
-	 * resulting array.
-	 *
-	 * This function is guaranteed to not reject its promises, on failure,
-	 * an empty array will be returned.
-	 *
-	 * @param {string} path
-	 * The file path to read.
-	 *
-	 * @returns {Promise<string[]>}
-	 * Returns a promise resolving to an array containing the stripped lines
-	 * of the given file or `[]` on failure.
-	 */
-	lines: function(path) {
-		return L.resolveDefault(this.read(path), '').then(function(s) {
-			var lines = [];
-
-			s = s.trim();
-
-			if (s != '') {
-				var l = s.split(/\n/);
-
-				for (var i = 0; i < l.length; i++)
-					lines.push(l[i].trim());
-			}
-
-			return lines;
-		});
-	},
-
-	/**
-	 * Read the contents of the given file and return them, bypassing ubus.
-	 *
-	 * This function will read the requested file through the cgi-io
-	 * helper applet at `/cgi-bin/cgi-download` which bypasses the ubus rpc
-	 * transport. This is useful to fetch large file contents which might
-	 * exceed the ubus message size limits or which contain binary data.
-	 *
-	 * The cgi-io helper will enforce the same access permission rules as
-	 * the ubus based read call.
-	 *
-	 * @param {string} path
-	 * The file path to read.
-	 *
-	 * @param {string} [type=text]
-	 * The expected type of read file contents. Valid values are `text` to
-	 * interpret the contents as string, `json` to parse the contents as JSON
-	 * or `blob` to return the contents as Blob instance.
-	 *
-	 * @returns {Promise<*>}
-	 * Returns a promise resolving with the file contents interpreted according
-	 * to the specified type or rejecting with an error stating the failure
-	 * reason.
-	 */
-	read_direct: function(path, type) {
-		var postdata = 'sessionid=%s&path=%s'
-			.format(encodeURIComponent(L.env.sessionid), encodeURIComponent(path));
-
-		return request.post(L.env.cgi_base + '/cgi-download', postdata, {
-			headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-			responseType: (type == 'blob') ? 'blob' : 'text'
-		}).then(handleCgiIoReply.bind({ type: type }));
-	},
-
-	/**
-	 * Execute the specified command, bypassing ubus.
-	 *
-	 * Note: The `command` must be either the path to an executable,
-	 * or a basename without arguments in which case it will be searched
-	 * in $PATH. If specified, the values given in `params` will be passed
-	 * as arguments to the command.
-	 *
-	 * This function will invoke the requested commands through the cgi-io
-	 * helper applet at `/cgi-bin/cgi-exec` which bypasses the ubus rpc
-	 * transport. This is useful to fetch large command outputs which might
-	 * exceed the ubus message size limits or which contain binary data.
-	 *
-	 * The cgi-io helper will enforce the same access permission rules as
-	 * the ubus based exec call.
-	 *
-	 * @param {string} command
-	 * The command to invoke.
-	 *
-	 * @param {string[]} [params]
-	 * The arguments to pass to the command.
-	 *
-	 * @param {string} [type=text]
-	 * The expected output type of the invoked program. Valid values are
-	 * `text` to interpret the output as string, `json` to parse the output
-	 * as JSON or `blob` to return the output as Blob instance.
-	 *
-	 * @param {boolean} [latin1=false]
-	 * Whether to encode the command line as Latin1 instead of UTF-8. This
-	 * is usually not needed but can be useful for programs that cannot
-	 * handle UTF-8 input.
-	 *
-	 * @returns {Promise<*>}
-	 * Returns a promise resolving with the command stdout output interpreted
-	 * according to the specified type or rejecting with an error stating the
-	 * failure reason.
-	 */
-	exec_direct: function(command, params, type, latin1) {
-		var cmdstr = String(command)
-			.replace(/\\/g, '\\\\').replace(/(\s)/g, '\\$1');
-
-		if (Array.isArray(params))
-			for (var i = 0; i < params.length; i++)
-				cmdstr += ' ' + String(params[i])
-					.replace(/\\/g, '\\\\').replace(/(\s)/g, '\\$1');
-
-		if (latin1)
-			cmdstr = escape(cmdstr).replace(/\+/g, '%2b');
-		else
-			cmdstr = encodeURIComponent(cmdstr);
-
-		var postdata = 'sessionid=%s&command=%s'
-			.format(encodeURIComponent(L.env.sessionid), cmdstr);
-
-		return request.post(L.env.cgi_base + '/cgi-exec', postdata, {
-			headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
-			responseType: (type == 'blob') ? 'blob' : 'text'
-		}).then(handleCgiIoReply.bind({ type: type }));
-	}
-});
-
-return FileSystem;
-
-
-
- - - - - - - - - -
-
- - - - diff --git a/docs/jsapi/index.html b/docs/jsapi/index.html deleted file mode 100644 index a31218bee1854c30cdbb7989a0d3387febd6ca8e..0000000000000000000000000000000000000000 --- a/docs/jsapi/index.html +++ /dev/null @@ -1,3472 +0,0 @@ - - - - - Index - - - - - - - - - - - - - - - - - -
- - -
-

Index

- - - - - - -

- - - - - - - - - - - - - -
-

LuCI client side API documentation

-

You can browse the JavaScript apis provided by LuCI here. A good starting point is the central -luci.js class.

-
- - - - - - - - - -
-
- - - - \ No newline at end of file diff --git a/docs/jsapi/luci.js.html b/docs/jsapi/luci.js.html deleted file mode 100644 index 725e97edfc4471f73d4afd86bae454592ffc748e..0000000000000000000000000000000000000000 --- a/docs/jsapi/luci.js.html +++ /dev/null @@ -1,6874 +0,0 @@ - - - - - Source: luci.js - - - - - - - - - - - - - - - - - -
- - -
-

Source: luci.js

- - - - -
-
-
/**
- * @class LuCI
- * @classdesc
- *
- * This is the LuCI base class. It is automatically instantiated and
- * accessible using the global `L` variable.
- *
- * @param {Object} env
- * The environment settings to use for the LuCI runtime.
- */
-
-(function(window, document, undefined) {
-	'use strict';
-
-	var env = {};
-
-	/* Object.assign polyfill for IE */
-	if (typeof Object.assign !== 'function') {
-		Object.defineProperty(Object, 'assign', {
-			value: function assign(target, varArgs) {
-				if (target == null)
-					throw new TypeError('Cannot convert undefined or null to object');
-
-				var to = Object(target);
-
-				for (var index = 1; index < arguments.length; index++)
-					if (arguments[index] != null)
-						for (var nextKey in arguments[index])
-							if (Object.prototype.hasOwnProperty.call(arguments[index], nextKey))
-								to[nextKey] = arguments[index][nextKey];
-
-				return to;
-			},
-			writable: true,
-			configurable: true
-		});
-	}
-
-	/* Promise.finally polyfill */
-	if (typeof Promise.prototype.finally !== 'function') {
-		Promise.prototype.finally = function(fn) {
-			var onFinally = function(cb) {
-				return Promise.resolve(fn.call(this)).then(cb);
-			};
-
-			return this.then(
-				function(result) { return onFinally.call(this, function() { return result }) },
-				function(reason) { return onFinally.call(this, function() { return Promise.reject(reason) }) }
-			);
-		};
-	}
-
-	/*
-	 * Class declaration and inheritance helper
-	 */
-
-	var toCamelCase = function(s) {
-		return s.replace(/(?:^|[\. -])(.)/g, function(m0, m1) { return m1.toUpperCase() });
-	};
-
-	/**
-	 * @class baseclass
-	 * @hideconstructor
-	 * @memberof LuCI
-	 * @classdesc
-	 *
-	 * `LuCI.baseclass` is the abstract base class all LuCI classes inherit from.
-	 *
-	 * It provides simple means to create subclasses of given classes and
-	 * implements prototypal inheritance.
-	 */
-	var superContext = {}, classIndex = 0, Class = Object.assign(function() {}, {
-		/**
-		 * Extends this base class with the properties described in
-		 * `properties` and returns a new subclassed Class instance
-		 *
-		 * @memberof LuCI.baseclass
-		 *
-		 * @param {Object<string, *>} properties
-		 * An object describing the properties to add to the new
-		 * subclass.
-		 *
-		 * @returns {LuCI.baseclass}
-		 * Returns a new LuCI.baseclass sublassed from this class, extended
-		 * by the given properties and with its prototype set to this base
-		 * class to enable inheritance. The resulting value represents a
-		 * class constructor and can be instantiated with `new`.
-		 */
-		extend: function(properties) {
-			var props = {
-				__id__: { value: classIndex },
-				__base__: { value: this.prototype },
-				__name__: { value: properties.__name__ || 'anonymous' + classIndex++ }
-			};
-
-			var ClassConstructor = function() {
-				if (!(this instanceof ClassConstructor))
-					throw new TypeError('Constructor must not be called without "new"');
-
-				if (Object.getPrototypeOf(this).hasOwnProperty('__init__')) {
-					if (typeof(this.__init__) != 'function')
-						throw new TypeError('Class __init__ member is not a function');
-
-					this.__init__.apply(this, arguments)
-				}
-				else {
-					this.super('__init__', arguments);
-				}
-			};
-
-			for (var key in properties)
-				if (!props[key] && properties.hasOwnProperty(key))
-					props[key] = { value: properties[key], writable: true };
-
-			ClassConstructor.prototype = Object.create(this.prototype, props);
-			ClassConstructor.prototype.constructor = ClassConstructor;
-			Object.assign(ClassConstructor, this);
-			ClassConstructor.displayName = toCamelCase(props.__name__.value + 'Class');
-
-			return ClassConstructor;
-		},
-
-		/**
-		 * Extends this base class with the properties described in
-		 * `properties`, instantiates the resulting subclass using
-		 * the additional optional arguments passed to this function
-		 * and returns the resulting subclassed Class instance.
-		 *
-		 * This function serves as a convenience shortcut for
-		 * {@link LuCI.baseclass.extend Class.extend()} and subsequent
-		 * `new`.
-		 *
-		 * @memberof LuCI.baseclass
-		 *
-		 * @param {Object<string, *>} properties
-		 * An object describing the properties to add to the new
-		 * subclass.
-		 *
-		 * @param {...*} [new_args]
-		 * Specifies arguments to be passed to the subclass constructor
-		 * as-is in order to instantiate the new subclass.
-		 *
-		 * @returns {LuCI.baseclass}
-		 * Returns a new LuCI.baseclass instance extended by the given
-		 * properties with its prototype set to this base class to
-		 * enable inheritance.
-		 */
-		singleton: function(properties /*, ... */) {
-			return Class.extend(properties)
-				.instantiate(Class.prototype.varargs(arguments, 1));
-		},
-
-		/**
-		 * Calls the class constructor using `new` with the given argument
-		 * array being passed as variadic parameters to the constructor.
-		 *
-		 * @memberof LuCI.baseclass
-		 *
-		 * @param {Array<*>} params
-		 * An array of arbitrary values which will be passed as arguments
-		 * to the constructor function.
-		 *
-		 * @param {...*} [new_args]
-		 * Specifies arguments to be passed to the subclass constructor
-		 * as-is in order to instantiate the new subclass.
-		 *
-		 * @returns {LuCI.baseclass}
-		 * Returns a new LuCI.baseclass instance extended by the given
-		 * properties with its prototype set to this base class to
-		 * enable inheritance.
-		 */
-		instantiate: function(args) {
-			return new (Function.prototype.bind.apply(this,
-				Class.prototype.varargs(args, 0, null)))();
-		},
-
-		/* unused */
-		call: function(self, method) {
-			if (typeof(this.prototype[method]) != 'function')
-				throw new ReferenceError(method + ' is not defined in class');
-
-			return this.prototype[method].apply(self, self.varargs(arguments, 1));
-		},
-
-		/**
-		 * Checks whether the given class value is a subclass of this class.
-		 *
-		 * @memberof LuCI.baseclass
-		 *
-		 * @param {LuCI.baseclass} classValue
-		 * The class object to test.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` when the given `classValue` is a subclass of this
-		 * class or `false` if the given value is not a valid class or not
-		 * a subclass of this class'.
-		 */
-		isSubclass: function(classValue) {
-			return (classValue != null &&
-			        typeof(classValue) == 'function' &&
-			        classValue.prototype instanceof this);
-		},
-
-		prototype: {
-			/**
-			 * Extract all values from the given argument array beginning from
-			 * `offset` and prepend any further given optional parameters to
-			 * the beginning of the resulting array copy.
-			 *
-			 * @memberof LuCI.baseclass
-			 * @instance
-			 *
-			 * @param {Array<*>} args
-			 * The array to extract the values from.
-			 *
-			 * @param {number} offset
-			 * The offset from which to extract the values. An offset of `0`
-			 * would copy all values till the end.
-			 *
-			 * @param {...*} [extra_args]
-			 * Extra arguments to add to prepend to the resultung array.
-			 *
-			 * @returns {Array<*>}
-			 * Returns a new array consisting of the optional extra arguments
-			 * and the values extracted from the `args` array beginning with
-			 * `offset`.
-			 */
-			varargs: function(args, offset /*, ... */) {
-				return Array.prototype.slice.call(arguments, 2)
-					.concat(Array.prototype.slice.call(args, offset));
-			},
-
-			/**
-			 * Walks up the parent class chain and looks for a class member
-			 * called `key` in any of the parent classes this class inherits
-			 * from. Returns the member value of the superclass or calls the
-			 * member as function and returns its return value when the
-			 * optional `callArgs` array is given.
-			 *
-			 * This function has two signatures and is sensitive to the
-			 * amount of arguments passed to it:
-			 *  - `super('key')` -
-			 *    Returns the value of `key` when found within one of the
-			 *    parent classes.
-			 *  - `super('key', ['arg1', 'arg2'])` -
-			 *    Calls the `key()` method with parameters `arg1` and `arg2`
-			 *    when found within one of the parent classes.
-			 *
-			 * @memberof LuCI.baseclass
-			 * @instance
-			 *
-			 * @param {string} key
-			 * The name of the superclass member to retrieve.
-			 *
-			 * @param {Array<*>} [callArgs]
-			 * An optional array of function call parameters to use. When
-			 * this parameter is specified, the found member value is called
-			 * as function using the values of this array as arguments.
-			 *
-			 * @throws {ReferenceError}
-			 * Throws a `ReferenceError` when `callArgs` are specified and
-			 * the found member named by `key` is not a function value.
-			 *
-			 * @returns {*|null}
-			 * Returns the value of the found member or the return value of
-			 * the call to the found method. Returns `null` when no member
-			 * was found in the parent class chain or when the call to the
-			 * superclass method returned `null`.
-			 */
-			super: function(key, callArgs) {
-				if (key == null)
-					return null;
-
-				var slotIdx = this.__id__ + '.' + key,
-				    symStack = superContext[slotIdx],
-				    protoCtx = null;
-
-				for (protoCtx = Object.getPrototypeOf(symStack ? symStack[0] : Object.getPrototypeOf(this));
-				     protoCtx != null && !protoCtx.hasOwnProperty(key);
-				     protoCtx = Object.getPrototypeOf(protoCtx)) {}
-
-				if (protoCtx == null)
-					return null;
-
-				var res = protoCtx[key];
-
-				if (arguments.length > 1) {
-					if (typeof(res) != 'function')
-						throw new ReferenceError(key + ' is not a function in base class');
-
-					if (typeof(callArgs) != 'object')
-						callArgs = this.varargs(arguments, 1);
-
-					if (symStack)
-						symStack.unshift(protoCtx);
-					else
-						superContext[slotIdx] = [ protoCtx ];
-
-					res = res.apply(this, callArgs);
-
-					if (symStack && symStack.length > 1)
-						symStack.shift(protoCtx);
-					else
-						delete superContext[slotIdx];
-				}
-
-				return res;
-			},
-
-			/**
-			 * Returns a string representation of this class.
-			 *
-			 * @returns {string}
-			 * Returns a string representation of this class containing the
-			 * constructor functions `displayName` and describing the class
-			 * members and their respective types.
-			 */
-			toString: function() {
-				var s = '[' + this.constructor.displayName + ']', f = true;
-				for (var k in this) {
-					if (this.hasOwnProperty(k)) {
-						s += (f ? ' {\n' : '') + '  ' + k + ': ' + typeof(this[k]) + '\n';
-						f = false;
-					}
-				}
-				return s + (f ? '' : '}');
-			}
-		}
-	});
-
-
-	/**
-	 * @class headers
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `Headers` class is an internal utility class exposed in HTTP
-	 * response objects using the `response.headers` property.
-	 */
-	var Headers = Class.extend(/** @lends LuCI.headers.prototype */ {
-		__name__: 'LuCI.headers',
-		__init__: function(xhr) {
-			var hdrs = this.headers = {};
-			xhr.getAllResponseHeaders().split(/\r\n/).forEach(function(line) {
-				var m = /^([^:]+):(.*)$/.exec(line);
-				if (m != null)
-					hdrs[m[1].trim().toLowerCase()] = m[2].trim();
-			});
-		},
-
-		/**
-		 * Checks whether the given header name is present.
-		 * Note: Header-Names are case-insensitive.
-		 *
-		 * @instance
-		 * @memberof LuCI.headers
-		 * @param {string} name
-		 * The header name to check
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the header name is present, `false` otherwise
-		 */
-		has: function(name) {
-			return this.headers.hasOwnProperty(String(name).toLowerCase());
-		},
-
-		/**
-		 * Returns the value of the given header name.
-		 * Note: Header-Names are case-insensitive.
-		 *
-		 * @instance
-		 * @memberof LuCI.headers
-		 * @param {string} name
-		 * The header name to read
-		 *
-		 * @returns {string|null}
-		 * The value of the given header name or `null` if the header isn't present.
-		 */
-		get: function(name) {
-			var key = String(name).toLowerCase();
-			return this.headers.hasOwnProperty(key) ? this.headers[key] : null;
-		}
-	});
-
-	/**
-	 * @class response
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `Response` class is an internal utility class representing HTTP responses.
-	 */
-	var Response = Class.extend({
-		__name__: 'LuCI.response',
-		__init__: function(xhr, url, duration, headers, content) {
-			/**
-			 * Describes whether the response is successful (status codes `200..299`) or not
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name ok
-			 * @type {boolean}
-			 */
-			this.ok = (xhr.status >= 200 && xhr.status <= 299);
-
-			/**
-			 * The numeric HTTP status code of the response
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name status
-			 * @type {number}
-			 */
-			this.status = xhr.status;
-
-			/**
-			 * The HTTP status description message of the response
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name statusText
-			 * @type {string}
-			 */
-			this.statusText = xhr.statusText;
-
-			/**
-			 * The HTTP headers of the response
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name headers
-			 * @type {LuCI.headers}
-			 */
-			this.headers = (headers != null) ? headers : new Headers(xhr);
-
-			/**
-			 * The total duration of the HTTP request in milliseconds
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name duration
-			 * @type {number}
-			 */
-			this.duration = duration;
-
-			/**
-			 * The final URL of the request, i.e. after following redirects.
-			 * @instance
-			 * @memberof LuCI.response
-			 * @name url
-			 * @type {string}
-			 */
-			this.url = url;
-
-			/* privates */
-			this.xhr = xhr;
-
-			if (content instanceof Blob) {
-				this.responseBlob = content;
-				this.responseJSON = null;
-				this.responseText = null;
-			}
-			else if (content != null && typeof(content) == 'object') {
-				this.responseBlob = null;
-				this.responseJSON = content;
-				this.responseText = null;
-			}
-			else if (content != null) {
-				this.responseBlob = null;
-				this.responseJSON = null;
-				this.responseText = String(content);
-			}
-			else {
-				this.responseJSON = null;
-
-				if (xhr.responseType == 'blob') {
-					this.responseBlob = xhr.response;
-					this.responseText = null;
-				}
-				else {
-					this.responseBlob = null;
-					this.responseText = xhr.responseText;
-				}
-			}
-		},
-
-		/**
-		 * Clones the given response object, optionally overriding the content
-		 * of the cloned instance.
-		 *
-		 * @instance
-		 * @memberof LuCI.response
-		 * @param {*} [content]
-		 * Override the content of the cloned response. Object values will be
-		 * treated as JSON response data, all other types will be converted
-		 * using `String()` and treated as response text.
-		 *
-		 * @returns {LuCI.response}
-		 * The cloned `Response` instance.
-		 */
-		clone: function(content) {
-			var copy = new Response(this.xhr, this.url, this.duration, this.headers, content);
-
-			copy.ok = this.ok;
-			copy.status = this.status;
-			copy.statusText = this.statusText;
-
-			return copy;
-		},
-
-		/**
-		 * Access the response content as JSON data.
-		 *
-		 * @instance
-		 * @memberof LuCI.response
-		 * @throws {SyntaxError}
-		 * Throws `SyntaxError` if the content isn't valid JSON.
-		 *
-		 * @returns {*}
-		 * The parsed JSON data.
-		 */
-		json: function() {
-			if (this.responseJSON == null)
-				this.responseJSON = JSON.parse(this.responseText);
-
-			return this.responseJSON;
-		},
-
-		/**
-		 * Access the response content as string.
-		 *
-		 * @instance
-		 * @memberof LuCI.response
-		 * @returns {string}
-		 * The response content.
-		 */
-		text: function() {
-			if (this.responseText == null && this.responseJSON != null)
-				this.responseText = JSON.stringify(this.responseJSON);
-
-			return this.responseText;
-		},
-
-		/**
-		 * Access the response content as blob.
-		 *
-		 * @instance
-		 * @memberof LuCI.response
-		 * @returns {Blob}
-		 * The response content as blob.
-		 */
-		blob: function() {
-			return this.responseBlob;
-		}
-	});
-
-
-	var requestQueue = [];
-
-	function isQueueableRequest(opt) {
-		if (!classes.rpc)
-			return false;
-
-		if (opt.method != 'POST' || typeof(opt.content) != 'object')
-			return false;
-
-		if (opt.nobatch === true)
-			return false;
-
-		var rpcBaseURL = Request.expandURL(classes.rpc.getBaseURL());
-
-		return (rpcBaseURL != null && opt.url.indexOf(rpcBaseURL) == 0);
-	}
-
-	function flushRequestQueue() {
-		if (!requestQueue.length)
-			return;
-
-		var reqopt = Object.assign({}, requestQueue[0][0], { content: [], nobatch: true }),
-		    batch = [];
-
-		for (var i = 0; i < requestQueue.length; i++) {
-			batch[i] = requestQueue[i];
-			reqopt.content[i] = batch[i][0].content;
-		}
-
-		requestQueue.length = 0;
-
-		Request.request(rpcBaseURL, reqopt).then(function(reply) {
-			var json = null, req = null;
-
-			try { json = reply.json() }
-			catch(e) { }
-
-			while ((req = batch.shift()) != null)
-				if (Array.isArray(json) && json.length)
-					req[2].call(reqopt, reply.clone(json.shift()));
-				else
-					req[1].call(reqopt, new Error('No related RPC reply'));
-		}).catch(function(error) {
-			var req = null;
-
-			while ((req = batch.shift()) != null)
-				req[1].call(reqopt, error);
-		});
-	}
-
-	/**
-	 * @class request
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `Request` class allows initiating HTTP requests and provides utilities
-	 * for dealing with responses.
-	 */
-	var Request = Class.singleton(/** @lends LuCI.request.prototype */ {
-		__name__: 'LuCI.request',
-
-		interceptors: [],
-
-		/**
-		 * Turn the given relative URL into an absolute URL if necessary.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {string} url
-		 * The URL to convert.
-		 *
-		 * @returns {string}
-		 * The absolute URL derived from the given one, or the original URL
-		 * if it already was absolute.
-		 */
-		expandURL: function(url) {
-			if (!/^(?:[^/]+:)?\/\//.test(url))
-				url = location.protocol + '//' + location.host + url;
-
-			return url;
-		},
-
-		/**
-		 * @typedef {Object} RequestOptions
-		 * @memberof LuCI.request
-		 *
-		 * @property {string} [method=GET]
-		 * The HTTP method to use, e.g. `GET` or `POST`.
-		 *
-		 * @property {Object<string, Object|string>} [query]
-		 * Query string data to append to the URL. Non-string values of the
-		 * given object will be converted to JSON.
-		 *
-		 * @property {boolean} [cache=false]
-		 * Specifies whether the HTTP response may be retrieved from cache.
-		 *
-		 * @property {string} [username]
-		 * Provides a username for HTTP basic authentication.
-		 *
-		 * @property {string} [password]
-		 * Provides a password for HTTP basic authentication.
-		 *
-		 * @property {number} [timeout]
-		 * Specifies the request timeout in seconds.
-		 *
-		 * @property {boolean} [credentials=false]
-		 * Whether to include credentials such as cookies in the request.
-		 *
-		 * @property {string} [responseType=text]
-		 * Overrides the request response type. Valid values or `text` to
-		 * interpret the response as UTF-8 string or `blob` to handle the
-		 * response as binary `Blob` data.
-		 *
-		 * @property {*} [content]
-		 * Specifies the HTTP message body to send along with the request.
-		 * If the value is a function, it is invoked and the return value
-		 * used as content, if it is a FormData instance, it is used as-is,
-		 * if it is an object, it will be converted to JSON, in all other
-		 * cases it is converted to a string.
-		 *
-	     * @property {Object<string, string>} [header]
-	     * Specifies HTTP headers to set for the request.
-	     *
-	     * @property {function} [progress]
-	     * An optional request callback function which receives ProgressEvent
-	     * instances as sole argument during the HTTP request transfer.
-		 */
-
-		/**
-		 * Initiate an HTTP request to the given target.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {string} target
-		 * The URL to request.
-		 *
-		 * @param {LuCI.request.RequestOptions} [options]
-		 * Additional options to configure the request.
-		 *
-		 * @returns {Promise<LuCI.response>}
-		 * The resulting HTTP response.
-		 */
-		request: function(target, options) {
-			var state = { xhr: new XMLHttpRequest(), url: this.expandURL(target), start: Date.now() },
-			    opt = Object.assign({}, options, state),
-			    content = null,
-			    contenttype = null,
-			    callback = this.handleReadyStateChange;
-
-			return new Promise(function(resolveFn, rejectFn) {
-				opt.xhr.onreadystatechange = callback.bind(opt, resolveFn, rejectFn);
-				opt.method = String(opt.method || 'GET').toUpperCase();
-
-				if ('query' in opt) {
-					var q = (opt.query != null) ? Object.keys(opt.query).map(function(k) {
-						if (opt.query[k] != null) {
-							var v = (typeof(opt.query[k]) == 'object')
-								? JSON.stringify(opt.query[k])
-								: String(opt.query[k]);
-
-							return '%s=%s'.format(encodeURIComponent(k), encodeURIComponent(v));
-						}
-						else {
-							return encodeURIComponent(k);
-						}
-					}).join('&') : '';
-
-					if (q !== '') {
-						switch (opt.method) {
-						case 'GET':
-						case 'HEAD':
-						case 'OPTIONS':
-							opt.url += ((/\?/).test(opt.url) ? '&' : '?') + q;
-							break;
-
-						default:
-							if (content == null) {
-								content = q;
-								contenttype = 'application/x-www-form-urlencoded';
-							}
-						}
-					}
-				}
-
-				if (!opt.cache)
-					opt.url += ((/\?/).test(opt.url) ? '&' : '?') + (new Date()).getTime();
-
-				if (isQueueableRequest(opt)) {
-					requestQueue.push([opt, rejectFn, resolveFn]);
-					requestAnimationFrame(flushRequestQueue);
-					return;
-				}
-
-				if ('username' in opt && 'password' in opt)
-					opt.xhr.open(opt.method, opt.url, true, opt.username, opt.password);
-				else
-					opt.xhr.open(opt.method, opt.url, true);
-
-				opt.xhr.responseType = opt.responseType || 'text';
-
-				if ('overrideMimeType' in opt.xhr)
-					opt.xhr.overrideMimeType('application/octet-stream');
-
-				if ('timeout' in opt)
-					opt.xhr.timeout = +opt.timeout;
-
-				if ('credentials' in opt)
-					opt.xhr.withCredentials = !!opt.credentials;
-
-				if (opt.content != null) {
-					switch (typeof(opt.content)) {
-					case 'function':
-						content = opt.content(xhr);
-						break;
-
-					case 'object':
-						if (!(opt.content instanceof FormData)) {
-							content = JSON.stringify(opt.content);
-							contenttype = 'application/json';
-						}
-						else {
-							content = opt.content;
-						}
-						break;
-
-					default:
-						content = String(opt.content);
-					}
-				}
-
-				if ('headers' in opt)
-					for (var header in opt.headers)
-						if (opt.headers.hasOwnProperty(header)) {
-							if (header.toLowerCase() != 'content-type')
-								opt.xhr.setRequestHeader(header, opt.headers[header]);
-							else
-								contenttype = opt.headers[header];
-						}
-
-				if ('progress' in opt && 'upload' in opt.xhr)
-					opt.xhr.upload.addEventListener('progress', opt.progress);
-
-				if (contenttype != null)
-					opt.xhr.setRequestHeader('Content-Type', contenttype);
-
-				try {
-					opt.xhr.send(content);
-				}
-				catch (e) {
-					rejectFn.call(opt, e);
-				}
-			});
-		},
-
-		handleReadyStateChange: function(resolveFn, rejectFn, ev) {
-			var xhr = this.xhr,
-			    duration = Date.now() - this.start;
-
-			if (xhr.readyState !== 4)
-				return;
-
-			if (xhr.status === 0 && xhr.statusText === '') {
-				if (duration >= this.timeout)
-					rejectFn.call(this, new Error('XHR request timed out'));
-				else
-					rejectFn.call(this, new Error('XHR request aborted by browser'));
-			}
-			else {
-				var response = new Response(
-					xhr, xhr.responseURL || this.url, duration);
-
-				Promise.all(Request.interceptors.map(function(fn) { return fn(response) }))
-					.then(resolveFn.bind(this, response))
-					.catch(rejectFn.bind(this));
-			}
-		},
-
-		/**
-		 * Initiate an HTTP GET request to the given target.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {string} target
-		 * The URL to request.
-		 *
-		 * @param {LuCI.request.RequestOptions} [options]
-		 * Additional options to configure the request.
-		 *
-		 * @returns {Promise<LuCI.response>}
-		 * The resulting HTTP response.
-		 */
-		get: function(url, options) {
-			return this.request(url, Object.assign({ method: 'GET' }, options));
-		},
-
-		/**
-		 * Initiate an HTTP POST request to the given target.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {string} target
-		 * The URL to request.
-		 *
-		 * @param {*} [data]
-		 * The request data to send, see {@link LuCI.request.RequestOptions} for details.
-		 *
-		 * @param {LuCI.request.RequestOptions} [options]
-		 * Additional options to configure the request.
-		 *
-		 * @returns {Promise<LuCI.response>}
-		 * The resulting HTTP response.
-		 */
-		post: function(url, data, options) {
-			return this.request(url, Object.assign({ method: 'POST', content: data }, options));
-		},
-
-		/**
-		 * Interceptor functions are invoked whenever an HTTP reply is received, in the order
-		 * these functions have been registered.
-		 * @callback LuCI.request.interceptorFn
-		 * @param {LuCI.response} res
-		 * The HTTP response object
-		 */
-
-		/**
-		 * Register an HTTP response interceptor function. Interceptor
-		 * functions are useful to perform default actions on incoming HTTP
-		 * responses, such as checking for expired authentication or for
-		 * implementing request retries before returning a failure.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {LuCI.request.interceptorFn} interceptorFn
-		 * The interceptor function to register.
-		 *
-		 * @returns {LuCI.request.interceptorFn}
-		 * The registered function.
-		 */
-		addInterceptor: function(interceptorFn) {
-			if (typeof(interceptorFn) == 'function')
-				this.interceptors.push(interceptorFn);
-			return interceptorFn;
-		},
-
-		/**
-		 * Remove an HTTP response interceptor function. The passed function
-		 * value must be the very same value that was used to register the
-		 * function.
-		 *
-		 * @instance
-		 * @memberof LuCI.request
-		 * @param {LuCI.request.interceptorFn} interceptorFn
-		 * The interceptor function to remove.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if any function has been removed, else `false`.
-		 */
-		removeInterceptor: function(interceptorFn) {
-			var oldlen = this.interceptors.length, i = oldlen;
-			while (i--)
-				if (this.interceptors[i] === interceptorFn)
-					this.interceptors.splice(i, 1);
-			return (this.interceptors.length < oldlen);
-		},
-
-		/**
-		 * @class
-		 * @memberof LuCI.request
-		 * @hideconstructor
-		 * @classdesc
-		 *
-		 * The `Request.poll` class provides some convience wrappers around
-		 * {@link LuCI.poll} mainly to simplify registering repeating HTTP
-		 * request calls as polling functions.
-		 */
-		poll: {
-			/**
-			 * The callback function is invoked whenever an HTTP reply to a
-			 * polled request is received or when the polled request timed
-			 * out.
-			 *
-			 * @callback LuCI.request.poll~callbackFn
-			 * @param {LuCI.response} res
-			 * The HTTP response object.
-			 *
-			 * @param {*} data
-			 * The response JSON if the response could be parsed as such,
-			 * else `null`.
-			 *
-			 * @param {number} duration
-			 * The total duration of the request in milliseconds.
-			 */
-
-			/**
-			 * Register a repeating HTTP request with an optional callback
-			 * to invoke whenever a response for the request is received.
-			 *
-			 * @instance
-			 * @memberof LuCI.request.poll
-			 * @param {number} interval
-			 * The poll interval in seconds.
-			 *
-			 * @param {string} url
-			 * The URL to request on each poll.
-			 *
-			 * @param {LuCI.request.RequestOptions} [options]
-			 * Additional options to configure the request.
-			 *
-			 * @param {LuCI.request.poll~callbackFn} [callback]
-			 * {@link LuCI.request.poll~callbackFn Callback} function to
-			 * invoke for each HTTP reply.
-			 *
-			 * @throws {TypeError}
-			 * Throws `TypeError` when an invalid interval was passed.
-			 *
-			 * @returns {function}
-			 * Returns the internally created poll function.
-			 */
-			add: function(interval, url, options, callback) {
-				if (isNaN(interval) || interval <= 0)
-					throw new TypeError('Invalid poll interval');
-
-				var ival = interval >>> 0,
-				    opts = Object.assign({}, options, { timeout: ival * 1000 - 5 });
-
-				var fn = function() {
-					return Request.request(url, options).then(function(res) {
-						if (!Poll.active())
-							return;
-
-						try {
-							callback(res, res.json(), res.duration);
-						}
-						catch (err) {
-							callback(res, null, res.duration);
-						}
-					});
-				};
-
-				return (Poll.add(fn, ival) ? fn : null);
-			},
-
-			/**
-			 * Remove a polling request that has been previously added using `add()`.
-			 * This function is essentially a wrapper around
-			 * {@link LuCI.poll.remove LuCI.poll.remove()}.
-			 *
-			 * @instance
-			 * @memberof LuCI.request.poll
-			 * @param {function} entry
-			 * The poll function returned by {@link LuCI.request.poll#add add()}.
-			 *
-			 * @returns {boolean}
-			 * Returns `true` if any function has been removed, else `false`.
-			 */
-			remove: function(entry) { return Poll.remove(entry) },
-
-			/**
-			  * Alias for {@link LuCI.poll.start LuCI.poll.start()}.
-			  *
-			  * @instance
-			  * @memberof LuCI.request.poll
-			  */
-			start: function() { return Poll.start() },
-
-			/**
-			  * Alias for {@link LuCI.poll.stop LuCI.poll.stop()}.
-			  *
-			  * @instance
-			  * @memberof LuCI.request.poll
-			  */
-			stop: function() { return Poll.stop() },
-
-			/**
-			  * Alias for {@link LuCI.poll.active LuCI.poll.active()}.
-			  *
-			  * @instance
-			  * @memberof LuCI.request.poll
-			  */
-			active: function() { return Poll.active() }
-		}
-	});
-
-	/**
-	 * @class poll
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `Poll` class allows registering and unregistering poll actions,
-	 * as well as starting, stopping and querying the state of the polling
-	 * loop.
-	 */
-	var Poll = Class.singleton(/** @lends LuCI.poll.prototype */ {
-		__name__: 'LuCI.poll',
-
-		queue: [],
-
-		/**
-		 * Add a new operation to the polling loop. If the polling loop is not
-		 * already started at this point, it will be implicitely started.
-		 *
-		 * @instance
-		 * @memberof LuCI.poll
-		 * @param {function} fn
-		 * The function to invoke on each poll interval.
-		 *
-		 * @param {number} interval
-		 * The poll interval in seconds.
-		 *
-		 * @throws {TypeError}
-		 * Throws `TypeError` when an invalid interval was passed.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the function has been added or `false` if it
-		 * already is registered.
-		 */
-		add: function(fn, interval) {
-			if (interval == null || interval <= 0)
-				interval = env.pollinterval || null;
-
-			if (isNaN(interval) || typeof(fn) != 'function')
-				throw new TypeError('Invalid argument to LuCI.poll.add()');
-
-			for (var i = 0; i < this.queue.length; i++)
-				if (this.queue[i].fn === fn)
-					return false;
-
-			var e = {
-				r: true,
-				i: interval >>> 0,
-				fn: fn
-			};
-
-			this.queue.push(e);
-
-			if (this.tick != null && !this.active())
-				this.start();
-
-			return true;
-		},
-
-		/**
-		 * Remove an operation from the polling loop. If no further operatons
-		 * are registered, the polling loop is implicitely stopped.
-		 *
-		 * @instance
-		 * @memberof LuCI.poll
-		 * @param {function} fn
-		 * The function to remove.
-		 *
-		 * @throws {TypeError}
-		 * Throws `TypeError` when the given argument isn't a function.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the function has been removed or `false` if it
-		 * wasn't found.
-		 */
-		remove: function(fn) {
-			if (typeof(fn) != 'function')
-				throw new TypeError('Invalid argument to LuCI.poll.remove()');
-
-			var len = this.queue.length;
-
-			for (var i = len; i > 0; i--)
-				if (this.queue[i-1].fn === fn)
-					this.queue.splice(i-1, 1);
-
-			if (!this.queue.length && this.stop())
-				this.tick = 0;
-
-			return (this.queue.length != len);
-		},
-
-		/**
-		 * (Re)start the polling loop. Dispatches a custom `poll-start` event
-		 * to the `document` object upon successful start.
-		 *
-		 * @instance
-		 * @memberof LuCI.poll
-		 * @returns {boolean}
-		 * Returns `true` if polling has been started (or if no functions
-		 * where registered) or `false` when the polling loop already runs.
-		 */
-		start: function() {
-			if (this.active())
-				return false;
-
-			this.tick = 0;
-
-			if (this.queue.length) {
-				this.timer = window.setInterval(this.step, 1000);
-				this.step();
-				document.dispatchEvent(new CustomEvent('poll-start'));
-			}
-
-			return true;
-		},
-
-		/**
-		 * Stop the polling loop. Dispatches a custom `poll-stop` event
-		 * to the `document` object upon successful stop.
-		 *
-		 * @instance
-		 * @memberof LuCI.poll
-		 * @returns {boolean}
-		 * Returns `true` if polling has been stopped or `false` if it din't
-		 * run to begin with.
-		 */
-		stop: function() {
-			if (!this.active())
-				return false;
-
-			document.dispatchEvent(new CustomEvent('poll-stop'));
-			window.clearInterval(this.timer);
-			delete this.timer;
-			delete this.tick;
-			return true;
-		},
-
-		/* private */
-		step: function() {
-			for (var i = 0, e = null; (e = Poll.queue[i]) != null; i++) {
-				if ((Poll.tick % e.i) != 0)
-					continue;
-
-				if (!e.r)
-					continue;
-
-				e.r = false;
-
-				Promise.resolve(e.fn()).finally((function() { this.r = true }).bind(e));
-			}
-
-			Poll.tick = (Poll.tick + 1) % Math.pow(2, 32);
-		},
-
-		/**
-		 * Test whether the polling loop is running.
-		 *
-		 * @instance
-		 * @memberof LuCI.poll
-		 * @returns {boolean} - Returns `true` if polling is active, else `false`.
-		 */
-		active: function() {
-			return (this.timer != null);
-		}
-	});
-
-	/**
-	 * @class dom
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `dom` class provides convenience method for creating and
-	 * manipulating DOM elements.
-	 *
-	 * To import the class in views, use `'require dom'`, to import it in
-	 * external JavaScript, use `L.require("dom").then(...)`.
-	 */
-	var DOM = Class.singleton(/** @lends LuCI.dom.prototype */ {
-		__name__: 'LuCI.dom',
-
-		/**
-		 * Tests whether the given argument is a valid DOM `Node`.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} e
-		 * The value to test.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the value is a DOM `Node`, else `false`.
-		 */
-		elem: function(e) {
-			return (e != null && typeof(e) == 'object' && 'nodeType' in e);
-		},
-
-		/**
-		 * Parses a given string as HTML and returns the first child node.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {string} s
-		 * A string containing an HTML fragment to parse. Note that only
-		 * the first result of the resulting structure is returned, so an
-		 * input value of `<div>foo</div> <div>bar</div>` will only return
-		 * the first `div` element node.
-		 *
-		 * @returns {Node}
-		 * Returns the first DOM `Node` extracted from the HTML fragment or
-		 * `null` on parsing failures or if no element could be found.
-		 */
-		parse: function(s) {
-			var elem;
-
-			try {
-				domParser = domParser || new DOMParser();
-				elem = domParser.parseFromString(s, 'text/html').body.firstChild;
-			}
-			catch(e) {}
-
-			if (!elem) {
-				try {
-					dummyElem = dummyElem || document.createElement('div');
-					dummyElem.innerHTML = s;
-					elem = dummyElem.firstChild;
-				}
-				catch (e) {}
-			}
-
-			return elem || null;
-		},
-
-		/**
-		 * Tests whether a given `Node` matches the given query selector.
-		 *
-		 * This function is a convenience wrapper around the standard
-		 * `Node.matches("selector")` function with the added benefit that
-		 * the `node` argument may be a non-`Node` value, in which case
-		 * this function simply returns `false`.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} node
-		 * The `Node` argument to test the selector against.
-		 *
-		 * @param {string} [selector]
-		 * The query selector expression to test against the given node.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the given node matches the specified selector
-		 * or `false` when the node argument is no valid DOM `Node` or the
-		 * selector didn't match.
-		 */
-		matches: function(node, selector) {
-			var m = this.elem(node) ? node.matches || node.msMatchesSelector : null;
-			return m ? m.call(node, selector) : false;
-		},
-
-		/**
-		 * Returns the closest parent node that matches the given query
-		 * selector expression.
-		 *
-		 * This function is a convenience wrapper around the standard
-		 * `Node.closest("selector")` function with the added benefit that
-		 * the `node` argument may be a non-`Node` value, in which case
-		 * this function simply returns `null`.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} node
-		 * The `Node` argument to find the closest parent for.
-		 *
-		 * @param {string} [selector]
-		 * The query selector expression to test against each parent.
-		 *
-		 * @returns {Node|null}
-		 * Returns the closest parent node matching the selector or
-		 * `null` when the node argument is no valid DOM `Node` or the
-		 * selector didn't match any parent.
-		 */
-		parent: function(node, selector) {
-			if (this.elem(node) && node.closest)
-				return node.closest(selector);
-
-			while (this.elem(node))
-				if (this.matches(node, selector))
-					return node;
-				else
-					node = node.parentNode;
-
-			return null;
-		},
-
-		/**
-		 * Appends the given children data to the given node.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} node
-		 * The `Node` argument to append the children to.
-		 *
-		 * @param {*} [children]
-		 * The childrens to append to the given node.
-		 *
-		 * When `children` is an array, then each item of the array
-		 * will be either appended as child element or text node,
-		 * depending on whether the item is a DOM `Node` instance or
-		 * some other non-`null` value. Non-`Node`, non-`null` values
-		 * will be converted to strings first before being passed as
-		 * argument to `createTextNode()`.
-		 *
-		 * When `children` is a function, it will be invoked with
-		 * the passed `node` argument as sole parameter and the `append`
-		 * function will be invoked again, with the given `node` argument
-		 * as first and the return value of the `children` function as
-		 * second parameter.
-		 *
-		 * When `children` is is a DOM `Node` instance, it will be
-		 * appended to the given `node`.
-		 *
-		 * When `children` is any other non-`null` value, it will be
-		 * converted to a string and appened to the `innerHTML` property
-		 * of the given `node`.
-		 *
-		 * @returns {Node|null}
-		 * Returns the last children `Node` appended to the node or `null`
-		 * if either the `node` argument was no valid DOM `node` or if the
-		 * `children` was `null` or didn't result in further DOM nodes.
-		 */
-		append: function(node, children) {
-			if (!this.elem(node))
-				return null;
-
-			if (Array.isArray(children)) {
-				for (var i = 0; i < children.length; i++)
-					if (this.elem(children[i]))
-						node.appendChild(children[i]);
-					else if (children !== null && children !== undefined)
-						node.appendChild(document.createTextNode('' + children[i]));
-
-				return node.lastChild;
-			}
-			else if (typeof(children) === 'function') {
-				return this.append(node, children(node));
-			}
-			else if (this.elem(children)) {
-				return node.appendChild(children);
-			}
-			else if (children !== null && children !== undefined) {
-				node.innerHTML = '' + children;
-				return node.lastChild;
-			}
-
-			return null;
-		},
-
-		/**
-		 * Replaces the content of the given node with the given children.
-		 *
-		 * This function first removes any children of the given DOM
-		 * `Node` and then adds the given given children following the
-		 * rules outlined below.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} node
-		 * The `Node` argument to replace the children of.
-		 *
-		 * @param {*} [children]
-		 * The childrens to replace into the given node.
-		 *
-		 * When `children` is an array, then each item of the array
-		 * will be either appended as child element or text node,
-		 * depending on whether the item is a DOM `Node` instance or
-		 * some other non-`null` value. Non-`Node`, non-`null` values
-		 * will be converted to strings first before being passed as
-		 * argument to `createTextNode()`.
-		 *
-		 * When `children` is a function, it will be invoked with
-		 * the passed `node` argument as sole parameter and the `append`
-		 * function will be invoked again, with the given `node` argument
-		 * as first and the return value of the `children` function as
-		 * second parameter.
-		 *
-		 * When `children` is is a DOM `Node` instance, it will be
-		 * appended to the given `node`.
-		 *
-		 * When `children` is any other non-`null` value, it will be
-		 * converted to a string and appened to the `innerHTML` property
-		 * of the given `node`.
-		 *
-		 * @returns {Node|null}
-		 * Returns the last children `Node` appended to the node or `null`
-		 * if either the `node` argument was no valid DOM `node` or if the
-		 * `children` was `null` or didn't result in further DOM nodes.
-		 */
-		content: function(node, children) {
-			if (!this.elem(node))
-				return null;
-
-			var dataNodes = node.querySelectorAll('[data-idref]');
-
-			for (var i = 0; i < dataNodes.length; i++)
-				delete this.registry[dataNodes[i].getAttribute('data-idref')];
-
-			while (node.firstChild)
-				node.removeChild(node.firstChild);
-
-			return this.append(node, children);
-		},
-
-		/**
-		 * Sets attributes or registers event listeners on element nodes.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} node
-		 * The `Node` argument to set the attributes or add the event
-		 * listeners for. When the given `node` value is not a valid
-		 * DOM `Node`, the function returns and does nothing.
-		 *
-		 * @param {string|Object<string, *>} key
-		 * Specifies either the attribute or event handler name to use,
-		 * or an object containing multiple key, value pairs which are
-		 * each added to the node as either attribute or event handler,
-		 * depending on the respective value.
-		 *
-		 * @param {*} [val]
-		 * Specifies the attribute value or event handler function to add.
-		 * If the `key` parameter is an `Object`, this parameter will be
-		 * ignored.
-		 *
-		 * When `val` is of type function, it will be registered as event
-		 * handler on the given `node` with the `key` parameter being the
-		 * event name.
-		 *
-		 * When `val` is of type object, it will be serialized as JSON and
-		 * added as attribute to the given `node`, using the given `key`
-		 * as attribute name.
-		 *
-		 * When `val` is of any other type, it will be added as attribute
-		 * to the given `node` as-is, with the underlying `setAttribute()`
-		 * call implicitely turning it into a string.
-		 */
-		attr: function(node, key, val) {
-			if (!this.elem(node))
-				return null;
-
-			var attr = null;
-
-			if (typeof(key) === 'object' && key !== null)
-				attr = key;
-			else if (typeof(key) === 'string')
-				attr = {}, attr[key] = val;
-
-			for (key in attr) {
-				if (!attr.hasOwnProperty(key) || attr[key] == null)
-					continue;
-
-				switch (typeof(attr[key])) {
-				case 'function':
-					node.addEventListener(key, attr[key]);
-					break;
-
-				case 'object':
-					node.setAttribute(key, JSON.stringify(attr[key]));
-					break;
-
-				default:
-					node.setAttribute(key, attr[key]);
-				}
-			}
-		},
-
-		/**
-		 * Creates a new DOM `Node` from the given `html`, `attr` and
-		 * `data` parameters.
-		 *
-		 * This function has multiple signatures, it can be either invoked
-		 * in the form `create(html[, attr[, data]])` or in the form
-		 * `create(html[, data])`. The used variant is determined from the
-		 * type of the second argument.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {*} html
-		 * Describes the node to create.
-		 *
-		 * When the value of `html` is of type array, a `DocumentFragment`
-		 * node is created and each item of the array is first converted
-		 * to a DOM `Node` by passing it through `create()` and then added
-		 * as child to the fragment.
-		 *
-		 * When the value of `html` is a DOM `Node` instance, no new
-		 * element will be created but the node will be used as-is.
-		 *
-		 * When the value of `html` is a string starting with `<`, it will
-		 * be passed to `dom.parse()` and the resulting value is used.
-		 *
-		 * When the value of `html` is any other string, it will be passed
-		 * to `document.createElement()` for creating a new DOM `Node` of
-		 * the given name.
-		 *
-		 * @param {Object<string, *>} [attr]
-		 * Specifies an Object of key, value pairs to set as attributes
-		 * or event handlers on the created node. Refer to
-		 * {@link LuCI.dom#attr dom.attr()} for details.
-		 *
-		 * @param {*} [data]
-		 * Specifies children to append to the newly created element.
-		 * Refer to {@link LuCI.dom#append dom.append()} for details.
-		 *
-		 * @throws {InvalidCharacterError}
-		 * Throws an `InvalidCharacterError` when the given `html`
-		 * argument contained malformed markup (such as not escaped
-		 * `&` characters in XHTML mode) or when the given node name
-		 * in `html` contains characters which are not legal in DOM
-		 * element names, such as spaces.
-		 *
-		 * @returns {Node}
-		 * Returns the newly created `Node`.
-		 */
-		create: function() {
-			var html = arguments[0],
-			    attr = arguments[1],
-			    data = arguments[2],
-			    elem;
-
-			if (!(attr instanceof Object) || Array.isArray(attr))
-				data = attr, attr = null;
-
-			if (Array.isArray(html)) {
-				elem = document.createDocumentFragment();
-				for (var i = 0; i < html.length; i++)
-					elem.appendChild(this.create(html[i]));
-			}
-			else if (this.elem(html)) {
-				elem = html;
-			}
-			else if (html.charCodeAt(0) === 60) {
-				elem = this.parse(html);
-			}
-			else {
-				elem = document.createElement(html);
-			}
-
-			if (!elem)
-				return null;
-
-			this.attr(elem, attr);
-			this.append(elem, data);
-
-			return elem;
-		},
-
-		registry: {},
-
-		/**
-		 * Attaches or detaches arbitrary data to and from a DOM `Node`.
-		 *
-		 * This function is useful to attach non-string values or runtime
-		 * data that is not serializable to DOM nodes. To decouple data
-		 * from the DOM, values are not added directly to nodes, but
-		 * inserted into a registry instead which is then referenced by a
-		 * string key stored as `data-idref` attribute in the node.
-		 *
-		 * This function has multiple signatures and is sensitive to the
-		 * number of arguments passed to it.
-		 *
-		 *  - `dom.data(node)` -
-		 *     Fetches all data associated with the given node.
-		 *  - `dom.data(node, key)` -
-		 *     Fetches a specific key associated with the given node.
-		 *  - `dom.data(node, key, val)` -
-		 *     Sets a specific key to the given value associated with the
-		 *     given node.
-		 *  - `dom.data(node, null)` -
-		 *     Clears any data associated with the node.
-		 *  - `dom.data(node, key, null)` -
-		 *     Clears the given key associated with the node.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {Node} node
-		 * The DOM `Node` instance to set or retrieve the data for.
-		 *
-		 * @param {string|null} [key]
-		 * This is either a string specifying the key to retrieve, or
-		 * `null` to unset the entire node data.
-		 *
-		 * @param {*|null} [val]
-		 * This is either a non-`null` value to set for a given key or
-		 * `null` to remove the given `key` from the specified node.
-		 *
-		 * @returns {*}
-		 * Returns the get or set value, or `null` when no value could
-		 * be found.
-		 */
-		data: function(node, key, val) {
-			if (!node || !node.getAttribute)
-				return null;
-
-			var id = node.getAttribute('data-idref');
-
-			/* clear all data */
-			if (arguments.length > 1 && key == null) {
-				if (id != null) {
-					node.removeAttribute('data-idref');
-					val = this.registry[id]
-					delete this.registry[id];
-					return val;
-				}
-
-				return null;
-			}
-
-			/* clear a key */
-			else if (arguments.length > 2 && key != null && val == null) {
-				if (id != null) {
-					val = this.registry[id][key];
-					delete this.registry[id][key];
-					return val;
-				}
-
-				return null;
-			}
-
-			/* set a key */
-			else if (arguments.length > 2 && key != null && val != null) {
-				if (id == null) {
-					do { id = Math.floor(Math.random() * 0xffffffff).toString(16) }
-					while (this.registry.hasOwnProperty(id));
-
-					node.setAttribute('data-idref', id);
-					this.registry[id] = {};
-				}
-
-				return (this.registry[id][key] = val);
-			}
-
-			/* get all data */
-			else if (arguments.length == 1) {
-				if (id != null)
-					return this.registry[id];
-
-				return null;
-			}
-
-			/* get a key */
-			else if (arguments.length == 2) {
-				if (id != null)
-					return this.registry[id][key];
-			}
-
-			return null;
-		},
-
-		/**
-		 * Binds the given class instance ot the specified DOM `Node`.
-		 *
-		 * This function uses the `dom.data()` facility to attach the
-		 * passed instance of a Class to a node. This is needed for
-		 * complex widget elements or similar where the corresponding
-		 * class instance responsible for the element must be retrieved
-		 * from DOM nodes obtained by `querySelector()` or similar means.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {Node} node
-		 * The DOM `Node` instance to bind the class to.
-		 *
-		 * @param {Class} inst
-		 * The Class instance to bind to the node.
-		 *
-		 * @throws {TypeError}
-		 * Throws a `TypeError` when the given instance argument isn't
-		 * a valid Class instance.
-		 *
-		 * @returns {Class}
-		 * Returns the bound class instance.
-		 */
-		bindClassInstance: function(node, inst) {
-			if (!(inst instanceof Class))
-				LuCI.prototype.error('TypeError', 'Argument must be a class instance');
-
-			return this.data(node, '_class', inst);
-		},
-
-		/**
-		 * Finds a bound class instance on the given node itself or the
-		 * first bound instance on its closest parent node.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {Node} node
-		 * The DOM `Node` instance to start from.
-		 *
-		 * @returns {Class|null}
-		 * Returns the founds class instance if any or `null` if no bound
-		 * class could be found on the node itself or any of its parents.
-		 */
-		findClassInstance: function(node) {
-			var inst = null;
-
-			do {
-				inst = this.data(node, '_class');
-				node = node.parentNode;
-			}
-			while (!(inst instanceof Class) && node != null);
-
-			return inst;
-		},
-
-		/**
-		 * Finds a bound class instance on the given node itself or the
-		 * first bound instance on its closest parent node and invokes
-		 * the specified method name on the found class instance.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {Node} node
-		 * The DOM `Node` instance to start from.
-		 *
-		 * @param {string} method
-		 * The name of the method to invoke on the found class instance.
-		 *
-		 * @param {...*} params
-		 * Additional arguments to pass to the invoked method as-is.
-		 *
-		 * @returns {*|null}
-		 * Returns the return value of the invoked method if a class
-		 * instance and method has been found. Returns `null` if either
-		 * no bound class instance could be found, or if the found
-		 * instance didn't have the requested `method`.
-		 */
-		callClassMethod: function(node, method /*, ... */) {
-			var inst = this.findClassInstance(node);
-
-			if (inst == null || typeof(inst[method]) != 'function')
-				return null;
-
-			return inst[method].apply(inst, inst.varargs(arguments, 2));
-		},
-
-		/**
-		 * The ignore callback function is invoked by `isEmpty()` for each
-		 * child node to decide whether to ignore a child node or not.
-		 *
-		 * When this function returns `false`, the node passed to it is
-		 * ignored, else not.
-		 *
-		 * @callback LuCI.dom~ignoreCallbackFn
-		 * @param {Node} node
-		 * The child node to test.
-		 *
-		 * @returns {boolean}
-		 * Boolean indicating whether to ignore the node or not.
-		 */
-
-		/**
-		 * Tests whether a given DOM `Node` instance is empty or appears
-		 * empty.
-		 *
-		 * Any element child nodes which have the CSS class `hidden` set
-		 * or for which the optionally passed `ignoreFn` callback function
-		 * returns `false` are ignored.
-		 *
-		 * @instance
-		 * @memberof LuCI.dom
-		 * @param {Node} node
-		 * The DOM `Node` instance to test.
-		 *
-		 * @param {LuCI.dom~ignoreCallbackFn} [ignoreFn]
-		 * Specifies an optional function which is invoked for each child
-		 * node to decide whether the child node should be ignored or not.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the node does not have any children or if
-		 * any children node either has a `hidden` CSS class or a `false`
-		 * result when testing it using the given `ignoreFn`.
-		 */
-		isEmpty: function(node, ignoreFn) {
-			for (var child = node.firstElementChild; child != null; child = child.nextElementSibling)
-				if (!child.classList.contains('hidden') && (!ignoreFn || !ignoreFn(child)))
-					return false;
-
-			return true;
-		}
-	});
-
-	/**
-	 * @class session
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `session` class provides various session related functionality.
-	 */
-	var Session = Class.singleton(/** @lends LuCI.session.prototype */ {
-		__name__: 'LuCI.session',
-
-		/**
-		 * Retrieve the current session ID.
-		 *
-		 * @returns {string}
-		 * Returns the current session ID.
-		 */
-		getID: function() {
-			return env.sessionid || '00000000000000000000000000000000';
-		},
-
-		/**
-		 * Retrieve the current session token.
-		 *
-		 * @returns {string|null}
-		 * Returns the current session token or `null` if not logged in.
-		 */
-		getToken: function() {
-			return env.token || null;
-		},
-
-		/**
-		 * Retrieve data from the local session storage.
-		 *
-		 * @param {string} [key]
-		 * The key to retrieve from the session data store. If omitted, all
-		 * session data will be returned.
-		 *
-		 * @returns {*}
-		 * Returns the stored session data or `null` if the given key wasn't
-		 * found.
-		 */
-		getLocalData: function(key) {
-			try {
-				var sid = this.getID(),
-				    item = 'luci-session-store',
-				    data = JSON.parse(window.sessionStorage.getItem(item));
-
-				if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
-					data = {};
-					data[sid] = {};
-				}
-
-				if (key != null)
-					return data[sid].hasOwnProperty(key) ? data[sid][key] : null;
-
-				return data[sid];
-			}
-			catch (e) {
-				return (key != null) ? null : {};
-			}
-		},
-
-		/**
-		 * Set data in the local session storage.
-		 *
-		 * @param {string} key
-		 * The key to set in the session data store.
-		 *
-		 * @param {*} value
-		 * The value to store. It will be internally converted to JSON before
-		 * being put in the session store.
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the data could be stored or `false` on error.
-		 */
-		setLocalData: function(key, value) {
-			if (key == null)
-				return false;
-
-			try {
-				var sid = this.getID(),
-				    item = 'luci-session-store',
-				    data = JSON.parse(window.sessionStorage.getItem(item));
-
-				if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
-					data = {};
-					data[sid] = {};
-				}
-
-				if (value != null)
-					data[sid][key] = value;
-				else
-					delete data[sid][key];
-
-				window.sessionStorage.setItem(item, JSON.stringify(data));
-
-				return true;
-			}
-			catch (e) {
-				return false;
-			}
-		}
-	});
-
-	/**
-	 * @class view
-	 * @memberof LuCI
-	 * @hideconstructor
-	 * @classdesc
-	 *
-	 * The `view` class forms the basis of views and provides a standard
-	 * set of methods to inherit from.
-	 */
-	var View = Class.extend(/** @lends LuCI.view.prototype */ {
-		__name__: 'LuCI.view',
-
-		__init__: function() {
-			var vp = document.getElementById('view');
-
-			DOM.content(vp, E('div', { 'class': 'spinning' }, _('Loading view…')));
-
-			return Promise.resolve(this.load())
-				.then(LuCI.prototype.bind(this.render, this))
-				.then(LuCI.prototype.bind(function(nodes) {
-					var vp = document.getElementById('view');
-
-					DOM.content(vp, nodes);
-					DOM.append(vp, this.addFooter());
-				}, this)).catch(LuCI.prototype.error);
-		},
-
-		/**
-		 * The load function is invoked before the view is rendered.
-		 *
-		 * The invocation of this function is wrapped by
-		 * `Promise.resolve()` so it may return Promises if needed.
-		 *
-		 * The return value of the function (or the resolved values
-		 * of the promise returned by it) will be passed as first
-		 * argument to `render()`.
-		 *
-		 * This function is supposed to be overwritten by subclasses,
-		 * the default implementation does nothing.
-		 *
-		 * @instance
-		 * @abstract
-		 * @memberof LuCI.view
-		 *
-		 * @returns {*|Promise<*>}
-		 * May return any value or a Promise resolving to any value.
-		 */
-		load: function() {},
-
-		/**
-		 * The render function is invoked after the
-		 * {@link LuCI.view#load load()} function and responsible
-		 * for setting up the view contents. It must return a DOM
-		 * `Node` or `DocumentFragment` holding the contents to
-		 * insert into the view area.
-		 *
-		 * The invocation of this function is wrapped by
-		 * `Promise.resolve()` so it may return Promises if needed.
-		 *
-		 * The return value of the function (or the resolved values
-		 * of the promise returned by it) will be inserted into the
-		 * main content area using
-		 * {@link LuCI.dom#append dom.append()}.
-		 *
-		 * This function is supposed to be overwritten by subclasses,
-		 * the default implementation does nothing.
-		 *
-		 * @instance
-		 * @abstract
-		 * @memberof LuCI.view
-		 * @param {*|null} load_results
-		 * This function will receive the return value of the
-		 * {@link LuCI.view#load view.load()} function as first
-		 * argument.
-		 *
-		 * @returns {Node|Promise<Node>}
-		 * Should return a DOM `Node` value or a `Promise` resolving
-		 * to a `Node` value.
-		 */
-		render: function() {},
-
-		/**
-		 * The handleSave function is invoked when the user clicks
-		 * the `Save` button in the page action footer.
-		 *
-		 * The default implementation should be sufficient for most
-		 * views using {@link form#Map form.Map()} based forms - it
-		 * will iterate all forms present in the view and invoke
-		 * the {@link form#Map#save Map.save()} method on each form.
-		 *
-		 * Views not using `Map` instances or requiring other special
-		 * logic should overwrite `handleSave()` with a custom
-		 * implementation.
-		 *
-		 * To disable the `Save` page footer button, views extending
-		 * this base class should overwrite the `handleSave` function
-		 * with `null`.
-		 *
-		 * The invocation of this function is wrapped by
-		 * `Promise.resolve()` so it may return Promises if needed.
-		 *
-		 * @instance
-		 * @memberof LuCI.view
-		 * @param {Event} ev
-		 * The DOM event that triggered the function.
-		 *
-		 * @returns {*|Promise<*>}
-		 * Any return values of this function are discarded, but
-		 * passed through `Promise.resolve()` to ensure that any
-		 * returned promise runs to completion before the button
-		 * is reenabled.
-		 */
-		handleSave: function(ev) {
-			var tasks = [];
-
-			document.getElementById('maincontent')
-				.querySelectorAll('.cbi-map').forEach(function(map) {
-					tasks.push(DOM.callClassMethod(map, 'save'));
-				});
-
-			return Promise.all(tasks);
-		},
-
-		/**
-		 * The handleSaveApply function is invoked when the user clicks
-		 * the `Save & Apply` button in the page action footer.
-		 *
-		 * The default implementation should be sufficient for most
-		 * views using {@link form#Map form.Map()} based forms - it
-		 * will first invoke
-		 * {@link LuCI.view.handleSave view.handleSave()} and then
-		 * call {@link ui#changes#apply ui.changes.apply()} to start the
-		 * modal config apply and page reload flow.
-		 *
-		 * Views not using `Map` instances or requiring other special
-		 * logic should overwrite `handleSaveApply()` with a custom
-		 * implementation.
-		 *
-		 * To disable the `Save & Apply` page footer button, views
-		 * extending this base class should overwrite the
-		 * `handleSaveApply` function with `null`.
-		 *
-		 * The invocation of this function is wrapped by
-		 * `Promise.resolve()` so it may return Promises if needed.
-		 *
-		 * @instance
-		 * @memberof LuCI.view
-		 * @param {Event} ev
-		 * The DOM event that triggered the function.
-		 *
-		 * @returns {*|Promise<*>}
-		 * Any return values of this function are discarded, but
-		 * passed through `Promise.resolve()` to ensure that any
-		 * returned promise runs to completion before the button
-		 * is reenabled.
-		 */
-		handleSaveApply: function(ev, mode) {
-			return this.handleSave(ev).then(function() {
-				classes.ui.changes.apply(mode == '0');
-			});
-		},
-
-		/**
-		 * The handleReset function is invoked when the user clicks
-		 * the `Reset` button in the page action footer.
-		 *
-		 * The default implementation should be sufficient for most
-		 * views using {@link form#Map form.Map()} based forms - it
-		 * will iterate all forms present in the view and invoke
-		 * the {@link form#Map#save Map.reset()} method on each form.
-		 *
-		 * Views not using `Map` instances or requiring other special
-		 * logic should overwrite `handleReset()` with a custom
-		 * implementation.
-		 *
-		 * To disable the `Reset` page footer button, views extending
-		 * this base class should overwrite the `handleReset` function
-		 * with `null`.
-		 *
-		 * The invocation of this function is wrapped by
-		 * `Promise.resolve()` so it may return Promises if needed.
-		 *
-		 * @instance
-		 * @memberof LuCI.view
-		 * @param {Event} ev
-		 * The DOM event that triggered the function.
-		 *
-		 * @returns {*|Promise<*>}
-		 * Any return values of this function are discarded, but
-		 * passed through `Promise.resolve()` to ensure that any
-		 * returned promise runs to completion before the button
-		 * is reenabled.
-		 */
-		handleReset: function(ev) {
-			var tasks = [];
-
-			document.getElementById('maincontent')
-				.querySelectorAll('.cbi-map').forEach(function(map) {
-					tasks.push(DOM.callClassMethod(map, 'reset'));
-				});
-
-			return Promise.all(tasks);
-		},
-
-		/**
-		 * Renders a standard page action footer if any of the
-		 * `handleSave()`, `handleSaveApply()` or `handleReset()`
-		 * functions are defined.
-		 *
-		 * The default implementation should be sufficient for most
-		 * views - it will render a standard page footer with action
-		 * buttons labeled `Save`, `Save & Apply` and `Reset`
-		 * triggering the `handleSave()`, `handleSaveApply()` and
-		 * `handleReset()` functions respectively.
-		 *
-		 * When any of these `handle*()` functions is overwritten
-		 * with `null` by a view extending this class, the
-		 * corresponding button will not be rendered.
-		 *
-		 * @instance
-		 * @memberof LuCI.view
-		 * @returns {DocumentFragment}
-		 * Returns a `DocumentFragment` containing the footer bar
-		 * with buttons for each corresponding `handle*()` action
-		 * or an empty `DocumentFragment` if all three `handle*()`
-		 * methods are overwritten with `null`.
-		 */
-		addFooter: function() {
-			var footer = E([]),
-			    vp = document.getElementById('view'),
-			    hasmap = false,
-			    readonly = true;
-
-			vp.querySelectorAll('.cbi-map').forEach(function(map) {
-				var m = DOM.findClassInstance(map);
-				if (m) {
-					hasmap = true;
-
-					if (!m.readonly)
-						readonly = false;
-				}
-			});
-
-			if (!hasmap)
-				readonly = !LuCI.prototype.hasViewPermission();
-
-			var saveApplyBtn = this.handleSaveApply ? new classes.ui.ComboButton('0', {
-				0: [ _('Save & Apply') ],
-				1: [ _('Apply unchecked') ]
-			}, {
-				classes: {
-					0: 'btn cbi-button cbi-button-apply important',
-					1: 'btn cbi-button cbi-button-negative important'
-				},
-				click: classes.ui.createHandlerFn(this, 'handleSaveApply'),
-				disabled: readonly || null
-			}).render() : E([]);
-
-			if (this.handleSaveApply || this.handleSave || this.handleReset) {
-				footer.appendChild(E('div', { 'class': 'cbi-page-actions control-group' }, [
-					saveApplyBtn, ' ',
-					this.handleSave ? E('button', {
-						'class': 'cbi-button cbi-button-save',
-						'click': classes.ui.createHandlerFn(this, 'handleSave'),
-						'disabled': readonly || null
-					}, [ _('Save') ]) : '', ' ',
-					this.handleReset ? E('button', {
-						'class': 'cbi-button cbi-button-reset',
-						'click': classes.ui.createHandlerFn(this, 'handleReset'),
-						'disabled': readonly || null
-					}, [ _('Reset') ]) : ''
-				]));
-			}
-
-			return footer;
-		}
-	});
-
-
-	var dummyElem = null,
-	    domParser = null,
-	    originalCBIInit = null,
-	    rpcBaseURL = null,
-	    sysFeatures = null,
-	    preloadClasses = null;
-
-	/* "preload" builtin classes to make the available via require */
-	var classes = {
-		baseclass: Class,
-		dom: DOM,
-		poll: Poll,
-		request: Request,
-		session: Session,
-		view: View
-	};
-
-	var LuCI = Class.extend(/** @lends LuCI.prototype */ {
-		__name__: 'LuCI',
-		__init__: function(setenv) {
-
-			document.querySelectorAll('script[src*="/luci.js"]').forEach(function(s) {
-				if (setenv.base_url == null || setenv.base_url == '') {
-					var m = (s.getAttribute('src') || '').match(/^(.*)\/luci\.js(?:\?v=([^?]+))?$/);
-					if (m) {
-						setenv.base_url = m[1];
-						setenv.resource_version = m[2];
-					}
-				}
-			});
-
-			if (setenv.base_url == null)
-				this.error('InternalError', 'Cannot find url of luci.js');
-
-			setenv.cgi_base = setenv.scriptname.replace(/\/[^\/]+$/, '');
-
-			Object.assign(env, setenv);
-
-			var domReady = new Promise(function(resolveFn, rejectFn) {
-				document.addEventListener('DOMContentLoaded', resolveFn);
-			});
-
-			Promise.all([
-				domReady,
-				this.require('ui'),
-				this.require('rpc'),
-				this.require('form'),
-				this.probeRPCBaseURL()
-			]).then(this.setupDOM.bind(this)).catch(this.error);
-
-			originalCBIInit = window.cbi_init;
-			window.cbi_init = function() {};
-		},
-
-		/**
-		 * Captures the current stack trace and throws an error of the
-		 * specified type as a new exception. Also logs the exception as
-		 * error to the debug console if it is available.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {Error|string} [type=Error]
-		 * Either a string specifying the type of the error to throw or an
-		 * existing `Error` instance to copy.
-		 *
-		 * @param {string} [fmt=Unspecified error]
-		 * A format string which is used to form the error message, together
-		 * with all subsequent optional arguments.
-		 *
-		 * @param {...*} [args]
-		 * Zero or more variable arguments to the supplied format string.
-		 *
-		 * @throws {Error}
-		 * Throws the created error object with the captured stack trace
-		 * appended to the message and the type set to the given type
-		 * argument or copied from the given error instance.
-		 */
-		raise: function(type, fmt /*, ...*/) {
-			var e = null,
-			    msg = fmt ? String.prototype.format.apply(fmt, this.varargs(arguments, 2)) : null,
-			    stack = null;
-
-			if (type instanceof Error) {
-				e = type;
-
-				if (msg)
-					e.message = msg + ': ' + e.message;
-			}
-			else {
-				try { throw new Error('stacktrace') }
-				catch (e2) { stack = (e2.stack || '').split(/\n/) }
-
-				e = new (window[type || 'Error'] || Error)(msg || 'Unspecified error');
-				e.name = type || 'Error';
-			}
-
-			stack = (stack || []).map(function(frame) {
-				frame = frame.replace(/(.*?)@(.+):(\d+):(\d+)/g, 'at $1 ($2:$3:$4)').trim();
-				return frame ? '  ' + frame : '';
-			});
-
-			if (!/^  at /.test(stack[0]))
-				stack.shift();
-
-			if (/\braise /.test(stack[0]))
-				stack.shift();
-
-			if (/\berror /.test(stack[0]))
-				stack.shift();
-
-			if (stack.length)
-				e.message += '\n' + stack.join('\n');
-
-			if (window.console && console.debug)
-				console.debug(e);
-
-			throw e;
-		},
-
-		/**
-		 * A wrapper around {@link LuCI#raise raise()} which also renders
-		 * the error either as modal overlay when `ui.js` is already loaed
-		 * or directly into the view body.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {Error|string} [type=Error]
-		 * Either a string specifying the type of the error to throw or an
-		 * existing `Error` instance to copy.
-		 *
-		 * @param {string} [fmt=Unspecified error]
-		 * A format string which is used to form the error message, together
-		 * with all subsequent optional arguments.
-		 *
-		 * @param {...*} [args]
-		 * Zero or more variable arguments to the supplied format string.
-		 *
-		 * @throws {Error}
-		 * Throws the created error object with the captured stack trace
-		 * appended to the message and the type set to the given type
-		 * argument or copied from the given error instance.
-		 */
-		error: function(type, fmt /*, ...*/) {
-			try {
-				LuCI.prototype.raise.apply(LuCI.prototype,
-					Array.prototype.slice.call(arguments));
-			}
-			catch (e) {
-				if (!e.reported) {
-					if (classes.ui)
-						classes.ui.addNotification(e.name || _('Runtime error'),
-							E('pre', {}, e.message), 'danger');
-					else
-						DOM.content(document.querySelector('#maincontent'),
-							E('pre', { 'class': 'alert-message error' }, e.message));
-
-					e.reported = true;
-				}
-
-				throw e;
-			}
-		},
-
-		/**
-		 * Return a bound function using the given `self` as `this` context
-		 * and any further arguments as parameters to the bound function.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {function} fn
-		 * The function to bind.
-		 *
-		 * @param {*} self
-		 * The value to bind as `this` context to the specified function.
-		 *
-		 * @param {...*} [args]
-		 * Zero or more variable arguments which are bound to the function
-		 * as parameters.
-		 *
-		 * @returns {function}
-		 * Returns the bound function.
-		 */
-		bind: function(fn, self /*, ... */) {
-			return Function.prototype.bind.apply(fn, this.varargs(arguments, 2, self));
-		},
-
-		/**
-		 * Load an additional LuCI JavaScript class and its dependencies,
-		 * instantiate it and return the resulting class instance. Each
-		 * class is only loaded once. Subsequent attempts to load the same
-		 * class will return the already instantiated class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string} name
-		 * The name of the class to load in dotted notation. Dots will
-		 * be replaced by spaces and joined with the runtime-determined
-		 * base URL of LuCI.js to form an absolute URL to load the class
-		 * file from.
-		 *
-		 * @throws {DependencyError}
-		 * Throws a `DependencyError` when the class to load includes
-		 * circular dependencies.
-		 *
-		 * @throws {NetworkError}
-		 * Throws `NetworkError` when the underlying {@link LuCI.request}
-		 * call failed.
-		 *
-		 * @throws {SyntaxError}
-		 * Throws `SyntaxError` when the loaded class file code cannot
-		 * be interpreted by `eval`.
-		 *
-		 * @throws {TypeError}
-		 * Throws `TypeError` when the class file could be loaded and
-		 * interpreted, but when invoking its code did not yield a valid
-		 * class instance.
-		 *
-		 * @returns {Promise<LuCI.baseclass>}
-		 * Returns the instantiated class.
-		 */
-		require: function(name, from) {
-			var L = this, url = null, from = from || [];
-
-			/* Class already loaded */
-			if (classes[name] != null) {
-				/* Circular dependency */
-				if (from.indexOf(name) != -1)
-					LuCI.prototype.raise('DependencyError',
-						'Circular dependency: class "%s" depends on "%s"',
-						name, from.join('" which depends on "'));
-
-				return Promise.resolve(classes[name]);
-			}
-
-			url = '%s/%s.js%s'.format(env.base_url, name.replace(/\./g, '/'), (env.resource_version ? '?v=' + env.resource_version : ''));
-			from = [ name ].concat(from);
-
-			var compileClass = function(res) {
-				if (!res.ok)
-					LuCI.prototype.raise('NetworkError',
-						'HTTP error %d while loading class file "%s"', res.status, url);
-
-				var source = res.text(),
-				    requirematch = /^require[ \t]+(\S+)(?:[ \t]+as[ \t]+([a-zA-Z_]\S*))?$/,
-				    strictmatch = /^use[ \t]+strict$/,
-				    depends = [],
-				    args = '';
-
-				/* find require statements in source */
-				for (var i = 0, off = -1, prev = -1, quote = -1, comment = -1, esc = false; i < source.length; i++) {
-					var chr = source.charCodeAt(i);
-
-					if (esc) {
-						esc = false;
-					}
-					else if (comment != -1) {
-						if ((comment == 47 && chr == 10) || (comment == 42 && prev == 42 && chr == 47))
-							comment = -1;
-					}
-					else if ((chr == 42 || chr == 47) && prev == 47) {
-						comment = chr;
-					}
-					else if (chr == 92) {
-						esc = true;
-					}
-					else if (chr == quote) {
-						var s = source.substring(off, i),
-						    m = requirematch.exec(s);
-
-						if (m) {
-							var dep = m[1], as = m[2] || dep.replace(/[^a-zA-Z0-9_]/g, '_');
-							depends.push(LuCI.prototype.require(dep, from));
-							args += ', ' + as;
-						}
-						else if (!strictmatch.exec(s)) {
-							break;
-						}
-
-						off = -1;
-						quote = -1;
-					}
-					else if (quote == -1 && (chr == 34 || chr == 39)) {
-						off = i + 1;
-						quote = chr;
-					}
-
-					prev = chr;
-				}
-
-				/* load dependencies and instantiate class */
-				return Promise.all(depends).then(function(instances) {
-					var _factory, _class;
-
-					try {
-						_factory = eval(
-							'(function(window, document, L%s) { %s })\n\n//# sourceURL=%s\n'
-								.format(args, source, res.url));
-					}
-					catch (error) {
-						LuCI.prototype.raise('SyntaxError', '%s\n  in %s:%s',
-							error.message, res.url, error.lineNumber || '?');
-					}
-
-					_factory.displayName = toCamelCase(name + 'ClassFactory');
-					_class = _factory.apply(_factory, [window, document, L].concat(instances));
-
-					if (!Class.isSubclass(_class))
-					    LuCI.prototype.error('TypeError', '"%s" factory yields invalid constructor', name);
-
-					if (_class.displayName == 'AnonymousClass')
-						_class.displayName = toCamelCase(name + 'Class');
-
-					var ptr = Object.getPrototypeOf(L),
-					    parts = name.split(/\./),
-					    instance = new _class();
-
-					for (var i = 0; ptr && i < parts.length - 1; i++)
-						ptr = ptr[parts[i]];
-
-					if (ptr)
-						ptr[parts[i]] = instance;
-
-					classes[name] = instance;
-
-					return instance;
-				});
-			};
-
-			/* Request class file */
-			classes[name] = Request.get(url, { cache: true }).then(compileClass);
-
-			return classes[name];
-		},
-
-		/* DOM setup */
-		probeRPCBaseURL: function() {
-			if (rpcBaseURL == null)
-				rpcBaseURL = Session.getLocalData('rpcBaseURL');
-
-			if (rpcBaseURL == null) {
-				var rpcFallbackURL = this.url('admin/ubus');
-
-				rpcBaseURL = Request.get(env.ubuspath).then(function(res) {
-					return (rpcBaseURL = (res.status == 400) ? env.ubuspath : rpcFallbackURL);
-				}, function() {
-					return (rpcBaseURL = rpcFallbackURL);
-				}).then(function(url) {
-					Session.setLocalData('rpcBaseURL', url);
-					return url;
-				});
-			}
-
-			return Promise.resolve(rpcBaseURL);
-		},
-
-		probeSystemFeatures: function() {
-			if (sysFeatures == null)
-				sysFeatures = Session.getLocalData('features');
-
-			if (!this.isObject(sysFeatures)) {
-				sysFeatures = classes.rpc.declare({
-					object: 'luci',
-					method: 'getFeatures',
-					expect: { '': {} }
-				})().then(function(features) {
-					Session.setLocalData('features', features);
-					sysFeatures = features;
-
-					return features;
-				});
-			}
-
-			return Promise.resolve(sysFeatures);
-		},
-
-		probePreloadClasses: function() {
-			if (preloadClasses == null)
-				preloadClasses = Session.getLocalData('preload');
-
-			if (!Array.isArray(preloadClasses)) {
-				preloadClasses = this.resolveDefault(classes.rpc.declare({
-					object: 'file',
-					method: 'list',
-					params: [ 'path' ],
-					expect: { 'entries': [] }
-				})(this.fspath(this.resource('preload'))), []).then(function(entries) {
-					var classes = [];
-
-					for (var i = 0; i < entries.length; i++) {
-						if (entries[i].type != 'file')
-							continue;
-
-						var m = entries[i].name.match(/(.+)\.js$/);
-
-						if (m)
-							classes.push('preload.%s'.format(m[1]));
-					}
-
-					Session.setLocalData('preload', classes);
-					preloadClasses = classes;
-
-					return classes;
-				});
-			}
-
-			return Promise.resolve(preloadClasses);
-		},
-
-		/**
-		 * Test whether a particular system feature is available, such as
-		 * hostapd SAE support or an installed firewall. The features are
-		 * queried once at the beginning of the LuCI session and cached in
-		 * `SessionStorage` throughout the lifetime of the associated tab or
-		 * browser window.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string} feature
-		 * The feature to test. For detailed list of known feature flags,
-		 * see `/modules/luci-base/root/usr/libexec/rpcd/luci`.
-		 *
-		 * @param {string} [subfeature]
-		 * Some feature classes like `hostapd` provide sub-feature flags,
-		 * such as `sae` or `11w` support. The `subfeature` argument can
-		 * be used to query these.
-		 *
-		 * @return {boolean|null}
-		 * Return `true` if the queried feature (and sub-feature) is available
-		 * or `false` if the requested feature isn't present or known.
-		 * Return `null` when a sub-feature was queried for a feature which
-		 * has no sub-features.
-		 */
-		hasSystemFeature: function() {
-			var ft = sysFeatures[arguments[0]];
-
-			if (arguments.length == 2)
-				return this.isObject(ft) ? ft[arguments[1]] : null;
-
-			return (ft != null && ft != false);
-		},
-
-		/* private */
-		notifySessionExpiry: function() {
-			Poll.stop();
-
-			classes.ui.showModal(_('Session expired'), [
-				E('div', { class: 'alert-message warning' },
-					_('A new login is required since the authentication session expired.')),
-				E('div', { class: 'right' },
-					E('div', {
-						class: 'btn primary',
-						click: function() {
-							var loc = window.location;
-							window.location = loc.protocol + '//' + loc.host + loc.pathname + loc.search;
-						}
-					}, _('To login…')))
-			]);
-
-			LuCI.prototype.raise('SessionError', 'Login session is expired');
-		},
-
-		/* private */
-		setupDOM: function(res) {
-			var domEv = res[0],
-			    uiClass = res[1],
-			    rpcClass = res[2],
-			    formClass = res[3],
-			    rpcBaseURL = res[4];
-
-			rpcClass.setBaseURL(rpcBaseURL);
-
-			rpcClass.addInterceptor(function(msg, req) {
-				if (!LuCI.prototype.isObject(msg) ||
-				    !LuCI.prototype.isObject(msg.error) ||
-				    msg.error.code != -32002)
-					return;
-
-				if (!LuCI.prototype.isObject(req) ||
-				    (req.object == 'session' && req.method == 'access'))
-					return;
-
-				return rpcClass.declare({
-					'object': 'session',
-					'method': 'access',
-					'params': [ 'scope', 'object', 'function' ],
-					'expect': { access: true }
-				})('uci', 'luci', 'read').catch(LuCI.prototype.notifySessionExpiry);
-			});
-
-			Request.addInterceptor(function(res) {
-				var isDenied = false;
-
-				if (res.status == 403 && res.headers.get('X-LuCI-Login-Required') == 'yes')
-					isDenied = true;
-
-				if (!isDenied)
-					return;
-
-				LuCI.prototype.notifySessionExpiry();
-			});
-
-			document.addEventListener('poll-start', function(ev) {
-				uiClass.showIndicator('poll-status', _('Refreshing'), function(ev) {
-					Request.poll.active() ? Request.poll.stop() : Request.poll.start();
-				});
-			});
-
-			document.addEventListener('poll-stop', function(ev) {
-				uiClass.showIndicator('poll-status', _('Paused'), null, 'inactive');
-			});
-
-			return Promise.all([
-				this.probeSystemFeatures(),
-				this.probePreloadClasses()
-			]).finally(LuCI.prototype.bind(function() {
-				var tasks = [];
-
-				if (Array.isArray(preloadClasses))
-					for (var i = 0; i < preloadClasses.length; i++)
-						tasks.push(this.require(preloadClasses[i]));
-
-				return Promise.all(tasks);
-			}, this)).finally(this.initDOM);
-		},
-
-		/* private */
-		initDOM: function() {
-			originalCBIInit();
-			Poll.start();
-			document.dispatchEvent(new CustomEvent('luci-loaded'));
-		},
-
-		/**
-		 * The `env` object holds environment settings used by LuCI, such
-		 * as request timeouts, base URLs etc.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 */
-		env: env,
-
-		/**
-		 * Construct an absolute filesystem path relative to the server
-		 * document root.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {...string} [parts]
-		 * An array of parts to join into a path.
-		 *
-		 * @return {string}
-		 * Return the joined path.
-		 */
-		fspath: function(/* ... */) {
-			var path = env.documentroot;
-
-			for (var i = 0; i < arguments.length; i++)
-				path += '/' + arguments[i];
-
-			var p = path.replace(/\/+$/, '').replace(/\/+/g, '/').split(/\//),
-			    res = [];
-
-			for (var i = 0; i < p.length; i++)
-				if (p[i] == '..')
-					res.pop();
-				else if (p[i] != '.')
-					res.push(p[i]);
-
-			return res.join('/');
-		},
-
-		/**
-		 * Construct a relative URL path from the given prefix and parts.
-		 * The resulting URL is guaranteed to only contain the characters
-		 * `a-z`, `A-Z`, `0-9`, `_`, `.`, `%`, `,`, `;`, and `-` as well
-		 * as `/` for the path separator.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string} [prefix]
-		 * The prefix to join the given parts with. If the `prefix` is
-		 * omitted, it defaults to an empty string.
-		 *
-		 * @param {string[]} [parts]
-		 * An array of parts to join into an URL path. Parts may contain
-		 * slashes and any of the other characters mentioned above.
-		 *
-		 * @return {string}
-		 * Return the joined URL path.
-		 */
-		path: function(prefix, parts) {
-			var url = [ prefix || '' ];
-
-			for (var i = 0; i < parts.length; i++)
-				if (/^(?:[a-zA-Z0-9_.%,;-]+\/)*[a-zA-Z0-9_.%,;-]+$/.test(parts[i]))
-					url.push('/', parts[i]);
-
-			if (url.length === 1)
-				url.push('/');
-
-			return url.join('');
-		},
-
-		/**
-		 * Construct an URL  pathrelative to the script path of the server
-		 * side LuCI application (usually `/cgi-bin/luci`).
-		 *
-		 * The resulting URL is guaranteed to only contain the characters
-		 * `a-z`, `A-Z`, `0-9`, `_`, `.`, `%`, `,`, `;`, and `-` as well
-		 * as `/` for the path separator.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string[]} [parts]
-		 * An array of parts to join into an URL path. Parts may contain
-		 * slashes and any of the other characters mentioned above.
-		 *
-		 * @return {string}
-		 * Returns the resulting URL path.
-		 */
-		url: function() {
-			return this.path(env.scriptname, arguments);
-		},
-
-		/**
-		 * Construct an URL path relative to the global static resource path
-		 * of the LuCI ui (usually `/luci-static/resources`).
-		 *
-		 * The resulting URL is guaranteed to only contain the characters
-		 * `a-z`, `A-Z`, `0-9`, `_`, `.`, `%`, `,`, `;`, and `-` as well
-		 * as `/` for the path separator.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string[]} [parts]
-		 * An array of parts to join into an URL path. Parts may contain
-		 * slashes and any of the other characters mentioned above.
-		 *
-		 * @return {string}
-		 * Returns the resulting URL path.
-		 */
-		resource: function() {
-			return this.path(env.resource, arguments);
-		},
-
-		/**
-		 * Construct an URL path relative to the media resource path of the
-		 * LuCI ui (usually `/luci-static/$theme_name`).
-		 *
-		 * The resulting URL is guaranteed to only contain the characters
-		 * `a-z`, `A-Z`, `0-9`, `_`, `.`, `%`, `,`, `;`, and `-` as well
-		 * as `/` for the path separator.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string[]} [parts]
-		 * An array of parts to join into an URL path. Parts may contain
-		 * slashes and any of the other characters mentioned above.
-		 *
-		 * @return {string}
-		 * Returns the resulting URL path.
-		 */
-		media: function() {
-			return this.path(env.media, arguments);
-		},
-
-		/**
-		 * Return the complete URL path to the current view.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @return {string}
-		 * Returns the URL path to the current view.
-		 */
-		location: function() {
-			return this.path(env.scriptname, env.requestpath);
-		},
-
-
-		/**
-		 * Tests whether the passed argument is a JavaScript object.
-		 * This function is meant to be an object counterpart to the
-		 * standard `Array.isArray()` function.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {*} [val]
-		 * The value to test
-		 *
-		 * @return {boolean}
-		 * Returns `true` if the given value is of type object and
-		 * not `null`, else returns `false`.
-		 */
-		isObject: function(val) {
-			return (val != null && typeof(val) == 'object');
-		},
-
-		/**
-		 * Return an array of sorted object keys, optionally sorted by
-		 * a different key or a different sorting mode.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {object} obj
-		 * The object to extract the keys from. If the given value is
-		 * not an object, the function will return an empty array.
-		 *
-		 * @param {string} [key]
-		 * Specifies the key to order by. This is mainly useful for
-		 * nested objects of objects or objects of arrays when sorting
-		 * shall not be performed by the primary object keys but by
-		 * some other key pointing to a value within the nested values.
-		 *
-		 * @param {string} [sortmode]
-		 * May be either `addr` or `num` to override the natural
-		 * lexicographic sorting with a sorting suitable for IP/MAC style
-		 * addresses or numeric values respectively.
-		 *
-		 * @return {string[]}
-		 * Returns an array containing the sorted keys of the given object.
-		 */
-		sortedKeys: function(obj, key, sortmode) {
-			if (obj == null || typeof(obj) != 'object')
-				return [];
-
-			return Object.keys(obj).map(function(e) {
-				var v = (key != null) ? obj[e][key] : e;
-
-				switch (sortmode) {
-				case 'addr':
-					v = (v != null) ? v.replace(/(?:^|[.:])([0-9a-fA-F]{1,4})/g,
-						function(m0, m1) { return ('000' + m1.toLowerCase()).substr(-4) }) : null;
-					break;
-
-				case 'num':
-					v = (v != null) ? +v : null;
-					break;
-				}
-
-				return [ e, v ];
-			}).filter(function(e) {
-				return (e[1] != null);
-			}).sort(function(a, b) {
-				return (a[1] > b[1]);
-			}).map(function(e) {
-				return e[0];
-			});
-		},
-
-		/**
-		 * Converts the given value to an array. If the given value is of
-		 * type array, it is returned as-is, values of type object are
-		 * returned as one-element array containing the object, empty
-		 * strings and `null` values are returned as empty array, all other
-		 * values are converted using `String()`, trimmed, split on white
-		 * space and returned as array.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {*} val
-		 * The value to convert into an array.
-		 *
-		 * @return {Array<*>}
-		 * Returns the resulting array.
-		 */
-		toArray: function(val) {
-			if (val == null)
-				return [];
-			else if (Array.isArray(val))
-				return val;
-			else if (typeof(val) == 'object')
-				return [ val ];
-
-			var s = String(val).trim();
-
-			if (s == '')
-				return [];
-
-			return s.split(/\s+/);
-		},
-
-		/**
-		 * Returns a promise resolving with either the given value or or with
-		 * the given default in case the input value is a rejecting promise.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {*} value
-		 * The value to resolve the promise with.
-		 *
-		 * @param {*} defvalue
-		 * The default value to resolve the promise with in case the given
-		 * input value is a rejecting promise.
-		 *
-		 * @returns {Promise<*>}
-		 * Returns a new promise resolving either to the given input value or
-		 * to the given default value on error.
-		 */
-		resolveDefault: function(value, defvalue) {
-			return Promise.resolve(value).catch(function() { return defvalue });
-		},
-
-		/**
-		 * The request callback function is invoked whenever an HTTP
-		 * reply to a request made using the `L.get()`, `L.post()` or
-		 * `L.poll()` function is timed out or received successfully.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @callback LuCI.requestCallbackFn
-		 * @param {XMLHTTPRequest} xhr
-		 * The XMLHTTPRequest instance used to make the request.
-		 *
-		 * @param {*} data
-		 * The response JSON if the response could be parsed as such,
-		 * else `null`.
-		 *
-		 * @param {number} duration
-		 * The total duration of the request in milliseconds.
-		 */
-
-		/**
-		 * Issues a GET request to the given url and invokes the specified
-		 * callback function. The function is a wrapper around
-		 * {@link LuCI.request#request Request.request()}.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string} url
-		 * The URL to request.
-		 *
-		 * @param {Object<string, string>} [args]
-		 * Additional query string arguments to append to the URL.
-		 *
-		 * @param {LuCI.requestCallbackFn} cb
-		 * The callback function to invoke when the request finishes.
-		 *
-		 * @return {Promise<null>}
-		 * Returns a promise resolving to `null` when concluded.
-		 */
-		get: function(url, args, cb) {
-			return this.poll(null, url, args, cb, false);
-		},
-
-		/**
-		 * Issues a POST request to the given url and invokes the specified
-		 * callback function. The function is a wrapper around
-		 * {@link LuCI.request#request Request.request()}. The request is
-		 * sent using `application/x-www-form-urlencoded` encoding and will
-		 * contain a field `token` with the current value of `LuCI.env.token`
-		 * by default.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {string} url
-		 * The URL to request.
-		 *
-		 * @param {Object<string, string>} [args]
-		 * Additional post arguments to append to the request body.
-		 *
-		 * @param {LuCI.requestCallbackFn} cb
-		 * The callback function to invoke when the request finishes.
-		 *
-		 * @return {Promise<null>}
-		 * Returns a promise resolving to `null` when concluded.
-		 */
-		post: function(url, args, cb) {
-			return this.poll(null, url, args, cb, true);
-		},
-
-		/**
-		 * Register a polling HTTP request that invokes the specified
-		 * callback function. The function is a wrapper around
-		 * {@link LuCI.request.poll#add Request.poll.add()}.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {number} interval
-		 * The poll interval to use. If set to a value less than or equal
-		 * to `0`, it will default to the global poll interval configured
-		 * in `LuCI.env.pollinterval`.
-		 *
-		 * @param {string} url
-		 * The URL to request.
-		 *
-		 * @param {Object<string, string>} [args]
-		 * Specifies additional arguments for the request. For GET requests,
-		 * the arguments are appended to the URL as query string, for POST
-		 * requests, they'll be added to the request body.
-		 *
-		 * @param {LuCI.requestCallbackFn} cb
-		 * The callback function to invoke whenever a request finishes.
-		 *
-		 * @param {boolean} [post=false]
-		 * When set to `false` or not specified, poll requests will be made
-		 * using the GET method. When set to `true`, POST requests will be
-		 * issued. In case of POST requests, the request body will contain
-		 * an argument `token` with the current value of `LuCI.env.token` by
-		 * default, regardless of the parameters specified with `args`.
-		 *
-		 * @return {function}
-		 * Returns the internally created function that has been passed to
-		 * {@link LuCI.request.poll#add Request.poll.add()}. This value can
-		 * be passed to {@link LuCI.poll.remove Poll.remove()} to remove the
-		 * polling request.
-		 */
-		poll: function(interval, url, args, cb, post) {
-			if (interval !== null && interval <= 0)
-				interval = env.pollinterval;
-
-			var data = post ? { token: env.token } : null,
-			    method = post ? 'POST' : 'GET';
-
-			if (!/^(?:\/|\S+:\/\/)/.test(url))
-				url = this.url(url);
-
-			if (args != null)
-				data = Object.assign(data || {}, args);
-
-			if (interval !== null)
-				return Request.poll.add(interval, url, { method: method, query: data }, cb);
-			else
-				return Request.request(url, { method: method, query: data })
-					.then(function(res) {
-						var json = null;
-						if (/^application\/json\b/.test(res.headers.get('Content-Type')))
-							try { json = res.json() } catch(e) {}
-						cb(res.xhr, json, res.duration);
-					});
-		},
-
-		/**
-		 * Check whether a view has sufficient permissions.
-		 *
-		 * @return {boolean|null}
-		 * Returns `null` if the current session has no permission at all to
-		 * load resources required by the view. Returns `false` if readonly
-		 * permissions are granted or `true` if at least one required ACL
-		 * group is granted with write permissions.
-		 */
-		hasViewPermission: function() {
-			if (!this.isObject(env.nodespec) || !env.nodespec.satisfied)
-			    return null;
-
-			return !env.nodespec.readonly;
-		},
-
-		/**
-		 * Deprecated wrapper around {@link LuCI.poll.remove Poll.remove()}.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @param {function} entry
-		 * The polling function to remove.
-		 *
-		 * @return {boolean}
-		 * Returns `true` when the function has been removed or `false` if
-		 * it could not be found.
-		 */
-		stop: function(entry) { return Poll.remove(entry) },
-
-		/**
-		 * Deprecated wrapper around {@link LuCI.poll.stop Poll.stop()}.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @return {boolean}
-		 * Returns `true` when the polling loop has been stopped or `false`
-		 * when it didn't run to begin with.
-		 */
-		halt: function() { return Poll.stop() },
-
-		/**
-		 * Deprecated wrapper around {@link LuCI.poll.start Poll.start()}.
-		 *
-		 * @deprecated
-		 * @instance
-		 * @memberof LuCI
-		 *
-		 * @return {boolean}
-		 * Returns `true` when the polling loop has been started or `false`
-		 * when it was already running.
-		 */
-		run: function() { return Poll.start() },
-
-		/**
-		 * Legacy `L.dom` class alias. New view code should use `'require dom';`
-		 * to request the `LuCI.dom` class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 * @deprecated
-		 */
-		dom: DOM,
-
-		/**
-		 * Legacy `L.view` class alias. New view code should use `'require view';`
-		 * to request the `LuCI.view` class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 * @deprecated
-		 */
-		view: View,
-
-		/**
-		 * Legacy `L.Poll` class alias. New view code should use `'require poll';`
-		 * to request the `LuCI.poll` class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 * @deprecated
-		 */
-		Poll: Poll,
-
-		/**
-		 * Legacy `L.Request` class alias. New view code should use `'require request';`
-		 * to request the `LuCI.request` class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 * @deprecated
-		 */
-		Request: Request,
-
-		/**
-		 * Legacy `L.Class` class alias. New view code should use `'require baseclass';`
-		 * to request the `LuCI.baseclass` class.
-		 *
-		 * @instance
-		 * @memberof LuCI
-		 * @deprecated
-		 */
-		Class: Class
-	});
-
-	/**
-	 * @class xhr
-	 * @memberof LuCI
-	 * @deprecated
-	 * @classdesc
-	 *
-	 * The `LuCI.xhr` class is a legacy compatibility shim for the
-	 * functionality formerly provided by `xhr.js`. It is registered as global
-	 * `window.XHR` symbol for compatibility with legacy code.
-	 *
-	 * New code should use {@link LuCI.request} instead to implement HTTP
-	 * request handling.
-	 */
-	var XHR = Class.extend(/** @lends LuCI.xhr.prototype */ {
-		__name__: 'LuCI.xhr',
-		__init__: function() {
-			if (window.console && console.debug)
-				console.debug('Direct use XHR() is deprecated, please use L.Request instead');
-		},
-
-		_response: function(cb, res, json, duration) {
-			if (this.active)
-				cb(res, json, duration);
-			delete this.active;
-		},
-
-		/**
-		 * This function is a legacy wrapper around
-		 * {@link LuCI#get LuCI.get()}.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 *
-		 * @param {string} url
-		 * The URL to request
-		 *
-		 * @param {Object} [data]
-		 * Additional query string data
-		 *
-		 * @param {LuCI.requestCallbackFn} [callback]
-		 * Callback function to invoke on completion
-		 *
-		 * @param {number} [timeout]
-		 * Request timeout to use
-		 *
-		 * @return {Promise<null>}
-		 */
-		get: function(url, data, callback, timeout) {
-			this.active = true;
-			LuCI.prototype.get(url, data, this._response.bind(this, callback), timeout);
-		},
-
-		/**
-		 * This function is a legacy wrapper around
-		 * {@link LuCI#post LuCI.post()}.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 *
-		 * @param {string} url
-		 * The URL to request
-		 *
-		 * @param {Object} [data]
-		 * Additional data to append to the request body.
-		 *
-		 * @param {LuCI.requestCallbackFn} [callback]
-		 * Callback function to invoke on completion
-		 *
-		 * @param {number} [timeout]
-		 * Request timeout to use
-		 *
-		 * @return {Promise<null>}
-		 */
-		post: function(url, data, callback, timeout) {
-			this.active = true;
-			LuCI.prototype.post(url, data, this._response.bind(this, callback), timeout);
-		},
-
-		/**
-		 * Cancels a running request.
-		 *
-		 * This function does not actually cancel the underlying
-		 * `XMLHTTPRequest` request but it sets a flag which prevents the
-		 * invocation of the callback function when the request eventually
-		 * finishes or timed out.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 */
-		cancel: function() { delete this.active },
-
-		/**
-		 * Checks the running state of the request.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 *
-		 * @returns {boolean}
-		 * Returns `true` if the request is still running or `false` if it
-		 * already completed.
-		 */
-		busy: function() { return (this.active === true) },
-
-		/**
-		 * Ignored for backwards compatibility.
-		 *
-		 * This function does nothing.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 */
-		abort: function() {},
-
-		/**
-		 * Existing for backwards compatibility.
-		 *
-		 * This function simply throws an `InternalError` when invoked.
-		 *
-		 * @instance
-		 * @deprecated
-		 * @memberof LuCI.xhr
-		 *
-		 * @throws {InternalError}
-		 * Throws an `InternalError` with the message `Not implemented`
-		 * when invoked.
-		 */
-		send_form: function() { LuCI.prototype.error('InternalError', 'Not implemented') },
-	});
-
-	XHR.get = function() { return LuCI.prototype.get.apply(LuCI.prototype, arguments) };
-	XHR.post = function() { return LuCI.prototype.post.apply(LuCI.prototype, arguments) };
-	XHR.poll = function() { return LuCI.prototype.poll.apply(LuCI.prototype, arguments) };
-	XHR.stop = Request.poll.remove.bind(Request.poll);
-	XHR.halt = Request.poll.stop.bind(Request.poll);
-	XHR.run = Request.poll.start.bind(Request.poll);
-	XHR.running = Request.poll.active.bind(Request.poll);
-
-	window.XHR = XHR;
-	window.LuCI = LuCI;
-})(window, document);
-
-
-
- - - - - - - - - -
-
- - - - diff --git a/docs/jsapi/network.js.html b/docs/jsapi/network.js.html deleted file mode 100644 index 19b6166bc8a46ad54c6dfd6e5336591f9c230f89..0000000000000000000000000000000000000000 --- a/docs/jsapi/network.js.html +++ /dev/null @@ -1,7618 +0,0 @@ - - - - - Source: network.js - - - - - - - - - - - - - - - - - -
- - -
-

Source: network.js

- - - - -
-
-
'use strict';
-'require uci';
-'require rpc';
-'require validation';
-'require baseclass';
-'require firewall';
-
-var proto_errors = {
-	CONNECT_FAILED:			_('Connection attempt failed'),
-	INVALID_ADDRESS:		_('IP address is invalid'),
-	INVALID_GATEWAY:		_('Gateway address is invalid'),
-	INVALID_LOCAL_ADDRESS:	_('Local IP address is invalid'),
-	MISSING_ADDRESS:		_('IP address is missing'),
-	MISSING_PEER_ADDRESS:	_('Peer address is missing'),
-	NO_DEVICE:				_('Network device is not present'),
-	NO_IFACE:				_('Unable to determine device name'),
-	NO_IFNAME:				_('Unable to determine device name'),
-	NO_WAN_ADDRESS:			_('Unable to determine external IP address'),
-	NO_WAN_LINK:			_('Unable to determine upstream interface'),
-	PEER_RESOLVE_FAIL:		_('Unable to resolve peer host name'),
-	PIN_FAILED:				_('PIN code rejected')
-};
-
-var iface_patterns_ignore = [
-	/^wmaster\d+/,
-	/^wifi\d+/,
-	/^hwsim\d+/,
-	/^imq\d+/,
-	/^ifb\d+/,
-	/^mon\.wlan\d+/,
-	/^sit\d+/,
-	/^gre\d+/,
-	/^gretap\d+/,
-	/^ip6gre\d+/,
-	/^ip6tnl\d+/,
-	/^tunl\d+/,
-	/^lo$/
-];
-
-var iface_patterns_wireless = [
-	/^wlan\d+/,
-	/^wl\d+/,
-	/^ath\d+/,
-	/^\w+\.network\d+/
-];
-
-var iface_patterns_virtual = [ ];
-
-var callLuciNetworkDevices = rpc.declare({
-	object: 'luci-rpc',
-	method: 'getNetworkDevices',
-	expect: { '': {} }
-});
-
-var callLuciWirelessDevices = rpc.declare({
-	object: 'luci-rpc',
-	method: 'getWirelessDevices',
-	expect: { '': {} }
-});
-
-var callLuciBoardJSON = rpc.declare({
-	object: 'luci-rpc',
-	method: 'getBoardJSON'
-});
-
-var callLuciHostHints = rpc.declare({
-	object: 'luci-rpc',
-	method: 'getHostHints',
-	expect: { '': {} }
-});
-
-var callIwinfoAssoclist = rpc.declare({
-	object: 'iwinfo',
-	method: 'assoclist',
-	params: [ 'device', 'mac' ],
-	expect: { results: [] }
-});
-
-var callIwinfoScan = rpc.declare({
-	object: 'iwinfo',
-	method: 'scan',
-	params: [ 'device' ],
-	nobatch: true,
-	expect: { results: [] }
-});
-
-var callNetworkInterfaceDump = rpc.declare({
-	object: 'network.interface',
-	method: 'dump',
-	expect: { 'interface': [] }
-});
-
-var callNetworkProtoHandlers = rpc.declare({
-	object: 'network',
-	method: 'get_proto_handlers',
-	expect: { '': {} }
-});
-
-var _init = null,
-    _state = null,
-    _protocols = {},
-    _protospecs = {};
-
-function getProtocolHandlers(cache) {
-	return callNetworkProtoHandlers().then(function(protos) {
-		/* Register "none" protocol */
-		if (!protos.hasOwnProperty('none'))
-			Object.assign(protos, { none: { no_device: false } });
-
-		/* Hack: emulate relayd protocol */
-		if (!protos.hasOwnProperty('relay') && L.hasSystemFeature('relayd'))
-			Object.assign(protos, { relay: { no_device: true } });
-
-		Object.assign(_protospecs, protos);
-
-		return Promise.all(Object.keys(protos).map(function(p) {
-			return Promise.resolve(L.require('protocol.%s'.format(p))).catch(function(err) {
-				if (L.isObject(err) && err.name != 'NetworkError')
-					L.error(err);
-			});
-		})).then(function() {
-			return protos;
-		});
-	}).catch(function() {
-		return {};
-	});
-}
-
-function getWifiStateBySid(sid) {
-	var s = uci.get('wireless', sid);
-
-	if (s != null && s['.type'] == 'wifi-iface') {
-		for (var radioname in _state.radios) {
-			for (var i = 0; i < _state.radios[radioname].interfaces.length; i++) {
-				var netstate = _state.radios[radioname].interfaces[i];
-
-				if (typeof(netstate.section) != 'string')
-					continue;
-
-				var s2 = uci.get('wireless', netstate.section);
-
-				if (s2 != null && s['.type'] == s2['.type'] && s['.name'] == s2['.name']) {
-					if (s2['.anonymous'] == false && netstate.section.charAt(0) == '@')
-						return null;
-
-					return [ radioname, _state.radios[radioname], netstate ];
-				}
-			}
-		}
-	}
-
-	return null;
-}
-
-function getWifiStateByIfname(ifname) {
-	for (var radioname in _state.radios) {
-		for (var i = 0; i < _state.radios[radioname].interfaces.length; i++) {
-			var netstate = _state.radios[radioname].interfaces[i];
-
-			if (typeof(netstate.ifname) != 'string')
-				continue;
-
-			if (netstate.ifname == ifname)
-				return [ radioname, _state.radios[radioname], netstate ];
-		}
-	}
-
-	return null;
-}
-
-function isWifiIfname(ifname) {
-	for (var i = 0; i < iface_patterns_wireless.length; i++)
-		if (iface_patterns_wireless[i].test(ifname))
-			return true;
-
-	return false;
-}
-
-function getWifiSidByNetid(netid) {
-	var m = /^(\w+)\.network(\d+)$/.exec(netid);
-	if (m) {
-		var sections = uci.sections('wireless', 'wifi-iface');
-		for (var i = 0, n = 0; i < sections.length; i++) {
-			if (sections[i].device != m[1])
-				continue;
-
-			if (++n == +m[2])
-				return sections[i]['.name'];
-		}
-	}
-
-	return null;
-}
-
-function getWifiSidByIfname(ifname) {
-	var sid = getWifiSidByNetid(ifname);
-
-	if (sid != null)
-		return sid;
-
-	var res = getWifiStateByIfname(ifname);
-
-	if (res != null && L.isObject(res[2]) && typeof(res[2].section) == 'string')
-		return res[2].section;
-
-	return null;
-}
-
-function getWifiNetidBySid(sid) {
-	var s = uci.get('wireless', sid);
-	if (s != null && s['.type'] == 'wifi-iface') {
-		var radioname = s.device;
-		if (typeof(s.device) == 'string') {
-			var i = 0, netid = null, sections = uci.sections('wireless', 'wifi-iface');
-			for (var i = 0, n = 0; i < sections.length; i++) {
-				if (sections[i].device != s.device)
-					continue;
-
-				n++;
-
-				if (sections[i]['.name'] != s['.name'])
-					continue;
-
-				return [ '%s.network%d'.format(s.device, n), s.device ];
-			}
-
-		}
-	}
-
-	return null;
-}
-
-function getWifiNetidByNetname(name) {
-	var sections = uci.sections('wireless', 'wifi-iface');
-	for (var i = 0; i < sections.length; i++) {
-		if (typeof(sections[i].network) != 'string')
-			continue;
-
-		var nets = sections[i].network.split(/\s+/);
-		for (var j = 0; j < nets.length; j++) {
-			if (nets[j] != name)
-				continue;
-
-			return getWifiNetidBySid(sections[i]['.name']);
-		}
-	}
-
-	return null;
-}
-
-function isVirtualIfname(ifname) {
-	for (var i = 0; i < iface_patterns_virtual.length; i++)
-		if (iface_patterns_virtual[i].test(ifname))
-			return true;
-
-	return false;
-}
-
-function isIgnoredIfname(ifname) {
-	for (var i = 0; i < iface_patterns_ignore.length; i++)
-		if (iface_patterns_ignore[i].test(ifname))
-			return true;
-
-	return false;
-}
-
-function appendValue(config, section, option, value) {
-	var values = uci.get(config, section, option),
-	    isArray = Array.isArray(values),
-	    rv = false;
-
-	if (isArray == false)
-		values = L.toArray(values);
-
-	if (values.indexOf(value) == -1) {
-		values.push(value);
-		rv = true;
-	}
-
-	uci.set(config, section, option, isArray ? values : values.join(' '));
-
-	return rv;
-}
-
-function removeValue(config, section, option, value) {
-	var values = uci.get(config, section, option),
-	    isArray = Array.isArray(values),
-	    rv = false;
-
-	if (isArray == false)
-		values = L.toArray(values);
-
-	for (var i = values.length - 1; i >= 0; i--) {
-		if (values[i] == value) {
-			values.splice(i, 1);
-			rv = true;
-		}
-	}
-
-	if (values.length > 0)
-		uci.set(config, section, option, isArray ? values : values.join(' '));
-	else
-		uci.unset(config, section, option);
-
-	return rv;
-}
-
-function prefixToMask(bits, v6) {
-	var w = v6 ? 128 : 32,
-	    m = [];
-
-	if (bits > w)
-		return null;
-
-	for (var i = 0; i < w / 16; i++) {
-		var b = Math.min(16, bits);
-		m.push((0xffff << (16 - b)) & 0xffff);
-		bits -= b;
-	}
-
-	if (v6)
-		return String.prototype.format.apply('%x:%x:%x:%x:%x:%x:%x:%x', m).replace(/:0(?::0)+$/, '::');
-	else
-		return '%d.%d.%d.%d'.format(m[0] >>> 8, m[0] & 0xff, m[1] >>> 8, m[1] & 0xff);
-}
-
-function maskToPrefix(mask, v6) {
-	var m = v6 ? validation.parseIPv6(mask) : validation.parseIPv4(mask);
-
-	if (!m)
-		return null;
-
-	var bits = 0;
-
-	for (var i = 0, z = false; i < m.length; i++) {
-		z = z || !m[i];
-
-		while (!z && (m[i] & (v6 ? 0x8000 : 0x80))) {
-			m[i] = (m[i] << 1) & (v6 ? 0xffff : 0xff);
-			bits++;
-		}
-
-		if (m[i])
-			return null;
-	}
-
-	return bits;
-}
-
-function initNetworkState(refresh) {
-	if (_state == null || refresh) {
-		_init = _init || Promise.all([
-			L.resolveDefault(callNetworkInterfaceDump(), []),
-			L.resolveDefault(callLuciBoardJSON(), {}),
-			L.resolveDefault(callLuciNetworkDevices(), {}),
-			L.resolveDefault(callLuciWirelessDevices(), {}),
-			L.resolveDefault(callLuciHostHints(), {}),
-			getProtocolHandlers(),
-			L.resolveDefault(uci.load('network')),
-			L.resolveDefault(uci.load('wireless')),
-			L.resolveDefault(uci.load('luci'))
-		]).then(function(data) {
-			var netifd_ifaces = data[0],
-			    board_json    = data[1],
-			    luci_devs     = data[2];
-
-			var s = {
-				isTunnel: {}, isBridge: {}, isSwitch: {}, isWifi: {},
-				ifaces: netifd_ifaces, radios: data[3], hosts: data[4],
-				netdevs: {}, bridges: {}, switches: {}, hostapd: {}
-			};
-
-			for (var name in luci_devs) {
-				var dev = luci_devs[name];
-
-				if (isVirtualIfname(name))
-					s.isTunnel[name] = true;
-
-				if (!s.isTunnel[name] && isIgnoredIfname(name))
-					continue;
-
-				s.netdevs[name] = s.netdevs[name] || {
-					idx:      dev.ifindex,
-					name:     name,
-					rawname:  name,
-					flags:    dev.flags,
-					stats:    dev.stats,
-					macaddr:  dev.mac,
-					type:     dev.type,
-					mtu:      dev.mtu,
-					qlen:     dev.qlen,
-					wireless: dev.wireless,
-					ipaddrs:  [],
-					ip6addrs: []
-				};
-
-				if (Array.isArray(dev.ipaddrs))
-					for (var i = 0; i < dev.ipaddrs.length; i++)
-						s.netdevs[name].ipaddrs.push(dev.ipaddrs[i].address + '/' + dev.ipaddrs[i].netmask);
-
-				if (Array.isArray(dev.ip6addrs))
-					for (var i = 0; i < dev.ip6addrs.length; i++)
-						s.netdevs[name].ip6addrs.push(dev.ip6addrs[i].address + '/' + dev.ip6addrs[i].netmask);
-			}
-
-			for (var name in luci_devs) {
-				var dev = luci_devs[name];
-
-				if (!dev.bridge)
-					continue;
-
-				var b = {
-					name:    name,
-					id:      dev.id,
-					stp:     dev.stp,
-					ifnames: []
-				};
-
-				for (var i = 0; dev.ports && i < dev.ports.length; i++) {
-					var subdev = s.netdevs[dev.ports[i]];
-
-					if (subdev == null)
-						continue;
-
-					b.ifnames.push(subdev);
-					subdev.bridge = b;
-				}
-
-				s.bridges[name] = b;
-				s.isBridge[name] = true;
-			}
-
-			if (L.isObject(board_json.switch)) {
-				for (var switchname in board_json.switch) {
-					var layout = board_json.switch[switchname],
-					    netdevs = {},
-					    nports = {},
-					    ports = [],
-					    pnum = null,
-					    role = null;
-
-					if (L.isObject(layout) && Array.isArray(layout.ports)) {
-						for (var i = 0, port; (port = layout.ports[i]) != null; i++) {
-							if (typeof(port) == 'object' && typeof(port.num) == 'number' &&
-								(typeof(port.role) == 'string' || typeof(port.device) == 'string')) {
-								var spec = {
-									num:   port.num,
-									role:  port.role || 'cpu',
-									index: (port.index != null) ? port.index : port.num
-								};
-
-								if (port.device != null) {
-									spec.device = port.device;
-									spec.tagged = spec.need_tag;
-									netdevs[port.num] = port.device;
-								}
-
-								ports.push(spec);
-
-								if (port.role != null)
-									nports[port.role] = (nports[port.role] || 0) + 1;
-							}
-						}
-
-						ports.sort(function(a, b) {
-							if (a.role != b.role)
-								return (a.role < b.role) ? -1 : 1;
-
-							return (a.index - b.index);
-						});
-
-						for (var i = 0, port; (port = ports[i]) != null; i++) {
-							if (port.role != role) {
-								role = port.role;
-								pnum = 1;
-							}
-
-							if (role == 'cpu')
-								port.label = 'CPU (%s)'.format(port.device);
-							else if (nports[role] > 1)
-								port.label = '%s %d'.format(role.toUpperCase(), pnum++);
-							else
-								port.label = role.toUpperCase();
-
-							delete port.role;
-							delete port.index;
-						}
-
-						s.switches[switchname] = {
-							ports: ports,
-							netdevs: netdevs
-						};
-					}
-				}
-			}
-
-			if (L.isObject(board_json.dsl) && L.isObject(board_json.dsl.modem)) {
-				s.hasDSLModem = board_json.dsl.modem;
-			}
-
-			_init = null;
-
-			var objects = [];
-
-			if (L.isObject(s.radios))
-				for (var radio in s.radios)
-					if (L.isObject(s.radios[radio]) && Array.isArray(s.radios[radio].interfaces))
-						for (var i = 0; i < s.radios[radio].interfaces.length; i++)
-							if (L.isObject(s.radios[radio].interfaces[i]) && s.radios[radio].interfaces[i].ifname)
-								objects.push('hostapd.%s'.format(s.radios[radio].interfaces[i].ifname));
-
-			return (objects.length ? L.resolveDefault(rpc.list.apply(rpc, objects), {}) : Promise.resolve({})).then(function(res) {
-				for (var k in res) {
-					var m = k.match(/^hostapd\.(.+)$/);
-					if (m)
-						s.hostapd[m[1]] = res[k];
-				}
-
-				return (_state = s);
-			});
-		});
-	}
-
-	return (_state != null ? Promise.resolve(_state) : _init);
-}
-
-function ifnameOf(obj) {
-	if (obj instanceof Protocol)
-		return obj.getIfname();
-	else if (obj instanceof Device)
-		return obj.getName();
-	else if (obj instanceof WifiDevice)
-		return obj.getName();
-	else if (obj instanceof WifiNetwork)
-		return obj.getIfname();
-	else if (typeof(obj) == 'string')
-		return obj.replace(/:.+$/, '');
-
-	return null;
-}
-
-function networkSort(a, b) {
-	return a.getName() > b.getName();
-}
-
-function deviceSort(a, b) {
-	var typeWeigth = { wifi: 2, alias: 3 },
-        weightA = typeWeigth[a.getType()] || 1,
-        weightB = typeWeigth[b.getType()] || 1;
-
-    if (weightA != weightB)
-    	return weightA - weightB;
-
-	return a.getName() > b.getName();
-}
-
-function formatWifiEncryption(enc) {
-	if (!L.isObject(enc))
-		return null;
-
-	if (!enc.enabled)
-		return 'None';
-
-	var ciphers = Array.isArray(enc.ciphers)
-		? enc.ciphers.map(function(c) { return c.toUpperCase() }) : [ 'NONE' ];
-
-	if (Array.isArray(enc.wep)) {
-		var has_open = false,
-		    has_shared = false;
-
-		for (var i = 0; i < enc.wep.length; i++)
-			if (enc.wep[i] == 'open')
-				has_open = true;
-			else if (enc.wep[i] == 'shared')
-				has_shared = true;
-
-		if (has_open && has_shared)
-			return 'WEP Open/Shared (%s)'.format(ciphers.join(', '));
-		else if (has_open)
-			return 'WEP Open System (%s)'.format(ciphers.join(', '));
-		else if (has_shared)
-			return 'WEP Shared Auth (%s)'.format(ciphers.join(', '));
-
-		return 'WEP';
-	}
-
-	if (Array.isArray(enc.wpa)) {
-		var versions = [],
-		    suites = Array.isArray(enc.authentication)
-			? enc.authentication.map(function(a) { return a.toUpperCase() }) : [ 'NONE' ];
-
-		for (var i = 0; i < enc.wpa.length; i++)
-			switch (enc.wpa[i]) {
-			case 1:
-				versions.push('WPA');
-				break;
-
-			default:
-				versions.push('WPA%d'.format(enc.wpa[i]));
-				break;
-			}
-
-		if (versions.length > 1)
-			return 'mixed %s %s (%s)'.format(versions.join('/'), suites.join(', '), ciphers.join(', '));
-
-		return '%s %s (%s)'.format(versions[0], suites.join(', '), ciphers.join(', '));
-	}
-
-	return 'Unknown';
-}
-
-function enumerateNetworks() {
-	var uciInterfaces = uci.sections('network', 'interface'),
-	    networks = {};
-
-	for (var i = 0; i < uciInterfaces.length; i++)
-		networks[uciInterfaces[i]['.name']] = this.instantiateNetwork(uciInterfaces[i]['.name']);
-
-	for (var i = 0; i < _state.ifaces.length; i++)
-		if (networks[_state.ifaces[i].interface] == null)
-			networks[_state.ifaces[i].interface] =
-				this.instantiateNetwork(_state.ifaces[i].interface, _state.ifaces[i].proto);
-
-	var rv = [];
-
-	for (var network in networks)
-		if (networks.hasOwnProperty(network))
-			rv.push(networks[network]);
-
-	rv.sort(networkSort);
-
-	return rv;
-}
-
-
-var Hosts, Network, Protocol, Device, WifiDevice, WifiNetwork;
-
-/**
- * @class network
- * @memberof LuCI
- * @hideconstructor
- * @classdesc
- *
- * The `LuCI.network` class combines data from multiple `ubus` apis to
- * provide an abstraction of the current network configuration state.
- *
- * It provides methods to enumerate interfaces and devices, to query
- * current configuration details and to manipulate settings.
- */
-Network = baseclass.extend(/** @lends LuCI.network.prototype */ {
-	/**
-	 * Converts the given prefix size in bits to a netmask.
-	 *
-	 * @method
-	 *
-	 * @param {number} bits
-	 * The prefix size in bits.
-	 *
-	 * @param {boolean} [v6=false]
-	 * Whether to convert the bits value into an IPv4 netmask (`false`) or
-	 * an IPv6 netmask (`true`).
-	 *
-	 * @returns {null|string}
-	 * Returns a string containing the netmask corresponding to the bit count
-	 * or `null` when the given amount of bits exceeds the maximum possible
-	 * value of `32` for IPv4 or `128` for IPv6.
-	 */
-	prefixToMask: prefixToMask,
-
-	/**
-	 * Converts the given netmask to a prefix size in bits.
-	 *
-	 * @method
-	 *
-	 * @param {string} netmask
-	 * The netmask to convert into a bit count.
-	 *
-	 * @param {boolean} [v6=false]
-	 * Whether to parse the given netmask as IPv4 (`false`) or IPv6 (`true`)
-	 * address.
-	 *
-	 * @returns {null|number}
-	 * Returns the number of prefix bits contained in the netmask or `null`
-	 * if the given netmask value was invalid.
-	 */
-	maskToPrefix: maskToPrefix,
-
-	/**
-	 * An encryption entry describes active wireless encryption settings
-	 * such as the used key management protocols, active ciphers and
-	 * protocol versions.
-	 *
-	 * @typedef {Object<string, boolean|Array<number|string>>} LuCI.network.WifiEncryption
-	 * @memberof LuCI.network
-	 *
-	 * @property {boolean} enabled
-	 * Specifies whether any kind of encryption, such as `WEP` or `WPA` is
-	 * enabled. If set to `false`, then no encryption is active and the
-	 * corresponding network is open.
-	 *
-	 * @property {string[]} [wep]
-	 * When the `wep` property exists, the network uses WEP encryption.
-	 * In this case, the property is set to an array of active WEP modes
-	 * which might be either `open`, `shared` or both.
-	 *
-	 * @property {number[]} [wpa]
-	 * When the `wpa` property exists, the network uses WPA security.
-	 * In this case, the property is set to an array containing the WPA
-	 * protocol versions used, e.g. `[ 1, 2 ]` for WPA/WPA2 mixed mode or
-	 * `[ 3 ]` for WPA3-SAE.
-	 *
-	 * @property {string[]} [authentication]
-	 * The `authentication` property only applies to WPA encryption and
-	 * is defined when the `wpa` property is set as well. It points to
-	 * an array of active authentication suites used by the network, e.g.
-	 * `[ "psk" ]` for a WPA(2)-PSK network or `[ "psk", "sae" ]` for
-	 * mixed WPA2-PSK/WPA3-SAE encryption.
-	 *
-	 * @property {string[]} [ciphers]
-	 * If either WEP or WPA encryption is active, then the `ciphers`
-	 * property will be set to an array describing the active encryption
-	 * ciphers used by the network, e.g. `[ "tkip", "ccmp" ]` for a
-	 * WPA/WPA2-PSK mixed network or `[ "wep-40", "wep-104" ]` for an
-	 * WEP network.
-	 */
-
-	/**
-	 * Converts a given {@link LuCI.network.WifiEncryption encryption entry}
-	 * into a human readable string such as `mixed WPA/WPA2 PSK (TKIP, CCMP)`
-	 * or `WPA3 SAE (CCMP)`.
-	 *
-	 * @method
-	 *
-	 * @param {LuCI.network.WifiEncryption} encryption
-	 * The wireless encryption entry to convert.
-	 *
-	 * @returns {null|string}
-	 * Returns the description string for the given encryption entry or
-	 * `null` if the given entry was invalid.
-	 */
-	formatWifiEncryption: formatWifiEncryption,
-
-	/**
-	 * Flushes the local network state cache and fetches updated information
-	 * from the remote `ubus` apis.
-	 *
-	 * @returns {Promise<Object>}
-	 * Returns a promise resolving to the internal network state object.
-	 */
-	flushCache: function() {
-		initNetworkState(true);
-		return _init;
-	},
-
-	/**
-	 * Instantiates the given {@link LuCI.network.Protocol Protocol} backend,
-	 * optionally using the given network name.
-	 *
-	 * @param {string} protoname
-	 * The protocol backend to use, e.g. `static` or `dhcp`.
-	 *
-	 * @param {string} [netname=__dummy__]
-	 * The network name to use for the instantiated protocol. This should be
-	 * usually set to one of the interfaces described in /etc/config/network
-	 * but it is allowed to omit it, e.g. to query protocol capabilities
-	 * without the need for an existing interface.
-	 *
-	 * @returns {null|LuCI.network.Protocol}
-	 * Returns the instantiated protocol backend class or `null` if the given
-	 * protocol isn't known.
-	 */
-	getProtocol: function(protoname, netname) {
-		var v = _protocols[protoname];
-		if (v != null)
-			return new v(netname || '__dummy__');
-
-		return null;
-	},
-
-	/**
-	 * Obtains instances of all known {@link LuCI.network.Protocol Protocol}
-	 * backend classes.
-	 *
-	 * @returns {Array<LuCI.network.Protocol>}
-	 * Returns an array of protocol class instances.
-	 */
-	getProtocols: function() {
-		var rv = [];
-
-		for (var protoname in _protocols)
-			rv.push(new _protocols[protoname]('__dummy__'));
-
-		return rv;
-	},
-
-	/**
-	 * Registers a new {@link LuCI.network.Protocol Protocol} subclass
-	 * with the given methods and returns the resulting subclass value.
-	 *
-	 * This functions internally calls
-	 * {@link LuCI.Class.extend Class.extend()} on the `Network.Protocol`
-	 * base class.
-	 *
-	 * @param {string} protoname
-	 * The name of the new protocol to register.
-	 *
-	 * @param {Object<string, *>} methods
-	 * The member methods and values of the new `Protocol` subclass to
-	 * be passed to {@link LuCI.Class.extend Class.extend()}.
-	 *
-	 * @returns {LuCI.network.Protocol}
-	 * Returns the new `Protocol` subclass.
-	 */
-	registerProtocol: function(protoname, methods) {
-		var spec = L.isObject(_protospecs) ? _protospecs[protoname] : null;
-		var proto = Protocol.extend(Object.assign({
-			getI18n: function() {
-				return protoname;
-			},
-
-			isFloating: function() {
-				return false;
-			},
-
-			isVirtual: function() {
-				return (L.isObject(spec) && spec.no_device == true);
-			},
-
-			renderFormOptions: function(section) {
-
-			}
-		}, methods, {
-			__init__: function(name) {
-				this.sid = name;
-			},
-
-			getProtocol: function() {
-				return protoname;
-			}
-		}));
-
-		_protocols[protoname] = proto;
-
-		return proto;
-	},
-
-	/**
-	 * Registers a new regular expression pattern to recognize
-	 * virtual interfaces.
-	 *
-	 * @param {RegExp} pat
-	 * A `RegExp` instance to match a virtual interface name
-	 * such as `6in4-wan` or `tun0`.
-	 */
-	registerPatternVirtual: function(pat) {
-		iface_patterns_virtual.push(pat);
-	},
-
-	/**
-	 * Registers a new human readable translation string for a `Protocol`
-	 * error code.
-	 *
-	 * @param {string} code
-	 * The `ubus` protocol error code to register a translation for, e.g.
-	 * `NO_DEVICE`.
-	 *
-	 * @param {string} message
-	 * The message to use as translation for the given protocol error code.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the error code description has been added or `false`
-	 * if either the arguments were invalid or if there already was a
-	 * description for the given code.
-	 */
-	registerErrorCode: function(code, message) {
-		if (typeof(code) == 'string' &&
-		    typeof(message) == 'string' &&
-		    !proto_errors.hasOwnProperty(code)) {
-			proto_errors[code] = message;
-			return true;
-		}
-
-		return false;
-	},
-
-	/**
-	 * Adds a new network of the given name and update it with the given
-	 * uci option values.
-	 *
-	 * If a network with the given name already exist but is empty, then
-	 * this function will update its option, otherwise it will do nothing.
-	 *
-	 * @param {string} name
-	 * The name of the network to add. Must be in the format `[a-zA-Z0-9_]+`.
-	 *
-	 * @param {Object<string, string|string[]>} [options]
-	 * An object of uci option values to set on the new network or to
-	 * update in an existing, empty network.
-	 *
-	 * @returns {Promise<null|LuCI.network.Protocol>}
-	 * Returns a promise resolving to the `Protocol` subclass instance
-	 * describing the added network or resolving to `null` if the name
-	 * was invalid or if a non-empty network of the given name already
-	 * existed.
-	 */
-	addNetwork: function(name, options) {
-		return this.getNetwork(name).then(L.bind(function(existingNetwork) {
-			if (name != null && /^[a-zA-Z0-9_]+$/.test(name) && existingNetwork == null) {
-				var sid = uci.add('network', 'interface', name);
-
-				if (sid != null) {
-					if (L.isObject(options))
-						for (var key in options)
-							if (options.hasOwnProperty(key))
-								uci.set('network', sid, key, options[key]);
-
-					return this.instantiateNetwork(sid);
-				}
-			}
-			else if (existingNetwork != null && existingNetwork.isEmpty()) {
-				if (L.isObject(options))
-					for (var key in options)
-						if (options.hasOwnProperty(key))
-							existingNetwork.set(key, options[key]);
-
-				return existingNetwork;
-			}
-		}, this));
-	},
-
-	/**
-	 * Get a {@link LuCI.network.Protocol Protocol} instance describing
-	 * the network with the given name.
-	 *
-	 * @param {string} name
-	 * The logical interface name of the network get, e.g. `lan` or `wan`.
-	 *
-	 * @returns {Promise<null|LuCI.network.Protocol>}
-	 * Returns a promise resolving to a
-	 * {@link LuCI.network.Protocol Protocol} subclass instance describing
-	 * the network or `null` if the network did not exist.
-	 */
-	getNetwork: function(name) {
-		return initNetworkState().then(L.bind(function() {
-			var section = (name != null) ? uci.get('network', name) : null;
-
-			if (section != null && section['.type'] == 'interface') {
-				return this.instantiateNetwork(name);
-			}
-			else if (name != null) {
-				for (var i = 0; i < _state.ifaces.length; i++)
-					if (_state.ifaces[i].interface == name)
-						return this.instantiateNetwork(name, _state.ifaces[i].proto);
-			}
-
-			return null;
-		}, this));
-	},
-
-	/**
-	 * Gets an array containing all known networks.
-	 *
-	 * @returns {Promise<Array<LuCI.network.Protocol>>}
-	 * Returns a promise resolving to a name-sorted array of
-	 * {@link LuCI.network.Protocol Protocol} subclass instances
-	 * describing all known networks.
-	 */
-	getNetworks: function() {
-		return initNetworkState().then(L.bind(enumerateNetworks, this));
-	},
-
-	/**
-	 * Deletes the given network and its references from the network and
-	 * firewall configuration.
-	 *
-	 * @param {string} name
-	 * The name of the network to delete.
-	 *
-	 * @returns {Promise<boolean>}
-	 * Returns a promise resolving to either `true` if the network and
-	 * references to it were successfully deleted from the configuration or
-	 * `false` if the given network could not be found.
-	 */
-	deleteNetwork: function(name) {
-		var requireFirewall = Promise.resolve(L.require('firewall')).catch(function() {}),
-		    network = this.instantiateNetwork(name);
-
-		return Promise.all([ requireFirewall, initNetworkState() ]).then(function(res) {
-			var uciInterface = uci.get('network', name),
-			    firewall = res[0];
-
-			if (uciInterface != null && uciInterface['.type'] == 'interface') {
-				return Promise.resolve(network ? network.deleteConfiguration() : null).then(function() {
-					uci.remove('network', name);
-
-					uci.sections('luci', 'ifstate', function(s) {
-						if (s.interface == name)
-							uci.remove('luci', s['.name']);
-					});
-
-					uci.sections('network', 'alias', function(s) {
-						if (s.interface == name)
-							uci.remove('network', s['.name']);
-					});
-
-					uci.sections('network', 'route', function(s) {
-						if (s.interface == name)
-							uci.remove('network', s['.name']);
-					});
-
-					uci.sections('network', 'route6', function(s) {
-						if (s.interface == name)
-							uci.remove('network', s['.name']);
-					});
-
-					uci.sections('wireless', 'wifi-iface', function(s) {
-						var networks = L.toArray(s.network).filter(function(network) { return network != name });
-
-						if (networks.length > 0)
-							uci.set('wireless', s['.name'], 'network', networks.join(' '));
-						else
-							uci.unset('wireless', s['.name'], 'network');
-					});
-
-					if (firewall)
-						return firewall.deleteNetwork(name).then(function() { return true });
-
-					return true;
-				}).catch(function() {
-					return false;
-				});
-			}
-
-			return false;
-		});
-	},
-
-	/**
-	 * Rename the given network and its references to a new name.
-	 *
-	 * @param {string} oldName
-	 * The current name of the network.
-	 *
-	 * @param {string} newName
-	 * The name to rename the network to, must be in the format
-	 * `[a-z-A-Z0-9_]+`.
-	 *
-	 * @returns {Promise<boolean>}
-	 * Returns a promise resolving to either `true` if the network was
-	 * successfully renamed or `false` if the new name was invalid, if
-	 * a network with the new name already exists or if the network to
-	 * rename could not be found.
-	 */
-	renameNetwork: function(oldName, newName) {
-		return initNetworkState().then(function() {
-			if (newName == null || !/^[a-zA-Z0-9_]+$/.test(newName) || uci.get('network', newName) != null)
-				return false;
-
-			var oldNetwork = uci.get('network', oldName);
-
-			if (oldNetwork == null || oldNetwork['.type'] != 'interface')
-				return false;
-
-			var sid = uci.add('network', 'interface', newName);
-
-			for (var key in oldNetwork)
-				if (oldNetwork.hasOwnProperty(key) && key.charAt(0) != '.')
-					uci.set('network', sid, key, oldNetwork[key]);
-
-			uci.sections('luci', 'ifstate', function(s) {
-				if (s.interface == oldName)
-					uci.set('luci', s['.name'], 'interface', newName);
-			});
-
-			uci.sections('network', 'alias', function(s) {
-				if (s.interface == oldName)
-					uci.set('network', s['.name'], 'interface', newName);
-			});
-
-			uci.sections('network', 'route', function(s) {
-				if (s.interface == oldName)
-					uci.set('network', s['.name'], 'interface', newName);
-			});
-
-			uci.sections('network', 'route6', function(s) {
-				if (s.interface == oldName)
-					uci.set('network', s['.name'], 'interface', newName);
-			});
-
-			uci.sections('wireless', 'wifi-iface', function(s) {
-				var networks = L.toArray(s.network).map(function(network) { return (network == oldName ? newName : network) });
-
-				if (networks.length > 0)
-					uci.set('wireless', s['.name'], 'network', networks.join(' '));
-			});
-
-			uci.remove('network', oldName);
-
-			return true;
-		});
-	},
-
-	/**
-	 * Get a {@link LuCI.network.Device Device} instance describing the
-	 * given network device.
-	 *
-	 * @param {string} name
-	 * The name of the network device to get, e.g. `eth0` or `br-lan`.
-	 *
-	 * @returns {Promise<null|LuCI.network.Device>}
-	 * Returns a promise resolving to the `Device` instance describing
-	 * the network device or `null` if the given device name could not
-	 * be found.
-	 */
-	getDevice: function(name) {
-		return initNetworkState().then(L.bind(function() {
-			if (name == null)
-				return null;
-
-			if (_state.netdevs.hasOwnProperty(name) || isWifiIfname(name))
-				return this.instantiateDevice(name);
-
-			var netid = getWifiNetidBySid(name);
-			if (netid != null)
-				return this.instantiateDevice(netid[0]);
-
-			return null;
-		}, this));
-	},
-
-	/**
-	 * Get a sorted list of all found network devices.
-	 *
-	 * @returns {Promise<Array<LuCI.network.Device>>}
-	 * Returns a promise resolving to a sorted array of `Device` class
-	 * instances describing the network devices found on the system.
-	 */
-	getDevices: function() {
-		return initNetworkState().then(L.bind(function() {
-			var devices = {};
-
-			/* find simple devices */
-			var uciInterfaces = uci.sections('network', 'interface');
-			for (var i = 0; i < uciInterfaces.length; i++) {
-				var ifnames = L.toArray(uciInterfaces[i].ifname);
-
-				for (var j = 0; j < ifnames.length; j++) {
-					if (ifnames[j].charAt(0) == '@')
-						continue;
-
-					if (isIgnoredIfname(ifnames[j]) || isVirtualIfname(ifnames[j]) || isWifiIfname(ifnames[j]))
-						continue;
-
-					devices[ifnames[j]] = this.instantiateDevice(ifnames[j]);
-				}
-			}
-
-			for (var ifname in _state.netdevs) {
-				if (devices.hasOwnProperty(ifname))
-					continue;
-
-				if (isIgnoredIfname(ifname) || isWifiIfname(ifname))
-					continue;
-
-				if (_state.netdevs[ifname].wireless)
-					continue;
-
-				devices[ifname] = this.instantiateDevice(ifname);
-			}
-
-			/* find VLAN devices */
-			var uciSwitchVLANs = uci.sections('network', 'switch_vlan');
-			for (var i = 0; i < uciSwitchVLANs.length; i++) {
-				if (typeof(uciSwitchVLANs[i].ports) != 'string' ||
-				    typeof(uciSwitchVLANs[i].device) != 'string' ||
-				    !_state.switches.hasOwnProperty(uciSwitchVLANs[i].device))
-					continue;
-
-				var ports = uciSwitchVLANs[i].ports.split(/\s+/);
-				for (var j = 0; j < ports.length; j++) {
-					var m = ports[j].match(/^(\d+)([tu]?)$/);
-					if (m == null)
-						continue;
-
-					var netdev = _state.switches[uciSwitchVLANs[i].device].netdevs[m[1]];
-					if (netdev == null)
-						continue;
-
-					if (!devices.hasOwnProperty(netdev))
-						devices[netdev] = this.instantiateDevice(netdev);
-
-					_state.isSwitch[netdev] = true;
-
-					if (m[2] != 't')
-						continue;
-
-					var vid = uciSwitchVLANs[i].vid || uciSwitchVLANs[i].vlan;
-					    vid = (vid != null ? +vid : null);
-
-					if (vid == null || vid < 0 || vid > 4095)
-						continue;
-
-					var vlandev = '%s.%d'.format(netdev, vid);
-
-					if (!devices.hasOwnProperty(vlandev))
-						devices[vlandev] = this.instantiateDevice(vlandev);
-
-					_state.isSwitch[vlandev] = true;
-				}
-			}
-
-			/* find wireless interfaces */
-			var uciWifiIfaces = uci.sections('wireless', 'wifi-iface'),
-			    networkCount = {};
-
-			for (var i = 0; i < uciWifiIfaces.length; i++) {
-				if (typeof(uciWifiIfaces[i].device) != 'string')
-					continue;
-
-				networkCount[uciWifiIfaces[i].device] = (networkCount[uciWifiIfaces[i].device] || 0) + 1;
-
-				var netid = '%s.network%d'.format(uciWifiIfaces[i].device, networkCount[uciWifiIfaces[i].device]);
-
-				devices[netid] = this.instantiateDevice(netid);
-			}
-
-			/* find uci declared devices */
-			var uciDevices = uci.sections('network', 'device');
-
-			for (var i = 0; i < uciDevices.length; i++) {
-				var type = uciDevices[i].type,
-				    name = uciDevices[i].name;
-
-				if (!type || !name || devices.hasOwnProperty(name))
-					continue;
-
-				if (type == 'bridge')
-					_state.isBridge[name] = true;
-
-				devices[name] = this.instantiateDevice(name);
-			}
-
-			var rv = [];
-
-			for (var netdev in devices)
-				if (devices.hasOwnProperty(netdev))
-					rv.push(devices[netdev]);
-
-			rv.sort(deviceSort);
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Test if a given network device name is in the list of patterns for
-	 * device names to ignore.
-	 *
-	 * Ignored device names are usually Linux network devices which are
-	 * spawned implicitly by kernel modules such as `tunl0` or `hwsim0`
-	 * and which are unsuitable for use in network configuration.
-	 *
-	 * @param {string} name
-	 * The device name to test.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the given name is in the ignore pattern list,
-	 * else returns `false`.
-	 */
-	isIgnoredDevice: function(name) {
-		return isIgnoredIfname(name);
-	},
-
-	/**
-	 * Get a {@link LuCI.network.WifiDevice WifiDevice} instance describing
-	 * the given wireless radio.
-	 *
-	 * @param {string} devname
-	 * The configuration name of the wireless radio to lookup, e.g. `radio0`
-	 * for the first mac80211 phy on the system.
-	 *
-	 * @returns {Promise<null|LuCI.network.WifiDevice>}
-	 * Returns a promise resolving to the `WifiDevice` instance describing
-	 * the underlying radio device or `null` if the wireless radio could not
-	 * be found.
-	 */
-	getWifiDevice: function(devname) {
-		return initNetworkState().then(L.bind(function() {
-			var existingDevice = uci.get('wireless', devname);
-
-			if (existingDevice == null || existingDevice['.type'] != 'wifi-device')
-				return null;
-
-			return this.instantiateWifiDevice(devname, _state.radios[devname] || {});
-		}, this));
-	},
-
-	/**
-	 * Obtain a list of all configured radio devices.
-	 *
-	 * @returns {Promise<Array<LuCI.network.WifiDevice>>}
-	 * Returns a promise resolving to an array of `WifiDevice` instances
-	 * describing the wireless radios configured in the system.
-	 * The order of the array corresponds to the order of the radios in
-	 * the configuration.
-	 */
-	getWifiDevices: function() {
-		return initNetworkState().then(L.bind(function() {
-			var uciWifiDevices = uci.sections('wireless', 'wifi-device'),
-			    rv = [];
-
-			for (var i = 0; i < uciWifiDevices.length; i++) {
-				var devname = uciWifiDevices[i]['.name'];
-				rv.push(this.instantiateWifiDevice(devname, _state.radios[devname] || {}));
-			}
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Get a {@link LuCI.network.WifiNetwork WifiNetwork} instance describing
-	 * the given wireless network.
-	 *
-	 * @param {string} netname
-	 * The name of the wireless network to lookup. This may be either an uci
-	 * configuration section ID, a network ID in the form `radio#.network#`
-	 * or a Linux network device name like `wlan0` which is resolved to the
-	 * corresponding configuration section through `ubus` runtime information.
-	 *
-	 * @returns {Promise<null|LuCI.network.WifiNetwork>}
-	 * Returns a promise resolving to the `WifiNetwork` instance describing
-	 * the wireless network or `null` if the corresponding network could not
-	 * be found.
-	 */
-	getWifiNetwork: function(netname) {
-		return initNetworkState()
-			.then(L.bind(this.lookupWifiNetwork, this, netname));
-	},
-
-	/**
-	 * Get an array of all {@link LuCI.network.WifiNetwork WifiNetwork}
-	 * instances describing the wireless networks present on the system.
-	 *
-	 * @returns {Promise<Array<LuCI.network.WifiNetwork>>}
-	 * Returns a promise resolving to an array of `WifiNetwork` instances
-	 * describing the wireless networks. The array will be empty if no networks
-	 * are found.
-	 */
-	getWifiNetworks: function() {
-		return initNetworkState().then(L.bind(function() {
-			var wifiIfaces = uci.sections('wireless', 'wifi-iface'),
-			    rv = [];
-
-			for (var i = 0; i < wifiIfaces.length; i++)
-				rv.push(this.lookupWifiNetwork(wifiIfaces[i]['.name']));
-
-			rv.sort(function(a, b) {
-				return (a.getID() > b.getID());
-			});
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Adds a new wireless network to the configuration and sets its options
-	 * to the provided values.
-	 *
-	 * @param {Object<string, string|string[]>} options
-	 * The options to set for the newly added wireless network. This object
-	 * must at least contain a `device` property which is set to the radio
-	 * name the new network belongs to.
-	 *
-	 * @returns {Promise<null|LuCI.network.WifiNetwork>}
-	 * Returns a promise resolving to a `WifiNetwork` instance describing
-	 * the newly added wireless network or `null` if the given options
-	 * were invalid or if the associated radio device could not be found.
-	 */
-	addWifiNetwork: function(options) {
-		return initNetworkState().then(L.bind(function() {
-			if (options == null ||
-			    typeof(options) != 'object' ||
-			    typeof(options.device) != 'string')
-			    return null;
-
-			var existingDevice = uci.get('wireless', options.device);
-			if (existingDevice == null || existingDevice['.type'] != 'wifi-device')
-				return null;
-
-			/* XXX: need to add a named section (wifinet#) here */
-			var sid = uci.add('wireless', 'wifi-iface');
-			for (var key in options)
-				if (options.hasOwnProperty(key))
-					uci.set('wireless', sid, key, options[key]);
-
-			var radioname = existingDevice['.name'],
-			    netid = getWifiNetidBySid(sid) || [];
-
-			return this.instantiateWifiNetwork(sid, radioname, _state.radios[radioname], netid[0], null);
-		}, this));
-	},
-
-	/**
-	 * Deletes the given wireless network from the configuration.
-	 *
-	 * @param {string} netname
-	 * The name of the network to remove. This may be either a
-	 * network ID in the form `radio#.network#` or a Linux network device
-	 * name like `wlan0` which is resolved to the corresponding configuration
-	 * section through `ubus` runtime information.
-	 *
-	 * @returns {Promise<boolean>}
-	 * Returns a promise resolving to `true` if the wireless network has been
-	 * successfully deleted from the configuration or `false` if it could not
-	 * be found.
-	 */
-	deleteWifiNetwork: function(netname) {
-		return initNetworkState().then(L.bind(function() {
-			var sid = getWifiSidByIfname(netname);
-
-			if (sid == null)
-				return false;
-
-			uci.remove('wireless', sid);
-			return true;
-		}, this));
-	},
-
-	/* private */
-	getStatusByRoute: function(addr, mask) {
-		return initNetworkState().then(L.bind(function() {
-			var rv = [];
-
-			for (var i = 0; i < _state.ifaces.length; i++) {
-				if (!Array.isArray(_state.ifaces[i].route))
-					continue;
-
-				for (var j = 0; j < _state.ifaces[i].route.length; j++) {
-					if (typeof(_state.ifaces[i].route[j]) != 'object' ||
-					    typeof(_state.ifaces[i].route[j].target) != 'string' ||
-					    typeof(_state.ifaces[i].route[j].mask) != 'number')
-					    continue;
-
-					if (_state.ifaces[i].route[j].table)
-						continue;
-
-					if (_state.ifaces[i].route[j].target != addr ||
-					    _state.ifaces[i].route[j].mask != mask)
-					    continue;
-
-					rv.push(_state.ifaces[i]);
-				}
-			}
-
-			return rv;
-		}, this));
-	},
-
-	/* private */
-	getStatusByAddress: function(addr) {
-		return initNetworkState().then(L.bind(function() {
-			var rv = [];
-
-			for (var i = 0; i < _state.ifaces.length; i++) {
-				if (Array.isArray(_state.ifaces[i]['ipv4-address']))
-					for (var j = 0; j < _state.ifaces[i]['ipv4-address'].length; j++)
-						if (typeof(_state.ifaces[i]['ipv4-address'][j]) == 'object' &&
-						    _state.ifaces[i]['ipv4-address'][j].address == addr)
-							return _state.ifaces[i];
-
-				if (Array.isArray(_state.ifaces[i]['ipv6-address']))
-					for (var j = 0; j < _state.ifaces[i]['ipv6-address'].length; j++)
-						if (typeof(_state.ifaces[i]['ipv6-address'][j]) == 'object' &&
-						    _state.ifaces[i]['ipv6-address'][j].address == addr)
-							return _state.ifaces[i];
-
-				if (Array.isArray(_state.ifaces[i]['ipv6-prefix-assignment']))
-					for (var j = 0; j < _state.ifaces[i]['ipv6-prefix-assignment'].length; j++)
-						if (typeof(_state.ifaces[i]['ipv6-prefix-assignment'][j]) == 'object' &&
-							typeof(_state.ifaces[i]['ipv6-prefix-assignment'][j]['local-address']) == 'object' &&
-						    _state.ifaces[i]['ipv6-prefix-assignment'][j]['local-address'].address == addr)
-							return _state.ifaces[i];
-			}
-
-			return null;
-		}, this));
-	},
-
-	/**
-	 * Get IPv4 wan networks.
-	 *
-	 * This function looks up all networks having a default `0.0.0.0/0` route
-	 * and returns them as array.
-	 *
-	 * @returns {Promise<Array<LuCI.network.Protocol>>}
-	 * Returns a promise resolving to an array of `Protocol` subclass
-	 * instances describing the found default route interfaces.
-	 */
-	getWANNetworks: function() {
-		return this.getStatusByRoute('0.0.0.0', 0).then(L.bind(function(statuses) {
-			var rv = [], seen = {};
-
-			for (var i = 0; i < statuses.length; i++) {
-				if (!seen.hasOwnProperty(statuses[i].interface)) {
-					rv.push(this.instantiateNetwork(statuses[i].interface, statuses[i].proto));
-					seen[statuses[i].interface] = true;
-				}
-			}
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Get IPv6 wan networks.
-	 *
-	 * This function looks up all networks having a default `::/0` route
-	 * and returns them as array.
-	 *
-	 * @returns {Promise<Array<LuCI.network.Protocol>>}
-	 * Returns a promise resolving to an array of `Protocol` subclass
-	 * instances describing the found IPv6 default route interfaces.
-	 */
-	getWAN6Networks: function() {
-		return this.getStatusByRoute('::', 0).then(L.bind(function(statuses) {
-			var rv = [], seen = {};
-
-			for (var i = 0; i < statuses.length; i++) {
-				if (!seen.hasOwnProperty(statuses[i].interface)) {
-					rv.push(this.instantiateNetwork(statuses[i].interface, statuses[i].proto));
-					seen[statuses[i].interface] = true;
-				}
-			}
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Describes an swconfig switch topology by specifying the CPU
-	 * connections and external port labels of a switch.
-	 *
-	 * @typedef {Object<string, Object|Array>} SwitchTopology
-	 * @memberof LuCI.network
-	 *
-	 * @property {Object<number, string>} netdevs
-	 * The `netdevs` property points to an object describing the CPU port
-	 * connections of the switch. The numeric key of the enclosed object is
-	 * the port number, the value contains the Linux network device name the
-	 * port is hardwired to.
-	 *
-	 * @property {Array<Object<string, boolean|number|string>>} ports
-	 * The `ports` property points to an array describing the populated
-	 * ports of the switch in the external label order. Each array item is
-	 * an object containg the following keys:
-	 *  - `num` - the internal switch port number
-	 *  - `label` - the label of the port, e.g. `LAN 1` or `CPU (eth0)`
-	 *  - `device` - the connected Linux network device name (CPU ports only)
-	 *  - `tagged` - a boolean indicating whether the port must be tagged to
-	 *     function (CPU ports only)
-	 */
-
-	/**
-	 * Returns the topologies of all swconfig switches found on the system.
-	 *
-	 * @returns {Promise<Object<string, LuCI.network.SwitchTopology>>}
-	 * Returns a promise resolving to an object containing the topologies
-	 * of each switch. The object keys correspond to the name of the switches
-	 * such as `switch0`, the values are
-	 * {@link LuCI.network.SwitchTopology SwitchTopology} objects describing
-	 * the layout.
-	 */
-	getSwitchTopologies: function() {
-		return initNetworkState().then(function() {
-			return _state.switches;
-		});
-	},
-
-	/* private */
-	instantiateNetwork: function(name, proto) {
-		if (name == null)
-			return null;
-
-		proto = (proto == null ? uci.get('network', name, 'proto') : proto);
-
-		var protoClass = _protocols[proto] || Protocol;
-		return new protoClass(name);
-	},
-
-	/* private */
-	instantiateDevice: function(name, network, extend) {
-		if (extend != null)
-			return new (Device.extend(extend))(name, network);
-
-		return new Device(name, network);
-	},
-
-	/* private */
-	instantiateWifiDevice: function(radioname, radiostate) {
-		return new WifiDevice(radioname, radiostate);
-	},
-
-	/* private */
-	instantiateWifiNetwork: function(sid, radioname, radiostate, netid, netstate, hostapd) {
-		return new WifiNetwork(sid, radioname, radiostate, netid, netstate, hostapd);
-	},
-
-	/* private */
-	lookupWifiNetwork: function(netname) {
-		var sid, res, netid, radioname, radiostate, netstate;
-
-		sid = getWifiSidByNetid(netname);
-
-		if (sid != null) {
-			res        = getWifiStateBySid(sid);
-			netid      = netname;
-			radioname  = res ? res[0] : null;
-			radiostate = res ? res[1] : null;
-			netstate   = res ? res[2] : null;
-		}
-		else {
-			res = getWifiStateByIfname(netname);
-
-			if (res != null) {
-				radioname  = res[0];
-				radiostate = res[1];
-				netstate   = res[2];
-				sid        = netstate.section;
-				netid      = L.toArray(getWifiNetidBySid(sid))[0];
-			}
-			else {
-				res = getWifiStateBySid(netname);
-
-				if (res != null) {
-					radioname  = res[0];
-					radiostate = res[1];
-					netstate   = res[2];
-					sid        = netname;
-					netid      = L.toArray(getWifiNetidBySid(sid))[0];
-				}
-				else {
-					res = getWifiNetidBySid(netname);
-
-					if (res != null) {
-						netid     = res[0];
-						radioname = res[1];
-						sid       = netname;
-					}
-				}
-			}
-		}
-
-		return this.instantiateWifiNetwork(sid || netname, radioname,
-			radiostate, netid, netstate,
-			netstate ? _state.hostapd[netstate.ifname] : null);
-	},
-
-	/**
-	 * Obtains the the network device name of the given object.
-	 *
-	 * @param {LuCI.network.Protocol|LuCI.network.Device|LuCI.network.WifiDevice|LuCI.network.WifiNetwork|string} obj
-	 * The object to get the device name from.
-	 *
-	 * @returns {null|string}
-	 * Returns a string containing the device name or `null` if the given
-	 * object could not be converted to a name.
-	 */
-	getIfnameOf: function(obj) {
-		return ifnameOf(obj);
-	},
-
-	/**
-	 * Queries the internal DSL modem type from board information.
-	 *
-	 * @returns {Promise<null|string>}
-	 * Returns a promise resolving to the type of the internal modem
-	 * (e.g. `vdsl`) or to `null` if no internal modem is present.
-	 */
-	getDSLModemType: function() {
-		return initNetworkState().then(function() {
-			return _state.hasDSLModem ? _state.hasDSLModem.type : null;
-		});
-	},
-
-	/**
-	 * Queries aggregated information about known hosts.
-	 *
-	 * This function aggregates information from various sources such as
-	 * DHCP lease databases, ARP and IPv6 neighbour entries, wireless
-	 * association list etc. and returns a {@link LuCI.network.Hosts Hosts}
-	 * class instance describing the found hosts.
-	 *
-	 * @returns {Promise<LuCI.network.Hosts>}
-	 * Returns a `Hosts` instance describing host known on the system.
-	 */
-	getHostHints: function() {
-		return initNetworkState().then(function() {
-			return new Hosts(_state.hosts);
-		});
-	}
-});
-
-/**
- * @class
- * @memberof LuCI.network
- * @hideconstructor
- * @classdesc
- *
- * The `LuCI.network.Hosts` class encapsulates host information aggregated
- * from multiple sources and provides convenience functions to access the
- * host information by different criteria.
- */
-Hosts = baseclass.extend(/** @lends LuCI.network.Hosts.prototype */ {
-	__init__: function(hosts) {
-		this.hosts = hosts;
-	},
-
-	/**
-	 * Lookup the hostname associated with the given MAC address.
-	 *
-	 * @param {string} mac
-	 * The MAC address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the hostname associated with the given MAC or `null` if
-	 * no matching host could be found or if no hostname is known for
-	 * the corresponding host.
-	 */
-	getHostnameByMACAddr: function(mac) {
-		return this.hosts[mac] ? this.hosts[mac].name : null;
-	},
-
-	/**
-	 * Lookup the IPv4 address associated with the given MAC address.
-	 *
-	 * @param {string} mac
-	 * The MAC address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the IPv4 address associated with the given MAC or `null` if
-	 * no matching host could be found or if no IPv4 address is known for
-	 * the corresponding host.
-	 */
-	getIPAddrByMACAddr: function(mac) {
-		return this.hosts[mac] ? this.hosts[mac].ipv4 : null;
-	},
-
-	/**
-	 * Lookup the IPv6 address associated with the given MAC address.
-	 *
-	 * @param {string} mac
-	 * The MAC address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the IPv6 address associated with the given MAC or `null` if
-	 * no matching host could be found or if no IPv6 address is known for
-	 * the corresponding host.
-	 */
-	getIP6AddrByMACAddr: function(mac) {
-		return this.hosts[mac] ? this.hosts[mac].ipv6 : null;
-	},
-
-	/**
-	 * Lookup the hostname associated with the given IPv4 address.
-	 *
-	 * @param {string} ipaddr
-	 * The IPv4 address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the hostname associated with the given IPv4 or `null` if
-	 * no matching host could be found or if no hostname is known for
-	 * the corresponding host.
-	 */
-	getHostnameByIPAddr: function(ipaddr) {
-		for (var mac in this.hosts)
-			if (this.hosts[mac].ipv4 == ipaddr && this.hosts[mac].name != null)
-				return this.hosts[mac].name;
-		return null;
-	},
-
-	/**
-	 * Lookup the MAC address associated with the given IPv4 address.
-	 *
-	 * @param {string} ipaddr
-	 * The IPv4 address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the MAC address associated with the given IPv4 or `null` if
-	 * no matching host could be found or if no MAC address is known for
-	 * the corresponding host.
-	 */
-	getMACAddrByIPAddr: function(ipaddr) {
-		for (var mac in this.hosts)
-			if (this.hosts[mac].ipv4 == ipaddr)
-				return mac;
-		return null;
-	},
-
-	/**
-	 * Lookup the hostname associated with the given IPv6 address.
-	 *
-	 * @param {string} ipaddr
-	 * The IPv6 address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the hostname associated with the given IPv6 or `null` if
-	 * no matching host could be found or if no hostname is known for
-	 * the corresponding host.
-	 */
-	getHostnameByIP6Addr: function(ip6addr) {
-		for (var mac in this.hosts)
-			if (this.hosts[mac].ipv6 == ip6addr && this.hosts[mac].name != null)
-				return this.hosts[mac].name;
-		return null;
-	},
-
-	/**
-	 * Lookup the MAC address associated with the given IPv6 address.
-	 *
-	 * @param {string} ipaddr
-	 * The IPv6 address to lookup.
-	 *
-	 * @returns {null|string}
-	 * Returns the MAC address associated with the given IPv6 or `null` if
-	 * no matching host could be found or if no MAC address is known for
-	 * the corresponding host.
-	 */
-	getMACAddrByIP6Addr: function(ip6addr) {
-		for (var mac in this.hosts)
-			if (this.hosts[mac].ipv6 == ip6addr)
-				return mac;
-		return null;
-	},
-
-	/**
-	 * Return an array of (MAC address, name hint) tuples sorted by
-	 * MAC address.
-	 *
-	 * @param {boolean} [preferIp6=false]
-	 * Whether to prefer IPv6 addresses (`true`) or IPv4 addresses (`false`)
-	 * as name hint when no hostname is known for a specific MAC address.
-	 *
-	 * @returns {Array<Array<string>>}
-	 * Returns an array of arrays containing a name hint for each found
-	 * MAC address on the system. The array is sorted ascending by MAC.
-	 *
-	 * Each item of the resulting array is a two element array with the
-	 * MAC being the first element and the name hint being the second
-	 * element. The name hint is either the hostname, an IPv4 or an IPv6
-	 * address related to the MAC address.
-	 *
-	 * If no hostname but both IPv4 and IPv6 addresses are known, the
-	 * `preferIP6` flag specifies whether the IPv6 or the IPv4 address
-	 * is used as hint.
-	 */
-	getMACHints: function(preferIp6) {
-		var rv = [];
-		for (var mac in this.hosts) {
-			var hint = this.hosts[mac].name ||
-				this.hosts[mac][preferIp6 ? 'ipv6' : 'ipv4'] ||
-				this.hosts[mac][preferIp6 ? 'ipv4' : 'ipv6'];
-
-			rv.push([mac, hint]);
-		}
-		return rv.sort(function(a, b) { return a[0] > b[0] });
-	}
-});
-
-/**
- * @class
- * @memberof LuCI.network
- * @hideconstructor
- * @classdesc
- *
- * The `Network.Protocol` class serves as base for protocol specific
- * subclasses which describe logical UCI networks defined by `config
- * interface` sections in `/etc/config/network`.
- */
-Protocol = baseclass.extend(/** @lends LuCI.network.Protocol.prototype */ {
-	__init__: function(name) {
-		this.sid = name;
-	},
-
-	_get: function(opt) {
-		var val = uci.get('network', this.sid, opt);
-
-		if (Array.isArray(val))
-			return val.join(' ');
-
-		return val || '';
-	},
-
-	_ubus: function(field) {
-		for (var i = 0; i < _state.ifaces.length; i++) {
-			if (_state.ifaces[i].interface != this.sid)
-				continue;
-
-			return (field != null ? _state.ifaces[i][field] : _state.ifaces[i]);
-		}
-	},
-
-	/**
-	 * Read the given UCI option value of this network.
-	 *
-	 * @param {string} opt
-	 * The UCI option name to read.
-	 *
-	 * @returns {null|string|string[]}
-	 * Returns the UCI option value or `null` if the requested option is
-	 * not found.
-	 */
-	get: function(opt) {
-		return uci.get('network', this.sid, opt);
-	},
-
-	/**
-	 * Set the given UCI option of this network to the given value.
-	 *
-	 * @param {string} opt
-	 * The name of the UCI option to set.
-	 *
-	 * @param {null|string|string[]} val
-	 * The value to set or `null` to remove the given option from the
-	 * configuration.
-	 */
-	set: function(opt, val) {
-		return uci.set('network', this.sid, opt, val);
-	},
-
-	/**
-	 * Get the associared Linux network device of this network.
-	 *
-	 * @returns {null|string}
-	 * Returns the name of the associated network device or `null` if
-	 * it could not be determined.
-	 */
-	getIfname: function() {
-		var ifname;
-
-		if (this.isFloating())
-			ifname = this._ubus('l3_device');
-		else
-			ifname = this._ubus('device') || this._ubus('l3_device');
-
-		if (ifname != null)
-			return ifname;
-
-		var res = getWifiNetidByNetname(this.sid);
-		return (res != null ? res[0] : null);
-	},
-
-	/**
-	 * Get the name of this network protocol class.
-	 *
-	 * This function will be overwritten by subclasses created by
-	 * {@link LuCI.network#registerProtocol Network.registerProtocol()}.
-	 *
-	 * @abstract
-	 * @returns {string}
-	 * Returns the name of the network protocol implementation, e.g.
-	 * `static` or `dhcp`.
-	 */
-	getProtocol: function() {
-		return null;
-	},
-
-	/**
-	 * Return a human readable description for the protcol, such as
-	 * `Static address` or `DHCP client`.
-	 *
-	 * This function should be overwritten by subclasses.
-	 *
-	 * @abstract
-	 * @returns {string}
-	 * Returns the description string.
-	 */
-	getI18n: function() {
-		switch (this.getProtocol()) {
-		case 'none':   return _('Unmanaged');
-		case 'static': return _('Static address');
-		case 'dhcp':   return _('DHCP client');
-		default:       return _('Unknown');
-		}
-	},
-
-	/**
-	 * Get the type of the underlying interface.
-	 *
-	 * This function actually is a convenience wrapper around
-	 * `proto.get("type")` and is mainly used by other `LuCI.network` code
-	 * to check whether the interface is declared as bridge in UCI.
-	 *
-	 * @returns {null|string}
-	 * Returns the value of the `type` option of the associated logical
-	 * interface or `null` if no `type` option is set.
-	 */
-	getType: function() {
-		return this._get('type');
-	},
-
-	/**
-	 * Get the name of the associated logical interface.
-	 *
-	 * @returns {string}
-	 * Returns the logical interface name, such as `lan` or `wan`.
-	 */
-	getName: function() {
-		return this.sid;
-	},
-
-	/**
-	 * Get the uptime of the logical interface.
-	 *
-	 * @returns {number}
-	 * Returns the uptime of the associated interface in seconds.
-	 */
-	getUptime: function() {
-		return this._ubus('uptime') || 0;
-	},
-
-	/**
-	 * Get the logical interface expiry time in seconds.
-	 *
-	 * For protocols that have a concept of a lease, such as DHCP or
-	 * DHCPv6, this function returns the remaining time in seconds
-	 * until the lease expires.
-	 *
-	 * @returns {number}
-	 * Returns the amount of seconds until the lease expires or `-1`
-	 * if it isn't applicable to the associated protocol.
-	 */
-	getExpiry: function() {
-		var u = this._ubus('uptime'),
-		    d = this._ubus('data');
-
-		if (typeof(u) == 'number' && d != null &&
-		    typeof(d) == 'object' && typeof(d.leasetime) == 'number') {
-			var r = d.leasetime - (u % d.leasetime);
-			return (r > 0 ? r : 0);
-		}
-
-		return -1;
-	},
-
-	/**
-	 * Get the metric value of the logical interface.
-	 *
-	 * @returns {number}
-	 * Returns the current metric value used for device and network
-	 * routes spawned by the associated logical interface.
-	 */
-	getMetric: function() {
-		return this._ubus('metric') || 0;
-	},
-
-	/**
-	 * Get the requested firewall zone name of the logical interface.
-	 *
-	 * Some protocol implementations request a specific firewall zone
-	 * to trigger inclusion of their resulting network devices into the
-	 * firewall rule set.
-	 *
-	 * @returns {null|string}
-	 * Returns the requested firewall zone name as published in the
-	 * `ubus` runtime information or `null` if the remote protocol
-	 * handler didn't request a zone.
-	 */
-	getZoneName: function() {
-		var d = this._ubus('data');
-
-		if (L.isObject(d) && typeof(d.zone) == 'string')
-			return d.zone;
-
-		return null;
-	},
-
-	/**
-	 * Query the first (primary) IPv4 address of the logical interface.
-	 *
-	 * @returns {null|string}
-	 * Returns the primary IPv4 address registered by the protocol handler
-	 * or `null` if no IPv4 addresses were set.
-	 */
-	getIPAddr: function() {
-		var addrs = this._ubus('ipv4-address');
-		return ((Array.isArray(addrs) && addrs.length) ? addrs[0].address : null);
-	},
-
-	/**
-	 * Query all IPv4 addresses of the logical interface.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv4 addresses in CIDR notation which have been
-	 * registered by the protocol handler. The order of the resulting array
-	 * follows the order of the addresses in `ubus` runtime information.
-	 */
-	getIPAddrs: function() {
-		var addrs = this._ubus('ipv4-address'),
-		    rv = [];
-
-		if (Array.isArray(addrs))
-			for (var i = 0; i < addrs.length; i++)
-				rv.push('%s/%d'.format(addrs[i].address, addrs[i].mask));
-
-		return rv;
-	},
-
-	/**
-	 * Query the first (primary) IPv4 netmask of the logical interface.
-	 *
-	 * @returns {null|string}
-	 * Returns the netmask of the primary IPv4 address registered by the
-	 * protocol handler or `null` if no IPv4 addresses were set.
-	 */
-	getNetmask: function() {
-		var addrs = this._ubus('ipv4-address');
-		if (Array.isArray(addrs) && addrs.length)
-			return prefixToMask(addrs[0].mask, false);
-	},
-
-	/**
-	 * Query the gateway (nexthop) of the default route associated with
-	 * this logical interface.
-	 *
-	 * @returns {string}
-	 * Returns a string containing the IPv4 nexthop address of the associated
-	 * default route or `null` if no default route was found.
-	 */
-	getGatewayAddr: function() {
-		var routes = this._ubus('route');
-
-		if (Array.isArray(routes))
-			for (var i = 0; i < routes.length; i++)
-				if (typeof(routes[i]) == 'object' &&
-				    routes[i].target == '0.0.0.0' &&
-				    routes[i].mask == 0)
-				    return routes[i].nexthop;
-
-		return null;
-	},
-
-	/**
-	 * Query the IPv4 DNS servers associated with the logical interface.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv4 DNS servers registered by the remote
-	 * protocol backend.
-	 */
-	getDNSAddrs: function() {
-		var addrs = this._ubus('dns-server'),
-		    rv = [];
-
-		if (Array.isArray(addrs))
-			for (var i = 0; i < addrs.length; i++)
-				if (!/:/.test(addrs[i]))
-					rv.push(addrs[i]);
-
-		return rv;
-	},
-
-	/**
-	 * Query the first (primary) IPv6 address of the logical interface.
-	 *
-	 * @returns {null|string}
-	 * Returns the primary IPv6 address registered by the protocol handler
-	 * in CIDR notation or `null` if no IPv6 addresses were set.
-	 */
-	getIP6Addr: function() {
-		var addrs = this._ubus('ipv6-address');
-
-		if (Array.isArray(addrs) && L.isObject(addrs[0]))
-			return '%s/%d'.format(addrs[0].address, addrs[0].mask);
-
-		addrs = this._ubus('ipv6-prefix-assignment');
-
-		if (Array.isArray(addrs) && L.isObject(addrs[0]) && L.isObject(addrs[0]['local-address']))
-			return '%s/%d'.format(addrs[0]['local-address'].address, addrs[0]['local-address'].mask);
-
-		return null;
-	},
-
-	/**
-	 * Query all IPv6 addresses of the logical interface.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv6 addresses in CIDR notation which have been
-	 * registered by the protocol handler. The order of the resulting array
-	 * follows the order of the addresses in `ubus` runtime information.
-	 */
-	getIP6Addrs: function() {
-		var addrs = this._ubus('ipv6-address'),
-		    rv = [];
-
-		if (Array.isArray(addrs))
-			for (var i = 0; i < addrs.length; i++)
-				if (L.isObject(addrs[i]))
-					rv.push('%s/%d'.format(addrs[i].address, addrs[i].mask));
-
-		addrs = this._ubus('ipv6-prefix-assignment');
-
-		if (Array.isArray(addrs))
-			for (var i = 0; i < addrs.length; i++)
-				if (L.isObject(addrs[i]) && L.isObject(addrs[i]['local-address']))
-					rv.push('%s/%d'.format(addrs[i]['local-address'].address, addrs[i]['local-address'].mask));
-
-		return rv;
-	},
-
-	/**
-	 * Query the gateway (nexthop) of the IPv6 default route associated with
-	 * this logical interface.
-	 *
-	 * @returns {string}
-	 * Returns a string containing the IPv6 nexthop address of the associated
-	 * default route or `null` if no default route was found.
-	 */
-	getGateway6Addr: function() {
-		var routes = this._ubus('route');
-
-		if (Array.isArray(routes))
-			for (var i = 0; i < routes.length; i++)
-				if (typeof(routes[i]) == 'object' &&
-				    routes[i].target == '::' &&
-				    routes[i].mask == 0)
-				    return routes[i].nexthop;
-
-		return null;
-	},
-
-	/**
-	 * Query the IPv6 DNS servers associated with the logical interface.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv6 DNS servers registered by the remote
-	 * protocol backend.
-	 */
-	getDNS6Addrs: function() {
-		var addrs = this._ubus('dns-server'),
-		    rv = [];
-
-		if (Array.isArray(addrs))
-			for (var i = 0; i < addrs.length; i++)
-				if (/:/.test(addrs[i]))
-					rv.push(addrs[i]);
-
-		return rv;
-	},
-
-	/**
-	 * Query the routed IPv6 prefix associated with the logical interface.
-	 *
-	 * @returns {null|string}
-	 * Returns the routed IPv6 prefix registered by the remote protocol
-	 * handler or `null` if no prefix is present.
-	 */
-	getIP6Prefix: function() {
-		var prefixes = this._ubus('ipv6-prefix');
-
-		if (Array.isArray(prefixes) && L.isObject(prefixes[0]))
-			return '%s/%d'.format(prefixes[0].address, prefixes[0].mask);
-
-		return null;
-	},
-
-	/**
-	 * Query interface error messages published in `ubus` runtime state.
-	 *
-	 * Interface errors are emitted by remote protocol handlers if the setup
-	 * of the underlying logical interface failed, e.g. due to bad
-	 * configuration or network connectivity issues.
-	 *
-	 * This function will translate the found error codes to human readable
-	 * messages using the descriptions registered by
-	 * {@link LuCI.network#registerErrorCode Network.registerErrorCode()}
-	 * and fall back to `"Unknown error (%s)"` where `%s` is replaced by the
-	 * error code in case no translation can be found.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of translated interface error messages.
-	 */
-	getErrors: function() {
-		var errors = this._ubus('errors'),
-		    rv = null;
-
-		if (Array.isArray(errors)) {
-			for (var i = 0; i < errors.length; i++) {
-				if (!L.isObject(errors[i]) || typeof(errors[i].code) != 'string')
-					continue;
-
-				rv = rv || [];
-				rv.push(proto_errors[errors[i].code] || _('Unknown error (%s)').format(errors[i].code));
-			}
-		}
-
-		return rv;
-	},
-
-	/**
-	 * Checks whether the underlying logical interface is declared as bridge.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the interface is declared with `option type bridge`
-	 * and when the associated protocol implementation is not marked virtual
-	 * or `false` when the logical interface is no bridge.
-	 */
-	isBridge: function() {
-		return (!this.isVirtual() && this.getType() == 'bridge');
-	},
-
-	/**
-	 * Get the name of the opkg package providing the protocol functionality.
-	 *
-	 * This function should be overwritten by protocol specific subclasses.
-	 *
-	 * @abstract
-	 *
-	 * @returns {string}
-	 * Returns the name of the opkg package required for the protocol to
-	 * function, e.g. `odhcp6c` for the `dhcpv6` prototocol.
-	 */
-	getOpkgPackage: function() {
-		return null;
-	},
-
-	/**
-	 * Check function for the protocol handler if a new interface is createable.
-	 *
-	 * This function should be overwritten by protocol specific subclasses.
-	 *
-	 * @abstract
-	 *
-	 * @param {string} ifname
-	 * The name of the interface to be created.
-	 *
-	 * @returns {Promise<void>}
-	 * Returns a promise resolving if new interface is createable, else
-	 * rejects with an error message string.
-	 */
-	isCreateable: function(ifname) {
-		return Promise.resolve(null);
-	},
-
-	/**
-	 * Checks whether the protocol functionality is installed.
-	 *
-	 * This function exists for compatibility with old code, it always
-	 * returns `true`.
-	 *
-	 * @deprecated
-	 * @abstract
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the protocol support is installed, else `false`.
-	 */
-	isInstalled: function() {
-		return true;
-	},
-
-	/**
-	 * Checks whether this protocol is "virtual".
-	 *
-	 * A "virtual" protocol is a protocol which spawns its own interfaces
-	 * on demand instead of using existing physical interfaces.
-	 *
-	 * Examples for virtual protocols are `6in4` which `gre` spawn tunnel
-	 * network device on startup, examples for non-virtual protcols are
-	 * `dhcp` or `static` which apply IP configuration to existing interfaces.
-	 *
-	 * This function should be overwritten by subclasses.
-	 *
-	 * @returns {boolean}
-	 * Returns a boolean indicating whether the underlying protocol spawns
-	 * dynamic interfaces (`true`) or not (`false`).
-	 */
-	isVirtual: function() {
-		return false;
-	},
-
-	/**
-	 * Checks whether this protocol is "floating".
-	 *
-	 * A "floating" protocol is a protocol which spawns its own interfaces
-	 * on demand, like a virtual one but which relies on an existinf lower
-	 * level interface to initiate the connection.
-	 *
-	 * An example for such a protocol is "pppoe".
-	 *
-	 * This function exists for backwards compatibility with older code
-	 * but should not be used anymore.
-	 *
-	 * @deprecated
-	 * @returns {boolean}
-	 * Returns a boolean indicating whether this protocol is floating (`true`)
-	 * or not (`false`).
-	 */
-	isFloating: function() {
-		return false;
-	},
-
-	/**
-	 * Checks whether this logical interface is dynamic.
-	 *
-	 * A dynamic interface is an interface which has been created at runtime,
-	 * e.g. as sub-interface of another interface, but which is not backed by
-	 * any user configuration. Such dynamic interfaces cannot be edited but
-	 * only brought down or restarted.
-	 *
-	 * @returns {boolean}
-	 * Returns a boolean indicating whether this interface is dynamic (`true`)
-	 * or not (`false`).
-	 */
-	isDynamic: function() {
-		return (this._ubus('dynamic') == true);
-	},
-
-	/**
-	 * Checks whether this interface is an alias interface.
-	 *
-	 * Alias interfaces are interfaces layering on top of another interface
-	 * and are denoted by a special `@interfacename` notation in the
-	 * underlying `ifname` option.
-	 *
-	 * @returns {null|string}
-	 * Returns the name of the parent interface if this logical interface
-	 * is an alias or `null` if it is not an alias interface.
-	 */
-	isAlias: function() {
-		var ifnames = L.toArray(uci.get('network', this.sid, 'ifname')),
-		    parent = null;
-
-		for (var i = 0; i < ifnames.length; i++)
-			if (ifnames[i].charAt(0) == '@')
-				parent = ifnames[i].substr(1);
-			else if (parent != null)
-				parent = null;
-
-		return parent;
-	},
-
-	/**
-	 * Checks whether this logical interface is "empty", meaning that ut
-	 * has no network devices attached.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if this logical interface is empty, else `false`.
-	 */
-	isEmpty: function() {
-		if (this.isFloating())
-			return false;
-
-		var empty = true,
-		    ifname = this._get('ifname');
-
-		if (ifname != null && ifname.match(/\S+/))
-			empty = false;
-
-		if (empty == true && getWifiNetidBySid(this.sid) != null)
-			empty = false;
-
-		return empty;
-	},
-
-	/**
-	 * Checks whether this logical interface is configured and running.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the interface is active or `false` when it is not.
-	 */
-	isUp: function() {
-		return (this._ubus('up') == true);
-	},
-
-	/**
-	 * Add the given network device to the logical interface.
-	 *
-	 * @param {LuCI.network.Protocol|LuCI.network.Device|LuCI.network.WifiDevice|LuCI.network.WifiNetwork|string} device
-	 * The object or device name to add to the logical interface. In case the
-	 * given argument is not a string, it is resolved though the
-	 * {@link LuCI.network#getIfnameOf Network.getIfnameOf()} function.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the device name has been added or `false` if any
-	 * argument was invalid, if the device was already part of the logical
-	 * interface or if the logical interface is virtual.
-	 */
-	addDevice: function(ifname) {
-		ifname = ifnameOf(ifname);
-
-		if (ifname == null || this.isFloating())
-			return false;
-
-		var wif = getWifiSidByIfname(ifname);
-
-		if (wif != null)
-			return appendValue('wireless', wif, 'network', this.sid);
-
-		return appendValue('network', this.sid, 'ifname', ifname);
-	},
-
-	/**
-	 * Remove the given network device from the logical interface.
-	 *
-	 * @param {LuCI.network.Protocol|LuCI.network.Device|LuCI.network.WifiDevice|LuCI.network.WifiNetwork|string} device
-	 * The object or device name to remove from the logical interface. In case
-	 * the given argument is not a string, it is resolved though the
-	 * {@link LuCI.network#getIfnameOf Network.getIfnameOf()} function.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the device name has been added or `false` if any
-	 * argument was invalid, if the device was already part of the logical
-	 * interface or if the logical interface is virtual.
-	 */
-	deleteDevice: function(ifname) {
-		var rv = false;
-
-		ifname = ifnameOf(ifname);
-
-		if (ifname == null || this.isFloating())
-			return false;
-
-		var wif = getWifiSidByIfname(ifname);
-
-		if (wif != null)
-			rv = removeValue('wireless', wif, 'network', this.sid);
-
-		if (removeValue('network', this.sid, 'ifname', ifname))
-			rv = true;
-
-		return rv;
-	},
-
-	/**
-	 * Returns the Linux network device associated with this logical
-	 * interface.
-	 *
-	 * @returns {LuCI.network.Device}
-	 * Returns a `Network.Device` class instance representing the
-	 * expected Linux network device according to the configuration.
-	 */
-	getDevice: function() {
-		if (this.isVirtual()) {
-			var ifname = '%s-%s'.format(this.getProtocol(), this.sid);
-			_state.isTunnel[this.getProtocol() + '-' + this.sid] = true;
-			return Network.prototype.instantiateDevice(ifname, this);
-		}
-		else if (this.isBridge()) {
-			var ifname = 'br-%s'.format(this.sid);
-			_state.isBridge[ifname] = true;
-			return new Device(ifname, this);
-		}
-		else {
-			var ifnames = L.toArray(uci.get('network', this.sid, 'ifname'));
-
-			for (var i = 0; i < ifnames.length; i++) {
-				var m = ifnames[i].match(/^([^:/]+)/);
-				return ((m && m[1]) ? Network.prototype.instantiateDevice(m[1], this) : null);
-			}
-
-			ifname = getWifiNetidByNetname(this.sid);
-
-			return (ifname != null ? Network.prototype.instantiateDevice(ifname[0], this) : null);
-		}
-	},
-
-	/**
-	 * Returns the layer 2 linux network device currently associated
-	 * with this logical interface.
-	 *
-	 * @returns {LuCI.network.Device}
-	 * Returns a `Network.Device` class instance representing the Linux
-	 * network device currently associated with the logical interface.
-	 */
-	getL2Device: function() {
-		var ifname = this._ubus('device');
-		return (ifname != null ? Network.prototype.instantiateDevice(ifname, this) : null);
-	},
-
-	/**
-	 * Returns the layer 3 linux network device currently associated
-	 * with this logical interface.
-	 *
-	 * @returns {LuCI.network.Device}
-	 * Returns a `Network.Device` class instance representing the Linux
-	 * network device currently associated with the logical interface.
-	 */
-	getL3Device: function() {
-		var ifname = this._ubus('l3_device');
-		return (ifname != null ? Network.prototype.instantiateDevice(ifname, this) : null);
-	},
-
-	/**
-	 * Returns a list of network sub-devices associated with this logical
-	 * interface.
-	 *
-	 * @returns {null|Array<LuCI.network.Device>}
-	 * Returns an array of of `Network.Device` class instances representing
-	 * the sub-devices attached to this logical interface or `null` if the
-	 * logical interface does not support sub-devices, e.g. because it is
-	 * virtual and not a bridge.
-	 */
-	getDevices: function() {
-		var rv = [];
-
-		if (!this.isBridge() && !(this.isVirtual() && !this.isFloating()))
-			return null;
-
-		var ifnames = L.toArray(uci.get('network', this.sid, 'ifname'));
-
-		for (var i = 0; i < ifnames.length; i++) {
-			if (ifnames[i].charAt(0) == '@')
-				continue;
-
-			var m = ifnames[i].match(/^([^:/]+)/);
-			if (m != null)
-				rv.push(Network.prototype.instantiateDevice(m[1], this));
-		}
-
-		var uciWifiIfaces = uci.sections('wireless', 'wifi-iface');
-
-		for (var i = 0; i < uciWifiIfaces.length; i++) {
-			if (typeof(uciWifiIfaces[i].device) != 'string')
-				continue;
-
-			var networks = L.toArray(uciWifiIfaces[i].network);
-
-			for (var j = 0; j < networks.length; j++) {
-				if (networks[j] != this.sid)
-					continue;
-
-				var netid = getWifiNetidBySid(uciWifiIfaces[i]['.name']);
-
-				if (netid != null)
-					rv.push(Network.prototype.instantiateDevice(netid[0], this));
-			}
-		}
-
-		rv.sort(deviceSort);
-
-		return rv;
-	},
-
-	/**
-	 * Checks whether this logical interface contains the given device
-	 * object.
-	 *
-	 * @param {LuCI.network.Protocol|LuCI.network.Device|LuCI.network.WifiDevice|LuCI.network.WifiNetwork|string} device
-	 * The object or device name to check. In case the given argument is not
-	 * a string, it is resolved though the
-	 * {@link LuCI.network#getIfnameOf Network.getIfnameOf()} function.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when this logical interface contains the given network
-	 * device or `false` if not.
-	 */
-	containsDevice: function(ifname) {
-		ifname = ifnameOf(ifname);
-
-		if (ifname == null)
-			return false;
-		else if (this.isVirtual() && '%s-%s'.format(this.getProtocol(), this.sid) == ifname)
-			return true;
-		else if (this.isBridge() && 'br-%s'.format(this.sid) == ifname)
-			return true;
-
-		var ifnames = L.toArray(uci.get('network', this.sid, 'ifname'));
-
-		for (var i = 0; i < ifnames.length; i++) {
-			var m = ifnames[i].match(/^([^:/]+)/);
-			if (m != null && m[1] == ifname)
-				return true;
-		}
-
-		var wif = getWifiSidByIfname(ifname);
-
-		if (wif != null) {
-			var networks = L.toArray(uci.get('wireless', wif, 'network'));
-
-			for (var i = 0; i < networks.length; i++)
-				if (networks[i] == this.sid)
-					return true;
-		}
-
-		return false;
-	},
-
-	/**
-	 * Cleanup related configuration entries.
-	 *
-	 * This function will be invoked if an interface is about to be removed
-	 * from the configuration and is responsible for performing any required
-	 * cleanup tasks, such as unsetting uci entries in related configurations.
-	 *
-	 * It should be overwritten by protocol specific subclasses.
-	 *
-	 * @abstract
-	 *
-	 * @returns {*|Promise<*>}
-	 * This function may return a promise which is awaited before the rest of
-	 * the configuration is removed. Any non-promise return value and any
-	 * resolved promise value is ignored. If the returned promise is rejected,
-	 * the interface removal will be aborted.
-	 */
-	deleteConfiguration: function() {}
-});
-
-/**
- * @class
- * @memberof LuCI.network
- * @hideconstructor
- * @classdesc
- *
- * A `Network.Device` class instance represents an underlying Linux network
- * device and allows querying device details such as packet statistics or MTU.
- */
-Device = baseclass.extend(/** @lends LuCI.network.Device.prototype */ {
-	__init__: function(ifname, network) {
-		var wif = getWifiSidByIfname(ifname);
-
-		if (wif != null) {
-			var res = getWifiStateBySid(wif) || [],
-			    netid = getWifiNetidBySid(wif) || [];
-
-			this.wif    = new WifiNetwork(wif, res[0], res[1], netid[0], res[2], { ifname: ifname });
-			this.ifname = this.wif.getIfname();
-		}
-
-		this.ifname  = this.ifname || ifname;
-		this.dev     = _state.netdevs[this.ifname];
-		this.network = network;
-	},
-
-	_devstate: function(/* ... */) {
-		var rv = this.dev;
-
-		for (var i = 0; i < arguments.length; i++)
-			if (L.isObject(rv))
-				rv = rv[arguments[i]];
-			else
-				return null;
-
-		return rv;
-	},
-
-	/**
-	 * Get the name of the network device.
-	 *
-	 * @returns {string}
-	 * Returns the name of the device, e.g. `eth0` or `wlan0`.
-	 */
-	getName: function() {
-		return (this.wif != null ? this.wif.getIfname() : this.ifname);
-	},
-
-	/**
-	 * Get the MAC address of the device.
-	 *
-	 * @returns {null|string}
-	 * Returns the MAC address of the device or `null` if not applicable,
-	 * e.g. for non-ethernet tunnel devices.
-	 */
-	getMAC: function() {
-		var mac = this._devstate('macaddr');
-		return mac ? mac.toUpperCase() : null;
-	},
-
-	/**
-	 * Get the MTU of the device.
-	 *
-	 * @returns {number}
-	 * Returns the MTU of the device.
-	 */
-	getMTU: function() {
-		return this._devstate('mtu');
-	},
-
-	/**
-	 * Get the IPv4 addresses configured on the device.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv4 address strings.
-	 */
-	getIPAddrs: function() {
-		var addrs = this._devstate('ipaddrs');
-		return (Array.isArray(addrs) ? addrs : []);
-	},
-
-	/**
-	 * Get the IPv6 addresses configured on the device.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of IPv6 address strings.
-	 */
-	getIP6Addrs: function() {
-		var addrs = this._devstate('ip6addrs');
-		return (Array.isArray(addrs) ? addrs : []);
-	},
-
-	/**
-	 * Get the type of the device..
-	 *
-	 * @returns {string}
-	 * Returns a string describing the type of the network device:
-	 *  - `alias` if it is an abstract alias device (`@` notation)
-	 *  - `wifi` if it is a wireless interface (e.g. `wlan0`)
-	 *  - `bridge` if it is a bridge device (e.g. `br-lan`)
-	 *  - `tunnel` if it is a tun or tap device (e.g. `tun0`)
-	 *  - `vlan` if it is a vlan device (e.g. `eth0.1`)
-	 *  - `switch` if it is a switch device (e.g.`eth1` connected to switch0)
-	 *  - `ethernet` for all other device types
-	 */
-	getType: function() {
-		if (this.ifname != null && this.ifname.charAt(0) == '@')
-			return 'alias';
-		else if (this.wif != null || isWifiIfname(this.ifname))
-			return 'wifi';
-		else if (_state.isBridge[this.ifname])
-			return 'bridge';
-		else if (_state.isTunnel[this.ifname])
-			return 'tunnel';
-		else if (this.ifname.indexOf('.') > -1)
-			return 'vlan';
-		else if (_state.isSwitch[this.ifname])
-			return 'switch';
-		else
-			return 'ethernet';
-	},
-
-	/**
-	 * Get a short description string for the device.
-	 *
-	 * @returns {string}
-	 * Returns the device name for non-wifi devices or a string containing
-	 * the operation mode and SSID for wifi devices.
-	 */
-	getShortName: function() {
-		if (this.wif != null)
-			return this.wif.getShortName();
-
-		return this.ifname;
-	},
-
-	/**
-	 * Get a long description string for the device.
-	 *
-	 * @returns {string}
-	 * Returns a string containing the type description and device name
-	 * for non-wifi devices or operation mode and ssid for wifi ones.
-	 */
-	getI18n: function() {
-		if (this.wif != null) {
-			return '%s: %s "%s"'.format(
-				_('Wireless Network'),
-				this.wif.getActiveMode(),
-				this.wif.getActiveSSID() || this.wif.getActiveBSSID() || this.wif.getID() || '?');
-		}
-
-		return '%s: "%s"'.format(this.getTypeI18n(), this.getName());
-	},
-
-	/**
-	 * Get a string describing the device type.
-	 *
-	 * @returns {string}
-	 * Returns a string describing the type, e.g. "Wireless Adapter" or
-	 * "Bridge".
-	 */
-	getTypeI18n: function() {
-		switch (this.getType()) {
-		case 'alias':
-			return _('Alias Interface');
-
-		case 'wifi':
-			return _('Wireless Adapter');
-
-		case 'bridge':
-			return _('Bridge');
-
-		case 'switch':
-			return _('Ethernet Switch');
-
-		case 'vlan':
-			return (_state.isSwitch[this.ifname] ? _('Switch VLAN') : _('Software VLAN'));
-
-		case 'tunnel':
-			return _('Tunnel Interface');
-
-		default:
-			return _('Ethernet Adapter');
-		}
-	},
-
-	/**
-	 * Get the associated bridge ports of the device.
-	 *
-	 * @returns {null|Array<LuCI.network.Device>}
-	 * Returns an array of `Network.Device` instances representing the ports
-	 * (slave interfaces) of the bridge or `null` when this device isn't
-	 * a Linux bridge.
-	 */
-	getPorts: function() {
-		var br = _state.bridges[this.ifname],
-		    rv = [];
-
-		if (br == null || !Array.isArray(br.ifnames))
-			return null;
-
-		for (var i = 0; i < br.ifnames.length; i++)
-			rv.push(Network.prototype.instantiateDevice(br.ifnames[i].name));
-
-		rv.sort(deviceSort);
-
-		return rv;
-	},
-
-	/**
-	 * Get the bridge ID
-	 *
-	 * @returns {null|string}
-	 * Returns the ID of this network bridge or `null` if this network
-	 * device is not a Linux bridge.
-	 */
-	getBridgeID: function() {
-		var br = _state.bridges[this.ifname];
-		return (br != null ? br.id : null);
-	},
-
-	/**
-	 * Get the bridge STP setting
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when this device is a Linux bridge and has `stp`
-	 * enabled, else `false`.
-	 */
-	getBridgeSTP: function() {
-		var br = _state.bridges[this.ifname];
-		return (br != null ? !!br.stp : false);
-	},
-
-	/**
-	 * Checks whether this device is up.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the associated device is running pr `false`
-	 * when it is down or absent.
-	 */
-	isUp: function() {
-		var up = this._devstate('flags', 'up');
-
-		if (up == null)
-			up = (this.getType() == 'alias');
-
-		return up;
-	},
-
-	/**
-	 * Checks whether this device is a Linux bridge.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the network device is present and a Linux bridge,
-	 * else `false`.
-	 */
-	isBridge: function() {
-		return (this.getType() == 'bridge');
-	},
-
-	/**
-	 * Checks whether this device is part of a Linux bridge.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when this network device is part of a bridge,
-	 * else `false`.
-	 */
-	isBridgePort: function() {
-		return (this._devstate('bridge') != null);
-	},
-
-	/**
-	 * Get the amount of transmitted bytes.
-	 *
-	 * @returns {number}
-	 * Returns the amount of bytes transmitted by the network device.
-	 */
-	getTXBytes: function() {
-		var stat = this._devstate('stats');
-		return (stat != null ? stat.tx_bytes || 0 : 0);
-	},
-
-	/**
-	 * Get the amount of received bytes.
-	 *
-	 * @returns {number}
-	 * Returns the amount of bytes received by the network device.
-	 */
-	getRXBytes: function() {
-		var stat = this._devstate('stats');
-		return (stat != null ? stat.rx_bytes || 0 : 0);
-	},
-
-	/**
-	 * Get the amount of transmitted packets.
-	 *
-	 * @returns {number}
-	 * Returns the amount of packets transmitted by the network device.
-	 */
-	getTXPackets: function() {
-		var stat = this._devstate('stats');
-		return (stat != null ? stat.tx_packets || 0 : 0);
-	},
-
-	/**
-	 * Get the amount of received packets.
-	 *
-	 * @returns {number}
-	 * Returns the amount of packets received by the network device.
-	 */
-	getRXPackets: function() {
-		var stat = this._devstate('stats');
-		return (stat != null ? stat.rx_packets || 0 : 0);
-	},
-
-	/**
-	 * Get the primary logical interface this device is assigned to.
-	 *
-	 * @returns {null|LuCI.network.Protocol}
-	 * Returns a `Network.Protocol` instance representing the logical
-	 * interface this device is attached to or `null` if it is not
-	 * assigned to any logical interface.
-	 */
-	getNetwork: function() {
-		return this.getNetworks()[0];
-	},
-
-	/**
-	 * Get the logical interfaces this device is assigned to.
-	 *
-	 * @returns {Array<LuCI.network.Protocol>}
-	 * Returns an array of `Network.Protocol` instances representing the
-	 * logical interfaces this device is assigned to.
-	 */
-	getNetworks: function() {
-		if (this.networks == null) {
-			this.networks = [];
-
-			var networks = enumerateNetworks.apply(L.network);
-
-			for (var i = 0; i < networks.length; i++)
-				if (networks[i].containsDevice(this.ifname) || networks[i].getIfname() == this.ifname)
-					this.networks.push(networks[i]);
-
-			this.networks.sort(networkSort);
-		}
-
-		return this.networks;
-	},
-
-	/**
-	 * Get the related wireless network this device is related to.
-	 *
-	 * @returns {null|LuCI.network.WifiNetwork}
-	 * Returns a `Network.WifiNetwork` instance representing the wireless
-	 * network corresponding to this network device or `null` if this device
-	 * is not a wireless device.
-	 */
-	getWifiNetwork: function() {
-		return (this.wif != null ? this.wif : null);
-	}
-});
-
-/**
- * @class
- * @memberof LuCI.network
- * @hideconstructor
- * @classdesc
- *
- * A `Network.WifiDevice` class instance represents a wireless radio device
- * present on the system and provides wireless capability information as
- * well as methods for enumerating related wireless networks.
- */
-WifiDevice = baseclass.extend(/** @lends LuCI.network.WifiDevice.prototype */ {
-	__init__: function(name, radiostate) {
-		var uciWifiDevice = uci.get('wireless', name);
-
-		if (uciWifiDevice != null &&
-		    uciWifiDevice['.type'] == 'wifi-device' &&
-		    uciWifiDevice['.name'] != null) {
-			this.sid    = uciWifiDevice['.name'];
-		}
-
-		this.sid    = this.sid || name;
-		this._ubusdata = {
-			radio: name,
-			dev:   radiostate
-		};
-	},
-
-	/* private */
-	ubus: function(/* ... */) {
-		var v = this._ubusdata;
-
-		for (var i = 0; i < arguments.length; i++)
-			if (L.isObject(v))
-				v = v[arguments[i]];
-			else
-				return null;
-
-		return v;
-	},
-
-	/**
-	 * Read the given UCI option value of this wireless device.
-	 *
-	 * @param {string} opt
-	 * The UCI option name to read.
-	 *
-	 * @returns {null|string|string[]}
-	 * Returns the UCI option value or `null` if the requested option is
-	 * not found.
-	 */
-	get: function(opt) {
-		return uci.get('wireless', this.sid, opt);
-	},
-
-	/**
-	 * Set the given UCI option of this network to the given value.
-	 *
-	 * @param {string} opt
-	 * The name of the UCI option to set.
-	 *
-	 * @param {null|string|string[]} val
-	 * The value to set or `null` to remove the given option from the
-	 * configuration.
-	 */
-	set: function(opt, value) {
-		return uci.set('wireless', this.sid, opt, value);
-	},
-
-	/**
-	 * Checks whether this wireless radio is disabled.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the wireless radio is marked as disabled in `ubus`
-	 * runtime state or when the `disabled` option is set in the corresponding
-	 * UCI configuration.
-	 */
-	isDisabled: function() {
-		return this.ubus('dev', 'disabled') || this.get('disabled') == '1';
-	},
-
-	/**
-	 * Get the configuration name of this wireless radio.
-	 *
-	 * @returns {string}
-	 * Returns the UCI section name (e.g. `radio0`) of the corresponding
-	 * radio configuration which also serves as unique logical identifier
-	 * for the wireless phy.
-	 */
-	getName: function() {
-		return this.sid;
-	},
-
-	/**
-	 * Gets a list of supported hwmodes.
-	 *
-	 * The hwmode values describe the frequency band and wireless standard
-	 * versions supported by the wireless phy.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of valid hwmode values for this radio. Currently
-	 * known mode values are:
-	 *  - `a` - Legacy 802.11a mode, 5 GHz, up to 54 Mbit/s
-	 *  - `b` - Legacy 802.11b mode, 2.4 GHz, up to 11 Mbit/s
-	 *  - `g` - Legacy 802.11g mode, 2.4 GHz, up to 54 Mbit/s
-	 *  - `n` - IEEE 802.11n mode, 2.4 or 5 GHz, up to 600 Mbit/s
-	 *  - `ac` - IEEE 802.11ac mode, 5 GHz, up to 6770 Mbit/s
-	 */
-	getHWModes: function() {
-		var hwmodes = this.ubus('dev', 'iwinfo', 'hwmodes');
-		return Array.isArray(hwmodes) ? hwmodes : [ 'b', 'g' ];
-	},
-
-	/**
-	 * Gets a list of supported htmodes.
-	 *
-	 * The htmode values describe the wide-frequency options supported by
-	 * the wireless phy.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of valid htmode values for this radio. Currently
-	 * known mode values are:
-	 *  - `HT20` - applicable to IEEE 802.11n, 20 MHz wide channels
-	 *  - `HT40` - applicable to IEEE 802.11n, 40 MHz wide channels
-	 *  - `VHT20` - applicable to IEEE 802.11ac, 20 MHz wide channels
-	 *  - `VHT40` - applicable to IEEE 802.11ac, 40 MHz wide channels
-	 *  - `VHT80` - applicable to IEEE 802.11ac, 80 MHz wide channels
-	 *  - `VHT160` - applicable to IEEE 802.11ac, 160 MHz wide channels
-	 */
-	getHTModes: function() {
-		var htmodes = this.ubus('dev', 'iwinfo', 'htmodes');
-		return (Array.isArray(htmodes) && htmodes.length) ? htmodes : null;
-	},
-
-	/**
-	 * Get a string describing the wireless radio hardware.
-	 *
-	 * @returns {string}
-	 * Returns the description string.
-	 */
-	getI18n: function() {
-		var hw = this.ubus('dev', 'iwinfo', 'hardware'),
-		    type = L.isObject(hw) ? hw.name : null;
-
-		if (this.ubus('dev', 'iwinfo', 'type') == 'wl')
-			type = 'Broadcom';
-
-		var hwmodes = this.getHWModes(),
-		    modestr = '';
-
-		hwmodes.sort(function(a, b) {
-			return (a.length != b.length ? a.length > b.length : a > b);
-		});
-
-		modestr = hwmodes.join('');
-
-		return '%s 802.11%s Wireless Controller (%s)'.format(type || 'Generic', modestr, this.getName());
-	},
-
-	/**
-	 * A wireless scan result object describes a neighbouring wireless
-	 * network found in the vincinity.
-	 *
-	 * @typedef {Object<string, number|string|LuCI.network.WifiEncryption>} WifiScanResult
-	 * @memberof LuCI.network
-	 *
-	 * @property {string} ssid
-	 * The SSID / Mesh ID of the network.
-	 *
-	 * @property {string} bssid
-	 * The BSSID if the network.
-	 *
-	 * @property {string} mode
-	 * The operation mode of the network (`Master`, `Ad-Hoc`, `Mesh Point`).
-	 *
-	 * @property {number} channel
-	 * The wireless channel of the network.
-	 *
-	 * @property {number} signal
-	 * The received signal strength of the network in dBm.
-	 *
-	 * @property {number} quality
-	 * The numeric quality level of the signal, can be used in conjunction
-	 * with `quality_max` to calculate a quality percentage.
-	 *
-	 * @property {number} quality_max
-	 * The maximum possible quality level of the signal, can be used in
-	 * conjunction with `quality` to calculate a quality percentage.
-	 *
-	 * @property {LuCI.network.WifiEncryption} encryption
-	 * The encryption used by the wireless network.
-	 */
-
-	/**
-	 * Trigger a wireless scan on this radio device and obtain a list of
-	 * nearby networks.
-	 *
-	 * @returns {Promise<Array<LuCI.network.WifiScanResult>>}
-	 * Returns a promise resolving to an array of scan result objects
-	 * describing the networks found in the vincinity.
-	 */
-	getScanList: function() {
-		return callIwinfoScan(this.sid);
-	},
-
-	/**
-	 * Check whether the wireless radio is marked as up in the `ubus`
-	 * runtime state.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the radio device is up, else `false`.
-	 */
-	isUp: function() {
-		if (L.isObject(_state.radios[this.sid]))
-			return (_state.radios[this.sid].up == true);
-
-		return false;
-	},
-
-	/**
-	 * Get the wifi network of the given name belonging to this radio device
-	 *
-	 * @param {string} network
-	 * The name of the wireless network to lookup. This may be either an uci
-	 * configuration section ID, a network ID in the form `radio#.network#`
-	 * or a Linux network device name like `wlan0` which is resolved to the
-	 * corresponding configuration section through `ubus` runtime information.
-	 *
-	 * @returns {Promise<LuCI.network.WifiNetwork>}
-	 * Returns a promise resolving to a `Network.WifiNetwork` instance
-	 * representing the wireless network and rejecting with `null` if
-	 * the given network could not be found or is not associated with
-	 * this radio device.
-	 */
-	getWifiNetwork: function(network) {
-		return Network.prototype.getWifiNetwork(network).then(L.bind(function(networkInstance) {
-			var uciWifiIface = (networkInstance.sid ? uci.get('wireless', networkInstance.sid) : null);
-
-			if (uciWifiIface == null || uciWifiIface['.type'] != 'wifi-iface' || uciWifiIface.device != this.sid)
-				return Promise.reject();
-
-			return networkInstance;
-		}, this));
-	},
-
-	/**
-	 * Get all wireless networks associated with this wireless radio device.
-	 *
-	 * @returns {Promise<Array<LuCI.network.WifiNetwork>>}
-	 * Returns a promise resolving to an array of `Network.WifiNetwork`
-	 * instances respresenting the wireless networks associated with this
-	 * radio device.
-	 */
-	getWifiNetworks: function() {
-		return Network.prototype.getWifiNetworks().then(L.bind(function(networks) {
-			var rv = [];
-
-			for (var i = 0; i < networks.length; i++)
-				if (networks[i].getWifiDeviceName() == this.getName())
-					rv.push(networks[i]);
-
-			return rv;
-		}, this));
-	},
-
-	/**
-	 * Adds a new wireless network associated with this radio device to the
-	 * configuration and sets its options to the provided values.
-	 *
-	 * @param {Object<string, string|string[]>} [options]
-	 * The options to set for the newly added wireless network.
-	 *
-	 * @returns {Promise<null|LuCI.network.WifiNetwork>}
-	 * Returns a promise resolving to a `WifiNetwork` instance describing
-	 * the newly added wireless network or `null` if the given options
-	 * were invalid.
-	 */
-	addWifiNetwork: function(options) {
-		if (!L.isObject(options))
-			options = {};
-
-		options.device = this.sid;
-
-		return Network.prototype.addWifiNetwork(options);
-	},
-
-	/**
-	 * Deletes the wireless network with the given name associated with this
-	 * radio device.
-	 *
-	 * @param {string} network
-	 * The name of the wireless network to lookup. This may be either an uci
-	 * configuration section ID, a network ID in the form `radio#.network#`
-	 * or a Linux network device name like `wlan0` which is resolved to the
-	 * corresponding configuration section through `ubus` runtime information.
-	 *
-	 * @returns {Promise<boolean>}
-	 * Returns a promise resolving to `true` when the wireless network was
-	 * successfully deleted from the configuration or `false` when the given
-	 * network could not be found or if the found network was not associated
-	 * with this wireless radio device.
-	 */
-	deleteWifiNetwork: function(network) {
-		var sid = null;
-
-		if (network instanceof WifiNetwork) {
-			sid = network.sid;
-		}
-		else {
-			var uciWifiIface = uci.get('wireless', network);
-
-			if (uciWifiIface == null || uciWifiIface['.type'] != 'wifi-iface')
-				sid = getWifiSidByIfname(network);
-		}
-
-		if (sid == null || uci.get('wireless', sid, 'device') != this.sid)
-			return Promise.resolve(false);
-
-		uci.delete('wireless', network);
-
-		return Promise.resolve(true);
-	}
-});
-
-/**
- * @class
- * @memberof LuCI.network
- * @hideconstructor
- * @classdesc
- *
- * A `Network.WifiNetwork` instance represents a wireless network (vif)
- * configured on top of a radio device and provides functions for querying
- * the runtime state of the network. Most radio devices support multiple
- * such networks in parallel.
- */
-WifiNetwork = baseclass.extend(/** @lends LuCI.network.WifiNetwork.prototype */ {
-	__init__: function(sid, radioname, radiostate, netid, netstate, hostapd) {
-		this.sid    = sid;
-		this.netid  = netid;
-		this._ubusdata = {
-			hostapd: hostapd,
-			radio:   radioname,
-			dev:     radiostate,
-			net:     netstate
-		};
-	},
-
-	ubus: function(/* ... */) {
-		var v = this._ubusdata;
-
-		for (var i = 0; i < arguments.length; i++)
-			if (L.isObject(v))
-				v = v[arguments[i]];
-			else
-				return null;
-
-		return v;
-	},
-
-	/**
-	 * Read the given UCI option value of this wireless network.
-	 *
-	 * @param {string} opt
-	 * The UCI option name to read.
-	 *
-	 * @returns {null|string|string[]}
-	 * Returns the UCI option value or `null` if the requested option is
-	 * not found.
-	 */
-	get: function(opt) {
-		return uci.get('wireless', this.sid, opt);
-	},
-
-	/**
-	 * Set the given UCI option of this network to the given value.
-	 *
-	 * @param {string} opt
-	 * The name of the UCI option to set.
-	 *
-	 * @param {null|string|string[]} val
-	 * The value to set or `null` to remove the given option from the
-	 * configuration.
-	 */
-	set: function(opt, value) {
-		return uci.set('wireless', this.sid, opt, value);
-	},
-
-	/**
-	 * Checks whether this wireless network is disabled.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the wireless radio is marked as disabled in `ubus`
-	 * runtime state or when the `disabled` option is set in the corresponding
-	 * UCI configuration.
-	 */
-	isDisabled: function() {
-		return this.ubus('dev', 'disabled') || this.get('disabled') == '1';
-	},
-
-	/**
-	 * Get the configured operation mode of the wireless network.
-	 *
-	 * @returns {string}
-	 * Returns the configured operation mode. Possible values are:
-	 *  - `ap` - Master (Access Point) mode
-	 *  - `sta` - Station (client) mode
-	 *  - `adhoc` - Ad-Hoc (IBSS) mode
-	 *  - `mesh` - Mesh (IEEE 802.11s) mode
-	 *  - `monitor` - Monitor mode
-	 */
-	getMode: function() {
-		return this.ubus('net', 'config', 'mode') || this.get('mode') || 'ap';
-	},
-
-	/**
-	 * Get the configured SSID of the wireless network.
-	 *
-	 * @returns {null|string}
-	 * Returns the configured SSID value or `null` when this network is
-	 * in mesh mode.
-	 */
-	getSSID: function() {
-		if (this.getMode() == 'mesh')
-			return null;
-
-		return this.ubus('net', 'config', 'ssid') || this.get('ssid');
-	},
-
-	/**
-	 * Get the configured Mesh ID of the wireless network.
-	 *
-	 * @returns {null|string}
-	 * Returns the configured mesh ID value or `null` when this network
-	 * is not in mesh mode.
-	 */
-	getMeshID: function() {
-		if (this.getMode() != 'mesh')
-			return null;
-
-		return this.ubus('net', 'config', 'mesh_id') || this.get('mesh_id');
-	},
-
-	/**
-	 * Get the configured BSSID of the wireless network.
-	 *
-	 * @returns {null|string}
-	 * Returns the BSSID value or `null` if none has been specified.
-	 */
-	getBSSID: function() {
-		return this.ubus('net', 'config', 'bssid') || this.get('bssid');
-	},
-
-	/**
-	 * Get the names of the logical interfaces this wireless network is
-	 * attached to.
-	 *
-	 * @returns {string[]}
-	 * Returns an array of logical interface names.
-	 */
-	getNetworkNames: function() {
-		return L.toArray(this.ubus('net', 'config', 'network') || this.get('network'));
-	},
-
-	/**
-	 * Get the internal network ID of this wireless network.
-	 *
-	 * The network ID is a LuCI specific identifer in the form
-	 * `radio#.network#` to identify wireless networks by their corresponding
-	 * radio and network index numbers.
-	 *
-	 * @returns {string}
-	 * Returns the LuCI specific network ID.
-	 */
-	getID: function() {
-		return this.netid;
-	},
-
-	/**
-	 * Get the configuration ID of this wireless network.
-	 *
-	 * @returns {string}
-	 * Returns the corresponding UCI section ID of the network.
-	 */
-	getName: function() {
-		return this.sid;
-	},
-
-	/**
-	 * Get the Linux network device name.
-	 *
-	 * @returns {null|string}
-	 * Returns the current Linux network device name as resolved from
-	 * `ubus` runtime information or `null` if this network has no
-	 * associated network device, e.g. when not configured or up.
-	 */
-	getIfname: function() {
-		var ifname = this.ubus('net', 'ifname') || this.ubus('net', 'iwinfo', 'ifname');
-
-		if (ifname == null || ifname.match(/^(wifi|radio)\d/))
-			ifname = this.netid;
-
-		return ifname;
-	},
-
-	/**
-	 * Get the name of the corresponding wifi radio device.
-	 *
-	 * @returns {null|string}
-	 * Returns the name of the radio device this network is configured on
-	 * or `null` if it cannot be determined.
-	 */
-	getWifiDeviceName: function() {
-		return this.ubus('radio') || this.get('device');
-	},
-
-	/**
-	 * Get the corresponding wifi radio device.
-	 *
-	 * @returns {null|LuCI.network.WifiDevice}
-	 * Returns a `Network.WifiDevice` instance representing the corresponding
-	 * wifi radio device or `null` if the related radio device could not be
-	 * found.
-	 */
-	getWifiDevice: function() {
-		var radioname = this.getWifiDeviceName();
-
-		if (radioname == null)
-			return Promise.reject();
-
-		return Network.prototype.getWifiDevice(radioname);
-	},
-
-	/**
-	 * Check whether the radio network is up.
-	 *
-	 * This function actually queries the up state of the related radio
-	 * device and assumes this network to be up as well when the parent
-	 * radio is up. This is due to the fact that OpenWrt does not control
-	 * virtual interfaces individually but within one common hostapd
-	 * instance.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when the network is up, else `false`.
-	 */
-	isUp: function() {
-		var device = this.getDevice();
-
-		if (device == null)
-			return false;
-
-		return device.isUp();
-	},
-
-	/**
-	 * Query the current operation mode from runtime information.
-	 *
-	 * @returns {string}
-	 * Returns the human readable mode name as reported by `ubus` runtime
-	 * state. Possible returned values are:
-	 *  - `Master`
-	 *  - `Ad-Hoc`
-	 *  - `Client`
-	 *  - `Monitor`
-	 *  - `Master (VLAN)`
-	 *  - `WDS`
-	 *  - `Mesh Point`
-	 *  - `P2P Client`
-	 *  - `P2P Go`
-	 *  - `Unknown`
-	 */
-	getActiveMode: function() {
-		var mode = this.ubus('net', 'iwinfo', 'mode') || this.ubus('net', 'config', 'mode') || this.get('mode') || 'ap';
-
-		switch (mode) {
-		case 'ap':      return 'Master';
-		case 'sta':     return 'Client';
-		case 'adhoc':   return 'Ad-Hoc';
-		case 'mesh':    return 'Mesh';
-		case 'monitor': return 'Monitor';
-		default:        return mode;
-		}
-	},
-
-	/**
-	 * Query the current operation mode from runtime information as
-	 * translated string.
-	 *
-	 * @returns {string}
-	 * Returns the translated, human readable mode name as reported by
-	 *`ubus` runtime state.
-	 */
-	getActiveModeI18n: function() {
-		var mode = this.getActiveMode();
-
-		switch (mode) {
-		case 'Master':  return _('Master');
-		case 'Client':  return _('Client');
-		case 'Ad-Hoc':  return _('Ad-Hoc');
-		case 'Mash':    return _('Mesh');
-		case 'Monitor': return _('Monitor');
-		default:        return mode;
-		}
-	},
-
-	/**
-	 * Query the current SSID from runtime information.
-	 *
-	 * @returns {string}
-	 * Returns the current SSID or Mesh ID as reported by `ubus` runtime
-	 * information.
-	 */
-	getActiveSSID: function() {
-		return this.ubus('net', 'iwinfo', 'ssid') || this.ubus('net', 'config', 'ssid') || this.get('ssid');
-	},
-
-	/**
-	 * Query the current BSSID from runtime information.
-	 *
-	 * @returns {string}
-	 * Returns the current BSSID or Mesh ID as reported by `ubus` runtime
-	 * information.
-	 */
-	getActiveBSSID: function() {
-		return this.ubus('net', 'iwinfo', 'bssid') || this.ubus('net', 'config', 'bssid') || this.get('bssid');
-	},
-
-	/**
-	 * Query the current encryption settings from runtime information.
-	 *
-	 * @returns {string}
-	 * Returns a string describing the current encryption or `-` if the the
-	 * encryption state could not be found in `ubus` runtime information.
-	 */
-	getActiveEncryption: function() {
-		return formatWifiEncryption(this.ubus('net', 'iwinfo', 'encryption')) || '-';
-	},
-
-	/**
-	 * A wireless peer entry describes the properties of a remote wireless
-	 * peer associated with a local network.
-	 *
-	 * @typedef {Object<string, boolean|number|string|LuCI.network.WifiRateEntry>} WifiPeerEntry
-	 * @memberof LuCI.network
-	 *
-	 * @property {string} mac
-	 * The MAC address (BSSID).
-	 *
-	 * @property {number} signal
-	 * The received signal strength.
-	 *
-	 * @property {number} [signal_avg]
-	 * The average signal strength if supported by the driver.
-	 *
-	 * @property {number} [noise]
-	 * The current noise floor of the radio. May be `0` or absent if not
-	 * supported by the driver.
-	 *
-	 * @property {number} inactive
-	 * The amount of milliseconds the peer has been inactive, e.g. due
-	 * to powersave.
-	 *
-	 * @property {number} connected_time
-	 * The amount of milliseconds the peer is associated to this network.
-	 *
-	 * @property {number} [thr]
-	 * The estimated throughput of the peer, May be `0` or absent if not
-	 * supported by the driver.
-	 *
-	 * @property {boolean} authorized
-	 * Specifies whether the peer is authorized to associate to this network.
-	 *
-	 * @property {boolean} authenticated
-	 * Specifies whether the peer completed authentication to this network.
-	 *
-	 * @property {string} preamble
-	 * The preamble mode used by the peer. May be `long` or `short`.
-	 *
-	 * @property {boolean} wme
-	 * Specifies whether the peer supports WME/WMM capabilities.
-	 *
-	 * @property {boolean} mfp
-	 * Specifies whether management frame protection is active.
-	 *
-	 * @property {boolean} tdls
-	 * Specifies whether TDLS is active.
-	 *
-	 * @property {number} [mesh llid]
-	 * The mesh LLID, may be `0` or absent if not applicable or supported
-	 * by the driver.
-	 *
-	 * @property {number} [mesh plid]
-	 * The mesh PLID, may be `0` or absent if not applicable or supported
-	 * by the driver.
-	 *
-	 * @property {string} [mesh plink]
-	 * The mesh peer link state description, may be an empty string (`''`)
-	 * or absent if not applicable or supported by the driver.
-	 *
-	 * The following states are known:
-	 *  - `LISTEN`
-	 *  - `OPN_SNT`
-	 *  - `OPN_RCVD`
-	 *  - `CNF_RCVD`
-	 *  - `ESTAB`
-	 *  - `HOLDING`
-	 *  - `BLOCKED`
-	 *  - `UNKNOWN`
-	 *
-	 * @property {number} [mesh local PS]
-	 * The local powersafe mode for the peer link, may be an empty
-	 * string (`''`) or absent if not applicable or supported by
-	 * the driver.
-	 *
-	 * The following modes are known:
-	 *  - `ACTIVE` (no power save)
-	 *  - `LIGHT SLEEP`
-	 *  - `DEEP SLEEP`
-	 *  - `UNKNOWN`
-	 *
-	 * @property {number} [mesh peer PS]
-	 * The remote powersafe mode for the peer link, may be an empty
-	 * string (`''`) or absent if not applicable or supported by
-	 * the driver.
-	 *
-	 * The following modes are known:
-	 *  - `ACTIVE` (no power save)
-	 *  - `LIGHT SLEEP`
-	 *  - `DEEP SLEEP`
-	 *  - `UNKNOWN`
-	 *
-	 * @property {number} [mesh non-peer PS]
-	 * The powersafe mode for all non-peer neigbours, may be an empty
-	 * string (`''`) or absent if not applicable or supported by the driver.
-	 *
-	 * The following modes are known:
-	 *  - `ACTIVE` (no power save)
-	 *  - `LIGHT SLEEP`
-	 *  - `DEEP SLEEP`
-	 *  - `UNKNOWN`
-	 *
-	 * @property {LuCI.network.WifiRateEntry} rx
-	 * Describes the receiving wireless rate from the peer.
-	 *
-	 * @property {LuCI.network.WifiRateEntry} tx
-	 * Describes the transmitting wireless rate to the peer.
-	 */
-
-	/**
-	 * A wireless rate entry describes the properties of a wireless
-	 * transmission rate to or from a peer.
-	 *
-	 * @typedef {Object<string, boolean|number>} WifiRateEntry
-	 * @memberof LuCI.network
-	 *
-	 * @property {number} [drop_misc]
-	 * The amount of received misc. packages that have been dropped, e.g.
-	 * due to corruption or missing authentication. Only applicable to
-	 * receiving rates.
-	 *
-	 * @property {number} packets
-	 * The amount of packets that have been received or sent.
-	 *
-	 * @property {number} bytes
-	 * The amount of bytes that have been received or sent.
-	 *
-	 * @property {number} [failed]
-	 * The amount of failed tranmission attempts. Only applicable to
-	 * transmit rates.
-	 *
-	 * @property {number} [retries]
-	 * The amount of retried transmissions. Only applicable to transmit
-	 * rates.
-	 *
-	 * @property {boolean} is_ht
-	 * Specifies whether this rate is an HT (IEEE 802.11n) rate.
-	 *
-	 * @property {boolean} is_vht
-	 * Specifies whether this rate is an VHT (IEEE 802.11ac) rate.
-	 *
-	 * @property {number} mhz
-	 * The channel width in MHz used for the transmission.
-	 *
-	 * @property {number} rate
-	 * The bitrate in bit/s of the transmission.
-	 *
-	 * @property {number} [mcs]
-	 * The MCS index of the used transmission rate. Only applicable to
-	 * HT or VHT rates.
-	 *
-	 * @property {number} [40mhz]
-	 * Specifies whether the tranmission rate used 40MHz wide channel.
-	 * Only applicable to HT or VHT rates.
-	 *
-	 * Note: this option exists for backwards compatibility only and its
-	 * use is discouraged. The `mhz` field should be used instead to
-	 * determine the channel width.
-	 *
-	 * @property {boolean} [short_gi]
-	 * Specifies whether a short guard interval is used for the transmission.
-	 * Only applicable to HT or VHT rates.
-	 *
-	 * @property {number} [nss]
-	 * Specifies the number of spatial streams used by the transmission.
-	 * Only applicable to VHT rates.
-	 */
-
-	/**
-	 * Fetch the list of associated peers.
-	 *
-	 * @returns {Promise<Array<LuCI.network.WifiPeerEntry>>}
-	 * Returns a promise resolving to an array of wireless peers associated
-	 * with this network.
-	 */
-	getAssocList: function() {
-		return callIwinfoAssoclist(this.getIfname());
-	},
-
-	/**
-	 * Query the current operating frequency of the wireless network.
-	 *
-	 * @returns {null|string}
-	 * Returns the current operating frequency of the network from `ubus`
-	 * runtime information in GHz or `null` if the information is not
-	 * available.
-	 */
-	getFrequency: function() {
-		var freq = this.ubus('net', 'iwinfo', 'frequency');
-
-		if (freq != null && freq > 0)
-			return '%.03f'.format(freq / 1000);
-
-		return null;
-	},
-
-	/**
-	 * Query the current average bitrate of all peers associated to this
-	 * wireless network.
-	 *
-	 * @returns {null|number}
-	 * Returns the average bit rate among all peers associated to the network
-	 * as reported by `ubus` runtime information or `null` if the information
-	 * is not available.
-	 */
-	getBitRate: function() {
-		var rate = this.ubus('net', 'iwinfo', 'bitrate');
-
-		if (rate != null && rate > 0)
-			return (rate / 1000);
-
-		return null;
-	},
-
-	/**
-	 * Query the current wireless channel.
-	 *
-	 * @returns {null|number}
-	 * Returns the wireless channel as reported by `ubus` runtime information
-	 * or `null` if it cannot be determined.
-	 */
-	getChannel: function() {
-		return this.ubus('net', 'iwinfo', 'channel') || this.ubus('dev', 'config', 'channel') || this.get('channel');
-	},
-
-	/**
-	 * Query the current wireless signal.
-	 *
-	 * @returns {null|number}
-	 * Returns the wireless signal in dBm as reported by `ubus` runtime
-	 * information or `null` if it cannot be determined.
-	 */
-	getSignal: function() {
-		return this.ubus('net', 'iwinfo', 'signal') || 0;
-	},
-
-	/**
-	 * Query the current radio noise floor.
-	 *
-	 * @returns {number}
-	 * Returns the radio noise floor in dBm as reported by `ubus` runtime
-	 * information or `0` if it cannot be determined.
-	 */
-	getNoise: function() {
-		return this.ubus('net', 'iwinfo', 'noise') || 0;
-	},
-
-	/**
-	 * Query the current country code.
-	 *
-	 * @returns {string}
-	 * Returns the wireless country code as reported by `ubus` runtime
-	 * information or `00` if it cannot be determined.
-	 */
-	getCountryCode: function() {
-		return this.ubus('net', 'iwinfo', 'country') || this.ubus('dev', 'config', 'country') || '00';
-	},
-
-	/**
-	 * Query the current radio TX power.
-	 *
-	 * @returns {null|number}
-	 * Returns the wireless network transmit power in dBm as reported by
-	 * `ubus` runtime information or `null` if it cannot be determined.
-	 */
-	getTXPower: function() {
-		return this.ubus('net', 'iwinfo', 'txpower');
-	},
-
-	/**
-	 * Query the radio TX power offset.
-	 *
-	 * Some wireless radios have a fixed power offset, e.g. due to the
-	 * use of external amplifiers.
-	 *
-	 * @returns {number}
-	 * Returns the wireless network transmit power offset in dBm as reported
-	 * by `ubus` runtime information or `0` if there is no offset, or if it
-	 * cannot be determined.
-	 */
-	getTXPowerOffset: function() {
-		return this.ubus('net', 'iwinfo', 'txpower_offset') || 0;
-	},
-
-	/**
-	 * Calculate the current signal.
-	 *
-	 * @deprecated
-	 * @returns {number}
-	 * Returns the calculated signal level, which is the difference between
-	 * noise and signal (SNR), divided by 5.
-	 */
-	getSignalLevel: function(signal, noise) {
-		if (this.getActiveBSSID() == '00:00:00:00:00:00')
-			return -1;
-
-		signal = signal || this.getSignal();
-		noise  = noise  || this.getNoise();
-
-		if (signal < 0 && noise < 0) {
-			var snr = -1 * (noise - signal);
-			return Math.floor(snr / 5);
-		}
-
-		return 0;
-	},
-
-	/**
-	 * Calculate the current signal quality percentage.
-	 *
-	 * @returns {number}
-	 * Returns the calculated signal quality in percent. The value is
-	 * calculated from the `quality` and `quality_max` indicators reported
-	 * by `ubus` runtime state.
-	 */
-	getSignalPercent: function() {
-		var qc = this.ubus('net', 'iwinfo', 'quality') || 0,
-		    qm = this.ubus('net', 'iwinfo', 'quality_max') || 0;
-
-		if (qc > 0 && qm > 0)
-			return Math.floor((100 / qm) * qc);
-
-		return 0;
-	},
-
-	/**
-	 * Get a short description string for this wireless network.
-	 *
-	 * @returns {string}
-	 * Returns a string describing this network, consisting of the
-	 * active operation mode, followed by either the SSID, BSSID or
-	 * internal network ID, depending on which information is available.
-	 */
-	getShortName: function() {
-		return '%s "%s"'.format(
-			this.getActiveModeI18n(),
-			this.getActiveSSID() || this.getActiveBSSID() || this.getID());
-	},
-
-	/**
-	 * Get a description string for this wireless network.
-	 *
-	 * @returns {string}
-	 * Returns a string describing this network, consisting of the
-	 * term `Wireless Network`, followed by the active operation mode,
-	 * the SSID, BSSID or internal network ID and the Linux network device
-	 * name, depending on which information is available.
-	 */
-	getI18n: function() {
-		return '%s: %s "%s" (%s)'.format(
-			_('Wireless Network'),
-			this.getActiveModeI18n(),
-			this.getActiveSSID() || this.getActiveBSSID() || this.getID(),
-			this.getIfname());
-	},
-
-	/**
-	 * Get the primary logical interface this wireless network is attached to.
-	 *
-	 * @returns {null|LuCI.network.Protocol}
-	 * Returns a `Network.Protocol` instance representing the logical
-	 * interface or `null` if this network is not attached to any logical
-	 * interface.
-	 */
-	getNetwork: function() {
-		return this.getNetworks()[0];
-	},
-
-	/**
-	 * Get the logical interfaces this wireless network is attached to.
-	 *
-	 * @returns {Array<LuCI.network.Protocol>}
-	 * Returns an array of `Network.Protocol` instances representing the
-	 * logical interfaces this wireless network is attached to.
-	 */
-	getNetworks: function() {
-		var networkNames = this.getNetworkNames(),
-		    networks = [];
-
-		for (var i = 0; i < networkNames.length; i++) {
-			var uciInterface = uci.get('network', networkNames[i]);
-
-			if (uciInterface == null || uciInterface['.type'] != 'interface')
-				continue;
-
-			networks.push(Network.prototype.instantiateNetwork(networkNames[i]));
-		}
-
-		networks.sort(networkSort);
-
-		return networks;
-	},
-
-	/**
-	 * Get the associated Linux network device.
-	 *
-	 * @returns {LuCI.network.Device}
-	 * Returns a `Network.Device` instance representing the Linux network
-	 * device associted with this wireless network.
-	 */
-	getDevice: function() {
-		return Network.prototype.instantiateDevice(this.getIfname());
-	},
-
-	/**
-	 * Check whether this wifi network supports deauthenticating clients.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` when this wifi network instance supports forcibly
-	 * deauthenticating clients, otherwise `false`.
-	 */
-	isClientDisconnectSupported: function() {
-		return L.isObject(this.ubus('hostapd', 'del_client'));
-	},
-
-	/**
-	 * Forcibly disconnect the given client from the wireless network.
-	 *
-	 * @param {string} mac
-	 * The MAC address of the client to disconnect.
-	 *
-	 * @param {boolean} [deauth=false]
-	 * Specifies whether to deauthenticate (`true`) or disassociate (`false`)
-	 * the client.
-	 *
-	 * @param {number} [reason=1]
-	 * Specifies the IEEE 802.11 reason code to disassoc/deauth the client
-	 * with. Default is `1` which corresponds to `Unspecified reason`.
-	 *
-	 * @param {number} [ban_time=0]
-	 * Specifies the amount of milliseconds to ban the client from
-	 * reconnecting. By default, no ban time is set which allows the client
-	 * to reassociate / reauthenticate immediately.
-	 *
-	 * @returns {Promise<number>}
-	 * Returns a promise resolving to the underlying ubus call result code
-	 * which is typically `0`, even for not existing MAC addresses.
-	 * The promise might reject with an error in case invalid arguments
-	 * are passed.
-	 */
-	disconnectClient: function(mac, deauth, reason, ban_time) {
-		if (reason == null || reason == 0)
-			reason = 1;
-
-		if (ban_time == 0)
-			ban_time = null;
-
-		return rpc.declare({
-			object: 'hostapd.%s'.format(this.getIfname()),
-			method: 'del_client',
-			params: [ 'addr', 'deauth', 'reason', 'ban_time' ]
-		})(mac, deauth, reason, ban_time);
-	}
-});
-
-return Network;
-
-
-
- - - - - - - - - -
-
- - - - diff --git a/docs/jsapi/rpc.js.html b/docs/jsapi/rpc.js.html deleted file mode 100644 index 6668e4635a93141a1998e6138ea2122d8177690d..0000000000000000000000000000000000000000 --- a/docs/jsapi/rpc.js.html +++ /dev/null @@ -1,3944 +0,0 @@ - - - - - Source: rpc.js - - - - - - - - - - - - - - - - - -
- - -
-

Source: rpc.js

- - - - -
-
-
'use strict';
-'require baseclass';
-'require request';
-
-var rpcRequestID = 1,
-    rpcSessionID = L.env.sessionid || '00000000000000000000000000000000',
-    rpcBaseURL = L.url('admin/ubus'),
-    rpcInterceptorFns = [];
-
-/**
- * @class rpc
- * @memberof LuCI
- * @hideconstructor
- * @classdesc
- *
- * The `LuCI.rpc` class provides high level ubus JSON-RPC abstractions
- * and means for listing and invoking remove RPC methods.
- */
-return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
-	/* privates */
-	call: function(req, cb, nobatch) {
-		var q = '';
-
-		if (Array.isArray(req)) {
-			if (req.length == 0)
-				return Promise.resolve([]);
-
-			for (var i = 0; i < req.length; i++)
-				if (req[i].params)
-					q += '%s%s.%s'.format(
-						q ? ';' : '/',
-						req[i].params[1],
-						req[i].params[2]
-					);
-		}
-		else if (req.params) {
-			q += '/%s.%s'.format(req.params[1], req.params[2]);
-		}
-
-		return request.post(rpcBaseURL + q, req, {
-			timeout: (L.env.rpctimeout || 20) * 1000,
-			nobatch: nobatch,
-			credentials: true
-		}).then(cb, cb);
-	},
-
-	parseCallReply: function(req, res) {
-		var msg = null;
-
-		if (res instanceof Error)
-			return req.reject(res);
-
-		try {
-			if (!res.ok)
-				L.raise('RPCError', 'RPC call to %s/%s failed with HTTP error %d: %s',
-					req.object, req.method, res.status, res.statusText || '?');
-
-			msg = res.json();
-		}
-		catch (e) {
-			return req.reject(e);
-		}
-
-		/*
-		 * The interceptor args are intentionally swapped.
-		 * Response is passed as first arg to align with Request class interceptors
-		 */
-		Promise.all(rpcInterceptorFns.map(function(fn) { return fn(msg, req) }))
-			.then(this.handleCallReply.bind(this, req, msg))
-			.catch(req.reject);
-	},
-
-	handleCallReply: function(req, msg) {
-		var type = Object.prototype.toString,
-		    ret = null;
-
-		try {
-			/* verify message frame */
-			if (!L.isObject(msg) || msg.jsonrpc != '2.0')
-				L.raise('RPCError', 'RPC call to %s/%s returned invalid message frame',
-					req.object, req.method);
-
-			/* check error condition */
-			if (L.isObject(msg.error) && msg.error.code && msg.error.message)
-				L.raise('RPCError', 'RPC call to %s/%s failed with error %d: %s',
-					req.object, req.method, msg.error.code, msg.error.message || '?');
-		}
-		catch (e) {
-			return req.reject(e);
-		}
-
-		if (!req.object && !req.method) {
-			ret = msg.result;
-		}
-		else if (Array.isArray(msg.result)) {
-			if (req.raise && msg.result[0] !== 0)
-				L.raise('RPCError', 'RPC call to %s/%s failed with ubus code %d: %s',
-					req.object, req.method, msg.result[0], this.getStatusText(msg.result[0]));
-
-			ret = (msg.result.length > 1) ? msg.result[1] : msg.result[0];
-		}
-
-		if (req.expect) {
-			for (var key in req.expect) {
-				if (ret != null && key != '')
-					ret = ret[key];
-
-				if (ret == null || type.call(ret) != type.call(req.expect[key]))
-					ret = req.expect[key];
-
-				break;
-			}
-		}
-
-		/* apply filter */
-		if (typeof(req.filter) == 'function') {
-			req.priv[0] = ret;
-			req.priv[1] = req.params;
-			ret = req.filter.apply(this, req.priv);
-		}
-
-		req.resolve(ret);
-	},
-
-	/**
-	 * Lists available remote ubus objects or the method signatures of
-	 * specific objects.
-	 *
-	 * This function has two signatures and is sensitive to the number of
-	 * arguments passed to it:
-	 *  - `list()` -
-	 *    Returns an array containing the names of all remote `ubus` objects
-	 *  - `list("objname", ...)`
-	 *    Returns method signatures for each given `ubus` object name.
-	 *
-	 * @param {...string} [objectNames]
-	 * If any object names are given, this function will return the method
-	 * signatures of each given object.
-	 *
-	 * @returns {Promise<Array<string>|Object<string, Object<string, Object<string, string>>>>}
-	 * When invoked without arguments, this function will return a promise
-	 * resolving to an array of `ubus` object names. When invoked with one or
-	 * more arguments, a promise resolving to an object describing the method
-	 * signatures of each requested `ubus` object name will be returned.
-	 */
-	list: function() {
-		var msg = {
-			jsonrpc: '2.0',
-			id:      rpcRequestID++,
-			method:  'list',
-			params:  arguments.length ? this.varargs(arguments) : undefined
-		};
-
-		return new Promise(L.bind(function(resolveFn, rejectFn) {
-			/* store request info */
-			var req = {
-				resolve: resolveFn,
-				reject:  rejectFn
-			};
-
-			/* call rpc */
-			this.call(msg, this.parseCallReply.bind(this, req));
-		}, this));
-	},
-
-	/**
-	 * @typedef {Object} DeclareOptions
-	 * @memberof LuCI.rpc
-	 *
-	 * @property {string} object
-	 * The name of the remote `ubus` object to invoke.
-	 *
-	 * @property {string} method
-	 * The name of the remote `ubus` method to invoke.
-	 *
-	 * @property {string[]} [params]
-	 * Lists the named parameters expected by the remote `ubus` RPC method.
-	 * The arguments passed to the resulting generated method call function
-	 * will be mapped to named parameters in the order they appear in this
-	 * array.
-	 *
-	 * Extraneous parameters passed to the generated function will not be
-	 * sent to the remote procedure but are passed to the
-	 * {@link LuCI.rpc~filterFn filter function} if one is specified.
-	 *
-	 * Examples:
-	 *  - `params: [ "foo", "bar" ]` -
-	 *    When the resulting call function is invoked with `fn(true, false)`,
-	 *    the corresponding args object sent to the remote procedure will be
-	 *    `{ foo: true, bar: false }`.
-	 *  - `params: [ "test" ], filter: function(reply, args, extra) { ... }` -
-	 *    When the resultung generated function is invoked with
-	 *    `fn("foo", "bar", "baz")` then `{ "test": "foo" }` will be sent as
-	 *    argument to the remote procedure and the filter function will be
-	 *    invoked with `filterFn(reply, [ "foo" ], "bar", "baz")`
-	 *
-	 * @property {Object<string,*>} [expect]
-	 * Describes the expected return data structure. The given object is
-	 * supposed to contain a single key selecting the value to use from
-	 * the returned `ubus` reply object. The value of the sole key within
-	 * the `expect` object is used to infer the expected type of the received
-	 * `ubus` reply data.
-	 *
-	 * If the received data does not contain `expect`'s key, or if the
-	 * type of the data differs from the type of the value in the expect
-	 * object, the expect object's value is returned as default instead.
-	 *
-	 * The key in the `expect` object may be an empty string (`''`) in which
-	 * case the entire reply object is selected instead of one of its subkeys.
-	 *
-	 * If the `expect` option is omitted, the received reply will be returned
-	 * as-is, regardless of its format or type.
-	 *
-	 * Examples:
-	 *  - `expect: { '': { error: 'Invalid response' } }` -
-	 *    This requires the entire `ubus` reply to be a plain JavaScript
-	 *    object. If the reply isn't an object but e.g. an array or a numeric
-	 *    error code instead, it will get replaced with
-	 *    `{ error: 'Invalid response' }` instead.
-	 *  - `expect: { results: [] }` -
-	 *    This requires the received `ubus` reply to be an object containing
-	 *    a key `results` with an array as value. If the received reply does
-	 *    not contain such a key, or if `reply.results` points to a non-array
-	 *    value, the empty array (`[]`) will be used instead.
-	 *  - `expect: { success: false }` -
-	 *    This requires the received `ubus` reply to be an object containing
-	 *    a key `success` with a boolean value. If the reply does not contain
-	 *    `success` or if `reply.success` is not a boolean value, `false` will
-	 *    be returned as default instead.
-	 *
-	 * @property {LuCI.rpc~filterFn} [filter]
-	 * Specfies an optional filter function which is invoked to transform the
-	 * received reply data before it is returned to the caller.
-	 *
-	 * @property {boolean} [reject=false]
-	 * If set to `true`, non-zero ubus call status codes are treated as fatal
-	 * error and lead to the rejection of the call promise. The default
-	 * behaviour is to resolve with the call return code value instead.
-	 */
-
-	/**
-	 * The filter function is invoked to transform a received `ubus` RPC call
-	 * reply before returning it to the caller.
-	 *
-	 * @callback LuCI.rpc~filterFn
-	 *
-	 * @param {*} data
-	 * The received `ubus` reply data or a subset of it as described in the
-	 * `expect` option of the RPC call declaration. In case of remote call
-	 * errors, `data` is numeric `ubus` error code instead.
-	 *
-	 * @param {Array<*>} args
-	 * The arguments the RPC method has been invoked with.
-	 *
-	 * @param {...*} extraArgs
-	 * All extraneous arguments passed to the RPC method exceeding the number
-	 * of arguments describes in the RPC call declaration.
-	 *
-	 * @return {*}
-	 * The return value of the filter function will be returned to the caller
-	 * of the RPC method as-is.
-	 */
-
-	/**
-	 * The generated invocation function is returned by
-	 * {@link LuCI.rpc#declare rpc.declare()} and encapsulates a single
-	 * RPC method call.
-	 *
-	 * Calling this function will execute a remote `ubus` HTTP call request
-	 * using the arguments passed to it as arguments and return a promise
-	 * resolving to the received reply values.
-	 *
-	 * @callback LuCI.rpc~invokeFn
-	 *
-	 * @param {...*} params
-	 * The parameters to pass to the remote procedure call. The given
-	 * positional arguments will be named to named RPC parameters according
-	 * to the names specified in the `params` array of the method declaration.
-	 *
-	 * Any additional parameters exceeding the amount of arguments in the
-	 * `params` declaration are passed as private extra arguments to the
-	 * declared filter function.
-	 *
-	 * @return {Promise<*>}
-	 * Returns a promise resolving to the result data of the remote `ubus`
-	 * RPC method invocation, optionally substituted and filtered according
-	 * to the `expect` and `filter` declarations.
-	 */
-
-	/**
-	 * Describes a remote RPC call procedure and returns a function
-	 * implementing it.
-	 *
-	 * @param {LuCI.rpc.DeclareOptions} options
-	 * If any object names are given, this function will return the method
-	 * signatures of each given object.
-	 *
-	 * @returns {LuCI.rpc~invokeFn}
-	 * Returns a new function implementing the method call described in
-	 * `options`.
-	 */
-	declare: function(options) {
-		return Function.prototype.bind.call(function(rpc, options) {
-			var args = this.varargs(arguments, 2);
-			return new Promise(function(resolveFn, rejectFn) {
-				/* build parameter object */
-				var p_off = 0;
-				var params = { };
-				if (Array.isArray(options.params))
-					for (p_off = 0; p_off < options.params.length; p_off++)
-						params[options.params[p_off]] = args[p_off];
-
-				/* all remaining arguments are private args */
-				var priv = [ undefined, undefined ];
-				for (; p_off < args.length; p_off++)
-					priv.push(args[p_off]);
-
-				/* store request info */
-				var req = {
-					expect:  options.expect,
-					filter:  options.filter,
-					resolve: resolveFn,
-					reject:  rejectFn,
-					params:  params,
-					priv:    priv,
-					object:  options.object,
-					method:  options.method,
-					raise:   options.reject
-				};
-
-				/* build message object */
-				var msg = {
-					jsonrpc: '2.0',
-					id:      rpcRequestID++,
-					method:  'call',
-					params:  [
-						rpcSessionID,
-						options.object,
-						options.method,
-						params
-					]
-				};
-
-				/* call rpc */
-				rpc.call(msg, rpc.parseCallReply.bind(rpc, req), options.nobatch);
-			});
-		}, this, this, options);
-	},
-
-	/**
-	 * Returns the current RPC session id.
-	 *
-	 * @returns {string}
-	 * Returns the 32 byte session ID string used for authenticating remote
-	 * requests.
-	 */
-	getSessionID: function() {
-		return rpcSessionID;
-	},
-
-	/**
-	 * Set the RPC session id to use.
-	 *
-	 * @param {string} sid
-	 * Sets the 32 byte session ID string used for authenticating remote
-	 * requests.
-	 */
-	setSessionID: function(sid) {
-		rpcSessionID = sid;
-	},
-
-	/**
-	 * Returns the current RPC base URL.
-	 *
-	 * @returns {string}
-	 * Returns the RPC URL endpoint to issue requests against.
-	 */
-	getBaseURL: function() {
-		return rpcBaseURL;
-	},
-
-	/**
-	 * Set the RPC base URL to use.
-	 *
-	 * @param {string} sid
-	 * Sets the RPC URL endpoint to issue requests against.
-	 */
-	setBaseURL: function(url) {
-		rpcBaseURL = url;
-	},
-
-	/**
-	 * Translates a numeric `ubus` error code into a human readable
-	 * description.
-	 *
-	 * @param {number} statusCode
-	 * The numeric status code.
-	 *
-	 * @returns {string}
-	 * Returns the textual description of the code.
-	 */
-	getStatusText: function(statusCode) {
-		switch (statusCode) {
-		case 0: return _('Command OK');
-		case 1: return _('Invalid command');
-		case 2: return _('Invalid argument');
-		case 3: return _('Method not found');
-		case 4: return _('Resource not found');
-		case 5: return _('No data received');
-		case 6: return _('Permission denied');
-		case 7: return _('Request timeout');
-		case 8: return _('Not supported');
-		case 9: return _('Unspecified error');
-		case 10: return _('Connection lost');
-		default: return _('Unknown error code');
-		}
-	},
-
-	/**
-	 * Registered interceptor functions are invoked before the standard reply
-	 * parsing and handling logic.
-	 *
-	 * By returning rejected promises, interceptor functions can cause the
-	 * invocation function to fail, regardless of the received reply.
-	 *
-	 * Interceptors may also modify their message argument in-place to
-	 * rewrite received replies before they're processed by the standard
-	 * response handling code.
-	 *
-	 * A common use case for such functions is to detect failing RPC replies
-	 * due to expired authentication in order to trigger a new login.
-	 *
-	 * @callback LuCI.rpc~interceptorFn
-	 *
-	 * @param {*} msg
-	 * The unprocessed, JSON decoded remote RPC method call reply.
-	 *
-	 * Since interceptors run before the standard parsing logic, the reply
-	 * data is not verified for correctness or filtered according to
-	 * `expect` and `filter` specifications in the declarations.
-	 *
-	 * @param {Object} req
-	 * The related request object which is an extended variant of the
-	 * declaration object, allowing access to internals of the invocation
-	 * function such as `filter`, `expect` or `params` values.
-	 *
-	 * @return {Promise<*>|*}
-	 * Interceptor functions may return a promise to defer response
-	 * processing until some delayed work completed. Any values the returned
-	 * promise resolves to are ignored.
-	 *
-	 * When the returned promise rejects with an error, the invocation
-	 * function will fail too, forwarding the error to the caller.
-	 */
-
-	/**
-	 * Registers a new interceptor function.
-	 *
-	 * @param {LuCI.rpc~interceptorFn} interceptorFn
-	 * The inteceptor function to register.
-	 *
-	 * @returns {LuCI.rpc~interceptorFn}
-	 * Returns the given function value.
-	 */
-	addInterceptor: function(interceptorFn) {
-		if (typeof(interceptorFn) == 'function')
-			rpcInterceptorFns.push(interceptorFn);
-		return interceptorFn;
-	},
-
-	/**
-	 * Removes a registered interceptor function.
-	 *
-	 * @param {LuCI.rpc~interceptorFn} interceptorFn
-	 * The inteceptor function to remove.
-	 *
-	 * @returns {boolean}
-	 * Returns `true` if the given function has been removed or `false`
-	 * if it has not been found.
-	 */
-	removeInterceptor: function(interceptorFn) {
-		var oldlen = rpcInterceptorFns.length, i = oldlen;
-		while (i--)
-			if (rpcInterceptorFns[i] === interceptorFn)
-				rpcInterceptorFns.splice(i, 1);
-		return (rpcInterceptorFns.length < oldlen);
-	}
-});
-
-
-
- - - - - - - - - -
-
- - - - diff --git a/docs/jsapi/scripts/bootstrap.min.js b/docs/jsapi/scripts/bootstrap.min.js deleted file mode 100644 index 1a6258efcbff4469d71123fbb01c921ac5231f14..0000000000000000000000000000000000000000 --- a/docs/jsapi/scripts/bootstrap.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v3.0.3 (http://getbootstrap.com) - * Copyright 2013 Twitter, Inc. - * Licensed under http://www.apache.org/licenses/LICENSE-2.0 - */ - -if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/docs/jsapi/scripts/jaguar.js b/docs/jsapi/scripts/jaguar.js deleted file mode 100644 index 466e2c4058dcfcd6a0acb387e4432b0be3269c30..0000000000000000000000000000000000000000 --- a/docs/jsapi/scripts/jaguar.js +++ /dev/null @@ -1 +0,0 @@ -(function(){var e=0;var t;var n=document.getElementById("source-code");if(n){var i=config.linenums;if(i){n=n.getElementsByTagName("ol")[0];t=Array.prototype.slice.apply(n.children);t=t.map(function(t){e++;t.id="line"+e})}else{n=n.getElementsByTagName("code")[0];t=n.innerHTML.split("\n");t=t.map(function(t){e++;return''+t});n.innerHTML=t.join("\n")}}})();$(function(){$("#search").on("keyup",function(e){var t=$(this).val();var n=$(".navigation");if(t){var i=new RegExp(t,"i");n.find("li, .itemMembers").hide();n.find("li").each(function(e,t){var n=$(t);if(n.data("name")&&i.test(n.data("name"))){n.show();n.closest(".itemMembers").show();n.closest(".item").show()}})}else{n.find(".item, .itemMembers").show()}n.find(".list").scrollTop(0)});$(".navigation").on("click",".title",function(e){$(this).parent().find(".itemMembers").toggle()});var e=$(".page-title").data("filename").replace(/\.[a-z]+$/,"");var t=$('.navigation .item[data-name*="'+e+'"]:eq(0)');if(t.length){t.remove().prependTo(".navigation .list").show().find(".itemMembers").show()}var n=function(){var e=$(window).height();var t=$(".navigation");t.height(e).find(".list").height(e-133)};$(window).on("resize",n);n();if(config.disqus){$(window).on("load",function(){var e=config.disqus;var t=document.createElement("script");t.type="text/javascript";t.async=true;t.src="http://"+e+".disqus.com/embed.js";(document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0]).appendChild(t);var n=document.createElement("script");n.async=true;n.type="text/javascript";n.src="http://"+e+".disqus.com/count.js";document.getElementsByTagName("BODY")[0].appendChild(n)})}}); \ No newline at end of file diff --git a/docs/jsapi/scripts/jquery.min.js b/docs/jsapi/scripts/jquery.min.js deleted file mode 100644 index 9a85bd346253ed01104e6b829f1b449214392ec3..0000000000000000000000000000000000000000 --- a/docs/jsapi/scripts/jquery.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/*! jQuery v2.0.3 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license -//@ sourceMappingURL=jquery.min.map -*/ -(function(e,undefined){var t,n,r=typeof undefined,i=e.location,o=e.document,s=o.documentElement,a=e.jQuery,u=e.$,l={},c=[],p="2.0.3",f=c.concat,h=c.push,d=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,x=function(e,n){return new x.fn.init(e,n,t)},b=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^-ms-/,N=/-([\da-z])/gi,E=function(e,t){return t.toUpperCase()},S=function(){o.removeEventListener("DOMContentLoaded",S,!1),e.removeEventListener("load",S,!1),x.ready()};x.fn=x.prototype={jquery:p,constructor:x,init:function(e,t,n){var r,i;if(!e)return this;if("string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:T.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof x?t[0]:t,x.merge(this,x.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:o,!0)),C.test(r[1])&&x.isPlainObject(t))for(r in t)x.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return i=o.getElementById(r[2]),i&&i.parentNode&&(this.length=1,this[0]=i),this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?n.ready(e):(e.selector!==undefined&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return d.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,t,n,r,i,o,s=arguments[0]||{},a=1,u=arguments.length,l=!1;for("boolean"==typeof s&&(l=s,s=arguments[1]||{},a=2),"object"==typeof s||x.isFunction(s)||(s={}),u===a&&(s=this,--a);u>a;a++)if(null!=(e=arguments[a]))for(t in e)n=s[t],r=e[t],s!==r&&(l&&r&&(x.isPlainObject(r)||(i=x.isArray(r)))?(i?(i=!1,o=n&&x.isArray(n)?n:[]):o=n&&x.isPlainObject(n)?n:{},s[t]=x.extend(l,o,r)):r!==undefined&&(s[t]=r));return s},x.extend({expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=a),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){(e===!0?--x.readyWait:x.isReady)||(x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(o,[x]),x.fn.trigger&&x(o).trigger("ready").off("ready")))},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray,isWindow:function(e){return null!=e&&e===e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if("object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(t){return!1}return!0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:JSON.parse,parseXML:function(e){var t,n;if(!e||"string"!=typeof e)return null;try{n=new DOMParser,t=n.parseFromString(e,"text/xml")}catch(r){t=undefined}return(!t||t.getElementsByTagName("parsererror").length)&&x.error("Invalid XML: "+e),t},noop:function(){},globalEval:function(e){var t,n=eval;e=x.trim(e),e&&(1===e.indexOf("use strict")?(t=o.createElement("script"),t.text=e,o.head.appendChild(t).parentNode.removeChild(t)):n(e))},camelCase:function(e){return e.replace(k,"ms-").replace(N,E)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,s=j(e);if(n){if(s){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(s){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:function(e){return null==e?"":v.call(e)},makeArray:function(e,t){var n=t||[];return null!=e&&(j(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:g.call(t,e,n)},merge:function(e,t){var n=t.length,r=e.length,i=0;if("number"==typeof n)for(;n>i;i++)e[r++]=t[i];else while(t[i]!==undefined)e[r++]=t[i++];return e.length=r,e},grep:function(e,t,n){var r,i=[],o=0,s=e.length;for(n=!!n;s>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,s=j(e),a=[];if(s)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(a[a.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(a[a.length]=r);return f.apply([],a)},guid:1,proxy:function(e,t){var n,r,i;return"string"==typeof t&&(n=e[t],t=e,e=n),x.isFunction(e)?(r=d.call(arguments,2),i=function(){return e.apply(t||this,r.concat(d.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):undefined},access:function(e,t,n,r,i,o,s){var a=0,u=e.length,l=null==n;if("object"===x.type(n)){i=!0;for(a in n)x.access(e,t,a,n[a],!0,o,s)}else if(r!==undefined&&(i=!0,x.isFunction(r)||(s=!0),l&&(s?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(x(e),n)})),t))for(;u>a;a++)t(e[a],n,s?r:r.call(e[a],a,t(e[a],n)));return i?e:l?t.call(e):u?t(e[0],n):o},now:Date.now,swap:function(e,t,n,r){var i,o,s={};for(o in t)s[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=s[o];return i}}),x.ready.promise=function(t){return n||(n=x.Deferred(),"complete"===o.readyState?setTimeout(x.ready):(o.addEventListener("DOMContentLoaded",S,!1),e.addEventListener("load",S,!1))),n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function j(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}t=x(o),function(e,undefined){var t,n,r,i,o,s,a,u,l,c,p,f,h,d,g,m,y,v="sizzle"+-new Date,b=e.document,w=0,T=0,C=st(),k=st(),N=st(),E=!1,S=function(e,t){return e===t?(E=!0,0):0},j=typeof undefined,D=1<<31,A={}.hasOwnProperty,L=[],q=L.pop,H=L.push,O=L.push,F=L.slice,P=L.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",W="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",$=W.replace("w","w#"),B="\\["+M+"*("+W+")"+M+"*(?:([*^$|!~]?=)"+M+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+$+")|)|)"+M+"*\\]",I=":("+W+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+B.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=RegExp("^"+M+"*,"+M+"*"),X=RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=RegExp(M+"*[+~]"),Y=RegExp("="+M+"*([^\\]'\"]*)"+M+"*\\]","g"),V=RegExp(I),G=RegExp("^"+$+"$"),J={ID:RegExp("^#("+W+")"),CLASS:RegExp("^\\.("+W+")"),TAG:RegExp("^("+W.replace("w","w*")+")"),ATTR:RegExp("^"+B),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:RegExp("^(?:"+R+")$","i"),needsContext:RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Q=/^[^{]+\{\s*\[native \w/,K=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,Z=/^(?:input|select|textarea|button)$/i,et=/^h\d$/i,tt=/'|\\/g,nt=RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),rt=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{O.apply(L=F.call(b.childNodes),b.childNodes),L[b.childNodes.length].nodeType}catch(it){O={apply:L.length?function(e,t){H.apply(e,F.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function ot(e,t,r,i){var o,s,a,u,l,f,g,m,x,w;if((t?t.ownerDocument||t:b)!==p&&c(t),t=t||p,r=r||[],!e||"string"!=typeof e)return r;if(1!==(u=t.nodeType)&&9!==u)return[];if(h&&!i){if(o=K.exec(e))if(a=o[1]){if(9===u){if(s=t.getElementById(a),!s||!s.parentNode)return r;if(s.id===a)return r.push(s),r}else if(t.ownerDocument&&(s=t.ownerDocument.getElementById(a))&&y(t,s)&&s.id===a)return r.push(s),r}else{if(o[2])return O.apply(r,t.getElementsByTagName(e)),r;if((a=o[3])&&n.getElementsByClassName&&t.getElementsByClassName)return O.apply(r,t.getElementsByClassName(a)),r}if(n.qsa&&(!d||!d.test(e))){if(m=g=v,x=t,w=9===u&&e,1===u&&"object"!==t.nodeName.toLowerCase()){f=gt(e),(g=t.getAttribute("id"))?m=g.replace(tt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",l=f.length;while(l--)f[l]=m+mt(f[l]);x=U.test(e)&&t.parentNode||t,w=f.join(",")}if(w)try{return O.apply(r,x.querySelectorAll(w)),r}catch(T){}finally{g||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,r,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>i.cacheLength&&delete t[e.shift()],t[n]=r}return t}function at(e){return e[v]=!0,e}function ut(e){var t=p.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function lt(e,t){var n=e.split("|"),r=e.length;while(r--)i.attrHandle[n[r]]=t}function ct(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function pt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return at(function(t){return t=+t,at(function(n,r){var i,o=e([],n.length,t),s=o.length;while(s--)n[i=o[s]]&&(n[i]=!(r[i]=n[i]))})})}s=ot.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},n=ot.support={},c=ot.setDocument=function(e){var t=e?e.ownerDocument||e:b,r=t.defaultView;return t!==p&&9===t.nodeType&&t.documentElement?(p=t,f=t.documentElement,h=!s(t),r&&r.attachEvent&&r!==r.top&&r.attachEvent("onbeforeunload",function(){c()}),n.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),n.getElementsByTagName=ut(function(e){return e.appendChild(t.createComment("")),!e.getElementsByTagName("*").length}),n.getElementsByClassName=ut(function(e){return e.innerHTML="
",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),n.getById=ut(function(e){return f.appendChild(e).id=v,!t.getElementsByName||!t.getElementsByName(v).length}),n.getById?(i.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){return e.getAttribute("id")===t}}):(delete i.find.ID,i.filter.ID=function(e){var t=e.replace(nt,rt);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=n.getElementsByTagName?function(e,t){return typeof t.getElementsByTagName!==j?t.getElementsByTagName(e):undefined}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.CLASS=n.getElementsByClassName&&function(e,t){return typeof t.getElementsByClassName!==j&&h?t.getElementsByClassName(e):undefined},g=[],d=[],(n.qsa=Q.test(t.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll(":checked").length||d.push(":checked")}),ut(function(e){var n=t.createElement("input");n.setAttribute("type","hidden"),e.appendChild(n).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&d.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||d.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),d.push(",.*:")})),(n.matchesSelector=Q.test(m=f.webkitMatchesSelector||f.mozMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&ut(function(e){n.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",I)}),d=d.length&&RegExp(d.join("|")),g=g.length&&RegExp(g.join("|")),y=Q.test(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},S=f.compareDocumentPosition?function(e,r){if(e===r)return E=!0,0;var i=r.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(r);return i?1&i||!n.sortDetached&&r.compareDocumentPosition(e)===i?e===t||y(b,e)?-1:r===t||y(b,r)?1:l?P.call(l,e)-P.call(l,r):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,n){var r,i=0,o=e.parentNode,s=n.parentNode,a=[e],u=[n];if(e===n)return E=!0,0;if(!o||!s)return e===t?-1:n===t?1:o?-1:s?1:l?P.call(l,e)-P.call(l,n):0;if(o===s)return ct(e,n);r=e;while(r=r.parentNode)a.unshift(r);r=n;while(r=r.parentNode)u.unshift(r);while(a[i]===u[i])i++;return i?ct(a[i],u[i]):a[i]===b?-1:u[i]===b?1:0},t):p},ot.matches=function(e,t){return ot(e,null,null,t)},ot.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Y,"='$1']"),!(!n.matchesSelector||!h||g&&g.test(t)||d&&d.test(t)))try{var r=m.call(e,t);if(r||n.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return ot(t,p,null,[e]).length>0},ot.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},ot.attr=function(e,t){(e.ownerDocument||e)!==p&&c(e);var r=i.attrHandle[t.toLowerCase()],o=r&&A.call(i.attrHandle,t.toLowerCase())?r(e,t,!h):undefined;return o===undefined?n.attributes||!h?e.getAttribute(t):(o=e.getAttributeNode(t))&&o.specified?o.value:null:o},ot.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},ot.uniqueSort=function(e){var t,r=[],i=0,o=0;if(E=!n.detectDuplicates,l=!n.sortStable&&e.slice(0),e.sort(S),E){while(t=e[o++])t===e[o]&&(i=r.push(o));while(i--)e.splice(r[i],1)}return e},o=ot.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=ot.selectors={cacheLength:50,createPseudo:at,match:J,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(nt,rt),e[3]=(e[4]||e[5]||"").replace(nt,rt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||ot.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&ot.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return J.CHILD.test(e[0])?null:(e[3]&&e[4]!==undefined?e[2]=e[4]:n&&V.test(n)&&(t=gt(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(nt,rt).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=C[e+" "];return t||(t=RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&C(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=ot.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),s="last"!==e.slice(-4),a="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,h,d,g=o!==s?"nextSibling":"previousSibling",m=t.parentNode,y=a&&t.nodeName.toLowerCase(),x=!u&&!a;if(m){if(o){while(g){p=t;while(p=p[g])if(a?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;d=g="only"===e&&!d&&"nextSibling"}return!0}if(d=[s?m.firstChild:m.lastChild],s&&x){c=m[v]||(m[v]={}),l=c[e]||[],h=l[0]===w&&l[1],f=l[0]===w&&l[2],p=h&&m.childNodes[h];while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[w,h,f];break}}else if(x&&(l=(t[v]||(t[v]={}))[e])&&l[0]===w)f=l[1];else while(p=++h&&p&&p[g]||(f=h=0)||d.pop())if((a?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(x&&((p[v]||(p[v]={}))[e]=[w,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||ot.error("unsupported pseudo: "+e);return r[v]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?at(function(e,n){var i,o=r(e,t),s=o.length;while(s--)i=P.call(e,o[s]),e[i]=!(n[i]=o[s])}):function(e){return r(e,0,n)}):r}},pseudos:{not:at(function(e){var t=[],n=[],r=a(e.replace(z,"$1"));return r[v]?at(function(e,t,n,i){var o,s=r(e,null,i,[]),a=e.length;while(a--)(o=s[a])&&(e[a]=!(t[a]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:at(function(e){return function(t){return ot(e,t).length>0}}),contains:at(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:at(function(e){return G.test(e||"")||ot.error("unsupported lang: "+e),e=e.replace(nt,rt).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return et.test(e.nodeName)},input:function(e){return Z.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},i.pseudos.nth=i.pseudos.eq;for(t in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[t]=pt(t);for(t in{submit:!0,reset:!0})i.pseudos[t]=ft(t);function dt(){}dt.prototype=i.filters=i.pseudos,i.setFilters=new dt;function gt(e,t){var n,r,o,s,a,u,l,c=k[e+" "];if(c)return t?0:c.slice(0);a=e,u=[],l=i.preFilter;while(a){(!n||(r=_.exec(a)))&&(r&&(a=a.slice(r[0].length)||a),u.push(o=[])),n=!1,(r=X.exec(a))&&(n=r.shift(),o.push({value:n,type:r[0].replace(z," ")}),a=a.slice(n.length));for(s in i.filter)!(r=J[s].exec(a))||l[s]&&!(r=l[s](r))||(n=r.shift(),o.push({value:n,type:s,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?ot.error(e):k(e,u).slice(0)}function mt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function yt(e,t,n){var i=t.dir,o=n&&"parentNode"===i,s=T++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,a){var u,l,c,p=w+" "+s;if(a){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,a))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[v]||(t[v]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,a)||r,l[1]===!0)return!0}}function vt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,s=[],a=0,u=e.length,l=null!=t;for(;u>a;a++)(o=e[a])&&(!n||n(o,r,i))&&(s.push(o),l&&t.push(a));return s}function bt(e,t,n,r,i,o){return r&&!r[v]&&(r=bt(r)),i&&!i[v]&&(i=bt(i,o)),at(function(o,s,a,u){var l,c,p,f=[],h=[],d=s.length,g=o||Ct(t||"*",a.nodeType?[a]:a,[]),m=!e||!o&&t?g:xt(g,f,e,a,u),y=n?i||(o?e:d||r)?[]:s:m;if(n&&n(m,y,a,u),r){l=xt(y,h),r(l,[],a,u),c=l.length;while(c--)(p=l[c])&&(y[h[c]]=!(m[h[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?P.call(o,p):f[c])>-1&&(o[l]=!(s[l]=p))}}else y=xt(y===s?y.splice(d,y.length):y),i?i(null,s,y,u):O.apply(s,y)})}function wt(e){var t,n,r,o=e.length,s=i.relative[e[0].type],a=s||i.relative[" "],l=s?1:0,c=yt(function(e){return e===t},a,!0),p=yt(function(e){return P.call(t,e)>-1},a,!0),f=[function(e,n,r){return!s&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>l;l++)if(n=i.relative[e[l].type])f=[yt(vt(f),n)];else{if(n=i.filter[e[l].type].apply(null,e[l].matches),n[v]){for(r=++l;o>r;r++)if(i.relative[e[r].type])break;return bt(l>1&&vt(f),l>1&&mt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&wt(e.slice(l,r)),o>r&&wt(e=e.slice(r)),o>r&&mt(e))}f.push(n)}return vt(f)}function Tt(e,t){var n=0,o=t.length>0,s=e.length>0,a=function(a,l,c,f,h){var d,g,m,y=[],v=0,x="0",b=a&&[],T=null!=h,C=u,k=a||s&&i.find.TAG("*",h&&l.parentNode||l),N=w+=null==C?1:Math.random()||.1;for(T&&(u=l!==p&&l,r=n);null!=(d=k[x]);x++){if(s&&d){g=0;while(m=e[g++])if(m(d,l,c)){f.push(d);break}T&&(w=N,r=++n)}o&&((d=!m&&d)&&v--,a&&b.push(d))}if(v+=x,o&&x!==v){g=0;while(m=t[g++])m(b,y,l,c);if(a){if(v>0)while(x--)b[x]||y[x]||(y[x]=q.call(f));y=xt(y)}O.apply(f,y),T&&!a&&y.length>0&&v+t.length>1&&ot.uniqueSort(f)}return T&&(w=N,u=C),b};return o?at(a):a}a=ot.compile=function(e,t){var n,r=[],i=[],o=N[e+" "];if(!o){t||(t=gt(e)),n=t.length;while(n--)o=wt(t[n]),o[v]?r.push(o):i.push(o);o=N(e,Tt(i,r))}return o};function Ct(e,t,n){var r=0,i=t.length;for(;i>r;r++)ot(e,t[r],n);return n}function kt(e,t,r,o){var s,u,l,c,p,f=gt(e);if(!o&&1===f.length){if(u=f[0]=f[0].slice(0),u.length>2&&"ID"===(l=u[0]).type&&n.getById&&9===t.nodeType&&h&&i.relative[u[1].type]){if(t=(i.find.ID(l.matches[0].replace(nt,rt),t)||[])[0],!t)return r;e=e.slice(u.shift().value.length)}s=J.needsContext.test(e)?0:u.length;while(s--){if(l=u[s],i.relative[c=l.type])break;if((p=i.find[c])&&(o=p(l.matches[0].replace(nt,rt),U.test(u[0].type)&&t.parentNode||t))){if(u.splice(s,1),e=o.length&&mt(u),!e)return O.apply(r,o),r;break}}}return a(e,f)(o,t,!h,r,U.test(e)),r}n.sortStable=v.split("").sort(S).join("")===v,n.detectDuplicates=E,c(),n.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(p.createElement("div"))}),ut(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||lt("type|href|height|width",function(e,t,n){return n?undefined:e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),n.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||lt("value",function(e,t,n){return n||"input"!==e.nodeName.toLowerCase()?undefined:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||lt(R,function(e,t,n){var r;return n?undefined:(r=e.getAttributeNode(t))&&r.specified?r.value:e[t]===!0?t.toLowerCase():null}),x.find=ot,x.expr=ot.selectors,x.expr[":"]=x.expr.pseudos,x.unique=ot.uniqueSort,x.text=ot.getText,x.isXMLDoc=ot.isXML,x.contains=ot.contains}(e);var D={};function A(e){var t=D[e]={};return x.each(e.match(w)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?D[e]||A(e):x.extend({},e);var t,n,r,i,o,s,a=[],u=!e.once&&[],l=function(p){for(t=e.memory&&p,n=!0,s=i||0,i=0,o=a.length,r=!0;a&&o>s;s++)if(a[s].apply(p[0],p[1])===!1&&e.stopOnFalse){t=!1;break}r=!1,a&&(u?u.length&&l(u.shift()):t?a=[]:c.disable())},c={add:function(){if(a){var n=a.length;(function s(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&c.has(n)||a.push(n):n&&n.length&&"string"!==r&&s(n)})})(arguments),r?o=a.length:t&&(i=n,l(t))}return this},remove:function(){return a&&x.each(arguments,function(e,t){var n;while((n=x.inArray(t,a,n))>-1)a.splice(n,1),r&&(o>=n&&o--,s>=n&&s--)}),this},has:function(e){return e?x.inArray(e,a)>-1:!(!a||!a.length)},empty:function(){return a=[],o=0,this},disable:function(){return a=u=t=undefined,this},disabled:function(){return!a},lock:function(){return u=undefined,t||c.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!a||n&&!u||(t=t||[],t=[e,t.slice?t.slice():t],r?u.push(t):l(t)),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!n}};return c},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var s=o[0],a=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[s+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var s=o[2],a=o[3];r[o[1]]=s.add,a&&s.add(function(){n=a},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=s.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=d.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),s=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?d.call(arguments):r,n===a?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},a,u,l;if(r>1)for(a=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(s(t,l,n)).fail(o.reject).progress(s(t,u,a)):--i;return i||o.resolveWith(l,n),o.promise()}}),x.support=function(t){var n=o.createElement("input"),r=o.createDocumentFragment(),i=o.createElement("div"),s=o.createElement("select"),a=s.appendChild(o.createElement("option"));return n.type?(n.type="checkbox",t.checkOn=""!==n.value,t.optSelected=a.selected,t.reliableMarginRight=!0,t.boxSizingReliable=!0,t.pixelPosition=!1,n.checked=!0,t.noCloneChecked=n.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!a.disabled,n=o.createElement("input"),n.value="t",n.type="radio",t.radioValue="t"===n.value,n.setAttribute("checked","t"),n.setAttribute("name","t"),r.appendChild(n),t.checkClone=r.cloneNode(!0).cloneNode(!0).lastChild.checked,t.focusinBubbles="onfocusin"in e,i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===i.style.backgroundClip,x(function(){var n,r,s="padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box",a=o.getElementsByTagName("body")[0];a&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",a.appendChild(n).appendChild(i),i.innerHTML="",i.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%",x.swap(a,null!=a.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===i.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(i,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(i,null)||{width:"4px"}).width,r=i.appendChild(o.createElement("div")),r.style.cssText=i.style.cssText=s,r.style.marginRight=r.style.width="0",i.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),a.removeChild(n))}),t):t}({});var L,q,H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,O=/([A-Z])/g;function F(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=x.expando+Math.random()}F.uid=1,F.accepts=function(e){return e.nodeType?1===e.nodeType||9===e.nodeType:!0},F.prototype={key:function(e){if(!F.accepts(e))return 0;var t={},n=e[this.expando];if(!n){n=F.uid++;try{t[this.expando]={value:n},Object.defineProperties(e,t)}catch(r){t[this.expando]=n,x.extend(e,t)}}return this.cache[n]||(this.cache[n]={}),n},set:function(e,t,n){var r,i=this.key(e),o=this.cache[i];if("string"==typeof t)o[t]=n;else if(x.isEmptyObject(o))x.extend(this.cache[i],t);else for(r in t)o[r]=t[r];return o},get:function(e,t){var n=this.cache[this.key(e)];return t===undefined?n:n[t]},access:function(e,t,n){var r;return t===undefined||t&&"string"==typeof t&&n===undefined?(r=this.get(e,t),r!==undefined?r:this.get(e,x.camelCase(t))):(this.set(e,t,n),n!==undefined?n:t)},remove:function(e,t){var n,r,i,o=this.key(e),s=this.cache[o];if(t===undefined)this.cache[o]={};else{x.isArray(t)?r=t.concat(t.map(x.camelCase)):(i=x.camelCase(t),t in s?r=[t,i]:(r=i,r=r in s?[r]:r.match(w)||[])),n=r.length;while(n--)delete s[r[n]]}},hasData:function(e){return!x.isEmptyObject(this.cache[e[this.expando]]||{})},discard:function(e){e[this.expando]&&delete this.cache[e[this.expando]]}},L=new F,q=new F,x.extend({acceptData:F.accepts,hasData:function(e){return L.hasData(e)||q.hasData(e)},data:function(e,t,n){return L.access(e,t,n)},removeData:function(e,t){L.remove(e,t)},_data:function(e,t,n){return q.access(e,t,n)},_removeData:function(e,t){q.remove(e,t)}}),x.fn.extend({data:function(e,t){var n,r,i=this[0],o=0,s=null;if(e===undefined){if(this.length&&(s=L.get(i),1===i.nodeType&&!q.get(i,"hasDataAttrs"))){for(n=i.attributes;n.length>o;o++)r=n[o].name,0===r.indexOf("data-")&&(r=x.camelCase(r.slice(5)),P(i,r,s[r]));q.set(i,"hasDataAttrs",!0)}return s}return"object"==typeof e?this.each(function(){L.set(this,e)}):x.access(this,function(t){var n,r=x.camelCase(e);if(i&&t===undefined){if(n=L.get(i,e),n!==undefined)return n;if(n=L.get(i,r),n!==undefined)return n;if(n=P(i,r,undefined),n!==undefined)return n}else this.each(function(){var n=L.get(this,r);L.set(this,r,t),-1!==e.indexOf("-")&&n!==undefined&&L.set(this,e,t)})},null,t,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){L.remove(this,e)})}});function P(e,t,n){var r;if(n===undefined&&1===e.nodeType)if(r="data-"+t.replace(O,"-$1").toLowerCase(),n=e.getAttribute(r),"string"==typeof n){try{n="true"===n?!0:"false"===n?!1:"null"===n?null:+n+""===n?+n:H.test(n)?JSON.parse(n):n}catch(i){}L.set(e,t,n)}else n=undefined;return n}x.extend({queue:function(e,t,n){var r;return e?(t=(t||"fx")+"queue",r=q.get(e,t),n&&(!r||x.isArray(n)?r=q.access(e,t,x.makeArray(n)):r.push(n)),r||[]):undefined},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),s=function(){x.dequeue(e,t) -};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,s,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return q.get(e,n)||q.access(e,n,{empty:x.Callbacks("once memory").add(function(){q.remove(e,[t+"queue",n])})})}}),x.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),n>arguments.length?x.queue(this[0],e):t===undefined?this:this.each(function(){var n=x.queue(this,e,t);x._queueHooks(this,e),"fx"===e&&"inprogress"!==n[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=x.Deferred(),o=this,s=this.length,a=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=undefined),e=e||"fx";while(s--)n=q.get(o[s],e+"queueHooks"),n&&n.empty&&(r++,n.empty.add(a));return a(),i.promise(t)}});var R,M,W=/[\t\r\n\f]/g,$=/\r/g,B=/^(?:input|select|textarea|button)$/i;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[x.propFix[e]||e]})},addClass:function(e){var t,n,r,i,o,s=0,a=this.length,u="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,s=0,a=this.length,u=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];a>s;s++)if(n=this[s],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(W," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,i=0,o=x(this),s=e.match(w)||[];while(t=s[i++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===r||"boolean"===n)&&(this.className&&q.set(this,"__className__",this.className),this.className=this.className||e===!1?"":q.get(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(W," ").indexOf(t)>=0)return!0;return!1},val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=x.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,x(this).val()):e,null==i?i="":"number"==typeof i?i+="":x.isArray(i)&&(i=x.map(i,function(e){return null==e?"":e+""})),t=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&t.set(this,i,"value")!==undefined||(this.value=i))});if(i)return t=x.valHooks[i.type]||x.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&(n=t.get(i,"value"))!==undefined?n:(n=i.value,"string"==typeof n?n.replace($,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,s=o?null:[],a=o?i+1:r.length,u=0>i?a:o?i:0;for(;a>u;u++)if(n=r[u],!(!n.selected&&u!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),s=i.length;while(s--)r=i[s],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,t,n){var i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===r?x.prop(e,t,n):(1===s&&x.isXMLDoc(e)||(t=t.toLowerCase(),i=x.attrHooks[t]||(x.expr.match.bool.test(t)?M:R)),n===undefined?i&&"get"in i&&null!==(o=i.get(e,t))?o:(o=x.find.attr(e,t),null==o?undefined:o):null!==n?i&&"set"in i&&(o=i.set(e,n,t))!==undefined?o:(e.setAttribute(t,n+""),n):(x.removeAttr(e,t),undefined))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)&&(e[r]=!1),e.removeAttribute(n)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,t,n){var r,i,o,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return o=1!==s||!x.isXMLDoc(e),o&&(t=x.propFix[t]||t,i=x.propHooks[t]),n!==undefined?i&&"set"in i&&(r=i.set(e,n,t))!==undefined?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){return e.hasAttribute("tabindex")||B.test(e.nodeName)||e.href?e.tabIndex:-1}}}}),M={set:function(e,t,n){return t===!1?x.removeAttr(e,n):e.setAttribute(n,n),n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,t){var n=x.expr.attrHandle[t]||x.find.attr;x.expr.attrHandle[t]=function(e,t,r){var i=x.expr.attrHandle[t],o=r?undefined:(x.expr.attrHandle[t]=undefined)!=n(e,t,r)?t.toLowerCase():null;return x.expr.attrHandle[t]=i,o}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,t){return x.isArray(t)?e.checked=x.inArray(x(e).val(),t)>=0:undefined}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var I=/^key/,z=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,X=/^([^.]*)(?:\.(.+)|)$/;function U(){return!0}function Y(){return!1}function V(){try{return o.activeElement}catch(e){}}x.event={global:{},add:function(e,t,n,i,o){var s,a,u,l,c,p,f,h,d,g,m,y=q.get(e);if(y){n.handler&&(s=n,n=s.handler,o=s.selector),n.guid||(n.guid=x.guid++),(l=y.events)||(l=y.events={}),(a=y.handle)||(a=y.handle=function(e){return typeof x===r||e&&x.event.triggered===e.type?undefined:x.event.dispatch.apply(a.elem,arguments)},a.elem=e),t=(t||"").match(w)||[""],c=t.length;while(c--)u=X.exec(t[c])||[],d=m=u[1],g=(u[2]||"").split(".").sort(),d&&(f=x.event.special[d]||{},d=(o?f.delegateType:f.bindType)||d,f=x.event.special[d]||{},p=x.extend({type:d,origType:m,data:i,handler:n,guid:n.guid,selector:o,needsContext:o&&x.expr.match.needsContext.test(o),namespace:g.join(".")},s),(h=l[d])||(h=l[d]=[],h.delegateCount=0,f.setup&&f.setup.call(e,i,g,a)!==!1||e.addEventListener&&e.addEventListener(d,a,!1)),f.add&&(f.add.call(e,p),p.handler.guid||(p.handler.guid=n.guid)),o?h.splice(h.delegateCount++,0,p):h.push(p),x.event.global[d]=!0);e=null}},remove:function(e,t,n,r,i){var o,s,a,u,l,c,p,f,h,d,g,m=q.hasData(e)&&q.get(e);if(m&&(u=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(a=X.exec(t[l])||[],h=g=a[1],d=(a[2]||"").split(".").sort(),h){p=x.event.special[h]||{},h=(r?p.delegateType:p.bindType)||h,f=u[h]||[],a=a[2]&&RegExp("(^|\\.)"+d.join("\\.(?:.*\\.|)")+"(\\.|$)"),s=o=f.length;while(o--)c=f[o],!i&&g!==c.origType||n&&n.guid!==c.guid||a&&!a.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(f.splice(o,1),c.selector&&f.delegateCount--,p.remove&&p.remove.call(e,c));s&&!f.length&&(p.teardown&&p.teardown.call(e,d,m.handle)!==!1||x.removeEvent(e,h,m.handle),delete u[h])}else for(h in u)x.event.remove(e,h+t[l],n,r,!0);x.isEmptyObject(u)&&(delete m.handle,q.remove(e,"events"))}},trigger:function(t,n,r,i){var s,a,u,l,c,p,f,h=[r||o],d=y.call(t,"type")?t.type:t,g=y.call(t,"namespace")?t.namespace.split("."):[];if(a=u=r=r||o,3!==r.nodeType&&8!==r.nodeType&&!_.test(d+x.event.triggered)&&(d.indexOf(".")>=0&&(g=d.split("."),d=g.shift(),g.sort()),c=0>d.indexOf(":")&&"on"+d,t=t[x.expando]?t:new x.Event(d,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=g.join("."),t.namespace_re=t.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=undefined,t.target||(t.target=r),n=null==n?[t]:x.makeArray(n,[t]),f=x.event.special[d]||{},i||!f.trigger||f.trigger.apply(r,n)!==!1)){if(!i&&!f.noBubble&&!x.isWindow(r)){for(l=f.delegateType||d,_.test(l+d)||(a=a.parentNode);a;a=a.parentNode)h.push(a),u=a;u===(r.ownerDocument||o)&&h.push(u.defaultView||u.parentWindow||e)}s=0;while((a=h[s++])&&!t.isPropagationStopped())t.type=s>1?l:f.bindType||d,p=(q.get(a,"events")||{})[t.type]&&q.get(a,"handle"),p&&p.apply(a,n),p=c&&a[c],p&&x.acceptData(a)&&p.apply&&p.apply(a,n)===!1&&t.preventDefault();return t.type=d,i||t.isDefaultPrevented()||f._default&&f._default.apply(h.pop(),n)!==!1||!x.acceptData(r)||c&&x.isFunction(r[d])&&!x.isWindow(r)&&(u=r[c],u&&(r[c]=null),x.event.triggered=d,r[d](),x.event.triggered=undefined,u&&(r[c]=u)),t.result}},dispatch:function(e){e=x.event.fix(e);var t,n,r,i,o,s=[],a=d.call(arguments),u=(q.get(this,"events")||{})[e.type]||[],l=x.event.special[e.type]||{};if(a[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),t=0;while((i=s[t++])&&!e.isPropagationStopped()){e.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(o.namespace))&&(e.handleObj=o,e.data=o.data,r=((x.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,a),r!==undefined&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,s=[],a=t.delegateCount,u=e.target;if(a&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!==this;u=u.parentNode||this)if(u.disabled!==!0||"click"!==e.type){for(r=[],n=0;a>n;n++)o=t[n],i=o.selector+" ",r[i]===undefined&&(r[i]=o.needsContext?x(i,this).index(u)>=0:x.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&s.push({elem:u,handlers:r})}return t.length>a&&s.push({elem:this,handlers:t.slice(a)}),s},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,t){var n,r,i,s=t.button;return null==e.pageX&&null!=t.clientX&&(n=e.target.ownerDocument||o,r=n.documentElement,i=n.body,e.pageX=t.clientX+(r&&r.scrollLeft||i&&i.scrollLeft||0)-(r&&r.clientLeft||i&&i.clientLeft||0),e.pageY=t.clientY+(r&&r.scrollTop||i&&i.scrollTop||0)-(r&&r.clientTop||i&&i.clientTop||0)),e.which||s===undefined||(e.which=1&s?1:2&s?3:4&s?2:0),e}},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,s=e,a=this.fixHooks[i];a||(this.fixHooks[i]=a=z.test(i)?this.mouseHooks:I.test(i)?this.keyHooks:{}),r=a.props?this.props.concat(a.props):this.props,e=new x.Event(s),t=r.length;while(t--)n=r[t],e[n]=s[n];return e.target||(e.target=o),3===e.target.nodeType&&(e.target=e.target.parentNode),a.filter?a.filter(e,s):e},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==V()&&this.focus?(this.focus(),!1):undefined},delegateType:"focusin"},blur:{trigger:function(){return this===V()&&this.blur?(this.blur(),!1):undefined},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&x.nodeName(this,"input")?(this.click(),!1):undefined},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==undefined&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)},x.Event=function(e,t){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.getPreventDefault&&e.getPreventDefault()?U:Y):this.type=e,t&&x.extend(this,t),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,undefined):new x.Event(e,t)},x.Event.prototype={isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=U,e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=U,e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=U,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,t,n,r,i){var o,s;if("object"==typeof e){"string"!=typeof t&&(n=n||t,t=undefined);for(s in e)this.on(s,t,n,e[s],i);return this}if(null==n&&null==r?(r=t,n=t=undefined):null==r&&("string"==typeof t?(r=n,n=undefined):(r=n,n=t,t=undefined)),r===!1)r=Y;else if(!r)return this;return 1===i&&(o=r,r=function(e){return x().off(e),o.apply(this,arguments)},r.guid=o.guid||(o.guid=x.guid++)),this.each(function(){x.event.add(this,e,r,n,t)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,x(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return(t===!1||"function"==typeof t)&&(n=t,t=undefined),n===!1&&(n=Y),this.each(function(){x.event.remove(this,e,n,t)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];return n?x.event.trigger(e,t,n,!0):undefined}});var G=/^.[^:#\[\.,]*$/,J=/^(?:parents|prev(?:Until|All))/,Q=x.expr.match.needsContext,K={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t=x(e,this),n=t.length;return this.filter(function(){var e=0;for(;n>e;e++)if(x.contains(this,t[e]))return!0})},not:function(e){return this.pushStack(et(this,e||[],!0))},filter:function(e){return this.pushStack(et(this,e||[],!1))},is:function(e){return!!et(this,"string"==typeof e&&Q.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],s=Q.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(s?s.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?g.call(x(e),this[0]):g.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function Z(e,t){while((e=e[t])&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return Z(e,"nextSibling")},prev:function(e){return Z(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return e.contentDocument||x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(K[e]||x.unique(i),J.test(e)&&i.reverse()),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,t,n){var r=[],i=n!==undefined;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&x(e).is(n))break;r.push(e)}return r},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function et(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(G.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return g.call(t,e)>=0!==n})}var tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,nt=/<([\w:]+)/,rt=/<|&#?\w+;/,it=/<(?:script|style|link)/i,ot=/^(?:checkbox|radio)$/i,st=/checked\s*(?:[^=]|=\s*.checked.)/i,at=/^$|\/(?:java|ecma)script/i,ut=/^true\/(.*)/,lt=/^\s*\s*$/g,ct={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ct.optgroup=ct.option,ct.tbody=ct.tfoot=ct.colgroup=ct.caption=ct.thead,ct.th=ct.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===undefined?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=pt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(mt(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&dt(mt(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++)1===e.nodeType&&(x.cleanData(mt(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var t=this[0]||{},n=0,r=this.length;if(e===undefined&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!it.test(e)&&!ct[(nt.exec(e)||["",""])[1].toLowerCase()]){e=e.replace(tt,"<$1>");try{for(;r>n;n++)t=this[n]||{},1===t.nodeType&&(x.cleanData(mt(t,!1)),t.innerHTML=e);t=0}catch(i){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=f.apply([],e);var r,i,o,s,a,u,l=0,c=this.length,p=this,h=c-1,d=e[0],g=x.isFunction(d);if(g||!(1>=c||"string"!=typeof d||x.support.checkClone)&&st.test(d))return this.each(function(r){var i=p.eq(r);g&&(e[0]=d.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(r=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),i=r.firstChild,1===r.childNodes.length&&(r=i),i)){for(o=x.map(mt(r,"script"),ft),s=o.length;c>l;l++)a=r,l!==h&&(a=x.clone(a,!0,!0),s&&x.merge(o,mt(a,"script"))),t.call(this[l],a,l);if(s)for(u=o[o.length-1].ownerDocument,x.map(o,ht),l=0;s>l;l++)a=o[l],at.test(a.type||"")&&!q.access(a,"globalEval")&&x.contains(u,a)&&(a.src?x._evalUrl(a.src):x.globalEval(a.textContent.replace(lt,"")))}return this}}),x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=[],i=x(e),o=i.length-1,s=0;for(;o>=s;s++)n=s===o?this:this.clone(!0),x(i[s])[t](n),h.apply(r,n.get());return this.pushStack(r)}}),x.extend({clone:function(e,t,n){var r,i,o,s,a=e.cloneNode(!0),u=x.contains(e.ownerDocument,e);if(!(x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(s=mt(a),o=mt(e),r=0,i=o.length;i>r;r++)yt(o[r],s[r]);if(t)if(n)for(o=o||mt(e),s=s||mt(a),r=0,i=o.length;i>r;r++)gt(o[r],s[r]);else gt(e,a);return s=mt(a,"script"),s.length>0&&dt(s,!u&&mt(e,"script")),a},buildFragment:function(e,t,n,r){var i,o,s,a,u,l,c=0,p=e.length,f=t.createDocumentFragment(),h=[];for(;p>c;c++)if(i=e[c],i||0===i)if("object"===x.type(i))x.merge(h,i.nodeType?[i]:i);else if(rt.test(i)){o=o||f.appendChild(t.createElement("div")),s=(nt.exec(i)||["",""])[1].toLowerCase(),a=ct[s]||ct._default,o.innerHTML=a[1]+i.replace(tt,"<$1>")+a[2],l=a[0];while(l--)o=o.lastChild;x.merge(h,o.childNodes),o=f.firstChild,o.textContent=""}else h.push(t.createTextNode(i));f.textContent="",c=0;while(i=h[c++])if((!r||-1===x.inArray(i,r))&&(u=x.contains(i.ownerDocument,i),o=mt(f.appendChild(i),"script"),u&&dt(o),n)){l=0;while(i=o[l++])at.test(i.type||"")&&n.push(i)}return f},cleanData:function(e){var t,n,r,i,o,s,a=x.event.special,u=0;for(;(n=e[u])!==undefined;u++){if(F.accepts(n)&&(o=n[q.expando],o&&(t=q.cache[o]))){if(r=Object.keys(t.events||{}),r.length)for(s=0;(i=r[s])!==undefined;s++)a[i]?x.event.remove(n,i):x.removeEvent(n,i,t.handle);q.cache[o]&&delete q.cache[o]}delete L.cache[n[L.expando]]}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}});function pt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function ft(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function ht(e){var t=ut.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function dt(e,t){var n=e.length,r=0;for(;n>r;r++)q.set(e[r],"globalEval",!t||q.get(t[r],"globalEval"))}function gt(e,t){var n,r,i,o,s,a,u,l;if(1===t.nodeType){if(q.hasData(e)&&(o=q.access(e),s=q.set(t,o),l=o.events)){delete s.handle,s.events={};for(i in l)for(n=0,r=l[i].length;r>n;n++)x.event.add(t,i,l[i][n])}L.hasData(e)&&(a=L.access(e),u=x.extend({},a),L.set(t,u))}}function mt(e,t){var n=e.getElementsByTagName?e.getElementsByTagName(t||"*"):e.querySelectorAll?e.querySelectorAll(t||"*"):[];return t===undefined||t&&x.nodeName(e,t)?x.merge([e],n):n}function yt(e,t){var n=t.nodeName.toLowerCase();"input"===n&&ot.test(e.type)?t.checked=e.checked:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}x.fn.extend({wrapAll:function(e){var t;return x.isFunction(e)?this.each(function(t){x(this).wrapAll(e.call(this,t))}):(this[0]&&(t=x(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this)},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var vt,xt,bt=/^(none|table(?!-c[ea]).+)/,wt=/^margin/,Tt=RegExp("^("+b+")(.*)$","i"),Ct=RegExp("^("+b+")(?!px)[a-z%]+$","i"),kt=RegExp("^([+-])=("+b+")","i"),Nt={BODY:"block"},Et={position:"absolute",visibility:"hidden",display:"block"},St={letterSpacing:0,fontWeight:400},jt=["Top","Right","Bottom","Left"],Dt=["Webkit","O","Moz","ms"];function At(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Dt.length;while(i--)if(t=Dt[i]+n,t in e)return t;return r}function Lt(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function qt(t){return e.getComputedStyle(t,null)}function Ht(e,t){var n,r,i,o=[],s=0,a=e.length;for(;a>s;s++)r=e[s],r.style&&(o[s]=q.get(r,"olddisplay"),n=r.style.display,t?(o[s]||"none"!==n||(r.style.display=""),""===r.style.display&&Lt(r)&&(o[s]=q.access(r,"olddisplay",Rt(r.nodeName)))):o[s]||(i=Lt(r),(n&&"none"!==n||!i)&&q.set(r,"olddisplay",i?n:x.css(r,"display"))));for(s=0;a>s;s++)r=e[s],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[s]||"":"none"));return e}x.fn.extend({css:function(e,t){return x.access(this,function(e,t,n){var r,i,o={},s=0;if(x.isArray(t)){for(r=qt(e),i=t.length;i>s;s++)o[t[s]]=x.css(e,t[s],!1,r);return o}return n!==undefined?x.style(e,t,n):x.css(e,t)},e,t,arguments.length>1)},show:function(){return Ht(this,!0)},hide:function(){return Ht(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Lt(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=vt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,s,a=x.camelCase(t),u=e.style;return t=x.cssProps[a]||(x.cssProps[a]=At(u,a)),s=x.cssHooks[t]||x.cssHooks[a],n===undefined?s&&"get"in s&&(i=s.get(e,!1,r))!==undefined?i:u[t]:(o=typeof n,"string"===o&&(i=kt.exec(n))&&(n=(i[1]+1)*i[2]+parseFloat(x.css(e,t)),o="number"),null==n||"number"===o&&isNaN(n)||("number"!==o||x.cssNumber[a]||(n+="px"),x.support.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),s&&"set"in s&&(n=s.set(e,n,r))===undefined||(u[t]=n)),undefined)}},css:function(e,t,n,r){var i,o,s,a=x.camelCase(t);return t=x.cssProps[a]||(x.cssProps[a]=At(e.style,a)),s=x.cssHooks[t]||x.cssHooks[a],s&&"get"in s&&(i=s.get(e,!0,n)),i===undefined&&(i=vt(e,t,r)),"normal"===i&&t in St&&(i=St[t]),""===n||n?(o=parseFloat(i),n===!0||x.isNumeric(o)?o||0:i):i}}),vt=function(e,t,n){var r,i,o,s=n||qt(e),a=s?s.getPropertyValue(t)||s[t]:undefined,u=e.style;return s&&(""!==a||x.contains(e.ownerDocument,e)||(a=x.style(e,t)),Ct.test(a)&&wt.test(t)&&(r=u.width,i=u.minWidth,o=u.maxWidth,u.minWidth=u.maxWidth=u.width=a,a=s.width,u.width=r,u.minWidth=i,u.maxWidth=o)),a};function Ot(e,t,n){var r=Tt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function Ft(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,s=0;for(;4>o;o+=2)"margin"===n&&(s+=x.css(e,n+jt[o],!0,i)),r?("content"===n&&(s-=x.css(e,"padding"+jt[o],!0,i)),"margin"!==n&&(s-=x.css(e,"border"+jt[o]+"Width",!0,i))):(s+=x.css(e,"padding"+jt[o],!0,i),"padding"!==n&&(s+=x.css(e,"border"+jt[o]+"Width",!0,i)));return s}function Pt(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=qt(e),s=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=vt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Ct.test(i))return i;r=s&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+Ft(e,t,n||(s?"border":"content"),r,o)+"px"}function Rt(e){var t=o,n=Nt[e];return n||(n=Mt(e,t),"none"!==n&&n||(xt=(xt||x("