@kuoruan/luci-types
Version:
Typescript declaration files for OpenWrt LuCI2.
1,347 lines (1,246 loc) • 52.5 kB
TypeScript
// Type definitions for LuCI.ui
// Documentation: http://openwrt.github.io/luci/jsapi/LuCI.ui.html
// Definitions by: Xingwang Liao <https://github.com/kuoruan>
// TypeScript Version: 3.8
import baseclass from "./baseclass";
export as namespace ui;
export = 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(...)`.
*/
declare namespace ui {
/**
* 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.
*
* @remarks {@link LuCI.dom.content}
*
* @param title - The title of the notification banner. If `null`, no title
* element will be rendered.
* @param 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.
* @param classes - repeatable. A number of extra CSS class names which are
* set on the notification banner element.
*
* @returns Returns a DOM Node representing the notification banner element.
*/
function addNotification(
title: string | null,
contents: any,
...classes: string[]
): Node;
/**
* 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.
*
* @remarks {@link LuCI.validation}
*
* @param field - The DOM input element node to bind the validation
* constraints to.
* @param type - The datatype specification to describe validation
* constraints. Refer to the `LuCI.validation` class documentation for
* details.
* @param 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.
* @param vfunc - 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.
* @param events - 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.
*
* @returns Returns the compiled validator function which can be used to
* manually trigger field validation or to bind it to further events.
*/
function addValidator(
field: Node,
type: LuCI.validation.DataTypes,
optional?: boolean,
vfunc?: Function,
...events: string[]
): Function;
/**
* 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.
*
* @param hosts - 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.
*/
function awaitReconnect(...hosts: string[]): void;
/**
* 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.
*
* @param ctx - The `this` context to use for the wrapped function.
* @param fn - 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
* @param 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 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.
*/
function createHandlerFn<T, F extends (this: T, ...args: any[]) => any>(
ctx: T,
fn: F | string,
...extra_args: any[]
): ((...args: any[]) => any) | null;
/**
* 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.
*
* @param id - The ID of the indicator to remove.
*
* @returns Returns `true` when the indicator has been removed or `false` when
* the requested indicator was not found.
*/
function hideIndicator(id: string): boolean;
/**
* 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.
*/
function hideModal(): void;
/**
* 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()`.
*
* @param path - The view path to render.
*
* @returns Returns a promise resolving to the loaded view instance.
*/
function instantiateView(path: string): Promise<LuCI.view>;
/**
* 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.
*
* @param node - The parent DOM node to append the markup to. Any previous
* child elements will be removed.
* @param items - 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()`.
* @param separators - 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 Returns the parent DOM node the formatted markup has been added
* to.
*/
function itemlist(node: Node, items: any[], separators?: any | any[]): Node;
/**
* 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.
*
* @param proto - The protocol to use for fetching the resource. May be either
* `http` (the default) or `https`.
* @param host - Override the host address to probe. By default the current
* host as seen in the address bar is probed.
*
* @returns 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.
*/
function pingDevice(proto?: "http" | "https", host?: string): Promise<Event>;
/**
* 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.
*
* @param id - The ID of the indicator. If an indicator with the given ID
* already exists, it is updated with the given label and style.
* @param label - The text to display in the indicator label.
* @param handler - 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.
* @param style - The indicator style to use. May be either `active` or
* `inactive`.
*
* @returns Returns `true` when the indicator has been updated or `false` when
* no changes were made.
*/
function showIndicator(
id: string,
label: string,
handler?: Function,
style?: "active" | "inactive"
): boolean;
/**
* 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.
*
* @remarks {@link LuCI.dom.content}
*
* @param title - The title of the dialog. If `null`, no title element will be
* rendered.
* @param 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.
* @param classes - repeatable. A number of extra CSS class names which are
* set on the modal dialog element.
*
* @returns Returns a DOM Node representing the modal dialog element.
*/
function showModal(
title: string | null,
contents: any,
...classes: string[]
): Node;
/**
* 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.
*
* @param path - The remote file path to upload the local file to.
* @param progessStatusNode - An optional DOM text node whose content text is
* set to the progress percentage value during file upload.
*
* @returns 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.
*/
function uploadFile(
path: string,
progessStatusNode?: Node
): Promise<FileUploadReply>;
/**
* 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.
*/
class AbstractElement extends baseclass {
/**
* Read the current value of the input widget.
*
* @returns 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.
*/
getValue(): string | string[] | null;
/**
* Check whether the current input value is valid.
*
* @returns Returns `true` if the current input value is valid or `false` if
* it does not meet the validation constraints.
*/
isValid(): boolean;
/**
* 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.
*
* @param targetNode - Specifies the DOM node on which the native event
* listeners should be registered.
* @param synevent - The name of the custom event to dispatch to the widget
* root DOM node.
* @param events - The native DOM events for which event handlers should be
* registered.
*/
registerEvents(targetNode: Node, synevent: string, events: string[]): void;
/**
* Render the widget, setup event listeners and return resulting markup.
*
* @returns Returns a DOM Node or DocumentFragment containing the rendered
* widget markup.
*/
render(): Node;
/**
* 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.
*
* @param targetNode - Specifies the DOM node on which the event listeners
* should be registered.
* @param events - repeatable. The DOM events for which event handlers
* should be registered.
*/
setChangeEvents(targetNode: Node, ...events: string[]): void;
/**
* 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.
*
* @param targetNode - Specifies the DOM node on which the event listeners
* should be registered.
* @param events - repeatable. The DOM events for which event handlers
* should be registered.
*/
setUpdateEvents(targetNode: Node, ...events: string[]): void;
/**
* Set the current value of the input widget.
*
* @param value - 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.
*/
setValue(value: string | string[] | null): void;
/**
* 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.
*/
triggerValidation(): void;
}
namespace AbstractElement {
interface InitOptions {
/**
* Specifies the widget ID to use. It will be used as HTML `id` attribute
* on the toplevel widget DOM node.
*/
id?: string;
/**
* Specifies the widget `name` which is set as HTML name attribute on the
* corresponding `<input>` element.
*/
name?: string;
/**
* Specifies whether the input field allows empty values.
*
* @defaultValue true
*/
optional?: boolean;
/**
* 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.
*
* @defaultValue string
*/
datatype?: string;
/**
* 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.
*/
validate?: (val: string) => boolean | string | object;
/**
* 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.
*
* @defaultValue false
*/
disabled?: boolean;
}
}
namespace changes {
/**
* 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.
*
* @param checked - 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.
*/
function apply(checked?: boolean): void;
/**
* Display the current changelog.
*
* Open a modal dialog visualizing the currently staged UCI changes and
* offer options to revert or apply the shown changes.
*/
function displayChanges(): void;
/**
* Update the change count indicator.
*
* This function updates the UCI change count indicator from the given UCI
* changeset structure.
*
* @param changes - The UCI changeset to count.
*/
function renderChangeIndicator(changes: {
[key: string]: LuCI.uci.ChangeRecord[];
}): void;
/**
* 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.
*/
function revert(): void;
/**
* 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.
*
* @param numChanges - The number of changes to indicate.
*/
function setIndicator(numChanges: number): void;
}
/**
* 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.
*/
class CheckBox extends AbstractElement {
/**
* Instantiate a checkbox widget.
*
* @param value - The initial input value.
* @param options - Object describing the widget specific options to
* initialize the input.
*/
constructor(value?: string, options?: CheckBox.InitOptions);
/**
* Test whether the checkbox is currently checked.
*
* @returns Returns `true` when the checkbox is currently checked, otherwise
* `false`.
*/
isChecked(): boolean;
}
namespace CheckBox {
interface InitOptions extends AbstractElement.InitOptions {
/**
* Specifies the value corresponding to a checked checkbox.
*
* @defaultValue 1
*/
value_enabled?: string;
/**
* Specifies the value corresponding to an unchecked checkbox.
*
* @defaultValue 0
*/
value_disabled?: string;
/**
* 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.
*/
hiddenname?: string;
}
}
/**
* 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.
*/
class Combobox extends Dropdown {
/**
* Instantiate a rich dropdown choice widget allowing custom values.
*
* @param value - The initial input value(s).
* @param choices - 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.
* @param options - Object describing the widget specific options to
* initialize the dropdown.
*/
constructor(
value: string | string[] | null,
choices: { [key: string]: any },
options?: Combobox.InitOptions
);
}
namespace Combobox {
interface InitOptions extends Dropdown.InitOptions {
/**
* Since Comboboxes never allow selecting multiple values, this property
* is forcibly set to `false`.
*
* @defaultValue false
*/
multiple?: false;
/**
* Since Comboboxes always allow custom choice values, this property is
* forcibly set to `true`.
*
* @defaultValue true
*/
create?: true;
/**
* Since Comboboxes are always optional, this property is forcibly set to
* `true`.
*
* @defaultValue true
*/
optional?: true;
}
}
/**
* 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.
*/
class ComboButton extends Dropdown {
/**
* Instantiate a combo button widget offering multiple action choices.
*
* @param value - The initial input value(s).
* @param choices - 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.
* @param options - Object describing the widget specific options to
* initialize the button.
*/
constructor(
value: string | string[] | null,
choices: { [key: string]: any },
options?: ComboButton.InitOptions
);
}
namespace ComboButton {
/**
* ComboButtons support the same properties as `Dropdown.InitOptions` but
* enforce specific values for some properties and add aditional button
* specific properties.
*/
interface InitOptions extends Dropdown.InitOptions {
/**
* Since ComboButtons never allow selecting multiple actions, this
* property is forcibly set to `false`.
*
* @defaultValue false
*/
multiple?: false;
/**
* Since ComboButtons never allow creating custom choices, this property
* is forcibly set to `false`.
*
* @defaultValue false
*/
create?: false;
/**
* Since ComboButtons must always select one action, this property is
* forcibly set to `false`.
*
* @defaultValue false
*/
optional?: false;
/**
* 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.
*/
classes?: { [key: string]: string };
/**
* 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.
*/
click?: Function;
}
}
/**
* 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.
*/
class Dropdown extends AbstractElement {
/**
* Instantiate a rich dropdown choice widget.
*
* @param value - The initial input value(s).
* @param choices - 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.
* @param options - Object describing the widget specific options to
* initialize the dropdown.
*/
constructor(
value: string | string[] | null,
choices: { [key: string]: any },
options?: Dropdown.InitOptions
);
/**
* Add new choices to the dropdown menu.
*
* This function adds further choices to an existing dropdown menu, ignoring
* choice values which are already present.
*
* @param values - The choice values to add to the dropdown widget.
* @param labels - 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`.
*/
addChoices(values: string[], labels: { [key: string]: any }): void;
/**
* 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.
*
* @param reset_value - If set to true, deselect and remove selected choices
* as well instead of keeping them.
*/
clearChoices(reset_value?: boolean): void;
/**
* Close all open dropdown widgets in the current document.
*/
closeAllDropdowns(): void;
}
namespace Dropdown {
interface InitOptions extends AbstractElement.InitOptions {
/**
* 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.
*
* @defaultValue true
*/
optional?: boolean;
/**
* Specifies whether multiple choice values may be selected. It defaults
* to `true` when an array is passed as input value to the constructor.
*/
multiple?: boolean;
/**
* 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.
*
* @defaultValue false
*/
sort?: boolean | string[];
/**
* Specifies a placeholder text which is displayed when no choice is
* selected yet.
*
* @defaultValue `-- Please choose --`
*/
select_placeholder?: string;
/**
* 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`.
*
* @defaultValue `-- custom --`
*/
custom_placeholder?: string;
/**
* Specifies whether custom choices may be entered into the dropdown
* widget.
*
* @defaultValue false
*/
create?: boolean;
/**
* 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.
*
* @defaultValue .create-item-input
*/
create_query?: string;
/**
* 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>`.
*
* @defaultValue script[type="item-template"]
*/
create_template?: string;
/**
* 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`.
*/
create_markup?: string;
/**
* 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`.
*
* @defaultValue 3
*/
display_items?: number;
/**
* 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.
*
* @defaultValue -1
*/
dropdown_items?: number;
/**
* 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.
*/
placeholder?: string;
/**
* Specifies whether the custom choice input field should be rendered
* readonly. Only applicable when `create` is `true`.
*
* @defaultValue false
*/
readonly?: boolean;
/**
* 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`.
*/
maxlength?: number;
}
}
/**
* 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.
*/
class DynamicList extends AbstractElement {
/**
* Instantiate a dynamic list widget.
*
* @param value - The initial input value(s).
* @param choices - 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.
* @param options - Object describing the widget specific options to
* initialize the dynamic list.
*/
constructor(
value: string | string[] | null,
choices?: { [key: string]: any },
options?: DynamicList.InitOptions
);
/**
* 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.
*
* @param values - The choice values to add to the dynamic lists suggestion
* dropdown.
* @param labels - 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`.
*/
addChoices(values: string[], labels: { [key: string]: any }): void;
/**
* Remove all existing choices from the dynamic list.
*
* This function removes all preexisting suggested choices from the widget.
*/
clearChoices(): void;
}
namespace DynamicList {
/**
* 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.
*/
interface InitOptions extends Dropdown.InitOptions {
/**
* Since dynamic lists never allow selecting multiple choices when adding
* another list item, this property is forcibly set to `false`.
*
* @defaultValue false
*/
multiple: false;
/**
* 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.
*
* @defaultValue true
*/
optional?: boolean;
}
}
/**
* 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.
*/
class FileUpload extends AbstractElement {
/**
* Instantiate a file upload widget.
*
* @param value - The initial input value.
* @param options - Object describing the widget specific options to
* initialize the file upload control.
*/
constructor(
value: string | string[] | null,
options?: FileUpload.InitOptions
);
}
namespace FileUpload {
interface InitOptions extends AbstractElement.InitOptions {
/**
* 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.
*
* @defaultValue false
*/
show_hidden?: boolean;
/**
* 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.
*
* @defaultValue true
*/
enable_upload?: boolean;
/**
* 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.
*
* @defaultValue true
*/
enable_remove?: boolean;
/**
* 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.
*
* @defaultValue /etc/luci-uploads
*/
root_directory?: string;
}
}
/**
* 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.
*/
class Hiddenfield extends AbstractElement {
/**
* Instantiate a hidden input field widget.
*
* @param value - The initial input value.
* @param options - Object describing the widget specific options to
* initialize the hidden input.
*/
constructor(
value: string | string[] | null,
options?: AbstractElement.InitOptions
);
}
/**
* Handle menu.
*/
namespace menu {
/**
* Load and cache current menu tree.
*
* @returns Returns a promise resolving to the root element of the menu
* tree.
*/
function load(): Promise<MenuNode>;
/**
* Flush the internal menu cache to force loading a new structure on the
* next page load.
*/
function flushCache(): void;
/**
* Get menu children
*
* @param node - The menu node to retrieve the children for. Defaults to the
* menu's internal root node if omitted.
*
* @returns Returns an array of child menu nodes.
*/
function getChildren(node?: MenuNode): MenuNode[];
type MenuNode = {
/**
* The internal name of the node, as used in the URL
*/
name: string;
/**
* The sort index of the menu node
*/
order: number;
/**
* The title of the menu node, `null` if the node should be hidden
*/
title?: string | null;
/**
* Boolean indicating whether the menu enries dependencies are satisfied
*/
satisified: boolean;
/**
* Boolean indicating whether the menu entries underlying ACLs are
* readonly
*/
readonly?: boolean;
/**
* Array of child menu nodes.
*/
children?: MenuNode[];
};
}
/**
* 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.
*/
class Select extends AbstractElement {
/**
* Instantiate a select dropdown or checkbox/radiobutton group.
*
* @param value - The initial input value(s).
* @param choices - 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.
* @param options - Object describing the widget specific options to
* initialize the inputs.
*/
constructor(
value: string | string[] | null,
choices: { [key: string]: string },
options?: Select.InitOptions
);
}
namespace Select {
interface InitOptions extends AbstractElement.InitOptions {
/**
* Specifies whether multiple choice values may be selected.
*
* @defaultValue false
*/
multiple?: boolean;
/**
* 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.
*
* @defaultValue select
*/
widget?: string;
/**
* Specifies whether checkbox / radio button groups should be rendered in
* a `horizontal` or `vertical` manner. Does not apply to the `select`
* widget type.
*
* @defaultValue horizontal
*/
orientation?: string;
/**
* 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.
*
* @defaultValue false
*/
sort?: boolean | string[];
/**
* Specifies the HTML `size` attribute to set on the `<select>` element.
* Only applicable to the `select` widget type.
*/
size?: number;
/**
* Specifies a placeholder text which is displayed when no choice is
* selected yet. Only applicable to the `select` widget type.
*
* @defaultValue `-- Please choose --`
*/
placeholder?: string;
}
}
/**
* 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.
*/
class tabs extends AbstractElement {
/**
* 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.
*
* @param panes - 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.
*/
initTabGroup(panes: Node[] | NodeList): void;
/**
* Checks whether the given tab pane node is empty.
*
* @param pane - The tab pane to check.
*
* @returns Returns `true` if the pane is empty, else `false`.
*/
isEmptyPane(pane: Node): boolean;
}
/**
* 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.
*/
class Textarea extends AbstractElement {
/**
* Instantiate a textarea widget.
*
* @param value - The initial input value.
* @param options - Object describing the widget specific options to
* initialize the input.
*/
constructor(value: string | null, options?: Textarea.InitOptions);
}
namespace Textarea {
interface InitOptions extends AbstractElement.InitOptions {
/**
* Specifies whether the input widget should be rendered readonly.
*
* @defaultValue false
*/
readonly?: boolean;
/**
* Specifies the HTML `placeholder` attribute which is displayed when the
* corresponding `<textarea>` element is empty.
*/
placeholder?: string;
/**
* Specifies whether a monospace font should be forced for the textarea
* contents.
*
* @defaultValue false
*/
monospace?: boolean;
/**
* Specifies the HTML `cols` attribute to set on the corresponding
* `<textarea>` element.