5 <title>Source: form.js
</title>
8 <script src=
"scripts/prettify/prettify.js"></script>
9 <script src=
"scripts/prettify/lang-css.js"></script>
10 <script src=
"scripts/jquery.min.js"></script>
12 <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
14 <link type=
"text/css" rel=
"stylesheet" href=
"styles/prettify-tomorrow.css">
15 <link type=
"text/css" rel=
"stylesheet" href=
"styles/bootstrap.min.css">
16 <link type=
"text/css" rel=
"stylesheet" href=
"styles/jaguar.css">
20 var config = {
"monospaceLinks":true,
"cleverLinks":true,
"default":{
"outputSourceFiles":true}};
27 <div id=
"wrap" class=
"clearfix">
29 <div class=
"navigation">
30 <h3 class=
"applicationName"><a href=
"index.html"></a></h3>
33 <input id=
"search" type=
"text" class=
"form-control input-sm" placeholder=
"Search Documentations">
37 <li class=
"item" data-name=
"LuCI">
39 <a href=
"LuCI.html">LuCI
</a>
42 <ul class=
"members itemMembers">
44 <span class=
"subtitle">Members
</span>
46 <li data-name=
"LuCI#Class"><a href=
"LuCI.html#Class">Class
</a></li>
48 <li data-name=
"LuCI#dom"><a href=
"LuCI.html#dom">dom
</a></li>
50 <li data-name=
"LuCI#env"><a href=
"LuCI.html#env">env
</a></li>
52 <li data-name=
"LuCI#Poll"><a href=
"LuCI.html#Poll">Poll
</a></li>
54 <li data-name=
"LuCI#Request"><a href=
"LuCI.html#Request">Request
</a></li>
56 <li data-name=
"LuCI#view"><a href=
"LuCI.html#view">view
</a></li>
59 <ul class=
"typedefs itemMembers">
61 <span class=
"subtitle">Typedefs
</span>
63 <li data-name=
"LuCI.requestCallbackFn"><a href=
"LuCI.html#.requestCallbackFn">requestCallbackFn
</a></li>
66 <ul class=
"typedefs itemMembers">
69 <ul class=
"methods itemMembers">
71 <span class=
"subtitle">Methods
</span>
73 <li data-name=
"LuCI#bind"><a href=
"LuCI.html#bind">bind
</a></li>
75 <li data-name=
"LuCI#error"><a href=
"LuCI.html#error">error
</a></li>
77 <li data-name=
"LuCI#fspath"><a href=
"LuCI.html#fspath">fspath
</a></li>
79 <li data-name=
"LuCI#get"><a href=
"LuCI.html#get">get
</a></li>
81 <li data-name=
"LuCI#halt"><a href=
"LuCI.html#halt">halt
</a></li>
83 <li data-name=
"LuCI#hasSystemFeature"><a href=
"LuCI.html#hasSystemFeature">hasSystemFeature
</a></li>
85 <li data-name=
"LuCI#hasViewPermission"><a href=
"LuCI.html#hasViewPermission">hasViewPermission
</a></li>
87 <li data-name=
"LuCI#isObject"><a href=
"LuCI.html#isObject">isObject
</a></li>
89 <li data-name=
"LuCI#location"><a href=
"LuCI.html#location">location
</a></li>
91 <li data-name=
"LuCI#media"><a href=
"LuCI.html#media">media
</a></li>
93 <li data-name=
"LuCI#path"><a href=
"LuCI.html#path">path
</a></li>
95 <li data-name=
"LuCI#poll"><a href=
"LuCI.html#poll">poll
</a></li>
97 <li data-name=
"LuCI#post"><a href=
"LuCI.html#post">post
</a></li>
99 <li data-name=
"LuCI#raise"><a href=
"LuCI.html#raise">raise
</a></li>
101 <li data-name=
"LuCI#require"><a href=
"LuCI.html#require">require
</a></li>
103 <li data-name=
"LuCI#resolveDefault"><a href=
"LuCI.html#resolveDefault">resolveDefault
</a></li>
105 <li data-name=
"LuCI#resource"><a href=
"LuCI.html#resource">resource
</a></li>
107 <li data-name=
"LuCI#run"><a href=
"LuCI.html#run">run
</a></li>
109 <li data-name=
"LuCI#sortedKeys"><a href=
"LuCI.html#sortedKeys">sortedKeys
</a></li>
111 <li data-name=
"LuCI#stop"><a href=
"LuCI.html#stop">stop
</a></li>
113 <li data-name=
"LuCI#toArray"><a href=
"LuCI.html#toArray">toArray
</a></li>
115 <li data-name=
"LuCI#url"><a href=
"LuCI.html#url">url
</a></li>
118 <ul class=
"events itemMembers">
123 <li class=
"item" data-name=
"LuCI.baseclass">
125 <a href=
"LuCI.baseclass.html">LuCI.baseclass
</a>
128 <ul class=
"members itemMembers">
131 <ul class=
"typedefs itemMembers">
134 <ul class=
"typedefs itemMembers">
137 <ul class=
"methods itemMembers">
139 <span class=
"subtitle">Methods
</span>
141 <li data-name=
"LuCI.baseclass.extend"><a href=
"LuCI.baseclass.html#.extend">extend
</a></li>
143 <li data-name=
"LuCI.baseclass.instantiate"><a href=
"LuCI.baseclass.html#.instantiate">instantiate
</a></li>
145 <li data-name=
"LuCI.baseclass.isSubclass"><a href=
"LuCI.baseclass.html#.isSubclass">isSubclass
</a></li>
147 <li data-name=
"LuCI.baseclass.singleton"><a href=
"LuCI.baseclass.html#.singleton">singleton
</a></li>
149 <li data-name=
"LuCI.baseclass#super"><a href=
"LuCI.baseclass.html#super">super
</a></li>
151 <li data-name=
"LuCI.baseclass#varargs"><a href=
"LuCI.baseclass.html#varargs">varargs
</a></li>
154 <ul class=
"events itemMembers">
159 <li class=
"item" data-name=
"LuCI.dom">
161 <a href=
"LuCI.dom.html">LuCI.dom
</a>
164 <ul class=
"members itemMembers">
167 <ul class=
"typedefs itemMembers">
169 <span class=
"subtitle">Typedefs
</span>
171 <li data-name=
"LuCI.dom~ignoreCallbackFn"><a href=
"LuCI.dom.html#~ignoreCallbackFn">ignoreCallbackFn
</a></li>
174 <ul class=
"typedefs itemMembers">
177 <ul class=
"methods itemMembers">
179 <span class=
"subtitle">Methods
</span>
181 <li data-name=
"LuCI.dom#append"><a href=
"LuCI.dom.html#append">append
</a></li>
183 <li data-name=
"LuCI.dom#attr"><a href=
"LuCI.dom.html#attr">attr
</a></li>
185 <li data-name=
"LuCI.dom#bindClassInstance"><a href=
"LuCI.dom.html#bindClassInstance">bindClassInstance
</a></li>
187 <li data-name=
"LuCI.dom#callClassMethod"><a href=
"LuCI.dom.html#callClassMethod">callClassMethod
</a></li>
189 <li data-name=
"LuCI.dom#content"><a href=
"LuCI.dom.html#content">content
</a></li>
191 <li data-name=
"LuCI.dom#create"><a href=
"LuCI.dom.html#create">create
</a></li>
193 <li data-name=
"LuCI.dom#data"><a href=
"LuCI.dom.html#data">data
</a></li>
195 <li data-name=
"LuCI.dom#elem"><a href=
"LuCI.dom.html#elem">elem
</a></li>
197 <li data-name=
"LuCI.dom#findClassInstance"><a href=
"LuCI.dom.html#findClassInstance">findClassInstance
</a></li>
199 <li data-name=
"LuCI.dom#isEmpty"><a href=
"LuCI.dom.html#isEmpty">isEmpty
</a></li>
201 <li data-name=
"LuCI.dom#matches"><a href=
"LuCI.dom.html#matches">matches
</a></li>
203 <li data-name=
"LuCI.dom#parent"><a href=
"LuCI.dom.html#parent">parent
</a></li>
205 <li data-name=
"LuCI.dom#parse"><a href=
"LuCI.dom.html#parse">parse
</a></li>
208 <ul class=
"events itemMembers">
213 <li class=
"item" data-name=
"LuCI.form">
215 <a href=
"LuCI.form.html">LuCI.form
</a>
218 <ul class=
"members itemMembers">
221 <ul class=
"typedefs itemMembers">
224 <ul class=
"typedefs itemMembers">
227 <ul class=
"methods itemMembers">
230 <ul class=
"events itemMembers">
235 <li class=
"item" data-name=
"LuCI.form.AbstractElement">
237 <a href=
"LuCI.form.AbstractElement.html">LuCI.form.AbstractElement
</a>
240 <ul class=
"members itemMembers">
243 <ul class=
"typedefs itemMembers">
246 <ul class=
"typedefs itemMembers">
249 <ul class=
"methods itemMembers">
251 <span class=
"subtitle">Methods
</span>
253 <li data-name=
"LuCI.form.AbstractElement#append"><a href=
"LuCI.form.AbstractElement.html#append">append
</a></li>
255 <li data-name=
"LuCI.form.AbstractElement#parse"><a href=
"LuCI.form.AbstractElement.html#parse">parse
</a></li>
257 <li data-name=
"LuCI.form.AbstractElement#render"><a href=
"LuCI.form.AbstractElement.html#render">render
</a></li>
259 <li data-name=
"LuCI.form.AbstractElement#stripTags"><a href=
"LuCI.form.AbstractElement.html#stripTags">stripTags
</a></li>
261 <li data-name=
"LuCI.form.AbstractElement#titleFn"><a href=
"LuCI.form.AbstractElement.html#titleFn">titleFn
</a></li>
264 <ul class=
"events itemMembers">
269 <li class=
"item" data-name=
"LuCI.form.AbstractSection">
271 <a href=
"LuCI.form.AbstractSection.html">LuCI.form.AbstractSection
</a>
274 <ul class=
"members itemMembers">
276 <span class=
"subtitle">Members
</span>
278 <li data-name=
"LuCI.form.AbstractSection##parentoption"><a href=
"LuCI.form.AbstractSection.html#parentoption">parentoption
</a></li>
281 <ul class=
"typedefs itemMembers">
284 <ul class=
"typedefs itemMembers">
287 <ul class=
"methods itemMembers">
289 <span class=
"subtitle">Methods
</span>
291 <li data-name=
"LuCI.form.AbstractSection#append"><a href=
"LuCI.form.AbstractSection.html#append">append
</a></li>
293 <li data-name=
"LuCI.form.AbstractSection#cfgsections"><a href=
"LuCI.form.AbstractSection.html#cfgsections">cfgsections
</a></li>
295 <li data-name=
"LuCI.form.AbstractSection#cfgvalue"><a href=
"LuCI.form.AbstractSection.html#cfgvalue">cfgvalue
</a></li>
297 <li data-name=
"LuCI.form.AbstractSection#filter"><a href=
"LuCI.form.AbstractSection.html#filter">filter
</a></li>
299 <li data-name=
"LuCI.form.AbstractSection#formvalue"><a href=
"LuCI.form.AbstractSection.html#formvalue">formvalue
</a></li>
301 <li data-name=
"LuCI.form.AbstractSection#getOption"><a href=
"LuCI.form.AbstractSection.html#getOption">getOption
</a></li>
303 <li data-name=
"LuCI.form.AbstractSection#getUIElement"><a href=
"LuCI.form.AbstractSection.html#getUIElement">getUIElement
</a></li>
305 <li data-name=
"LuCI.form.AbstractSection#load"><a href=
"LuCI.form.AbstractSection.html#load">load
</a></li>
307 <li data-name=
"LuCI.form.AbstractSection#option"><a href=
"LuCI.form.AbstractSection.html#option">option
</a></li>
309 <li data-name=
"LuCI.form.AbstractSection#parse"><a href=
"LuCI.form.AbstractSection.html#parse">parse
</a></li>
311 <li data-name=
"LuCI.form.AbstractSection#render"><a href=
"LuCI.form.AbstractSection.html#render">render
</a></li>
313 <li data-name=
"LuCI.form.AbstractSection#stripTags"><a href=
"LuCI.form.AbstractSection.html#stripTags">stripTags
</a></li>
315 <li data-name=
"LuCI.form.AbstractSection#tab"><a href=
"LuCI.form.AbstractSection.html#tab">tab
</a></li>
317 <li data-name=
"LuCI.form.AbstractSection#taboption"><a href=
"LuCI.form.AbstractSection.html#taboption">taboption
</a></li>
319 <li data-name=
"LuCI.form.AbstractSection#titleFn"><a href=
"LuCI.form.AbstractSection.html#titleFn">titleFn
</a></li>
322 <ul class=
"events itemMembers">
327 <li class=
"item" data-name=
"LuCI.form.AbstractValue">
329 <a href=
"LuCI.form.AbstractValue.html">LuCI.form.AbstractValue
</a>
332 <ul class=
"members itemMembers">
334 <span class=
"subtitle">Members
</span>
336 <li data-name=
"LuCI.form.AbstractValue##datatype"><a href=
"LuCI.form.AbstractValue.html#datatype">datatype
</a></li>
338 <li data-name=
"LuCI.form.AbstractValue##default"><a href=
"LuCI.form.AbstractValue.html#default">default
</a></li>
340 <li data-name=
"LuCI.form.AbstractValue##editable"><a href=
"LuCI.form.AbstractValue.html#editable">editable
</a></li>
342 <li data-name=
"LuCI.form.AbstractValue##modalonly"><a href=
"LuCI.form.AbstractValue.html#modalonly">modalonly
</a></li>
344 <li data-name=
"LuCI.form.AbstractValue##onchange"><a href=
"LuCI.form.AbstractValue.html#onchange">onchange
</a></li>
346 <li data-name=
"LuCI.form.AbstractValue##optional"><a href=
"LuCI.form.AbstractValue.html#optional">optional
</a></li>
348 <li data-name=
"LuCI.form.AbstractValue##readonly"><a href=
"LuCI.form.AbstractValue.html#readonly">readonly
</a></li>
350 <li data-name=
"LuCI.form.AbstractValue##rmempty"><a href=
"LuCI.form.AbstractValue.html#rmempty">rmempty
</a></li>
352 <li data-name=
"LuCI.form.AbstractValue##uciconfig"><a href=
"LuCI.form.AbstractValue.html#uciconfig">uciconfig
</a></li>
354 <li data-name=
"LuCI.form.AbstractValue##ucioption"><a href=
"LuCI.form.AbstractValue.html#ucioption">ucioption
</a></li>
356 <li data-name=
"LuCI.form.AbstractValue##ucisection"><a href=
"LuCI.form.AbstractValue.html#ucisection">ucisection
</a></li>
358 <li data-name=
"LuCI.form.AbstractValue##validate"><a href=
"LuCI.form.AbstractValue.html#validate">validate
</a></li>
360 <li data-name=
"LuCI.form.AbstractValue##width"><a href=
"LuCI.form.AbstractValue.html#width">width
</a></li>
363 <ul class=
"typedefs itemMembers">
366 <ul class=
"typedefs itemMembers">
369 <ul class=
"methods itemMembers">
371 <span class=
"subtitle">Methods
</span>
373 <li data-name=
"LuCI.form.AbstractValue#append"><a href=
"LuCI.form.AbstractValue.html#append">append
</a></li>
375 <li data-name=
"LuCI.form.AbstractValue#cbid"><a href=
"LuCI.form.AbstractValue.html#cbid">cbid
</a></li>
377 <li data-name=
"LuCI.form.AbstractValue#cfgvalue"><a href=
"LuCI.form.AbstractValue.html#cfgvalue">cfgvalue
</a></li>
379 <li data-name=
"LuCI.form.AbstractValue#depends"><a href=
"LuCI.form.AbstractValue.html#depends">depends
</a></li>
381 <li data-name=
"LuCI.form.AbstractValue#formvalue"><a href=
"LuCI.form.AbstractValue.html#formvalue">formvalue
</a></li>
383 <li data-name=
"LuCI.form.AbstractValue#getUIElement"><a href=
"LuCI.form.AbstractValue.html#getUIElement">getUIElement
</a></li>
385 <li data-name=
"LuCI.form.AbstractValue#isActive"><a href=
"LuCI.form.AbstractValue.html#isActive">isActive
</a></li>
387 <li data-name=
"LuCI.form.AbstractValue#isValid"><a href=
"LuCI.form.AbstractValue.html#isValid">isValid
</a></li>
389 <li data-name=
"LuCI.form.AbstractValue#load"><a href=
"LuCI.form.AbstractValue.html#load">load
</a></li>
391 <li data-name=
"LuCI.form.AbstractValue#parse"><a href=
"LuCI.form.AbstractValue.html#parse">parse
</a></li>
393 <li data-name=
"LuCI.form.AbstractValue#remove"><a href=
"LuCI.form.AbstractValue.html#remove">remove
</a></li>
395 <li data-name=
"LuCI.form.AbstractValue#render"><a href=
"LuCI.form.AbstractValue.html#render">render
</a></li>
397 <li data-name=
"LuCI.form.AbstractValue#stripTags"><a href=
"LuCI.form.AbstractValue.html#stripTags">stripTags
</a></li>
399 <li data-name=
"LuCI.form.AbstractValue#textvalue"><a href=
"LuCI.form.AbstractValue.html#textvalue">textvalue
</a></li>
401 <li data-name=
"LuCI.form.AbstractValue#titleFn"><a href=
"LuCI.form.AbstractValue.html#titleFn">titleFn
</a></li>
403 <li data-name=
"LuCI.form.AbstractValue#validate"><a href=
"LuCI.form.AbstractValue.html#validate">validate
</a></li>
405 <li data-name=
"LuCI.form.AbstractValue#write"><a href=
"LuCI.form.AbstractValue.html#write">write
</a></li>
408 <ul class=
"events itemMembers">
413 <li class=
"item" data-name=
"LuCI.form.ButtonValue">
415 <a href=
"LuCI.form.ButtonValue.html">LuCI.form.ButtonValue
</a>
418 <ul class=
"members itemMembers">
420 <span class=
"subtitle">Members
</span>
422 <li data-name=
"LuCI.form.ButtonValue##inputstyle"><a href=
"LuCI.form.ButtonValue.html#inputstyle">inputstyle
</a></li>
424 <li data-name=
"LuCI.form.ButtonValue##inputtitle"><a href=
"LuCI.form.ButtonValue.html#inputtitle">inputtitle
</a></li>
426 <li data-name=
"LuCI.form.ButtonValue##onclick"><a href=
"LuCI.form.ButtonValue.html#onclick">onclick
</a></li>
428 <li data-name=
"LuCI.form.ButtonValue#datatype"><a href=
"LuCI.form.ButtonValue.html#datatype">datatype
</a></li>
430 <li data-name=
"LuCI.form.ButtonValue#default"><a href=
"LuCI.form.ButtonValue.html#default">default
</a></li>
432 <li data-name=
"LuCI.form.ButtonValue#editable"><a href=
"LuCI.form.ButtonValue.html#editable">editable
</a></li>
434 <li data-name=
"LuCI.form.ButtonValue#modalonly"><a href=
"LuCI.form.ButtonValue.html#modalonly">modalonly
</a></li>
436 <li data-name=
"LuCI.form.ButtonValue#onchange"><a href=
"LuCI.form.ButtonValue.html#onchange">onchange
</a></li>
438 <li data-name=
"LuCI.form.ButtonValue#optional"><a href=
"LuCI.form.ButtonValue.html#optional">optional
</a></li>
440 <li data-name=
"LuCI.form.ButtonValue#password"><a href=
"LuCI.form.ButtonValue.html#password">password
</a></li>
442 <li data-name=
"LuCI.form.ButtonValue#placeholder"><a href=
"LuCI.form.ButtonValue.html#placeholder">placeholder
</a></li>
444 <li data-name=
"LuCI.form.ButtonValue#readonly"><a href=
"LuCI.form.ButtonValue.html#readonly">readonly
</a></li>
446 <li data-name=
"LuCI.form.ButtonValue#rmempty"><a href=
"LuCI.form.ButtonValue.html#rmempty">rmempty
</a></li>
448 <li data-name=
"LuCI.form.ButtonValue#uciconfig"><a href=
"LuCI.form.ButtonValue.html#uciconfig">uciconfig
</a></li>
450 <li data-name=
"LuCI.form.ButtonValue#ucioption"><a href=
"LuCI.form.ButtonValue.html#ucioption">ucioption
</a></li>
452 <li data-name=
"LuCI.form.ButtonValue#ucisection"><a href=
"LuCI.form.ButtonValue.html#ucisection">ucisection
</a></li>
454 <li data-name=
"LuCI.form.ButtonValue#validate"><a href=
"LuCI.form.ButtonValue.html#validate">validate
</a></li>
456 <li data-name=
"LuCI.form.ButtonValue#width"><a href=
"LuCI.form.ButtonValue.html#width">width
</a></li>
459 <ul class=
"typedefs itemMembers">
462 <ul class=
"typedefs itemMembers">
465 <ul class=
"methods itemMembers">
467 <span class=
"subtitle">Methods
</span>
469 <li data-name=
"LuCI.form.ButtonValue#append"><a href=
"LuCI.form.ButtonValue.html#append">append
</a></li>
471 <li data-name=
"LuCI.form.ButtonValue#cbid"><a href=
"LuCI.form.ButtonValue.html#cbid">cbid
</a></li>
473 <li data-name=
"LuCI.form.ButtonValue#cfgvalue"><a href=
"LuCI.form.ButtonValue.html#cfgvalue">cfgvalue
</a></li>
475 <li data-name=
"LuCI.form.ButtonValue#depends"><a href=
"LuCI.form.ButtonValue.html#depends">depends
</a></li>
477 <li data-name=
"LuCI.form.ButtonValue#formvalue"><a href=
"LuCI.form.ButtonValue.html#formvalue">formvalue
</a></li>
479 <li data-name=
"LuCI.form.ButtonValue#getUIElement"><a href=
"LuCI.form.ButtonValue.html#getUIElement">getUIElement
</a></li>
481 <li data-name=
"LuCI.form.ButtonValue#isActive"><a href=
"LuCI.form.ButtonValue.html#isActive">isActive
</a></li>
483 <li data-name=
"LuCI.form.ButtonValue#isValid"><a href=
"LuCI.form.ButtonValue.html#isValid">isValid
</a></li>
485 <li data-name=
"LuCI.form.ButtonValue#load"><a href=
"LuCI.form.ButtonValue.html#load">load
</a></li>
487 <li data-name=
"LuCI.form.ButtonValue#parse"><a href=
"LuCI.form.ButtonValue.html#parse">parse
</a></li>
489 <li data-name=
"LuCI.form.ButtonValue#remove"><a href=
"LuCI.form.ButtonValue.html#remove">remove
</a></li>
491 <li data-name=
"LuCI.form.ButtonValue#stripTags"><a href=
"LuCI.form.ButtonValue.html#stripTags">stripTags
</a></li>
493 <li data-name=
"LuCI.form.ButtonValue#textvalue"><a href=
"LuCI.form.ButtonValue.html#textvalue">textvalue
</a></li>
495 <li data-name=
"LuCI.form.ButtonValue#titleFn"><a href=
"LuCI.form.ButtonValue.html#titleFn">titleFn
</a></li>
497 <li data-name=
"LuCI.form.ButtonValue#value"><a href=
"LuCI.form.ButtonValue.html#value">value
</a></li>
499 <li data-name=
"LuCI.form.ButtonValue#write"><a href=
"LuCI.form.ButtonValue.html#write">write
</a></li>
502 <ul class=
"events itemMembers">
507 <li class=
"item" data-name=
"LuCI.form.DummyValue">
509 <a href=
"LuCI.form.DummyValue.html">LuCI.form.DummyValue
</a>
512 <ul class=
"members itemMembers">
514 <span class=
"subtitle">Members
</span>
516 <li data-name=
"LuCI.form.DummyValue##href"><a href=
"LuCI.form.DummyValue.html#href">href
</a></li>
518 <li data-name=
"LuCI.form.DummyValue##rawhtml"><a href=
"LuCI.form.DummyValue.html#rawhtml">rawhtml
</a></li>
520 <li data-name=
"LuCI.form.DummyValue#datatype"><a href=
"LuCI.form.DummyValue.html#datatype">datatype
</a></li>
522 <li data-name=
"LuCI.form.DummyValue#default"><a href=
"LuCI.form.DummyValue.html#default">default
</a></li>
524 <li data-name=
"LuCI.form.DummyValue#editable"><a href=
"LuCI.form.DummyValue.html#editable">editable
</a></li>
526 <li data-name=
"LuCI.form.DummyValue#modalonly"><a href=
"LuCI.form.DummyValue.html#modalonly">modalonly
</a></li>
528 <li data-name=
"LuCI.form.DummyValue#onchange"><a href=
"LuCI.form.DummyValue.html#onchange">onchange
</a></li>
530 <li data-name=
"LuCI.form.DummyValue#optional"><a href=
"LuCI.form.DummyValue.html#optional">optional
</a></li>
532 <li data-name=
"LuCI.form.DummyValue#password"><a href=
"LuCI.form.DummyValue.html#password">password
</a></li>
534 <li data-name=
"LuCI.form.DummyValue#placeholder"><a href=
"LuCI.form.DummyValue.html#placeholder">placeholder
</a></li>
536 <li data-name=
"LuCI.form.DummyValue#readonly"><a href=
"LuCI.form.DummyValue.html#readonly">readonly
</a></li>
538 <li data-name=
"LuCI.form.DummyValue#rmempty"><a href=
"LuCI.form.DummyValue.html#rmempty">rmempty
</a></li>
540 <li data-name=
"LuCI.form.DummyValue#uciconfig"><a href=
"LuCI.form.DummyValue.html#uciconfig">uciconfig
</a></li>
542 <li data-name=
"LuCI.form.DummyValue#ucioption"><a href=
"LuCI.form.DummyValue.html#ucioption">ucioption
</a></li>
544 <li data-name=
"LuCI.form.DummyValue#ucisection"><a href=
"LuCI.form.DummyValue.html#ucisection">ucisection
</a></li>
546 <li data-name=
"LuCI.form.DummyValue#validate"><a href=
"LuCI.form.DummyValue.html#validate">validate
</a></li>
548 <li data-name=
"LuCI.form.DummyValue#width"><a href=
"LuCI.form.DummyValue.html#width">width
</a></li>
551 <ul class=
"typedefs itemMembers">
554 <ul class=
"typedefs itemMembers">
557 <ul class=
"methods itemMembers">
559 <span class=
"subtitle">Methods
</span>
561 <li data-name=
"LuCI.form.DummyValue#append"><a href=
"LuCI.form.DummyValue.html#append">append
</a></li>
563 <li data-name=
"LuCI.form.DummyValue#cbid"><a href=
"LuCI.form.DummyValue.html#cbid">cbid
</a></li>
565 <li data-name=
"LuCI.form.DummyValue#cfgvalue"><a href=
"LuCI.form.DummyValue.html#cfgvalue">cfgvalue
</a></li>
567 <li data-name=
"LuCI.form.DummyValue#depends"><a href=
"LuCI.form.DummyValue.html#depends">depends
</a></li>
569 <li data-name=
"LuCI.form.DummyValue#formvalue"><a href=
"LuCI.form.DummyValue.html#formvalue">formvalue
</a></li>
571 <li data-name=
"LuCI.form.DummyValue#getUIElement"><a href=
"LuCI.form.DummyValue.html#getUIElement">getUIElement
</a></li>
573 <li data-name=
"LuCI.form.DummyValue#isActive"><a href=
"LuCI.form.DummyValue.html#isActive">isActive
</a></li>
575 <li data-name=
"LuCI.form.DummyValue#isValid"><a href=
"LuCI.form.DummyValue.html#isValid">isValid
</a></li>
577 <li data-name=
"LuCI.form.DummyValue#load"><a href=
"LuCI.form.DummyValue.html#load">load
</a></li>
579 <li data-name=
"LuCI.form.DummyValue#parse"><a href=
"LuCI.form.DummyValue.html#parse">parse
</a></li>
581 <li data-name=
"LuCI.form.DummyValue#remove"><a href=
"LuCI.form.DummyValue.html#remove">remove
</a></li>
583 <li data-name=
"LuCI.form.DummyValue#stripTags"><a href=
"LuCI.form.DummyValue.html#stripTags">stripTags
</a></li>
585 <li data-name=
"LuCI.form.DummyValue#textvalue"><a href=
"LuCI.form.DummyValue.html#textvalue">textvalue
</a></li>
587 <li data-name=
"LuCI.form.DummyValue#titleFn"><a href=
"LuCI.form.DummyValue.html#titleFn">titleFn
</a></li>
589 <li data-name=
"LuCI.form.DummyValue#value"><a href=
"LuCI.form.DummyValue.html#value">value
</a></li>
591 <li data-name=
"LuCI.form.DummyValue#write"><a href=
"LuCI.form.DummyValue.html#write">write
</a></li>
594 <ul class=
"events itemMembers">
599 <li class=
"item" data-name=
"LuCI.form.DynamicList">
601 <a href=
"LuCI.form.DynamicList.html">LuCI.form.DynamicList
</a>
604 <ul class=
"members itemMembers">
606 <span class=
"subtitle">Members
</span>
608 <li data-name=
"LuCI.form.DynamicList#datatype"><a href=
"LuCI.form.DynamicList.html#datatype">datatype
</a></li>
610 <li data-name=
"LuCI.form.DynamicList#default"><a href=
"LuCI.form.DynamicList.html#default">default
</a></li>
612 <li data-name=
"LuCI.form.DynamicList#editable"><a href=
"LuCI.form.DynamicList.html#editable">editable
</a></li>
614 <li data-name=
"LuCI.form.DynamicList#modalonly"><a href=
"LuCI.form.DynamicList.html#modalonly">modalonly
</a></li>
616 <li data-name=
"LuCI.form.DynamicList#onchange"><a href=
"LuCI.form.DynamicList.html#onchange">onchange
</a></li>
618 <li data-name=
"LuCI.form.DynamicList#optional"><a href=
"LuCI.form.DynamicList.html#optional">optional
</a></li>
620 <li data-name=
"LuCI.form.DynamicList#password"><a href=
"LuCI.form.DynamicList.html#password">password
</a></li>
622 <li data-name=
"LuCI.form.DynamicList#placeholder"><a href=
"LuCI.form.DynamicList.html#placeholder">placeholder
</a></li>
624 <li data-name=
"LuCI.form.DynamicList#readonly"><a href=
"LuCI.form.DynamicList.html#readonly">readonly
</a></li>
626 <li data-name=
"LuCI.form.DynamicList#rmempty"><a href=
"LuCI.form.DynamicList.html#rmempty">rmempty
</a></li>
628 <li data-name=
"LuCI.form.DynamicList#uciconfig"><a href=
"LuCI.form.DynamicList.html#uciconfig">uciconfig
</a></li>
630 <li data-name=
"LuCI.form.DynamicList#ucioption"><a href=
"LuCI.form.DynamicList.html#ucioption">ucioption
</a></li>
632 <li data-name=
"LuCI.form.DynamicList#ucisection"><a href=
"LuCI.form.DynamicList.html#ucisection">ucisection
</a></li>
634 <li data-name=
"LuCI.form.DynamicList#validate"><a href=
"LuCI.form.DynamicList.html#validate">validate
</a></li>
636 <li data-name=
"LuCI.form.DynamicList#width"><a href=
"LuCI.form.DynamicList.html#width">width
</a></li>
639 <ul class=
"typedefs itemMembers">
642 <ul class=
"typedefs itemMembers">
645 <ul class=
"methods itemMembers">
647 <span class=
"subtitle">Methods
</span>
649 <li data-name=
"LuCI.form.DynamicList#append"><a href=
"LuCI.form.DynamicList.html#append">append
</a></li>
651 <li data-name=
"LuCI.form.DynamicList#cbid"><a href=
"LuCI.form.DynamicList.html#cbid">cbid
</a></li>
653 <li data-name=
"LuCI.form.DynamicList#cfgvalue"><a href=
"LuCI.form.DynamicList.html#cfgvalue">cfgvalue
</a></li>
655 <li data-name=
"LuCI.form.DynamicList#depends"><a href=
"LuCI.form.DynamicList.html#depends">depends
</a></li>
657 <li data-name=
"LuCI.form.DynamicList#formvalue"><a href=
"LuCI.form.DynamicList.html#formvalue">formvalue
</a></li>
659 <li data-name=
"LuCI.form.DynamicList#getUIElement"><a href=
"LuCI.form.DynamicList.html#getUIElement">getUIElement
</a></li>
661 <li data-name=
"LuCI.form.DynamicList#isActive"><a href=
"LuCI.form.DynamicList.html#isActive">isActive
</a></li>
663 <li data-name=
"LuCI.form.DynamicList#isValid"><a href=
"LuCI.form.DynamicList.html#isValid">isValid
</a></li>
665 <li data-name=
"LuCI.form.DynamicList#load"><a href=
"LuCI.form.DynamicList.html#load">load
</a></li>
667 <li data-name=
"LuCI.form.DynamicList#parse"><a href=
"LuCI.form.DynamicList.html#parse">parse
</a></li>
669 <li data-name=
"LuCI.form.DynamicList#remove"><a href=
"LuCI.form.DynamicList.html#remove">remove
</a></li>
671 <li data-name=
"LuCI.form.DynamicList#stripTags"><a href=
"LuCI.form.DynamicList.html#stripTags">stripTags
</a></li>
673 <li data-name=
"LuCI.form.DynamicList#textvalue"><a href=
"LuCI.form.DynamicList.html#textvalue">textvalue
</a></li>
675 <li data-name=
"LuCI.form.DynamicList#titleFn"><a href=
"LuCI.form.DynamicList.html#titleFn">titleFn
</a></li>
677 <li data-name=
"LuCI.form.DynamicList#value"><a href=
"LuCI.form.DynamicList.html#value">value
</a></li>
679 <li data-name=
"LuCI.form.DynamicList#write"><a href=
"LuCI.form.DynamicList.html#write">write
</a></li>
682 <ul class=
"events itemMembers">
687 <li class=
"item" data-name=
"LuCI.form.FileUpload">
689 <a href=
"LuCI.form.FileUpload.html">LuCI.form.FileUpload
</a>
692 <ul class=
"members itemMembers">
694 <span class=
"subtitle">Members
</span>
696 <li data-name=
"LuCI.form.FileUpload##enable_remove"><a href=
"LuCI.form.FileUpload.html#enable_remove">enable_remove
</a></li>
698 <li data-name=
"LuCI.form.FileUpload##enable_upload"><a href=
"LuCI.form.FileUpload.html#enable_upload">enable_upload
</a></li>
700 <li data-name=
"LuCI.form.FileUpload##root_directory"><a href=
"LuCI.form.FileUpload.html#root_directory">root_directory
</a></li>
702 <li data-name=
"LuCI.form.FileUpload##show_hidden"><a href=
"LuCI.form.FileUpload.html#show_hidden">show_hidden
</a></li>
704 <li data-name=
"LuCI.form.FileUpload#datatype"><a href=
"LuCI.form.FileUpload.html#datatype">datatype
</a></li>
706 <li data-name=
"LuCI.form.FileUpload#default"><a href=
"LuCI.form.FileUpload.html#default">default
</a></li>
708 <li data-name=
"LuCI.form.FileUpload#editable"><a href=
"LuCI.form.FileUpload.html#editable">editable
</a></li>
710 <li data-name=
"LuCI.form.FileUpload#modalonly"><a href=
"LuCI.form.FileUpload.html#modalonly">modalonly
</a></li>
712 <li data-name=
"LuCI.form.FileUpload#onchange"><a href=
"LuCI.form.FileUpload.html#onchange">onchange
</a></li>
714 <li data-name=
"LuCI.form.FileUpload#optional"><a href=
"LuCI.form.FileUpload.html#optional">optional
</a></li>
716 <li data-name=
"LuCI.form.FileUpload#password"><a href=
"LuCI.form.FileUpload.html#password">password
</a></li>
718 <li data-name=
"LuCI.form.FileUpload#placeholder"><a href=
"LuCI.form.FileUpload.html#placeholder">placeholder
</a></li>
720 <li data-name=
"LuCI.form.FileUpload#readonly"><a href=
"LuCI.form.FileUpload.html#readonly">readonly
</a></li>
722 <li data-name=
"LuCI.form.FileUpload#rmempty"><a href=
"LuCI.form.FileUpload.html#rmempty">rmempty
</a></li>
724 <li data-name=
"LuCI.form.FileUpload#uciconfig"><a href=
"LuCI.form.FileUpload.html#uciconfig">uciconfig
</a></li>
726 <li data-name=
"LuCI.form.FileUpload#ucioption"><a href=
"LuCI.form.FileUpload.html#ucioption">ucioption
</a></li>
728 <li data-name=
"LuCI.form.FileUpload#ucisection"><a href=
"LuCI.form.FileUpload.html#ucisection">ucisection
</a></li>
730 <li data-name=
"LuCI.form.FileUpload#validate"><a href=
"LuCI.form.FileUpload.html#validate">validate
</a></li>
732 <li data-name=
"LuCI.form.FileUpload#width"><a href=
"LuCI.form.FileUpload.html#width">width
</a></li>
735 <ul class=
"typedefs itemMembers">
738 <ul class=
"typedefs itemMembers">
741 <ul class=
"methods itemMembers">
743 <span class=
"subtitle">Methods
</span>
745 <li data-name=
"LuCI.form.FileUpload#append"><a href=
"LuCI.form.FileUpload.html#append">append
</a></li>
747 <li data-name=
"LuCI.form.FileUpload#cbid"><a href=
"LuCI.form.FileUpload.html#cbid">cbid
</a></li>
749 <li data-name=
"LuCI.form.FileUpload#cfgvalue"><a href=
"LuCI.form.FileUpload.html#cfgvalue">cfgvalue
</a></li>
751 <li data-name=
"LuCI.form.FileUpload#depends"><a href=
"LuCI.form.FileUpload.html#depends">depends
</a></li>
753 <li data-name=
"LuCI.form.FileUpload#formvalue"><a href=
"LuCI.form.FileUpload.html#formvalue">formvalue
</a></li>
755 <li data-name=
"LuCI.form.FileUpload#getUIElement"><a href=
"LuCI.form.FileUpload.html#getUIElement">getUIElement
</a></li>
757 <li data-name=
"LuCI.form.FileUpload#isActive"><a href=
"LuCI.form.FileUpload.html#isActive">isActive
</a></li>
759 <li data-name=
"LuCI.form.FileUpload#isValid"><a href=
"LuCI.form.FileUpload.html#isValid">isValid
</a></li>
761 <li data-name=
"LuCI.form.FileUpload#load"><a href=
"LuCI.form.FileUpload.html#load">load
</a></li>
763 <li data-name=
"LuCI.form.FileUpload#parse"><a href=
"LuCI.form.FileUpload.html#parse">parse
</a></li>
765 <li data-name=
"LuCI.form.FileUpload#remove"><a href=
"LuCI.form.FileUpload.html#remove">remove
</a></li>
767 <li data-name=
"LuCI.form.FileUpload#stripTags"><a href=
"LuCI.form.FileUpload.html#stripTags">stripTags
</a></li>
769 <li data-name=
"LuCI.form.FileUpload#textvalue"><a href=
"LuCI.form.FileUpload.html#textvalue">textvalue
</a></li>
771 <li data-name=
"LuCI.form.FileUpload#titleFn"><a href=
"LuCI.form.FileUpload.html#titleFn">titleFn
</a></li>
773 <li data-name=
"LuCI.form.FileUpload#value"><a href=
"LuCI.form.FileUpload.html#value">value
</a></li>
775 <li data-name=
"LuCI.form.FileUpload#write"><a href=
"LuCI.form.FileUpload.html#write">write
</a></li>
778 <ul class=
"events itemMembers">
783 <li class=
"item" data-name=
"LuCI.form.FlagValue">
785 <a href=
"LuCI.form.FlagValue.html">LuCI.form.FlagValue
</a>
788 <ul class=
"members itemMembers">
790 <span class=
"subtitle">Members
</span>
792 <li data-name=
"LuCI.form.FlagValue##disabled"><a href=
"LuCI.form.FlagValue.html#disabled">disabled
</a></li>
794 <li data-name=
"LuCI.form.FlagValue##enabled"><a href=
"LuCI.form.FlagValue.html#enabled">enabled
</a></li>
796 <li data-name=
"LuCI.form.FlagValue#datatype"><a href=
"LuCI.form.FlagValue.html#datatype">datatype
</a></li>
798 <li data-name=
"LuCI.form.FlagValue#default"><a href=
"LuCI.form.FlagValue.html#default">default
</a></li>
800 <li data-name=
"LuCI.form.FlagValue#editable"><a href=
"LuCI.form.FlagValue.html#editable">editable
</a></li>
802 <li data-name=
"LuCI.form.FlagValue#modalonly"><a href=
"LuCI.form.FlagValue.html#modalonly">modalonly
</a></li>
804 <li data-name=
"LuCI.form.FlagValue#onchange"><a href=
"LuCI.form.FlagValue.html#onchange">onchange
</a></li>
806 <li data-name=
"LuCI.form.FlagValue#optional"><a href=
"LuCI.form.FlagValue.html#optional">optional
</a></li>
808 <li data-name=
"LuCI.form.FlagValue#password"><a href=
"LuCI.form.FlagValue.html#password">password
</a></li>
810 <li data-name=
"LuCI.form.FlagValue#placeholder"><a href=
"LuCI.form.FlagValue.html#placeholder">placeholder
</a></li>
812 <li data-name=
"LuCI.form.FlagValue#readonly"><a href=
"LuCI.form.FlagValue.html#readonly">readonly
</a></li>
814 <li data-name=
"LuCI.form.FlagValue#rmempty"><a href=
"LuCI.form.FlagValue.html#rmempty">rmempty
</a></li>
816 <li data-name=
"LuCI.form.FlagValue#uciconfig"><a href=
"LuCI.form.FlagValue.html#uciconfig">uciconfig
</a></li>
818 <li data-name=
"LuCI.form.FlagValue#ucioption"><a href=
"LuCI.form.FlagValue.html#ucioption">ucioption
</a></li>
820 <li data-name=
"LuCI.form.FlagValue#ucisection"><a href=
"LuCI.form.FlagValue.html#ucisection">ucisection
</a></li>
822 <li data-name=
"LuCI.form.FlagValue#validate"><a href=
"LuCI.form.FlagValue.html#validate">validate
</a></li>
824 <li data-name=
"LuCI.form.FlagValue#width"><a href=
"LuCI.form.FlagValue.html#width">width
</a></li>
827 <ul class=
"typedefs itemMembers">
830 <ul class=
"typedefs itemMembers">
833 <ul class=
"methods itemMembers">
835 <span class=
"subtitle">Methods
</span>
837 <li data-name=
"LuCI.form.FlagValue#append"><a href=
"LuCI.form.FlagValue.html#append">append
</a></li>
839 <li data-name=
"LuCI.form.FlagValue#cbid"><a href=
"LuCI.form.FlagValue.html#cbid">cbid
</a></li>
841 <li data-name=
"LuCI.form.FlagValue#cfgvalue"><a href=
"LuCI.form.FlagValue.html#cfgvalue">cfgvalue
</a></li>
843 <li data-name=
"LuCI.form.FlagValue#depends"><a href=
"LuCI.form.FlagValue.html#depends">depends
</a></li>
845 <li data-name=
"LuCI.form.FlagValue#formvalue"><a href=
"LuCI.form.FlagValue.html#formvalue">formvalue
</a></li>
847 <li data-name=
"LuCI.form.FlagValue#getUIElement"><a href=
"LuCI.form.FlagValue.html#getUIElement">getUIElement
</a></li>
849 <li data-name=
"LuCI.form.FlagValue#isActive"><a href=
"LuCI.form.FlagValue.html#isActive">isActive
</a></li>
851 <li data-name=
"LuCI.form.FlagValue#isValid"><a href=
"LuCI.form.FlagValue.html#isValid">isValid
</a></li>
853 <li data-name=
"LuCI.form.FlagValue#load"><a href=
"LuCI.form.FlagValue.html#load">load
</a></li>
855 <li data-name=
"LuCI.form.FlagValue#parse"><a href=
"LuCI.form.FlagValue.html#parse">parse
</a></li>
857 <li data-name=
"LuCI.form.FlagValue#remove"><a href=
"LuCI.form.FlagValue.html#remove">remove
</a></li>
859 <li data-name=
"LuCI.form.FlagValue#stripTags"><a href=
"LuCI.form.FlagValue.html#stripTags">stripTags
</a></li>
861 <li data-name=
"LuCI.form.FlagValue#textvalue"><a href=
"LuCI.form.FlagValue.html#textvalue">textvalue
</a></li>
863 <li data-name=
"LuCI.form.FlagValue#titleFn"><a href=
"LuCI.form.FlagValue.html#titleFn">titleFn
</a></li>
865 <li data-name=
"LuCI.form.FlagValue#value"><a href=
"LuCI.form.FlagValue.html#value">value
</a></li>
867 <li data-name=
"LuCI.form.FlagValue#write"><a href=
"LuCI.form.FlagValue.html#write">write
</a></li>
870 <ul class=
"events itemMembers">
875 <li class=
"item" data-name=
"LuCI.form.GridSection">
877 <a href=
"LuCI.form.GridSection.html">LuCI.form.GridSection
</a>
880 <ul class=
"members itemMembers">
882 <span class=
"subtitle">Members
</span>
884 <li data-name=
"LuCI.form.GridSection#addbtntitle"><a href=
"LuCI.form.GridSection.html#addbtntitle">addbtntitle
</a></li>
886 <li data-name=
"LuCI.form.GridSection#addremove"><a href=
"LuCI.form.GridSection.html#addremove">addremove
</a></li>
888 <li data-name=
"LuCI.form.GridSection#anonymous"><a href=
"LuCI.form.GridSection.html#anonymous">anonymous
</a></li>
890 <li data-name=
"LuCI.form.GridSection#extedit"><a href=
"LuCI.form.GridSection.html#extedit">extedit
</a></li>
892 <li data-name=
"LuCI.form.GridSection#max_cols"><a href=
"LuCI.form.GridSection.html#max_cols">max_cols
</a></li>
894 <li data-name=
"LuCI.form.GridSection#modaltitle"><a href=
"LuCI.form.GridSection.html#modaltitle">modaltitle
</a></li>
896 <li data-name=
"LuCI.form.GridSection#nodescriptions"><a href=
"LuCI.form.GridSection.html#nodescriptions">nodescriptions
</a></li>
898 <li data-name=
"LuCI.form.GridSection#parentoption"><a href=
"LuCI.form.GridSection.html#parentoption">parentoption
</a></li>
900 <li data-name=
"LuCI.form.GridSection#rowcolors"><a href=
"LuCI.form.GridSection.html#rowcolors">rowcolors
</a></li>
902 <li data-name=
"LuCI.form.GridSection#sectiontitle"><a href=
"LuCI.form.GridSection.html#sectiontitle">sectiontitle
</a></li>
904 <li data-name=
"LuCI.form.GridSection#sortable"><a href=
"LuCI.form.GridSection.html#sortable">sortable
</a></li>
906 <li data-name=
"LuCI.form.GridSection#tabbed"><a href=
"LuCI.form.GridSection.html#tabbed">tabbed
</a></li>
908 <li data-name=
"LuCI.form.GridSection#uciconfig"><a href=
"LuCI.form.GridSection.html#uciconfig">uciconfig
</a></li>
911 <ul class=
"typedefs itemMembers">
914 <ul class=
"typedefs itemMembers">
917 <ul class=
"methods itemMembers">
919 <span class=
"subtitle">Methods
</span>
921 <li data-name=
"LuCI.form.GridSection#addModalOptions"><a href=
"LuCI.form.GridSection.html#addModalOptions">addModalOptions
</a></li>
923 <li data-name=
"LuCI.form.GridSection#append"><a href=
"LuCI.form.GridSection.html#append">append
</a></li>
925 <li data-name=
"LuCI.form.GridSection#cfgvalue"><a href=
"LuCI.form.GridSection.html#cfgvalue">cfgvalue
</a></li>
927 <li data-name=
"LuCI.form.GridSection#filter"><a href=
"LuCI.form.GridSection.html#filter">filter
</a></li>
929 <li data-name=
"LuCI.form.GridSection#formvalue"><a href=
"LuCI.form.GridSection.html#formvalue">formvalue
</a></li>
931 <li data-name=
"LuCI.form.GridSection#getOption"><a href=
"LuCI.form.GridSection.html#getOption">getOption
</a></li>
933 <li data-name=
"LuCI.form.GridSection#getUIElement"><a href=
"LuCI.form.GridSection.html#getUIElement">getUIElement
</a></li>
935 <li data-name=
"LuCI.form.GridSection#load"><a href=
"LuCI.form.GridSection.html#load">load
</a></li>
937 <li data-name=
"LuCI.form.GridSection#option"><a href=
"LuCI.form.GridSection.html#option">option
</a></li>
939 <li data-name=
"LuCI.form.GridSection#parse"><a href=
"LuCI.form.GridSection.html#parse">parse
</a></li>
941 <li data-name=
"LuCI.form.GridSection#stripTags"><a href=
"LuCI.form.GridSection.html#stripTags">stripTags
</a></li>
943 <li data-name=
"LuCI.form.GridSection#tab"><a href=
"LuCI.form.GridSection.html#tab">tab
</a></li>
945 <li data-name=
"LuCI.form.GridSection#taboption"><a href=
"LuCI.form.GridSection.html#taboption">taboption
</a></li>
947 <li data-name=
"LuCI.form.GridSection#titleFn"><a href=
"LuCI.form.GridSection.html#titleFn">titleFn
</a></li>
950 <ul class=
"events itemMembers">
955 <li class=
"item" data-name=
"LuCI.form.HiddenValue">
957 <a href=
"LuCI.form.HiddenValue.html">LuCI.form.HiddenValue
</a>
960 <ul class=
"members itemMembers">
962 <span class=
"subtitle">Members
</span>
964 <li data-name=
"LuCI.form.HiddenValue#datatype"><a href=
"LuCI.form.HiddenValue.html#datatype">datatype
</a></li>
966 <li data-name=
"LuCI.form.HiddenValue#default"><a href=
"LuCI.form.HiddenValue.html#default">default
</a></li>
968 <li data-name=
"LuCI.form.HiddenValue#editable"><a href=
"LuCI.form.HiddenValue.html#editable">editable
</a></li>
970 <li data-name=
"LuCI.form.HiddenValue#modalonly"><a href=
"LuCI.form.HiddenValue.html#modalonly">modalonly
</a></li>
972 <li data-name=
"LuCI.form.HiddenValue#onchange"><a href=
"LuCI.form.HiddenValue.html#onchange">onchange
</a></li>
974 <li data-name=
"LuCI.form.HiddenValue#optional"><a href=
"LuCI.form.HiddenValue.html#optional">optional
</a></li>
976 <li data-name=
"LuCI.form.HiddenValue#password"><a href=
"LuCI.form.HiddenValue.html#password">password
</a></li>
978 <li data-name=
"LuCI.form.HiddenValue#placeholder"><a href=
"LuCI.form.HiddenValue.html#placeholder">placeholder
</a></li>
980 <li data-name=
"LuCI.form.HiddenValue#readonly"><a href=
"LuCI.form.HiddenValue.html#readonly">readonly
</a></li>
982 <li data-name=
"LuCI.form.HiddenValue#rmempty"><a href=
"LuCI.form.HiddenValue.html#rmempty">rmempty
</a></li>
984 <li data-name=
"LuCI.form.HiddenValue#uciconfig"><a href=
"LuCI.form.HiddenValue.html#uciconfig">uciconfig
</a></li>
986 <li data-name=
"LuCI.form.HiddenValue#ucioption"><a href=
"LuCI.form.HiddenValue.html#ucioption">ucioption
</a></li>
988 <li data-name=
"LuCI.form.HiddenValue#ucisection"><a href=
"LuCI.form.HiddenValue.html#ucisection">ucisection
</a></li>
990 <li data-name=
"LuCI.form.HiddenValue#validate"><a href=
"LuCI.form.HiddenValue.html#validate">validate
</a></li>
992 <li data-name=
"LuCI.form.HiddenValue#width"><a href=
"LuCI.form.HiddenValue.html#width">width
</a></li>
995 <ul class=
"typedefs itemMembers">
998 <ul class=
"typedefs itemMembers">
1001 <ul class=
"methods itemMembers">
1003 <span class=
"subtitle">Methods
</span>
1005 <li data-name=
"LuCI.form.HiddenValue#append"><a href=
"LuCI.form.HiddenValue.html#append">append
</a></li>
1007 <li data-name=
"LuCI.form.HiddenValue#cbid"><a href=
"LuCI.form.HiddenValue.html#cbid">cbid
</a></li>
1009 <li data-name=
"LuCI.form.HiddenValue#cfgvalue"><a href=
"LuCI.form.HiddenValue.html#cfgvalue">cfgvalue
</a></li>
1011 <li data-name=
"LuCI.form.HiddenValue#depends"><a href=
"LuCI.form.HiddenValue.html#depends">depends
</a></li>
1013 <li data-name=
"LuCI.form.HiddenValue#formvalue"><a href=
"LuCI.form.HiddenValue.html#formvalue">formvalue
</a></li>
1015 <li data-name=
"LuCI.form.HiddenValue#getUIElement"><a href=
"LuCI.form.HiddenValue.html#getUIElement">getUIElement
</a></li>
1017 <li data-name=
"LuCI.form.HiddenValue#isActive"><a href=
"LuCI.form.HiddenValue.html#isActive">isActive
</a></li>
1019 <li data-name=
"LuCI.form.HiddenValue#isValid"><a href=
"LuCI.form.HiddenValue.html#isValid">isValid
</a></li>
1021 <li data-name=
"LuCI.form.HiddenValue#load"><a href=
"LuCI.form.HiddenValue.html#load">load
</a></li>
1023 <li data-name=
"LuCI.form.HiddenValue#parse"><a href=
"LuCI.form.HiddenValue.html#parse">parse
</a></li>
1025 <li data-name=
"LuCI.form.HiddenValue#remove"><a href=
"LuCI.form.HiddenValue.html#remove">remove
</a></li>
1027 <li data-name=
"LuCI.form.HiddenValue#stripTags"><a href=
"LuCI.form.HiddenValue.html#stripTags">stripTags
</a></li>
1029 <li data-name=
"LuCI.form.HiddenValue#textvalue"><a href=
"LuCI.form.HiddenValue.html#textvalue">textvalue
</a></li>
1031 <li data-name=
"LuCI.form.HiddenValue#titleFn"><a href=
"LuCI.form.HiddenValue.html#titleFn">titleFn
</a></li>
1033 <li data-name=
"LuCI.form.HiddenValue#value"><a href=
"LuCI.form.HiddenValue.html#value">value
</a></li>
1035 <li data-name=
"LuCI.form.HiddenValue#write"><a href=
"LuCI.form.HiddenValue.html#write">write
</a></li>
1038 <ul class=
"events itemMembers">
1043 <li class=
"item" data-name=
"LuCI.form.JSONMap">
1044 <span class=
"title">
1045 <a href=
"LuCI.form.JSONMap.html">LuCI.form.JSONMap
</a>
1048 <ul class=
"members itemMembers">
1050 <span class=
"subtitle">Members
</span>
1052 <li data-name=
"LuCI.form.JSONMap#readonly"><a href=
"LuCI.form.JSONMap.html#readonly">readonly
</a></li>
1055 <ul class=
"typedefs itemMembers">
1058 <ul class=
"typedefs itemMembers">
1061 <ul class=
"methods itemMembers">
1063 <span class=
"subtitle">Methods
</span>
1065 <li data-name=
"LuCI.form.JSONMap#append"><a href=
"LuCI.form.JSONMap.html#append">append
</a></li>
1067 <li data-name=
"LuCI.form.JSONMap#chain"><a href=
"LuCI.form.JSONMap.html#chain">chain
</a></li>
1069 <li data-name=
"LuCI.form.JSONMap#findElement"><a href=
"LuCI.form.JSONMap.html#findElement">findElement
</a></li>
1071 <li data-name=
"LuCI.form.JSONMap#findElements"><a href=
"LuCI.form.JSONMap.html#findElements">findElements
</a></li>
1073 <li data-name=
"LuCI.form.JSONMap#load"><a href=
"LuCI.form.JSONMap.html#load">load
</a></li>
1075 <li data-name=
"LuCI.form.JSONMap#lookupOption"><a href=
"LuCI.form.JSONMap.html#lookupOption">lookupOption
</a></li>
1077 <li data-name=
"LuCI.form.JSONMap#parse"><a href=
"LuCI.form.JSONMap.html#parse">parse
</a></li>
1079 <li data-name=
"LuCI.form.JSONMap#render"><a href=
"LuCI.form.JSONMap.html#render">render
</a></li>
1081 <li data-name=
"LuCI.form.JSONMap#reset"><a href=
"LuCI.form.JSONMap.html#reset">reset
</a></li>
1083 <li data-name=
"LuCI.form.JSONMap#save"><a href=
"LuCI.form.JSONMap.html#save">save
</a></li>
1085 <li data-name=
"LuCI.form.JSONMap#section"><a href=
"LuCI.form.JSONMap.html#section">section
</a></li>
1087 <li data-name=
"LuCI.form.JSONMap#stripTags"><a href=
"LuCI.form.JSONMap.html#stripTags">stripTags
</a></li>
1089 <li data-name=
"LuCI.form.JSONMap#titleFn"><a href=
"LuCI.form.JSONMap.html#titleFn">titleFn
</a></li>
1092 <ul class=
"events itemMembers">
1097 <li class=
"item" data-name=
"LuCI.form.ListValue">
1098 <span class=
"title">
1099 <a href=
"LuCI.form.ListValue.html">LuCI.form.ListValue
</a>
1102 <ul class=
"members itemMembers">
1104 <span class=
"subtitle">Members
</span>
1106 <li data-name=
"LuCI.form.ListValue##orientation"><a href=
"LuCI.form.ListValue.html#orientation">orientation
</a></li>
1108 <li data-name=
"LuCI.form.ListValue##size"><a href=
"LuCI.form.ListValue.html#size">size
</a></li>
1110 <li data-name=
"LuCI.form.ListValue##widget"><a href=
"LuCI.form.ListValue.html#widget">widget
</a></li>
1112 <li data-name=
"LuCI.form.ListValue#datatype"><a href=
"LuCI.form.ListValue.html#datatype">datatype
</a></li>
1114 <li data-name=
"LuCI.form.ListValue#default"><a href=
"LuCI.form.ListValue.html#default">default
</a></li>
1116 <li data-name=
"LuCI.form.ListValue#editable"><a href=
"LuCI.form.ListValue.html#editable">editable
</a></li>
1118 <li data-name=
"LuCI.form.ListValue#modalonly"><a href=
"LuCI.form.ListValue.html#modalonly">modalonly
</a></li>
1120 <li data-name=
"LuCI.form.ListValue#onchange"><a href=
"LuCI.form.ListValue.html#onchange">onchange
</a></li>
1122 <li data-name=
"LuCI.form.ListValue#optional"><a href=
"LuCI.form.ListValue.html#optional">optional
</a></li>
1124 <li data-name=
"LuCI.form.ListValue#password"><a href=
"LuCI.form.ListValue.html#password">password
</a></li>
1126 <li data-name=
"LuCI.form.ListValue#placeholder"><a href=
"LuCI.form.ListValue.html#placeholder">placeholder
</a></li>
1128 <li data-name=
"LuCI.form.ListValue#readonly"><a href=
"LuCI.form.ListValue.html#readonly">readonly
</a></li>
1130 <li data-name=
"LuCI.form.ListValue#rmempty"><a href=
"LuCI.form.ListValue.html#rmempty">rmempty
</a></li>
1132 <li data-name=
"LuCI.form.ListValue#uciconfig"><a href=
"LuCI.form.ListValue.html#uciconfig">uciconfig
</a></li>
1134 <li data-name=
"LuCI.form.ListValue#ucioption"><a href=
"LuCI.form.ListValue.html#ucioption">ucioption
</a></li>
1136 <li data-name=
"LuCI.form.ListValue#ucisection"><a href=
"LuCI.form.ListValue.html#ucisection">ucisection
</a></li>
1138 <li data-name=
"LuCI.form.ListValue#validate"><a href=
"LuCI.form.ListValue.html#validate">validate
</a></li>
1140 <li data-name=
"LuCI.form.ListValue#width"><a href=
"LuCI.form.ListValue.html#width">width
</a></li>
1143 <ul class=
"typedefs itemMembers">
1146 <ul class=
"typedefs itemMembers">
1149 <ul class=
"methods itemMembers">
1151 <span class=
"subtitle">Methods
</span>
1153 <li data-name=
"LuCI.form.ListValue#append"><a href=
"LuCI.form.ListValue.html#append">append
</a></li>
1155 <li data-name=
"LuCI.form.ListValue#cbid"><a href=
"LuCI.form.ListValue.html#cbid">cbid
</a></li>
1157 <li data-name=
"LuCI.form.ListValue#cfgvalue"><a href=
"LuCI.form.ListValue.html#cfgvalue">cfgvalue
</a></li>
1159 <li data-name=
"LuCI.form.ListValue#depends"><a href=
"LuCI.form.ListValue.html#depends">depends
</a></li>
1161 <li data-name=
"LuCI.form.ListValue#formvalue"><a href=
"LuCI.form.ListValue.html#formvalue">formvalue
</a></li>
1163 <li data-name=
"LuCI.form.ListValue#getUIElement"><a href=
"LuCI.form.ListValue.html#getUIElement">getUIElement
</a></li>
1165 <li data-name=
"LuCI.form.ListValue#isActive"><a href=
"LuCI.form.ListValue.html#isActive">isActive
</a></li>
1167 <li data-name=
"LuCI.form.ListValue#isValid"><a href=
"LuCI.form.ListValue.html#isValid">isValid
</a></li>
1169 <li data-name=
"LuCI.form.ListValue#load"><a href=
"LuCI.form.ListValue.html#load">load
</a></li>
1171 <li data-name=
"LuCI.form.ListValue#parse"><a href=
"LuCI.form.ListValue.html#parse">parse
</a></li>
1173 <li data-name=
"LuCI.form.ListValue#remove"><a href=
"LuCI.form.ListValue.html#remove">remove
</a></li>
1175 <li data-name=
"LuCI.form.ListValue#stripTags"><a href=
"LuCI.form.ListValue.html#stripTags">stripTags
</a></li>
1177 <li data-name=
"LuCI.form.ListValue#textvalue"><a href=
"LuCI.form.ListValue.html#textvalue">textvalue
</a></li>
1179 <li data-name=
"LuCI.form.ListValue#titleFn"><a href=
"LuCI.form.ListValue.html#titleFn">titleFn
</a></li>
1181 <li data-name=
"LuCI.form.ListValue#value"><a href=
"LuCI.form.ListValue.html#value">value
</a></li>
1183 <li data-name=
"LuCI.form.ListValue#write"><a href=
"LuCI.form.ListValue.html#write">write
</a></li>
1186 <ul class=
"events itemMembers">
1191 <li class=
"item" data-name=
"LuCI.form.Map">
1192 <span class=
"title">
1193 <a href=
"LuCI.form.Map.html">LuCI.form.Map
</a>
1196 <ul class=
"members itemMembers">
1198 <span class=
"subtitle">Members
</span>
1200 <li data-name=
"LuCI.form.Map##readonly"><a href=
"LuCI.form.Map.html#readonly">readonly
</a></li>
1203 <ul class=
"typedefs itemMembers">
1206 <ul class=
"typedefs itemMembers">
1209 <ul class=
"methods itemMembers">
1211 <span class=
"subtitle">Methods
</span>
1213 <li data-name=
"LuCI.form.Map#append"><a href=
"LuCI.form.Map.html#append">append
</a></li>
1215 <li data-name=
"LuCI.form.Map#chain"><a href=
"LuCI.form.Map.html#chain">chain
</a></li>
1217 <li data-name=
"LuCI.form.Map#findElement"><a href=
"LuCI.form.Map.html#findElement">findElement
</a></li>
1219 <li data-name=
"LuCI.form.Map#findElements"><a href=
"LuCI.form.Map.html#findElements">findElements
</a></li>
1221 <li data-name=
"LuCI.form.Map#load"><a href=
"LuCI.form.Map.html#load">load
</a></li>
1223 <li data-name=
"LuCI.form.Map#lookupOption"><a href=
"LuCI.form.Map.html#lookupOption">lookupOption
</a></li>
1225 <li data-name=
"LuCI.form.Map#parse"><a href=
"LuCI.form.Map.html#parse">parse
</a></li>
1227 <li data-name=
"LuCI.form.Map#render"><a href=
"LuCI.form.Map.html#render">render
</a></li>
1229 <li data-name=
"LuCI.form.Map#reset"><a href=
"LuCI.form.Map.html#reset">reset
</a></li>
1231 <li data-name=
"LuCI.form.Map#save"><a href=
"LuCI.form.Map.html#save">save
</a></li>
1233 <li data-name=
"LuCI.form.Map#section"><a href=
"LuCI.form.Map.html#section">section
</a></li>
1235 <li data-name=
"LuCI.form.Map#stripTags"><a href=
"LuCI.form.Map.html#stripTags">stripTags
</a></li>
1237 <li data-name=
"LuCI.form.Map#titleFn"><a href=
"LuCI.form.Map.html#titleFn">titleFn
</a></li>
1240 <ul class=
"events itemMembers">
1245 <li class=
"item" data-name=
"LuCI.form.MultiValue">
1246 <span class=
"title">
1247 <a href=
"LuCI.form.MultiValue.html">LuCI.form.MultiValue
</a>
1250 <ul class=
"members itemMembers">
1252 <span class=
"subtitle">Members
</span>
1254 <li data-name=
"LuCI.form.MultiValue##display_size"><a href=
"LuCI.form.MultiValue.html#display_size">display_size
</a></li>
1256 <li data-name=
"LuCI.form.MultiValue##dropdown_size"><a href=
"LuCI.form.MultiValue.html#dropdown_size">dropdown_size
</a></li>
1258 <li data-name=
"LuCI.form.MultiValue#datatype"><a href=
"LuCI.form.MultiValue.html#datatype">datatype
</a></li>
1260 <li data-name=
"LuCI.form.MultiValue#default"><a href=
"LuCI.form.MultiValue.html#default">default
</a></li>
1262 <li data-name=
"LuCI.form.MultiValue#editable"><a href=
"LuCI.form.MultiValue.html#editable">editable
</a></li>
1264 <li data-name=
"LuCI.form.MultiValue#modalonly"><a href=
"LuCI.form.MultiValue.html#modalonly">modalonly
</a></li>
1266 <li data-name=
"LuCI.form.MultiValue#onchange"><a href=
"LuCI.form.MultiValue.html#onchange">onchange
</a></li>
1268 <li data-name=
"LuCI.form.MultiValue#optional"><a href=
"LuCI.form.MultiValue.html#optional">optional
</a></li>
1270 <li data-name=
"LuCI.form.MultiValue#password"><a href=
"LuCI.form.MultiValue.html#password">password
</a></li>
1272 <li data-name=
"LuCI.form.MultiValue#placeholder"><a href=
"LuCI.form.MultiValue.html#placeholder">placeholder
</a></li>
1274 <li data-name=
"LuCI.form.MultiValue#readonly"><a href=
"LuCI.form.MultiValue.html#readonly">readonly
</a></li>
1276 <li data-name=
"LuCI.form.MultiValue#rmempty"><a href=
"LuCI.form.MultiValue.html#rmempty">rmempty
</a></li>
1278 <li data-name=
"LuCI.form.MultiValue#uciconfig"><a href=
"LuCI.form.MultiValue.html#uciconfig">uciconfig
</a></li>
1280 <li data-name=
"LuCI.form.MultiValue#ucioption"><a href=
"LuCI.form.MultiValue.html#ucioption">ucioption
</a></li>
1282 <li data-name=
"LuCI.form.MultiValue#ucisection"><a href=
"LuCI.form.MultiValue.html#ucisection">ucisection
</a></li>
1284 <li data-name=
"LuCI.form.MultiValue#validate"><a href=
"LuCI.form.MultiValue.html#validate">validate
</a></li>
1286 <li data-name=
"LuCI.form.MultiValue#width"><a href=
"LuCI.form.MultiValue.html#width">width
</a></li>
1289 <ul class=
"typedefs itemMembers">
1292 <ul class=
"typedefs itemMembers">
1295 <ul class=
"methods itemMembers">
1297 <span class=
"subtitle">Methods
</span>
1299 <li data-name=
"LuCI.form.MultiValue#append"><a href=
"LuCI.form.MultiValue.html#append">append
</a></li>
1301 <li data-name=
"LuCI.form.MultiValue#cbid"><a href=
"LuCI.form.MultiValue.html#cbid">cbid
</a></li>
1303 <li data-name=
"LuCI.form.MultiValue#cfgvalue"><a href=
"LuCI.form.MultiValue.html#cfgvalue">cfgvalue
</a></li>
1305 <li data-name=
"LuCI.form.MultiValue#depends"><a href=
"LuCI.form.MultiValue.html#depends">depends
</a></li>
1307 <li data-name=
"LuCI.form.MultiValue#formvalue"><a href=
"LuCI.form.MultiValue.html#formvalue">formvalue
</a></li>
1309 <li data-name=
"LuCI.form.MultiValue#getUIElement"><a href=
"LuCI.form.MultiValue.html#getUIElement">getUIElement
</a></li>
1311 <li data-name=
"LuCI.form.MultiValue#isActive"><a href=
"LuCI.form.MultiValue.html#isActive">isActive
</a></li>
1313 <li data-name=
"LuCI.form.MultiValue#isValid"><a href=
"LuCI.form.MultiValue.html#isValid">isValid
</a></li>
1315 <li data-name=
"LuCI.form.MultiValue#load"><a href=
"LuCI.form.MultiValue.html#load">load
</a></li>
1317 <li data-name=
"LuCI.form.MultiValue#parse"><a href=
"LuCI.form.MultiValue.html#parse">parse
</a></li>
1319 <li data-name=
"LuCI.form.MultiValue#remove"><a href=
"LuCI.form.MultiValue.html#remove">remove
</a></li>
1321 <li data-name=
"LuCI.form.MultiValue#stripTags"><a href=
"LuCI.form.MultiValue.html#stripTags">stripTags
</a></li>
1323 <li data-name=
"LuCI.form.MultiValue#textvalue"><a href=
"LuCI.form.MultiValue.html#textvalue">textvalue
</a></li>
1325 <li data-name=
"LuCI.form.MultiValue#titleFn"><a href=
"LuCI.form.MultiValue.html#titleFn">titleFn
</a></li>
1327 <li data-name=
"LuCI.form.MultiValue#value"><a href=
"LuCI.form.MultiValue.html#value">value
</a></li>
1329 <li data-name=
"LuCI.form.MultiValue#write"><a href=
"LuCI.form.MultiValue.html#write">write
</a></li>
1332 <ul class=
"events itemMembers">
1337 <li class=
"item" data-name=
"LuCI.form.NamedSection">
1338 <span class=
"title">
1339 <a href=
"LuCI.form.NamedSection.html">LuCI.form.NamedSection
</a>
1342 <ul class=
"members itemMembers">
1344 <span class=
"subtitle">Members
</span>
1346 <li data-name=
"LuCI.form.NamedSection##addremove"><a href=
"LuCI.form.NamedSection.html#addremove">addremove
</a></li>
1348 <li data-name=
"LuCI.form.NamedSection##uciconfig"><a href=
"LuCI.form.NamedSection.html#uciconfig">uciconfig
</a></li>
1350 <li data-name=
"LuCI.form.NamedSection#parentoption"><a href=
"LuCI.form.NamedSection.html#parentoption">parentoption
</a></li>
1353 <ul class=
"typedefs itemMembers">
1356 <ul class=
"typedefs itemMembers">
1359 <ul class=
"methods itemMembers">
1361 <span class=
"subtitle">Methods
</span>
1363 <li data-name=
"LuCI.form.NamedSection#append"><a href=
"LuCI.form.NamedSection.html#append">append
</a></li>
1365 <li data-name=
"LuCI.form.NamedSection#cfgsections"><a href=
"LuCI.form.NamedSection.html#cfgsections">cfgsections
</a></li>
1367 <li data-name=
"LuCI.form.NamedSection#cfgvalue"><a href=
"LuCI.form.NamedSection.html#cfgvalue">cfgvalue
</a></li>
1369 <li data-name=
"LuCI.form.NamedSection#filter"><a href=
"LuCI.form.NamedSection.html#filter">filter
</a></li>
1371 <li data-name=
"LuCI.form.NamedSection#formvalue"><a href=
"LuCI.form.NamedSection.html#formvalue">formvalue
</a></li>
1373 <li data-name=
"LuCI.form.NamedSection#getOption"><a href=
"LuCI.form.NamedSection.html#getOption">getOption
</a></li>
1375 <li data-name=
"LuCI.form.NamedSection#getUIElement"><a href=
"LuCI.form.NamedSection.html#getUIElement">getUIElement
</a></li>
1377 <li data-name=
"LuCI.form.NamedSection#load"><a href=
"LuCI.form.NamedSection.html#load">load
</a></li>
1379 <li data-name=
"LuCI.form.NamedSection#option"><a href=
"LuCI.form.NamedSection.html#option">option
</a></li>
1381 <li data-name=
"LuCI.form.NamedSection#parse"><a href=
"LuCI.form.NamedSection.html#parse">parse
</a></li>
1383 <li data-name=
"LuCI.form.NamedSection#render"><a href=
"LuCI.form.NamedSection.html#render">render
</a></li>
1385 <li data-name=
"LuCI.form.NamedSection#stripTags"><a href=
"LuCI.form.NamedSection.html#stripTags">stripTags
</a></li>
1387 <li data-name=
"LuCI.form.NamedSection#tab"><a href=
"LuCI.form.NamedSection.html#tab">tab
</a></li>
1389 <li data-name=
"LuCI.form.NamedSection#taboption"><a href=
"LuCI.form.NamedSection.html#taboption">taboption
</a></li>
1391 <li data-name=
"LuCI.form.NamedSection#titleFn"><a href=
"LuCI.form.NamedSection.html#titleFn">titleFn
</a></li>
1394 <ul class=
"events itemMembers">
1399 <li class=
"item" data-name=
"LuCI.form.SectionValue">
1400 <span class=
"title">
1401 <a href=
"LuCI.form.SectionValue.html">LuCI.form.SectionValue
</a>
1404 <ul class=
"members itemMembers">
1406 <span class=
"subtitle">Members
</span>
1408 <li data-name=
"LuCI.form.SectionValue##subsection"><a href=
"LuCI.form.SectionValue.html#subsection">subsection
</a></li>
1410 <li data-name=
"LuCI.form.SectionValue#datatype"><a href=
"LuCI.form.SectionValue.html#datatype">datatype
</a></li>
1412 <li data-name=
"LuCI.form.SectionValue#default"><a href=
"LuCI.form.SectionValue.html#default">default
</a></li>
1414 <li data-name=
"LuCI.form.SectionValue#editable"><a href=
"LuCI.form.SectionValue.html#editable">editable
</a></li>
1416 <li data-name=
"LuCI.form.SectionValue#modalonly"><a href=
"LuCI.form.SectionValue.html#modalonly">modalonly
</a></li>
1418 <li data-name=
"LuCI.form.SectionValue#onchange"><a href=
"LuCI.form.SectionValue.html#onchange">onchange
</a></li>
1420 <li data-name=
"LuCI.form.SectionValue#optional"><a href=
"LuCI.form.SectionValue.html#optional">optional
</a></li>
1422 <li data-name=
"LuCI.form.SectionValue#password"><a href=
"LuCI.form.SectionValue.html#password">password
</a></li>
1424 <li data-name=
"LuCI.form.SectionValue#placeholder"><a href=
"LuCI.form.SectionValue.html#placeholder">placeholder
</a></li>
1426 <li data-name=
"LuCI.form.SectionValue#readonly"><a href=
"LuCI.form.SectionValue.html#readonly">readonly
</a></li>
1428 <li data-name=
"LuCI.form.SectionValue#rmempty"><a href=
"LuCI.form.SectionValue.html#rmempty">rmempty
</a></li>
1430 <li data-name=
"LuCI.form.SectionValue#uciconfig"><a href=
"LuCI.form.SectionValue.html#uciconfig">uciconfig
</a></li>
1432 <li data-name=
"LuCI.form.SectionValue#ucioption"><a href=
"LuCI.form.SectionValue.html#ucioption">ucioption
</a></li>
1434 <li data-name=
"LuCI.form.SectionValue#ucisection"><a href=
"LuCI.form.SectionValue.html#ucisection">ucisection
</a></li>
1436 <li data-name=
"LuCI.form.SectionValue#validate"><a href=
"LuCI.form.SectionValue.html#validate">validate
</a></li>
1438 <li data-name=
"LuCI.form.SectionValue#width"><a href=
"LuCI.form.SectionValue.html#width">width
</a></li>
1441 <ul class=
"typedefs itemMembers">
1444 <ul class=
"typedefs itemMembers">
1447 <ul class=
"methods itemMembers">
1449 <span class=
"subtitle">Methods
</span>
1451 <li data-name=
"LuCI.form.SectionValue#append"><a href=
"LuCI.form.SectionValue.html#append">append
</a></li>
1453 <li data-name=
"LuCI.form.SectionValue#cbid"><a href=
"LuCI.form.SectionValue.html#cbid">cbid
</a></li>
1455 <li data-name=
"LuCI.form.SectionValue#cfgvalue"><a href=
"LuCI.form.SectionValue.html#cfgvalue">cfgvalue
</a></li>
1457 <li data-name=
"LuCI.form.SectionValue#depends"><a href=
"LuCI.form.SectionValue.html#depends">depends
</a></li>
1459 <li data-name=
"LuCI.form.SectionValue#formvalue"><a href=
"LuCI.form.SectionValue.html#formvalue">formvalue
</a></li>
1461 <li data-name=
"LuCI.form.SectionValue#getUIElement"><a href=
"LuCI.form.SectionValue.html#getUIElement">getUIElement
</a></li>
1463 <li data-name=
"LuCI.form.SectionValue#isActive"><a href=
"LuCI.form.SectionValue.html#isActive">isActive
</a></li>
1465 <li data-name=
"LuCI.form.SectionValue#isValid"><a href=
"LuCI.form.SectionValue.html#isValid">isValid
</a></li>
1467 <li data-name=
"LuCI.form.SectionValue#load"><a href=
"LuCI.form.SectionValue.html#load">load
</a></li>
1469 <li data-name=
"LuCI.form.SectionValue#parse"><a href=
"LuCI.form.SectionValue.html#parse">parse
</a></li>
1471 <li data-name=
"LuCI.form.SectionValue#remove"><a href=
"LuCI.form.SectionValue.html#remove">remove
</a></li>
1473 <li data-name=
"LuCI.form.SectionValue#stripTags"><a href=
"LuCI.form.SectionValue.html#stripTags">stripTags
</a></li>
1475 <li data-name=
"LuCI.form.SectionValue#textvalue"><a href=
"LuCI.form.SectionValue.html#textvalue">textvalue
</a></li>
1477 <li data-name=
"LuCI.form.SectionValue#titleFn"><a href=
"LuCI.form.SectionValue.html#titleFn">titleFn
</a></li>
1479 <li data-name=
"LuCI.form.SectionValue#value"><a href=
"LuCI.form.SectionValue.html#value">value
</a></li>
1481 <li data-name=
"LuCI.form.SectionValue#write"><a href=
"LuCI.form.SectionValue.html#write">write
</a></li>
1484 <ul class=
"events itemMembers">
1489 <li class=
"item" data-name=
"LuCI.form.TableSection">
1490 <span class=
"title">
1491 <a href=
"LuCI.form.TableSection.html">LuCI.form.TableSection
</a>
1494 <ul class=
"members itemMembers">
1496 <span class=
"subtitle">Members
</span>
1498 <li data-name=
"LuCI.form.TableSection##addbtntitle"><a href=
"LuCI.form.TableSection.html#addbtntitle">addbtntitle
</a></li>
1500 <li data-name=
"LuCI.form.TableSection##addremove"><a href=
"LuCI.form.TableSection.html#addremove">addremove
</a></li>
1502 <li data-name=
"LuCI.form.TableSection##anonymous"><a href=
"LuCI.form.TableSection.html#anonymous">anonymous
</a></li>
1504 <li data-name=
"LuCI.form.TableSection##extedit"><a href=
"LuCI.form.TableSection.html#extedit">extedit
</a></li>
1506 <li data-name=
"LuCI.form.TableSection##max_cols"><a href=
"LuCI.form.TableSection.html#max_cols">max_cols
</a></li>
1508 <li data-name=
"LuCI.form.TableSection##modaltitle"><a href=
"LuCI.form.TableSection.html#modaltitle">modaltitle
</a></li>
1510 <li data-name=
"LuCI.form.TableSection##nodescriptions"><a href=
"LuCI.form.TableSection.html#nodescriptions">nodescriptions
</a></li>
1512 <li data-name=
"LuCI.form.TableSection##rowcolors"><a href=
"LuCI.form.TableSection.html#rowcolors">rowcolors
</a></li>
1514 <li data-name=
"LuCI.form.TableSection##sectiontitle"><a href=
"LuCI.form.TableSection.html#sectiontitle">sectiontitle
</a></li>
1516 <li data-name=
"LuCI.form.TableSection##sortable"><a href=
"LuCI.form.TableSection.html#sortable">sortable
</a></li>
1518 <li data-name=
"LuCI.form.TableSection##uciconfig"><a href=
"LuCI.form.TableSection.html#uciconfig">uciconfig
</a></li>
1520 <li data-name=
"LuCI.form.TableSection#addbtntitle"><a href=
"LuCI.form.TableSection.html#addbtntitle">addbtntitle
</a></li>
1522 <li data-name=
"LuCI.form.TableSection#addremove"><a href=
"LuCI.form.TableSection.html#addremove">addremove
</a></li>
1524 <li data-name=
"LuCI.form.TableSection#anonymous"><a href=
"LuCI.form.TableSection.html#anonymous">anonymous
</a></li>
1526 <li data-name=
"LuCI.form.TableSection#parentoption"><a href=
"LuCI.form.TableSection.html#parentoption">parentoption
</a></li>
1528 <li data-name=
"LuCI.form.TableSection#tabbed"><a href=
"LuCI.form.TableSection.html#tabbed">tabbed
</a></li>
1530 <li data-name=
"LuCI.form.TableSection#uciconfig"><a href=
"LuCI.form.TableSection.html#uciconfig">uciconfig
</a></li>
1533 <ul class=
"typedefs itemMembers">
1536 <ul class=
"typedefs itemMembers">
1539 <ul class=
"methods itemMembers">
1541 <span class=
"subtitle">Methods
</span>
1543 <li data-name=
"LuCI.form.TableSection#addModalOptions"><a href=
"LuCI.form.TableSection.html#addModalOptions">addModalOptions
</a></li>
1545 <li data-name=
"LuCI.form.TableSection#append"><a href=
"LuCI.form.TableSection.html#append">append
</a></li>
1547 <li data-name=
"LuCI.form.TableSection#cfgvalue"><a href=
"LuCI.form.TableSection.html#cfgvalue">cfgvalue
</a></li>
1549 <li data-name=
"LuCI.form.TableSection#filter"><a href=
"LuCI.form.TableSection.html#filter">filter
</a></li>
1551 <li data-name=
"LuCI.form.TableSection#formvalue"><a href=
"LuCI.form.TableSection.html#formvalue">formvalue
</a></li>
1553 <li data-name=
"LuCI.form.TableSection#getOption"><a href=
"LuCI.form.TableSection.html#getOption">getOption
</a></li>
1555 <li data-name=
"LuCI.form.TableSection#getUIElement"><a href=
"LuCI.form.TableSection.html#getUIElement">getUIElement
</a></li>
1557 <li data-name=
"LuCI.form.TableSection#load"><a href=
"LuCI.form.TableSection.html#load">load
</a></li>
1559 <li data-name=
"LuCI.form.TableSection#option"><a href=
"LuCI.form.TableSection.html#option">option
</a></li>
1561 <li data-name=
"LuCI.form.TableSection#parse"><a href=
"LuCI.form.TableSection.html#parse">parse
</a></li>
1563 <li data-name=
"LuCI.form.TableSection#stripTags"><a href=
"LuCI.form.TableSection.html#stripTags">stripTags
</a></li>
1565 <li data-name=
"LuCI.form.TableSection#tab"><a href=
"LuCI.form.TableSection.html#tab">tab
</a></li>
1567 <li data-name=
"LuCI.form.TableSection#taboption"><a href=
"LuCI.form.TableSection.html#taboption">taboption
</a></li>
1569 <li data-name=
"LuCI.form.TableSection#titleFn"><a href=
"LuCI.form.TableSection.html#titleFn">titleFn
</a></li>
1572 <ul class=
"events itemMembers">
1577 <li class=
"item" data-name=
"LuCI.form.TextValue">
1578 <span class=
"title">
1579 <a href=
"LuCI.form.TextValue.html">LuCI.form.TextValue
</a>
1582 <ul class=
"members itemMembers">
1584 <span class=
"subtitle">Members
</span>
1586 <li data-name=
"LuCI.form.TextValue##cols"><a href=
"LuCI.form.TextValue.html#cols">cols
</a></li>
1588 <li data-name=
"LuCI.form.TextValue##monospace"><a href=
"LuCI.form.TextValue.html#monospace">monospace
</a></li>
1590 <li data-name=
"LuCI.form.TextValue##rows"><a href=
"LuCI.form.TextValue.html#rows">rows
</a></li>
1592 <li data-name=
"LuCI.form.TextValue##wrap"><a href=
"LuCI.form.TextValue.html#wrap">wrap
</a></li>
1594 <li data-name=
"LuCI.form.TextValue#datatype"><a href=
"LuCI.form.TextValue.html#datatype">datatype
</a></li>
1596 <li data-name=
"LuCI.form.TextValue#default"><a href=
"LuCI.form.TextValue.html#default">default
</a></li>
1598 <li data-name=
"LuCI.form.TextValue#editable"><a href=
"LuCI.form.TextValue.html#editable">editable
</a></li>
1600 <li data-name=
"LuCI.form.TextValue#modalonly"><a href=
"LuCI.form.TextValue.html#modalonly">modalonly
</a></li>
1602 <li data-name=
"LuCI.form.TextValue#onchange"><a href=
"LuCI.form.TextValue.html#onchange">onchange
</a></li>
1604 <li data-name=
"LuCI.form.TextValue#optional"><a href=
"LuCI.form.TextValue.html#optional">optional
</a></li>
1606 <li data-name=
"LuCI.form.TextValue#password"><a href=
"LuCI.form.TextValue.html#password">password
</a></li>
1608 <li data-name=
"LuCI.form.TextValue#placeholder"><a href=
"LuCI.form.TextValue.html#placeholder">placeholder
</a></li>
1610 <li data-name=
"LuCI.form.TextValue#readonly"><a href=
"LuCI.form.TextValue.html#readonly">readonly
</a></li>
1612 <li data-name=
"LuCI.form.TextValue#rmempty"><a href=
"LuCI.form.TextValue.html#rmempty">rmempty
</a></li>
1614 <li data-name=
"LuCI.form.TextValue#uciconfig"><a href=
"LuCI.form.TextValue.html#uciconfig">uciconfig
</a></li>
1616 <li data-name=
"LuCI.form.TextValue#ucioption"><a href=
"LuCI.form.TextValue.html#ucioption">ucioption
</a></li>
1618 <li data-name=
"LuCI.form.TextValue#ucisection"><a href=
"LuCI.form.TextValue.html#ucisection">ucisection
</a></li>
1620 <li data-name=
"LuCI.form.TextValue#validate"><a href=
"LuCI.form.TextValue.html#validate">validate
</a></li>
1622 <li data-name=
"LuCI.form.TextValue#width"><a href=
"LuCI.form.TextValue.html#width">width
</a></li>
1625 <ul class=
"typedefs itemMembers">
1628 <ul class=
"typedefs itemMembers">
1631 <ul class=
"methods itemMembers">
1633 <span class=
"subtitle">Methods
</span>
1635 <li data-name=
"LuCI.form.TextValue#append"><a href=
"LuCI.form.TextValue.html#append">append
</a></li>
1637 <li data-name=
"LuCI.form.TextValue#cbid"><a href=
"LuCI.form.TextValue.html#cbid">cbid
</a></li>
1639 <li data-name=
"LuCI.form.TextValue#cfgvalue"><a href=
"LuCI.form.TextValue.html#cfgvalue">cfgvalue
</a></li>
1641 <li data-name=
"LuCI.form.TextValue#depends"><a href=
"LuCI.form.TextValue.html#depends">depends
</a></li>
1643 <li data-name=
"LuCI.form.TextValue#formvalue"><a href=
"LuCI.form.TextValue.html#formvalue">formvalue
</a></li>
1645 <li data-name=
"LuCI.form.TextValue#getUIElement"><a href=
"LuCI.form.TextValue.html#getUIElement">getUIElement
</a></li>
1647 <li data-name=
"LuCI.form.TextValue#isActive"><a href=
"LuCI.form.TextValue.html#isActive">isActive
</a></li>
1649 <li data-name=
"LuCI.form.TextValue#isValid"><a href=
"LuCI.form.TextValue.html#isValid">isValid
</a></li>
1651 <li data-name=
"LuCI.form.TextValue#load"><a href=
"LuCI.form.TextValue.html#load">load
</a></li>
1653 <li data-name=
"LuCI.form.TextValue#parse"><a href=
"LuCI.form.TextValue.html#parse">parse
</a></li>
1655 <li data-name=
"LuCI.form.TextValue#remove"><a href=
"LuCI.form.TextValue.html#remove">remove
</a></li>
1657 <li data-name=
"LuCI.form.TextValue#stripTags"><a href=
"LuCI.form.TextValue.html#stripTags">stripTags
</a></li>
1659 <li data-name=
"LuCI.form.TextValue#textvalue"><a href=
"LuCI.form.TextValue.html#textvalue">textvalue
</a></li>
1661 <li data-name=
"LuCI.form.TextValue#titleFn"><a href=
"LuCI.form.TextValue.html#titleFn">titleFn
</a></li>
1663 <li data-name=
"LuCI.form.TextValue#write"><a href=
"LuCI.form.TextValue.html#write">write
</a></li>
1666 <ul class=
"events itemMembers">
1671 <li class=
"item" data-name=
"LuCI.form.TypedSection">
1672 <span class=
"title">
1673 <a href=
"LuCI.form.TypedSection.html">LuCI.form.TypedSection
</a>
1676 <ul class=
"members itemMembers">
1678 <span class=
"subtitle">Members
</span>
1680 <li data-name=
"LuCI.form.TypedSection##addbtntitle"><a href=
"LuCI.form.TypedSection.html#addbtntitle">addbtntitle
</a></li>
1682 <li data-name=
"LuCI.form.TypedSection##addremove"><a href=
"LuCI.form.TypedSection.html#addremove">addremove
</a></li>
1684 <li data-name=
"LuCI.form.TypedSection##anonymous"><a href=
"LuCI.form.TypedSection.html#anonymous">anonymous
</a></li>
1686 <li data-name=
"LuCI.form.TypedSection##tabbed"><a href=
"LuCI.form.TypedSection.html#tabbed">tabbed
</a></li>
1688 <li data-name=
"LuCI.form.TypedSection##uciconfig"><a href=
"LuCI.form.TypedSection.html#uciconfig">uciconfig
</a></li>
1690 <li data-name=
"LuCI.form.TypedSection#parentoption"><a href=
"LuCI.form.TypedSection.html#parentoption">parentoption
</a></li>
1693 <ul class=
"typedefs itemMembers">
1696 <ul class=
"typedefs itemMembers">
1699 <ul class=
"methods itemMembers">
1701 <span class=
"subtitle">Methods
</span>
1703 <li data-name=
"LuCI.form.TypedSection#append"><a href=
"LuCI.form.TypedSection.html#append">append
</a></li>
1705 <li data-name=
"LuCI.form.TypedSection#cfgsections"><a href=
"LuCI.form.TypedSection.html#cfgsections">cfgsections
</a></li>
1707 <li data-name=
"LuCI.form.TypedSection#cfgvalue"><a href=
"LuCI.form.TypedSection.html#cfgvalue">cfgvalue
</a></li>
1709 <li data-name=
"LuCI.form.TypedSection#filter"><a href=
"LuCI.form.TypedSection.html#filter">filter
</a></li>
1711 <li data-name=
"LuCI.form.TypedSection#formvalue"><a href=
"LuCI.form.TypedSection.html#formvalue">formvalue
</a></li>
1713 <li data-name=
"LuCI.form.TypedSection#getOption"><a href=
"LuCI.form.TypedSection.html#getOption">getOption
</a></li>
1715 <li data-name=
"LuCI.form.TypedSection#getUIElement"><a href=
"LuCI.form.TypedSection.html#getUIElement">getUIElement
</a></li>
1717 <li data-name=
"LuCI.form.TypedSection#load"><a href=
"LuCI.form.TypedSection.html#load">load
</a></li>
1719 <li data-name=
"LuCI.form.TypedSection#option"><a href=
"LuCI.form.TypedSection.html#option">option
</a></li>
1721 <li data-name=
"LuCI.form.TypedSection#parse"><a href=
"LuCI.form.TypedSection.html#parse">parse
</a></li>
1723 <li data-name=
"LuCI.form.TypedSection#render"><a href=
"LuCI.form.TypedSection.html#render">render
</a></li>
1725 <li data-name=
"LuCI.form.TypedSection#stripTags"><a href=
"LuCI.form.TypedSection.html#stripTags">stripTags
</a></li>
1727 <li data-name=
"LuCI.form.TypedSection#tab"><a href=
"LuCI.form.TypedSection.html#tab">tab
</a></li>
1729 <li data-name=
"LuCI.form.TypedSection#taboption"><a href=
"LuCI.form.TypedSection.html#taboption">taboption
</a></li>
1731 <li data-name=
"LuCI.form.TypedSection#titleFn"><a href=
"LuCI.form.TypedSection.html#titleFn">titleFn
</a></li>
1734 <ul class=
"events itemMembers">
1739 <li class=
"item" data-name=
"LuCI.form.Value">
1740 <span class=
"title">
1741 <a href=
"LuCI.form.Value.html">LuCI.form.Value
</a>
1744 <ul class=
"members itemMembers">
1746 <span class=
"subtitle">Members
</span>
1748 <li data-name=
"LuCI.form.Value##password"><a href=
"LuCI.form.Value.html#password">password
</a></li>
1750 <li data-name=
"LuCI.form.Value##placeholder"><a href=
"LuCI.form.Value.html#placeholder">placeholder
</a></li>
1752 <li data-name=
"LuCI.form.Value#datatype"><a href=
"LuCI.form.Value.html#datatype">datatype
</a></li>
1754 <li data-name=
"LuCI.form.Value#default"><a href=
"LuCI.form.Value.html#default">default
</a></li>
1756 <li data-name=
"LuCI.form.Value#editable"><a href=
"LuCI.form.Value.html#editable">editable
</a></li>
1758 <li data-name=
"LuCI.form.Value#modalonly"><a href=
"LuCI.form.Value.html#modalonly">modalonly
</a></li>
1760 <li data-name=
"LuCI.form.Value#onchange"><a href=
"LuCI.form.Value.html#onchange">onchange
</a></li>
1762 <li data-name=
"LuCI.form.Value#optional"><a href=
"LuCI.form.Value.html#optional">optional
</a></li>
1764 <li data-name=
"LuCI.form.Value#readonly"><a href=
"LuCI.form.Value.html#readonly">readonly
</a></li>
1766 <li data-name=
"LuCI.form.Value#rmempty"><a href=
"LuCI.form.Value.html#rmempty">rmempty
</a></li>
1768 <li data-name=
"LuCI.form.Value#uciconfig"><a href=
"LuCI.form.Value.html#uciconfig">uciconfig
</a></li>
1770 <li data-name=
"LuCI.form.Value#ucioption"><a href=
"LuCI.form.Value.html#ucioption">ucioption
</a></li>
1772 <li data-name=
"LuCI.form.Value#ucisection"><a href=
"LuCI.form.Value.html#ucisection">ucisection
</a></li>
1774 <li data-name=
"LuCI.form.Value#validate"><a href=
"LuCI.form.Value.html#validate">validate
</a></li>
1776 <li data-name=
"LuCI.form.Value#width"><a href=
"LuCI.form.Value.html#width">width
</a></li>
1779 <ul class=
"typedefs itemMembers">
1782 <ul class=
"typedefs itemMembers">
1785 <ul class=
"methods itemMembers">
1787 <span class=
"subtitle">Methods
</span>
1789 <li data-name=
"LuCI.form.Value#append"><a href=
"LuCI.form.Value.html#append">append
</a></li>
1791 <li data-name=
"LuCI.form.Value#cbid"><a href=
"LuCI.form.Value.html#cbid">cbid
</a></li>
1793 <li data-name=
"LuCI.form.Value#cfgvalue"><a href=
"LuCI.form.Value.html#cfgvalue">cfgvalue
</a></li>
1795 <li data-name=
"LuCI.form.Value#depends"><a href=
"LuCI.form.Value.html#depends">depends
</a></li>
1797 <li data-name=
"LuCI.form.Value#formvalue"><a href=
"LuCI.form.Value.html#formvalue">formvalue
</a></li>
1799 <li data-name=
"LuCI.form.Value#getUIElement"><a href=
"LuCI.form.Value.html#getUIElement">getUIElement
</a></li>
1801 <li data-name=
"LuCI.form.Value#isActive"><a href=
"LuCI.form.Value.html#isActive">isActive
</a></li>
1803 <li data-name=
"LuCI.form.Value#isValid"><a href=
"LuCI.form.Value.html#isValid">isValid
</a></li>
1805 <li data-name=
"LuCI.form.Value#load"><a href=
"LuCI.form.Value.html#load">load
</a></li>
1807 <li data-name=
"LuCI.form.Value#parse"><a href=
"LuCI.form.Value.html#parse">parse
</a></li>
1809 <li data-name=
"LuCI.form.Value#remove"><a href=
"LuCI.form.Value.html#remove">remove
</a></li>
1811 <li data-name=
"LuCI.form.Value#render"><a href=
"LuCI.form.Value.html#render">render
</a></li>
1813 <li data-name=
"LuCI.form.Value#stripTags"><a href=
"LuCI.form.Value.html#stripTags">stripTags
</a></li>
1815 <li data-name=
"LuCI.form.Value#textvalue"><a href=
"LuCI.form.Value.html#textvalue">textvalue
</a></li>
1817 <li data-name=
"LuCI.form.Value#titleFn"><a href=
"LuCI.form.Value.html#titleFn">titleFn
</a></li>
1819 <li data-name=
"LuCI.form.Value#value"><a href=
"LuCI.form.Value.html#value">value
</a></li>
1821 <li data-name=
"LuCI.form.Value#write"><a href=
"LuCI.form.Value.html#write">write
</a></li>
1824 <ul class=
"events itemMembers">
1829 <li class=
"item" data-name=
"LuCI.fs">
1830 <span class=
"title">
1831 <a href=
"LuCI.fs.html">LuCI.fs
</a>
1834 <ul class=
"members itemMembers">
1837 <ul class=
"typedefs itemMembers">
1839 <span class=
"subtitle">Typedefs
</span>
1841 <li data-name=
"LuCI.fs.FileExecResult"><a href=
"LuCI.fs.html#.FileExecResult">FileExecResult
</a></li>
1843 <li data-name=
"LuCI.fs.FileStatEntry"><a href=
"LuCI.fs.html#.FileStatEntry">FileStatEntry
</a></li>
1846 <ul class=
"typedefs itemMembers">
1849 <ul class=
"methods itemMembers">
1851 <span class=
"subtitle">Methods
</span>
1853 <li data-name=
"LuCI.fs#exec"><a href=
"LuCI.fs.html#exec">exec
</a></li>
1855 <li data-name=
"LuCI.fs#exec_direct"><a href=
"LuCI.fs.html#exec_direct">exec_direct
</a></li>
1857 <li data-name=
"LuCI.fs#lines"><a href=
"LuCI.fs.html#lines">lines
</a></li>
1859 <li data-name=
"LuCI.fs#list"><a href=
"LuCI.fs.html#list">list
</a></li>
1861 <li data-name=
"LuCI.fs#read"><a href=
"LuCI.fs.html#read">read
</a></li>
1863 <li data-name=
"LuCI.fs#read_direct"><a href=
"LuCI.fs.html#read_direct">read_direct
</a></li>
1865 <li data-name=
"LuCI.fs#remove"><a href=
"LuCI.fs.html#remove">remove
</a></li>
1867 <li data-name=
"LuCI.fs#stat"><a href=
"LuCI.fs.html#stat">stat
</a></li>
1869 <li data-name=
"LuCI.fs#trimmed"><a href=
"LuCI.fs.html#trimmed">trimmed
</a></li>
1871 <li data-name=
"LuCI.fs#write"><a href=
"LuCI.fs.html#write">write
</a></li>
1874 <ul class=
"events itemMembers">
1879 <li class=
"item" data-name=
"LuCI.headers">
1880 <span class=
"title">
1881 <a href=
"LuCI.headers.html">LuCI.headers
</a>
1884 <ul class=
"members itemMembers">
1887 <ul class=
"typedefs itemMembers">
1890 <ul class=
"typedefs itemMembers">
1893 <ul class=
"methods itemMembers">
1895 <span class=
"subtitle">Methods
</span>
1897 <li data-name=
"LuCI.headers#get"><a href=
"LuCI.headers.html#get">get
</a></li>
1899 <li data-name=
"LuCI.headers#has"><a href=
"LuCI.headers.html#has">has
</a></li>
1902 <ul class=
"events itemMembers">
1907 <li class=
"item" data-name=
"LuCI.network">
1908 <span class=
"title">
1909 <a href=
"LuCI.network.html">LuCI.network
</a>
1912 <ul class=
"members itemMembers">
1915 <ul class=
"typedefs itemMembers">
1917 <span class=
"subtitle">Typedefs
</span>
1919 <li data-name=
"LuCI.network.SwitchTopology"><a href=
"LuCI.network.html#.SwitchTopology">SwitchTopology
</a></li>
1921 <li data-name=
"LuCI.network.WifiEncryption"><a href=
"LuCI.network.html#.WifiEncryption">WifiEncryption
</a></li>
1923 <li data-name=
"LuCI.network.WifiPeerEntry"><a href=
"LuCI.network.html#.WifiPeerEntry">WifiPeerEntry
</a></li>
1925 <li data-name=
"LuCI.network.WifiRateEntry"><a href=
"LuCI.network.html#.WifiRateEntry">WifiRateEntry
</a></li>
1927 <li data-name=
"LuCI.network.WifiScanResult"><a href=
"LuCI.network.html#.WifiScanResult">WifiScanResult
</a></li>
1930 <ul class=
"typedefs itemMembers">
1933 <ul class=
"methods itemMembers">
1935 <span class=
"subtitle">Methods
</span>
1937 <li data-name=
"LuCI.network#addNetwork"><a href=
"LuCI.network.html#addNetwork">addNetwork
</a></li>
1939 <li data-name=
"LuCI.network#addWifiNetwork"><a href=
"LuCI.network.html#addWifiNetwork">addWifiNetwork
</a></li>
1941 <li data-name=
"LuCI.network#deleteNetwork"><a href=
"LuCI.network.html#deleteNetwork">deleteNetwork
</a></li>
1943 <li data-name=
"LuCI.network#deleteWifiNetwork"><a href=
"LuCI.network.html#deleteWifiNetwork">deleteWifiNetwork
</a></li>
1945 <li data-name=
"LuCI.network#flushCache"><a href=
"LuCI.network.html#flushCache">flushCache
</a></li>
1947 <li data-name=
"LuCI.network#formatWifiEncryption"><a href=
"LuCI.network.html#formatWifiEncryption">formatWifiEncryption
</a></li>
1949 <li data-name=
"LuCI.network#getDevice"><a href=
"LuCI.network.html#getDevice">getDevice
</a></li>
1951 <li data-name=
"LuCI.network#getDevices"><a href=
"LuCI.network.html#getDevices">getDevices
</a></li>
1953 <li data-name=
"LuCI.network#getDSLModemType"><a href=
"LuCI.network.html#getDSLModemType">getDSLModemType
</a></li>
1955 <li data-name=
"LuCI.network#getHostHints"><a href=
"LuCI.network.html#getHostHints">getHostHints
</a></li>
1957 <li data-name=
"LuCI.network#getIfnameOf"><a href=
"LuCI.network.html#getIfnameOf">getIfnameOf
</a></li>
1959 <li data-name=
"LuCI.network#getNetwork"><a href=
"LuCI.network.html#getNetwork">getNetwork
</a></li>
1961 <li data-name=
"LuCI.network#getNetworks"><a href=
"LuCI.network.html#getNetworks">getNetworks
</a></li>
1963 <li data-name=
"LuCI.network#getProtocol"><a href=
"LuCI.network.html#getProtocol">getProtocol
</a></li>
1965 <li data-name=
"LuCI.network#getProtocols"><a href=
"LuCI.network.html#getProtocols">getProtocols
</a></li>
1967 <li data-name=
"LuCI.network#getSwitchTopologies"><a href=
"LuCI.network.html#getSwitchTopologies">getSwitchTopologies
</a></li>
1969 <li data-name=
"LuCI.network#getWAN6Networks"><a href=
"LuCI.network.html#getWAN6Networks">getWAN6Networks
</a></li>
1971 <li data-name=
"LuCI.network#getWANNetworks"><a href=
"LuCI.network.html#getWANNetworks">getWANNetworks
</a></li>
1973 <li data-name=
"LuCI.network#getWifiDevice"><a href=
"LuCI.network.html#getWifiDevice">getWifiDevice
</a></li>
1975 <li data-name=
"LuCI.network#getWifiDevices"><a href=
"LuCI.network.html#getWifiDevices">getWifiDevices
</a></li>
1977 <li data-name=
"LuCI.network#getWifiNetwork"><a href=
"LuCI.network.html#getWifiNetwork">getWifiNetwork
</a></li>
1979 <li data-name=
"LuCI.network#getWifiNetworks"><a href=
"LuCI.network.html#getWifiNetworks">getWifiNetworks
</a></li>
1981 <li data-name=
"LuCI.network#isIgnoredDevice"><a href=
"LuCI.network.html#isIgnoredDevice">isIgnoredDevice
</a></li>
1983 <li data-name=
"LuCI.network#maskToPrefix"><a href=
"LuCI.network.html#maskToPrefix">maskToPrefix
</a></li>
1985 <li data-name=
"LuCI.network#prefixToMask"><a href=
"LuCI.network.html#prefixToMask">prefixToMask
</a></li>
1987 <li data-name=
"LuCI.network#registerErrorCode"><a href=
"LuCI.network.html#registerErrorCode">registerErrorCode
</a></li>
1989 <li data-name=
"LuCI.network#registerPatternVirtual"><a href=
"LuCI.network.html#registerPatternVirtual">registerPatternVirtual
</a></li>
1991 <li data-name=
"LuCI.network#registerProtocol"><a href=
"LuCI.network.html#registerProtocol">registerProtocol
</a></li>
1993 <li data-name=
"LuCI.network#renameNetwork"><a href=
"LuCI.network.html#renameNetwork">renameNetwork
</a></li>
1996 <ul class=
"events itemMembers">
2001 <li class=
"item" data-name=
"LuCI.network.Device">
2002 <span class=
"title">
2003 <a href=
"LuCI.network.Device.html">LuCI.network.Device
</a>
2006 <ul class=
"members itemMembers">
2009 <ul class=
"typedefs itemMembers">
2012 <ul class=
"typedefs itemMembers">
2015 <ul class=
"methods itemMembers">
2017 <span class=
"subtitle">Methods
</span>
2019 <li data-name=
"LuCI.network.Device#getBridgeID"><a href=
"LuCI.network.Device.html#getBridgeID">getBridgeID
</a></li>
2021 <li data-name=
"LuCI.network.Device#getBridgeSTP"><a href=
"LuCI.network.Device.html#getBridgeSTP">getBridgeSTP
</a></li>
2023 <li data-name=
"LuCI.network.Device#getI18n"><a href=
"LuCI.network.Device.html#getI18n">getI18n
</a></li>
2025 <li data-name=
"LuCI.network.Device#getIP6Addrs"><a href=
"LuCI.network.Device.html#getIP6Addrs">getIP6Addrs
</a></li>
2027 <li data-name=
"LuCI.network.Device#getIPAddrs"><a href=
"LuCI.network.Device.html#getIPAddrs">getIPAddrs
</a></li>
2029 <li data-name=
"LuCI.network.Device#getMAC"><a href=
"LuCI.network.Device.html#getMAC">getMAC
</a></li>
2031 <li data-name=
"LuCI.network.Device#getMTU"><a href=
"LuCI.network.Device.html#getMTU">getMTU
</a></li>
2033 <li data-name=
"LuCI.network.Device#getName"><a href=
"LuCI.network.Device.html#getName">getName
</a></li>
2035 <li data-name=
"LuCI.network.Device#getNetwork"><a href=
"LuCI.network.Device.html#getNetwork">getNetwork
</a></li>
2037 <li data-name=
"LuCI.network.Device#getNetworks"><a href=
"LuCI.network.Device.html#getNetworks">getNetworks
</a></li>
2039 <li data-name=
"LuCI.network.Device#getPorts"><a href=
"LuCI.network.Device.html#getPorts">getPorts
</a></li>
2041 <li data-name=
"LuCI.network.Device#getRXBytes"><a href=
"LuCI.network.Device.html#getRXBytes">getRXBytes
</a></li>
2043 <li data-name=
"LuCI.network.Device#getRXPackets"><a href=
"LuCI.network.Device.html#getRXPackets">getRXPackets
</a></li>
2045 <li data-name=
"LuCI.network.Device#getShortName"><a href=
"LuCI.network.Device.html#getShortName">getShortName
</a></li>
2047 <li data-name=
"LuCI.network.Device#getTXBytes"><a href=
"LuCI.network.Device.html#getTXBytes">getTXBytes
</a></li>
2049 <li data-name=
"LuCI.network.Device#getTXPackets"><a href=
"LuCI.network.Device.html#getTXPackets">getTXPackets
</a></li>
2051 <li data-name=
"LuCI.network.Device#getType"><a href=
"LuCI.network.Device.html#getType">getType
</a></li>
2053 <li data-name=
"LuCI.network.Device#getTypeI18n"><a href=
"LuCI.network.Device.html#getTypeI18n">getTypeI18n
</a></li>
2055 <li data-name=
"LuCI.network.Device#getWifiNetwork"><a href=
"LuCI.network.Device.html#getWifiNetwork">getWifiNetwork
</a></li>
2057 <li data-name=
"LuCI.network.Device#isBridge"><a href=
"LuCI.network.Device.html#isBridge">isBridge
</a></li>
2059 <li data-name=
"LuCI.network.Device#isBridgePort"><a href=
"LuCI.network.Device.html#isBridgePort">isBridgePort
</a></li>
2061 <li data-name=
"LuCI.network.Device#isUp"><a href=
"LuCI.network.Device.html#isUp">isUp
</a></li>
2064 <ul class=
"events itemMembers">
2069 <li class=
"item" data-name=
"LuCI.network.Hosts">
2070 <span class=
"title">
2071 <a href=
"LuCI.network.Hosts.html">LuCI.network.Hosts
</a>
2074 <ul class=
"members itemMembers">
2077 <ul class=
"typedefs itemMembers">
2080 <ul class=
"typedefs itemMembers">
2083 <ul class=
"methods itemMembers">
2085 <span class=
"subtitle">Methods
</span>
2087 <li data-name=
"LuCI.network.Hosts#getHostnameByIP6Addr"><a href=
"LuCI.network.Hosts.html#getHostnameByIP6Addr">getHostnameByIP6Addr
</a></li>
2089 <li data-name=
"LuCI.network.Hosts#getHostnameByIPAddr"><a href=
"LuCI.network.Hosts.html#getHostnameByIPAddr">getHostnameByIPAddr
</a></li>
2091 <li data-name=
"LuCI.network.Hosts#getHostnameByMACAddr"><a href=
"LuCI.network.Hosts.html#getHostnameByMACAddr">getHostnameByMACAddr
</a></li>
2093 <li data-name=
"LuCI.network.Hosts#getIP6AddrByMACAddr"><a href=
"LuCI.network.Hosts.html#getIP6AddrByMACAddr">getIP6AddrByMACAddr
</a></li>
2095 <li data-name=
"LuCI.network.Hosts#getIPAddrByMACAddr"><a href=
"LuCI.network.Hosts.html#getIPAddrByMACAddr">getIPAddrByMACAddr
</a></li>
2097 <li data-name=
"LuCI.network.Hosts#getMACAddrByIP6Addr"><a href=
"LuCI.network.Hosts.html#getMACAddrByIP6Addr">getMACAddrByIP6Addr
</a></li>
2099 <li data-name=
"LuCI.network.Hosts#getMACAddrByIPAddr"><a href=
"LuCI.network.Hosts.html#getMACAddrByIPAddr">getMACAddrByIPAddr
</a></li>
2101 <li data-name=
"LuCI.network.Hosts#getMACHints"><a href=
"LuCI.network.Hosts.html#getMACHints">getMACHints
</a></li>
2104 <ul class=
"events itemMembers">
2109 <li class=
"item" data-name=
"LuCI.network.Protocol">
2110 <span class=
"title">
2111 <a href=
"LuCI.network.Protocol.html">LuCI.network.Protocol
</a>
2114 <ul class=
"members itemMembers">
2117 <ul class=
"typedefs itemMembers">
2120 <ul class=
"typedefs itemMembers">
2123 <ul class=
"methods itemMembers">
2125 <span class=
"subtitle">Methods
</span>
2127 <li data-name=
"LuCI.network.Protocol#addDevice"><a href=
"LuCI.network.Protocol.html#addDevice">addDevice
</a></li>
2129 <li data-name=
"LuCI.network.Protocol#containsDevice"><a href=
"LuCI.network.Protocol.html#containsDevice">containsDevice
</a></li>
2131 <li data-name=
"LuCI.network.Protocol#deleteConfiguration"><a href=
"LuCI.network.Protocol.html#deleteConfiguration">deleteConfiguration
</a></li>
2133 <li data-name=
"LuCI.network.Protocol#deleteDevice"><a href=
"LuCI.network.Protocol.html#deleteDevice">deleteDevice
</a></li>
2135 <li data-name=
"LuCI.network.Protocol#get"><a href=
"LuCI.network.Protocol.html#get">get
</a></li>
2137 <li data-name=
"LuCI.network.Protocol#getDevice"><a href=
"LuCI.network.Protocol.html#getDevice">getDevice
</a></li>
2139 <li data-name=
"LuCI.network.Protocol#getDevices"><a href=
"LuCI.network.Protocol.html#getDevices">getDevices
</a></li>
2141 <li data-name=
"LuCI.network.Protocol#getDNS6Addrs"><a href=
"LuCI.network.Protocol.html#getDNS6Addrs">getDNS6Addrs
</a></li>
2143 <li data-name=
"LuCI.network.Protocol#getDNSAddrs"><a href=
"LuCI.network.Protocol.html#getDNSAddrs">getDNSAddrs
</a></li>
2145 <li data-name=
"LuCI.network.Protocol#getErrors"><a href=
"LuCI.network.Protocol.html#getErrors">getErrors
</a></li>
2147 <li data-name=
"LuCI.network.Protocol#getExpiry"><a href=
"LuCI.network.Protocol.html#getExpiry">getExpiry
</a></li>
2149 <li data-name=
"LuCI.network.Protocol#getGateway6Addr"><a href=
"LuCI.network.Protocol.html#getGateway6Addr">getGateway6Addr
</a></li>
2151 <li data-name=
"LuCI.network.Protocol#getGatewayAddr"><a href=
"LuCI.network.Protocol.html#getGatewayAddr">getGatewayAddr
</a></li>
2153 <li data-name=
"LuCI.network.Protocol#getI18n"><a href=
"LuCI.network.Protocol.html#getI18n">getI18n
</a></li>
2155 <li data-name=
"LuCI.network.Protocol#getIfname"><a href=
"LuCI.network.Protocol.html#getIfname">getIfname
</a></li>
2157 <li data-name=
"LuCI.network.Protocol#getIP6Addr"><a href=
"LuCI.network.Protocol.html#getIP6Addr">getIP6Addr
</a></li>
2159 <li data-name=
"LuCI.network.Protocol#getIP6Addrs"><a href=
"LuCI.network.Protocol.html#getIP6Addrs">getIP6Addrs
</a></li>
2161 <li data-name=
"LuCI.network.Protocol#getIP6Prefix"><a href=
"LuCI.network.Protocol.html#getIP6Prefix">getIP6Prefix
</a></li>
2163 <li data-name=
"LuCI.network.Protocol#getIPAddr"><a href=
"LuCI.network.Protocol.html#getIPAddr">getIPAddr
</a></li>
2165 <li data-name=
"LuCI.network.Protocol#getIPAddrs"><a href=
"LuCI.network.Protocol.html#getIPAddrs">getIPAddrs
</a></li>
2167 <li data-name=
"LuCI.network.Protocol#getL2Device"><a href=
"LuCI.network.Protocol.html#getL2Device">getL2Device
</a></li>
2169 <li data-name=
"LuCI.network.Protocol#getL3Device"><a href=
"LuCI.network.Protocol.html#getL3Device">getL3Device
</a></li>
2171 <li data-name=
"LuCI.network.Protocol#getMetric"><a href=
"LuCI.network.Protocol.html#getMetric">getMetric
</a></li>
2173 <li data-name=
"LuCI.network.Protocol#getName"><a href=
"LuCI.network.Protocol.html#getName">getName
</a></li>
2175 <li data-name=
"LuCI.network.Protocol#getNetmask"><a href=
"LuCI.network.Protocol.html#getNetmask">getNetmask
</a></li>
2177 <li data-name=
"LuCI.network.Protocol#getOpkgPackage"><a href=
"LuCI.network.Protocol.html#getOpkgPackage">getOpkgPackage
</a></li>
2179 <li data-name=
"LuCI.network.Protocol#getProtocol"><a href=
"LuCI.network.Protocol.html#getProtocol">getProtocol
</a></li>
2181 <li data-name=
"LuCI.network.Protocol#getType"><a href=
"LuCI.network.Protocol.html#getType">getType
</a></li>
2183 <li data-name=
"LuCI.network.Protocol#getUptime"><a href=
"LuCI.network.Protocol.html#getUptime">getUptime
</a></li>
2185 <li data-name=
"LuCI.network.Protocol#getZoneName"><a href=
"LuCI.network.Protocol.html#getZoneName">getZoneName
</a></li>
2187 <li data-name=
"LuCI.network.Protocol#isAlias"><a href=
"LuCI.network.Protocol.html#isAlias">isAlias
</a></li>
2189 <li data-name=
"LuCI.network.Protocol#isBridge"><a href=
"LuCI.network.Protocol.html#isBridge">isBridge
</a></li>
2191 <li data-name=
"LuCI.network.Protocol#isCreateable"><a href=
"LuCI.network.Protocol.html#isCreateable">isCreateable
</a></li>
2193 <li data-name=
"LuCI.network.Protocol#isDynamic"><a href=
"LuCI.network.Protocol.html#isDynamic">isDynamic
</a></li>
2195 <li data-name=
"LuCI.network.Protocol#isEmpty"><a href=
"LuCI.network.Protocol.html#isEmpty">isEmpty
</a></li>
2197 <li data-name=
"LuCI.network.Protocol#isFloating"><a href=
"LuCI.network.Protocol.html#isFloating">isFloating
</a></li>
2199 <li data-name=
"LuCI.network.Protocol#isInstalled"><a href=
"LuCI.network.Protocol.html#isInstalled">isInstalled
</a></li>
2201 <li data-name=
"LuCI.network.Protocol#isUp"><a href=
"LuCI.network.Protocol.html#isUp">isUp
</a></li>
2203 <li data-name=
"LuCI.network.Protocol#isVirtual"><a href=
"LuCI.network.Protocol.html#isVirtual">isVirtual
</a></li>
2205 <li data-name=
"LuCI.network.Protocol#set"><a href=
"LuCI.network.Protocol.html#set">set
</a></li>
2208 <ul class=
"events itemMembers">
2213 <li class=
"item" data-name=
"LuCI.network.WifiDevice">
2214 <span class=
"title">
2215 <a href=
"LuCI.network.WifiDevice.html">LuCI.network.WifiDevice
</a>
2218 <ul class=
"members itemMembers">
2221 <ul class=
"typedefs itemMembers">
2224 <ul class=
"typedefs itemMembers">
2227 <ul class=
"methods itemMembers">
2229 <span class=
"subtitle">Methods
</span>
2231 <li data-name=
"LuCI.network.WifiDevice#addWifiNetwork"><a href=
"LuCI.network.WifiDevice.html#addWifiNetwork">addWifiNetwork
</a></li>
2233 <li data-name=
"LuCI.network.WifiDevice#deleteWifiNetwork"><a href=
"LuCI.network.WifiDevice.html#deleteWifiNetwork">deleteWifiNetwork
</a></li>
2235 <li data-name=
"LuCI.network.WifiDevice#get"><a href=
"LuCI.network.WifiDevice.html#get">get
</a></li>
2237 <li data-name=
"LuCI.network.WifiDevice#getHTModes"><a href=
"LuCI.network.WifiDevice.html#getHTModes">getHTModes
</a></li>
2239 <li data-name=
"LuCI.network.WifiDevice#getHWModes"><a href=
"LuCI.network.WifiDevice.html#getHWModes">getHWModes
</a></li>
2241 <li data-name=
"LuCI.network.WifiDevice#getI18n"><a href=
"LuCI.network.WifiDevice.html#getI18n">getI18n
</a></li>
2243 <li data-name=
"LuCI.network.WifiDevice#getName"><a href=
"LuCI.network.WifiDevice.html#getName">getName
</a></li>
2245 <li data-name=
"LuCI.network.WifiDevice#getScanList"><a href=
"LuCI.network.WifiDevice.html#getScanList">getScanList
</a></li>
2247 <li data-name=
"LuCI.network.WifiDevice#getWifiNetwork"><a href=
"LuCI.network.WifiDevice.html#getWifiNetwork">getWifiNetwork
</a></li>
2249 <li data-name=
"LuCI.network.WifiDevice#getWifiNetworks"><a href=
"LuCI.network.WifiDevice.html#getWifiNetworks">getWifiNetworks
</a></li>
2251 <li data-name=
"LuCI.network.WifiDevice#isDisabled"><a href=
"LuCI.network.WifiDevice.html#isDisabled">isDisabled
</a></li>
2253 <li data-name=
"LuCI.network.WifiDevice#isUp"><a href=
"LuCI.network.WifiDevice.html#isUp">isUp
</a></li>
2255 <li data-name=
"LuCI.network.WifiDevice#set"><a href=
"LuCI.network.WifiDevice.html#set">set
</a></li>
2258 <ul class=
"events itemMembers">
2263 <li class=
"item" data-name=
"LuCI.network.WifiNetwork">
2264 <span class=
"title">
2265 <a href=
"LuCI.network.WifiNetwork.html">LuCI.network.WifiNetwork
</a>
2268 <ul class=
"members itemMembers">
2271 <ul class=
"typedefs itemMembers">
2274 <ul class=
"typedefs itemMembers">
2277 <ul class=
"methods itemMembers">
2279 <span class=
"subtitle">Methods
</span>
2281 <li data-name=
"LuCI.network.WifiNetwork#disconnectClient"><a href=
"LuCI.network.WifiNetwork.html#disconnectClient">disconnectClient
</a></li>
2283 <li data-name=
"LuCI.network.WifiNetwork#get"><a href=
"LuCI.network.WifiNetwork.html#get">get
</a></li>
2285 <li data-name=
"LuCI.network.WifiNetwork#getActiveBSSID"><a href=
"LuCI.network.WifiNetwork.html#getActiveBSSID">getActiveBSSID
</a></li>
2287 <li data-name=
"LuCI.network.WifiNetwork#getActiveEncryption"><a href=
"LuCI.network.WifiNetwork.html#getActiveEncryption">getActiveEncryption
</a></li>
2289 <li data-name=
"LuCI.network.WifiNetwork#getActiveMode"><a href=
"LuCI.network.WifiNetwork.html#getActiveMode">getActiveMode
</a></li>
2291 <li data-name=
"LuCI.network.WifiNetwork#getActiveModeI18n"><a href=
"LuCI.network.WifiNetwork.html#getActiveModeI18n">getActiveModeI18n
</a></li>
2293 <li data-name=
"LuCI.network.WifiNetwork#getActiveSSID"><a href=
"LuCI.network.WifiNetwork.html#getActiveSSID">getActiveSSID
</a></li>
2295 <li data-name=
"LuCI.network.WifiNetwork#getAssocList"><a href=
"LuCI.network.WifiNetwork.html#getAssocList">getAssocList
</a></li>
2297 <li data-name=
"LuCI.network.WifiNetwork#getBitRate"><a href=
"LuCI.network.WifiNetwork.html#getBitRate">getBitRate
</a></li>
2299 <li data-name=
"LuCI.network.WifiNetwork#getBSSID"><a href=
"LuCI.network.WifiNetwork.html#getBSSID">getBSSID
</a></li>
2301 <li data-name=
"LuCI.network.WifiNetwork#getChannel"><a href=
"LuCI.network.WifiNetwork.html#getChannel">getChannel
</a></li>
2303 <li data-name=
"LuCI.network.WifiNetwork#getCountryCode"><a href=
"LuCI.network.WifiNetwork.html#getCountryCode">getCountryCode
</a></li>
2305 <li data-name=
"LuCI.network.WifiNetwork#getDevice"><a href=
"LuCI.network.WifiNetwork.html#getDevice">getDevice
</a></li>
2307 <li data-name=
"LuCI.network.WifiNetwork#getFrequency"><a href=
"LuCI.network.WifiNetwork.html#getFrequency">getFrequency
</a></li>
2309 <li data-name=
"LuCI.network.WifiNetwork#getI18n"><a href=
"LuCI.network.WifiNetwork.html#getI18n">getI18n
</a></li>
2311 <li data-name=
"LuCI.network.WifiNetwork#getID"><a href=
"LuCI.network.WifiNetwork.html#getID">getID
</a></li>
2313 <li data-name=
"LuCI.network.WifiNetwork#getIfname"><a href=
"LuCI.network.WifiNetwork.html#getIfname">getIfname
</a></li>
2315 <li data-name=
"LuCI.network.WifiNetwork#getMeshID"><a href=
"LuCI.network.WifiNetwork.html#getMeshID">getMeshID
</a></li>
2317 <li data-name=
"LuCI.network.WifiNetwork#getMode"><a href=
"LuCI.network.WifiNetwork.html#getMode">getMode
</a></li>
2319 <li data-name=
"LuCI.network.WifiNetwork#getName"><a href=
"LuCI.network.WifiNetwork.html#getName">getName
</a></li>
2321 <li data-name=
"LuCI.network.WifiNetwork#getNetwork"><a href=
"LuCI.network.WifiNetwork.html#getNetwork">getNetwork
</a></li>
2323 <li data-name=
"LuCI.network.WifiNetwork#getNetworkNames"><a href=
"LuCI.network.WifiNetwork.html#getNetworkNames">getNetworkNames
</a></li>
2325 <li data-name=
"LuCI.network.WifiNetwork#getNetworks"><a href=
"LuCI.network.WifiNetwork.html#getNetworks">getNetworks
</a></li>
2327 <li data-name=
"LuCI.network.WifiNetwork#getNoise"><a href=
"LuCI.network.WifiNetwork.html#getNoise">getNoise
</a></li>
2329 <li data-name=
"LuCI.network.WifiNetwork#getShortName"><a href=
"LuCI.network.WifiNetwork.html#getShortName">getShortName
</a></li>
2331 <li data-name=
"LuCI.network.WifiNetwork#getSignal"><a href=
"LuCI.network.WifiNetwork.html#getSignal">getSignal
</a></li>
2333 <li data-name=
"LuCI.network.WifiNetwork#getSignalLevel"><a href=
"LuCI.network.WifiNetwork.html#getSignalLevel">getSignalLevel
</a></li>
2335 <li data-name=
"LuCI.network.WifiNetwork#getSignalPercent"><a href=
"LuCI.network.WifiNetwork.html#getSignalPercent">getSignalPercent
</a></li>
2337 <li data-name=
"LuCI.network.WifiNetwork#getSSID"><a href=
"LuCI.network.WifiNetwork.html#getSSID">getSSID
</a></li>
2339 <li data-name=
"LuCI.network.WifiNetwork#getTXPower"><a href=
"LuCI.network.WifiNetwork.html#getTXPower">getTXPower
</a></li>
2341 <li data-name=
"LuCI.network.WifiNetwork#getTXPowerOffset"><a href=
"LuCI.network.WifiNetwork.html#getTXPowerOffset">getTXPowerOffset
</a></li>
2343 <li data-name=
"LuCI.network.WifiNetwork#getWifiDevice"><a href=
"LuCI.network.WifiNetwork.html#getWifiDevice">getWifiDevice
</a></li>
2345 <li data-name=
"LuCI.network.WifiNetwork#getWifiDeviceName"><a href=
"LuCI.network.WifiNetwork.html#getWifiDeviceName">getWifiDeviceName
</a></li>
2347 <li data-name=
"LuCI.network.WifiNetwork#isClientDisconnectSupported"><a href=
"LuCI.network.WifiNetwork.html#isClientDisconnectSupported">isClientDisconnectSupported
</a></li>
2349 <li data-name=
"LuCI.network.WifiNetwork#isDisabled"><a href=
"LuCI.network.WifiNetwork.html#isDisabled">isDisabled
</a></li>
2351 <li data-name=
"LuCI.network.WifiNetwork#isUp"><a href=
"LuCI.network.WifiNetwork.html#isUp">isUp
</a></li>
2353 <li data-name=
"LuCI.network.WifiNetwork#set"><a href=
"LuCI.network.WifiNetwork.html#set">set
</a></li>
2356 <ul class=
"events itemMembers">
2361 <li class=
"item" data-name=
"LuCI.poll">
2362 <span class=
"title">
2363 <a href=
"LuCI.poll.html">LuCI.poll
</a>
2366 <ul class=
"members itemMembers">
2369 <ul class=
"typedefs itemMembers">
2372 <ul class=
"typedefs itemMembers">
2375 <ul class=
"methods itemMembers">
2377 <span class=
"subtitle">Methods
</span>
2379 <li data-name=
"LuCI.poll#active"><a href=
"LuCI.poll.html#active">active
</a></li>
2381 <li data-name=
"LuCI.poll#add"><a href=
"LuCI.poll.html#add">add
</a></li>
2383 <li data-name=
"LuCI.poll#remove"><a href=
"LuCI.poll.html#remove">remove
</a></li>
2385 <li data-name=
"LuCI.poll#start"><a href=
"LuCI.poll.html#start">start
</a></li>
2387 <li data-name=
"LuCI.poll#stop"><a href=
"LuCI.poll.html#stop">stop
</a></li>
2390 <ul class=
"events itemMembers">
2395 <li class=
"item" data-name=
"LuCI.request">
2396 <span class=
"title">
2397 <a href=
"LuCI.request.html">LuCI.request
</a>
2400 <ul class=
"members itemMembers">
2403 <ul class=
"typedefs itemMembers">
2405 <span class=
"subtitle">Typedefs
</span>
2407 <li data-name=
"LuCI.request.interceptorFn"><a href=
"LuCI.request.html#.interceptorFn">interceptorFn
</a></li>
2409 <li data-name=
"LuCI.request.RequestOptions"><a href=
"LuCI.request.html#.RequestOptions">RequestOptions
</a></li>
2412 <ul class=
"typedefs itemMembers">
2415 <ul class=
"methods itemMembers">
2417 <span class=
"subtitle">Methods
</span>
2419 <li data-name=
"LuCI.request#addInterceptor"><a href=
"LuCI.request.html#addInterceptor">addInterceptor
</a></li>
2421 <li data-name=
"LuCI.request#expandURL"><a href=
"LuCI.request.html#expandURL">expandURL
</a></li>
2423 <li data-name=
"LuCI.request#get"><a href=
"LuCI.request.html#get">get
</a></li>
2425 <li data-name=
"LuCI.request#post"><a href=
"LuCI.request.html#post">post
</a></li>
2427 <li data-name=
"LuCI.request#removeInterceptor"><a href=
"LuCI.request.html#removeInterceptor">removeInterceptor
</a></li>
2429 <li data-name=
"LuCI.request#request"><a href=
"LuCI.request.html#request">request
</a></li>
2432 <ul class=
"events itemMembers">
2437 <li class=
"item" data-name=
"LuCI.request.poll">
2438 <span class=
"title">
2439 <a href=
"LuCI.request.poll.html">LuCI.request.poll
</a>
2442 <ul class=
"members itemMembers">
2445 <ul class=
"typedefs itemMembers">
2447 <span class=
"subtitle">Typedefs
</span>
2449 <li data-name=
"LuCI.request.poll~callbackFn"><a href=
"LuCI.request.poll.html#~callbackFn">callbackFn
</a></li>
2452 <ul class=
"typedefs itemMembers">
2455 <ul class=
"methods itemMembers">
2457 <span class=
"subtitle">Methods
</span>
2459 <li data-name=
"LuCI.request.poll#active"><a href=
"LuCI.request.poll.html#active">active
</a></li>
2461 <li data-name=
"LuCI.request.poll#add"><a href=
"LuCI.request.poll.html#add">add
</a></li>
2463 <li data-name=
"LuCI.request.poll#remove"><a href=
"LuCI.request.poll.html#remove">remove
</a></li>
2465 <li data-name=
"LuCI.request.poll#start"><a href=
"LuCI.request.poll.html#start">start
</a></li>
2467 <li data-name=
"LuCI.request.poll#stop"><a href=
"LuCI.request.poll.html#stop">stop
</a></li>
2470 <ul class=
"events itemMembers">
2475 <li class=
"item" data-name=
"LuCI.response">
2476 <span class=
"title">
2477 <a href=
"LuCI.response.html">LuCI.response
</a>
2480 <ul class=
"members itemMembers">
2482 <span class=
"subtitle">Members
</span>
2484 <li data-name=
"LuCI.response#duration"><a href=
"LuCI.response.html#duration">duration
</a></li>
2486 <li data-name=
"LuCI.response#headers"><a href=
"LuCI.response.html#headers">headers
</a></li>
2488 <li data-name=
"LuCI.response#ok"><a href=
"LuCI.response.html#ok">ok
</a></li>
2490 <li data-name=
"LuCI.response#status"><a href=
"LuCI.response.html#status">status
</a></li>
2492 <li data-name=
"LuCI.response#statusText"><a href=
"LuCI.response.html#statusText">statusText
</a></li>
2494 <li data-name=
"LuCI.response#url"><a href=
"LuCI.response.html#url">url
</a></li>
2497 <ul class=
"typedefs itemMembers">
2500 <ul class=
"typedefs itemMembers">
2503 <ul class=
"methods itemMembers">
2505 <span class=
"subtitle">Methods
</span>
2507 <li data-name=
"LuCI.response#blob"><a href=
"LuCI.response.html#blob">blob
</a></li>
2509 <li data-name=
"LuCI.response#clone"><a href=
"LuCI.response.html#clone">clone
</a></li>
2511 <li data-name=
"LuCI.response#json"><a href=
"LuCI.response.html#json">json
</a></li>
2513 <li data-name=
"LuCI.response#text"><a href=
"LuCI.response.html#text">text
</a></li>
2516 <ul class=
"events itemMembers">
2521 <li class=
"item" data-name=
"LuCI.rpc">
2522 <span class=
"title">
2523 <a href=
"LuCI.rpc.html">LuCI.rpc
</a>
2526 <ul class=
"members itemMembers">
2529 <ul class=
"typedefs itemMembers">
2531 <span class=
"subtitle">Typedefs
</span>
2533 <li data-name=
"LuCI.rpc.DeclareOptions"><a href=
"LuCI.rpc.html#.DeclareOptions">DeclareOptions
</a></li>
2535 <li data-name=
"LuCI.rpc~filterFn"><a href=
"LuCI.rpc.html#~filterFn">filterFn
</a></li>
2537 <li data-name=
"LuCI.rpc~interceptorFn"><a href=
"LuCI.rpc.html#~interceptorFn">interceptorFn
</a></li>
2539 <li data-name=
"LuCI.rpc~invokeFn"><a href=
"LuCI.rpc.html#~invokeFn">invokeFn
</a></li>
2542 <ul class=
"typedefs itemMembers">
2545 <ul class=
"methods itemMembers">
2547 <span class=
"subtitle">Methods
</span>
2549 <li data-name=
"LuCI.rpc#addInterceptor"><a href=
"LuCI.rpc.html#addInterceptor">addInterceptor
</a></li>
2551 <li data-name=
"LuCI.rpc#declare"><a href=
"LuCI.rpc.html#declare">declare
</a></li>
2553 <li data-name=
"LuCI.rpc#getBaseURL"><a href=
"LuCI.rpc.html#getBaseURL">getBaseURL
</a></li>
2555 <li data-name=
"LuCI.rpc#getSessionID"><a href=
"LuCI.rpc.html#getSessionID">getSessionID
</a></li>
2557 <li data-name=
"LuCI.rpc#getStatusText"><a href=
"LuCI.rpc.html#getStatusText">getStatusText
</a></li>
2559 <li data-name=
"LuCI.rpc#list"><a href=
"LuCI.rpc.html#list">list
</a></li>
2561 <li data-name=
"LuCI.rpc#removeInterceptor"><a href=
"LuCI.rpc.html#removeInterceptor">removeInterceptor
</a></li>
2563 <li data-name=
"LuCI.rpc#setBaseURL"><a href=
"LuCI.rpc.html#setBaseURL">setBaseURL
</a></li>
2565 <li data-name=
"LuCI.rpc#setSessionID"><a href=
"LuCI.rpc.html#setSessionID">setSessionID
</a></li>
2568 <ul class=
"events itemMembers">
2573 <li class=
"item" data-name=
"LuCI.session">
2574 <span class=
"title">
2575 <a href=
"LuCI.session.html">LuCI.session
</a>
2578 <ul class=
"members itemMembers">
2581 <ul class=
"typedefs itemMembers">
2584 <ul class=
"typedefs itemMembers">
2587 <ul class=
"methods itemMembers">
2589 <span class=
"subtitle">Methods
</span>
2591 <li data-name=
"LuCI.session#getID"><a href=
"LuCI.session.html#getID">getID
</a></li>
2593 <li data-name=
"LuCI.session#getLocalData"><a href=
"LuCI.session.html#getLocalData">getLocalData
</a></li>
2595 <li data-name=
"LuCI.session#getToken"><a href=
"LuCI.session.html#getToken">getToken
</a></li>
2597 <li data-name=
"LuCI.session#setLocalData"><a href=
"LuCI.session.html#setLocalData">setLocalData
</a></li>
2600 <ul class=
"events itemMembers">
2605 <li class=
"item" data-name=
"LuCI.uci">
2606 <span class=
"title">
2607 <a href=
"LuCI.uci.html">LuCI.uci
</a>
2610 <ul class=
"members itemMembers">
2613 <ul class=
"typedefs itemMembers">
2615 <span class=
"subtitle">Typedefs
</span>
2617 <li data-name=
"LuCI.uci.ChangeRecord"><a href=
"LuCI.uci.html#.ChangeRecord">ChangeRecord
</a></li>
2619 <li data-name=
"LuCI.uci.SectionObject"><a href=
"LuCI.uci.html#.SectionObject">SectionObject
</a></li>
2621 <li data-name=
"LuCI.uci~sectionsFn"><a href=
"LuCI.uci.html#~sectionsFn">sectionsFn
</a></li>
2624 <ul class=
"typedefs itemMembers">
2627 <ul class=
"methods itemMembers">
2629 <span class=
"subtitle">Methods
</span>
2631 <li data-name=
"LuCI.uci#add"><a href=
"LuCI.uci.html#add">add
</a></li>
2633 <li data-name=
"LuCI.uci#apply"><a href=
"LuCI.uci.html#apply">apply
</a></li>
2635 <li data-name=
"LuCI.uci#changes"><a href=
"LuCI.uci.html#changes">changes
</a></li>
2637 <li data-name=
"LuCI.uci#createSID"><a href=
"LuCI.uci.html#createSID">createSID
</a></li>
2639 <li data-name=
"LuCI.uci#get"><a href=
"LuCI.uci.html#get">get
</a></li>
2641 <li data-name=
"LuCI.uci#get_first"><a href=
"LuCI.uci.html#get_first">get_first
</a></li>
2643 <li data-name=
"LuCI.uci#load"><a href=
"LuCI.uci.html#load">load
</a></li>
2645 <li data-name=
"LuCI.uci#move"><a href=
"LuCI.uci.html#move">move
</a></li>
2647 <li data-name=
"LuCI.uci#remove"><a href=
"LuCI.uci.html#remove">remove
</a></li>
2649 <li data-name=
"LuCI.uci#resolveSID"><a href=
"LuCI.uci.html#resolveSID">resolveSID
</a></li>
2651 <li data-name=
"LuCI.uci#save"><a href=
"LuCI.uci.html#save">save
</a></li>
2653 <li data-name=
"LuCI.uci#sections"><a href=
"LuCI.uci.html#sections">sections
</a></li>
2655 <li data-name=
"LuCI.uci#set"><a href=
"LuCI.uci.html#set">set
</a></li>
2657 <li data-name=
"LuCI.uci#set_first"><a href=
"LuCI.uci.html#set_first">set_first
</a></li>
2659 <li data-name=
"LuCI.uci#unload"><a href=
"LuCI.uci.html#unload">unload
</a></li>
2661 <li data-name=
"LuCI.uci#unset"><a href=
"LuCI.uci.html#unset">unset
</a></li>
2663 <li data-name=
"LuCI.uci#unset_first"><a href=
"LuCI.uci.html#unset_first">unset_first
</a></li>
2666 <ul class=
"events itemMembers">
2671 <li class=
"item" data-name=
"LuCI.ui">
2672 <span class=
"title">
2673 <a href=
"LuCI.ui.html">LuCI.ui
</a>
2676 <ul class=
"members itemMembers">
2679 <ul class=
"typedefs itemMembers">
2681 <span class=
"subtitle">Typedefs
</span>
2683 <li data-name=
"LuCI.ui.FileUploadReply"><a href=
"LuCI.ui.html#.FileUploadReply">FileUploadReply
</a></li>
2686 <ul class=
"typedefs itemMembers">
2689 <ul class=
"methods itemMembers">
2691 <span class=
"subtitle">Methods
</span>
2693 <li data-name=
"LuCI.ui#addNotification"><a href=
"LuCI.ui.html#addNotification">addNotification
</a></li>
2695 <li data-name=
"LuCI.ui#addValidator"><a href=
"LuCI.ui.html#addValidator">addValidator
</a></li>
2697 <li data-name=
"LuCI.ui#awaitReconnect"><a href=
"LuCI.ui.html#awaitReconnect">awaitReconnect
</a></li>
2699 <li data-name=
"LuCI.ui#createHandlerFn"><a href=
"LuCI.ui.html#createHandlerFn">createHandlerFn
</a></li>
2701 <li data-name=
"LuCI.ui#hideIndicator"><a href=
"LuCI.ui.html#hideIndicator">hideIndicator
</a></li>
2703 <li data-name=
"LuCI.ui#hideModal"><a href=
"LuCI.ui.html#hideModal">hideModal
</a></li>
2705 <li data-name=
"LuCI.ui#instantiateView"><a href=
"LuCI.ui.html#instantiateView">instantiateView
</a></li>
2707 <li data-name=
"LuCI.ui#itemlist"><a href=
"LuCI.ui.html#itemlist">itemlist
</a></li>
2709 <li data-name=
"LuCI.ui#pingDevice"><a href=
"LuCI.ui.html#pingDevice">pingDevice
</a></li>
2711 <li data-name=
"LuCI.ui#showIndicator"><a href=
"LuCI.ui.html#showIndicator">showIndicator
</a></li>
2713 <li data-name=
"LuCI.ui#showModal"><a href=
"LuCI.ui.html#showModal">showModal
</a></li>
2715 <li data-name=
"LuCI.ui#uploadFile"><a href=
"LuCI.ui.html#uploadFile">uploadFile
</a></li>
2718 <ul class=
"events itemMembers">
2723 <li class=
"item" data-name=
"LuCI.ui.AbstractElement">
2724 <span class=
"title">
2725 <a href=
"LuCI.ui.AbstractElement.html">LuCI.ui.AbstractElement
</a>
2728 <ul class=
"members itemMembers">
2731 <ul class=
"typedefs itemMembers">
2733 <span class=
"subtitle">Typedefs
</span>
2735 <li data-name=
"LuCI.ui.AbstractElement.InitOptions"><a href=
"LuCI.ui.AbstractElement.html#.InitOptions">InitOptions
</a></li>
2738 <ul class=
"typedefs itemMembers">
2741 <ul class=
"methods itemMembers">
2743 <span class=
"subtitle">Methods
</span>
2745 <li data-name=
"LuCI.ui.AbstractElement#getValue"><a href=
"LuCI.ui.AbstractElement.html#getValue">getValue
</a></li>
2747 <li data-name=
"LuCI.ui.AbstractElement#isChanged"><a href=
"LuCI.ui.AbstractElement.html#isChanged">isChanged
</a></li>
2749 <li data-name=
"LuCI.ui.AbstractElement#isValid"><a href=
"LuCI.ui.AbstractElement.html#isValid">isValid
</a></li>
2751 <li data-name=
"LuCI.ui.AbstractElement#registerEvents"><a href=
"LuCI.ui.AbstractElement.html#registerEvents">registerEvents
</a></li>
2753 <li data-name=
"LuCI.ui.AbstractElement#render"><a href=
"LuCI.ui.AbstractElement.html#render">render
</a></li>
2755 <li data-name=
"LuCI.ui.AbstractElement#setChangeEvents"><a href=
"LuCI.ui.AbstractElement.html#setChangeEvents">setChangeEvents
</a></li>
2757 <li data-name=
"LuCI.ui.AbstractElement#setPlaceholder"><a href=
"LuCI.ui.AbstractElement.html#setPlaceholder">setPlaceholder
</a></li>
2759 <li data-name=
"LuCI.ui.AbstractElement#setUpdateEvents"><a href=
"LuCI.ui.AbstractElement.html#setUpdateEvents">setUpdateEvents
</a></li>
2761 <li data-name=
"LuCI.ui.AbstractElement#setValue"><a href=
"LuCI.ui.AbstractElement.html#setValue">setValue
</a></li>
2763 <li data-name=
"LuCI.ui.AbstractElement#triggerValidation"><a href=
"LuCI.ui.AbstractElement.html#triggerValidation">triggerValidation
</a></li>
2766 <ul class=
"events itemMembers">
2771 <li class=
"item" data-name=
"LuCI.ui.changes">
2772 <span class=
"title">
2773 <a href=
"LuCI.ui.changes.html">LuCI.ui.changes
</a>
2776 <ul class=
"members itemMembers">
2779 <ul class=
"typedefs itemMembers">
2782 <ul class=
"typedefs itemMembers">
2785 <ul class=
"methods itemMembers">
2787 <span class=
"subtitle">Methods
</span>
2789 <li data-name=
"LuCI.ui.changes#apply"><a href=
"LuCI.ui.changes.html#apply">apply
</a></li>
2791 <li data-name=
"LuCI.ui.changes#displayChanges"><a href=
"LuCI.ui.changes.html#displayChanges">displayChanges
</a></li>
2793 <li data-name=
"LuCI.ui.changes#renderChangeIndicator"><a href=
"LuCI.ui.changes.html#renderChangeIndicator">renderChangeIndicator
</a></li>
2795 <li data-name=
"LuCI.ui.changes#revert"><a href=
"LuCI.ui.changes.html#revert">revert
</a></li>
2797 <li data-name=
"LuCI.ui.changes#setIndicator"><a href=
"LuCI.ui.changes.html#setIndicator">setIndicator
</a></li>
2800 <ul class=
"events itemMembers">
2805 <li class=
"item" data-name=
"LuCI.ui.Checkbox">
2806 <span class=
"title">
2807 <a href=
"LuCI.ui.Checkbox.html">LuCI.ui.Checkbox
</a>
2810 <ul class=
"members itemMembers">
2813 <ul class=
"typedefs itemMembers">
2815 <span class=
"subtitle">Typedefs
</span>
2817 <li data-name=
"LuCI.ui.Checkbox.InitOptions"><a href=
"LuCI.ui.Checkbox.html#.InitOptions">InitOptions
</a></li>
2820 <ul class=
"typedefs itemMembers">
2823 <ul class=
"methods itemMembers">
2825 <span class=
"subtitle">Methods
</span>
2827 <li data-name=
"LuCI.ui.Checkbox#getValue"><a href=
"LuCI.ui.Checkbox.html#getValue">getValue
</a></li>
2829 <li data-name=
"LuCI.ui.Checkbox#isChanged"><a href=
"LuCI.ui.Checkbox.html#isChanged">isChanged
</a></li>
2831 <li data-name=
"LuCI.ui.Checkbox#isChecked"><a href=
"LuCI.ui.Checkbox.html#isChecked">isChecked
</a></li>
2833 <li data-name=
"LuCI.ui.Checkbox#isValid"><a href=
"LuCI.ui.Checkbox.html#isValid">isValid
</a></li>
2835 <li data-name=
"LuCI.ui.Checkbox#registerEvents"><a href=
"LuCI.ui.Checkbox.html#registerEvents">registerEvents
</a></li>
2837 <li data-name=
"LuCI.ui.Checkbox#render"><a href=
"LuCI.ui.Checkbox.html#render">render
</a></li>
2839 <li data-name=
"LuCI.ui.Checkbox#setChangeEvents"><a href=
"LuCI.ui.Checkbox.html#setChangeEvents">setChangeEvents
</a></li>
2841 <li data-name=
"LuCI.ui.Checkbox#setPlaceholder"><a href=
"LuCI.ui.Checkbox.html#setPlaceholder">setPlaceholder
</a></li>
2843 <li data-name=
"LuCI.ui.Checkbox#setUpdateEvents"><a href=
"LuCI.ui.Checkbox.html#setUpdateEvents">setUpdateEvents
</a></li>
2845 <li data-name=
"LuCI.ui.Checkbox#setValue"><a href=
"LuCI.ui.Checkbox.html#setValue">setValue
</a></li>
2847 <li data-name=
"LuCI.ui.Checkbox#triggerValidation"><a href=
"LuCI.ui.Checkbox.html#triggerValidation">triggerValidation
</a></li>
2850 <ul class=
"events itemMembers">
2855 <li class=
"item" data-name=
"LuCI.ui.Combobox">
2856 <span class=
"title">
2857 <a href=
"LuCI.ui.Combobox.html">LuCI.ui.Combobox
</a>
2860 <ul class=
"members itemMembers">
2863 <ul class=
"typedefs itemMembers">
2865 <span class=
"subtitle">Typedefs
</span>
2867 <li data-name=
"LuCI.ui.Combobox.InitOptions"><a href=
"LuCI.ui.Combobox.html#.InitOptions">InitOptions
</a></li>
2870 <ul class=
"typedefs itemMembers">
2873 <ul class=
"methods itemMembers">
2875 <span class=
"subtitle">Methods
</span>
2877 <li data-name=
"LuCI.ui.Combobox#addChoices"><a href=
"LuCI.ui.Combobox.html#addChoices">addChoices
</a></li>
2879 <li data-name=
"LuCI.ui.Combobox#clearChoices"><a href=
"LuCI.ui.Combobox.html#clearChoices">clearChoices
</a></li>
2881 <li data-name=
"LuCI.ui.Combobox#closeAllDropdowns"><a href=
"LuCI.ui.Combobox.html#closeAllDropdowns">closeAllDropdowns
</a></li>
2883 <li data-name=
"LuCI.ui.Combobox#isChanged"><a href=
"LuCI.ui.Combobox.html#isChanged">isChanged
</a></li>
2885 <li data-name=
"LuCI.ui.Combobox#isValid"><a href=
"LuCI.ui.Combobox.html#isValid">isValid
</a></li>
2887 <li data-name=
"LuCI.ui.Combobox#registerEvents"><a href=
"LuCI.ui.Combobox.html#registerEvents">registerEvents
</a></li>
2889 <li data-name=
"LuCI.ui.Combobox#setChangeEvents"><a href=
"LuCI.ui.Combobox.html#setChangeEvents">setChangeEvents
</a></li>
2891 <li data-name=
"LuCI.ui.Combobox#setPlaceholder"><a href=
"LuCI.ui.Combobox.html#setPlaceholder">setPlaceholder
</a></li>
2893 <li data-name=
"LuCI.ui.Combobox#setUpdateEvents"><a href=
"LuCI.ui.Combobox.html#setUpdateEvents">setUpdateEvents
</a></li>
2895 <li data-name=
"LuCI.ui.Combobox#triggerValidation"><a href=
"LuCI.ui.Combobox.html#triggerValidation">triggerValidation
</a></li>
2898 <ul class=
"events itemMembers">
2903 <li class=
"item" data-name=
"LuCI.ui.ComboButton">
2904 <span class=
"title">
2905 <a href=
"LuCI.ui.ComboButton.html">LuCI.ui.ComboButton
</a>
2908 <ul class=
"members itemMembers">
2911 <ul class=
"typedefs itemMembers">
2913 <span class=
"subtitle">Typedefs
</span>
2915 <li data-name=
"LuCI.ui.ComboButton.InitOptions"><a href=
"LuCI.ui.ComboButton.html#.InitOptions">InitOptions
</a></li>
2918 <ul class=
"typedefs itemMembers">
2921 <ul class=
"methods itemMembers">
2923 <span class=
"subtitle">Methods
</span>
2925 <li data-name=
"LuCI.ui.ComboButton#addChoices"><a href=
"LuCI.ui.ComboButton.html#addChoices">addChoices
</a></li>
2927 <li data-name=
"LuCI.ui.ComboButton#clearChoices"><a href=
"LuCI.ui.ComboButton.html#clearChoices">clearChoices
</a></li>
2929 <li data-name=
"LuCI.ui.ComboButton#closeAllDropdowns"><a href=
"LuCI.ui.ComboButton.html#closeAllDropdowns">closeAllDropdowns
</a></li>
2931 <li data-name=
"LuCI.ui.ComboButton#isChanged"><a href=
"LuCI.ui.ComboButton.html#isChanged">isChanged
</a></li>
2933 <li data-name=
"LuCI.ui.ComboButton#isValid"><a href=
"LuCI.ui.ComboButton.html#isValid">isValid
</a></li>
2935 <li data-name=
"LuCI.ui.ComboButton#registerEvents"><a href=
"LuCI.ui.ComboButton.html#registerEvents">registerEvents
</a></li>
2937 <li data-name=
"LuCI.ui.ComboButton#setChangeEvents"><a href=
"LuCI.ui.ComboButton.html#setChangeEvents">setChangeEvents
</a></li>
2939 <li data-name=
"LuCI.ui.ComboButton#setPlaceholder"><a href=
"LuCI.ui.ComboButton.html#setPlaceholder">setPlaceholder
</a></li>
2941 <li data-name=
"LuCI.ui.ComboButton#setUpdateEvents"><a href=
"LuCI.ui.ComboButton.html#setUpdateEvents">setUpdateEvents
</a></li>
2943 <li data-name=
"LuCI.ui.ComboButton#triggerValidation"><a href=
"LuCI.ui.ComboButton.html#triggerValidation">triggerValidation
</a></li>
2946 <ul class=
"events itemMembers">
2951 <li class=
"item" data-name=
"LuCI.ui.Dropdown">
2952 <span class=
"title">
2953 <a href=
"LuCI.ui.Dropdown.html">LuCI.ui.Dropdown
</a>
2956 <ul class=
"members itemMembers">
2959 <ul class=
"typedefs itemMembers">
2961 <span class=
"subtitle">Typedefs
</span>
2963 <li data-name=
"LuCI.ui.Dropdown.InitOptions"><a href=
"LuCI.ui.Dropdown.html#.InitOptions">InitOptions
</a></li>
2966 <ul class=
"typedefs itemMembers">
2969 <ul class=
"methods itemMembers">
2971 <span class=
"subtitle">Methods
</span>
2973 <li data-name=
"LuCI.ui.Dropdown#addChoices"><a href=
"LuCI.ui.Dropdown.html#addChoices">addChoices
</a></li>
2975 <li data-name=
"LuCI.ui.Dropdown#clearChoices"><a href=
"LuCI.ui.Dropdown.html#clearChoices">clearChoices
</a></li>
2977 <li data-name=
"LuCI.ui.Dropdown#closeAllDropdowns"><a href=
"LuCI.ui.Dropdown.html#closeAllDropdowns">closeAllDropdowns
</a></li>
2979 <li data-name=
"LuCI.ui.Dropdown#getValue"><a href=
"LuCI.ui.Dropdown.html#getValue">getValue
</a></li>
2981 <li data-name=
"LuCI.ui.Dropdown#isChanged"><a href=
"LuCI.ui.Dropdown.html#isChanged">isChanged
</a></li>
2983 <li data-name=
"LuCI.ui.Dropdown#isValid"><a href=
"LuCI.ui.Dropdown.html#isValid">isValid
</a></li>
2985 <li data-name=
"LuCI.ui.Dropdown#registerEvents"><a href=
"LuCI.ui.Dropdown.html#registerEvents">registerEvents
</a></li>
2987 <li data-name=
"LuCI.ui.Dropdown#render"><a href=
"LuCI.ui.Dropdown.html#render">render
</a></li>
2989 <li data-name=
"LuCI.ui.Dropdown#setChangeEvents"><a href=
"LuCI.ui.Dropdown.html#setChangeEvents">setChangeEvents
</a></li>
2991 <li data-name=
"LuCI.ui.Dropdown#setPlaceholder"><a href=
"LuCI.ui.Dropdown.html#setPlaceholder">setPlaceholder
</a></li>
2993 <li data-name=
"LuCI.ui.Dropdown#setUpdateEvents"><a href=
"LuCI.ui.Dropdown.html#setUpdateEvents">setUpdateEvents
</a></li>
2995 <li data-name=
"LuCI.ui.Dropdown#setValue"><a href=
"LuCI.ui.Dropdown.html#setValue">setValue
</a></li>
2997 <li data-name=
"LuCI.ui.Dropdown#triggerValidation"><a href=
"LuCI.ui.Dropdown.html#triggerValidation">triggerValidation
</a></li>
3000 <ul class=
"events itemMembers">
3005 <li class=
"item" data-name=
"LuCI.ui.DynamicList">
3006 <span class=
"title">
3007 <a href=
"LuCI.ui.DynamicList.html">LuCI.ui.DynamicList
</a>
3010 <ul class=
"members itemMembers">
3013 <ul class=
"typedefs itemMembers">
3015 <span class=
"subtitle">Typedefs
</span>
3017 <li data-name=
"LuCI.ui.DynamicList.InitOptions"><a href=
"LuCI.ui.DynamicList.html#.InitOptions">InitOptions
</a></li>
3020 <ul class=
"typedefs itemMembers">
3023 <ul class=
"methods itemMembers">
3025 <span class=
"subtitle">Methods
</span>
3027 <li data-name=
"LuCI.ui.DynamicList#addChoices"><a href=
"LuCI.ui.DynamicList.html#addChoices">addChoices
</a></li>
3029 <li data-name=
"LuCI.ui.DynamicList#clearChoices"><a href=
"LuCI.ui.DynamicList.html#clearChoices">clearChoices
</a></li>
3031 <li data-name=
"LuCI.ui.DynamicList#getValue"><a href=
"LuCI.ui.DynamicList.html#getValue">getValue
</a></li>
3033 <li data-name=
"LuCI.ui.DynamicList#isChanged"><a href=
"LuCI.ui.DynamicList.html#isChanged">isChanged
</a></li>
3035 <li data-name=
"LuCI.ui.DynamicList#isValid"><a href=
"LuCI.ui.DynamicList.html#isValid">isValid
</a></li>
3037 <li data-name=
"LuCI.ui.DynamicList#registerEvents"><a href=
"LuCI.ui.DynamicList.html#registerEvents">registerEvents
</a></li>
3039 <li data-name=
"LuCI.ui.DynamicList#render"><a href=
"LuCI.ui.DynamicList.html#render">render
</a></li>
3041 <li data-name=
"LuCI.ui.DynamicList#setChangeEvents"><a href=
"LuCI.ui.DynamicList.html#setChangeEvents">setChangeEvents
</a></li>
3043 <li data-name=
"LuCI.ui.DynamicList#setPlaceholder"><a href=
"LuCI.ui.DynamicList.html#setPlaceholder">setPlaceholder
</a></li>
3045 <li data-name=
"LuCI.ui.DynamicList#setUpdateEvents"><a href=
"LuCI.ui.DynamicList.html#setUpdateEvents">setUpdateEvents
</a></li>
3047 <li data-name=
"LuCI.ui.DynamicList#setValue"><a href=
"LuCI.ui.DynamicList.html#setValue">setValue
</a></li>
3049 <li data-name=
"LuCI.ui.DynamicList#triggerValidation"><a href=
"LuCI.ui.DynamicList.html#triggerValidation">triggerValidation
</a></li>
3052 <ul class=
"events itemMembers">
3057 <li class=
"item" data-name=
"LuCI.ui.FileUpload">
3058 <span class=
"title">
3059 <a href=
"LuCI.ui.FileUpload.html">LuCI.ui.FileUpload
</a>
3062 <ul class=
"members itemMembers">
3065 <ul class=
"typedefs itemMembers">
3067 <span class=
"subtitle">Typedefs
</span>
3069 <li data-name=
"LuCI.ui.FileUpload.InitOptions"><a href=
"LuCI.ui.FileUpload.html#.InitOptions">InitOptions
</a></li>
3072 <ul class=
"typedefs itemMembers">
3075 <ul class=
"methods itemMembers">
3077 <span class=
"subtitle">Methods
</span>
3079 <li data-name=
"LuCI.ui.FileUpload#getValue"><a href=
"LuCI.ui.FileUpload.html#getValue">getValue
</a></li>
3081 <li data-name=
"LuCI.ui.FileUpload#isChanged"><a href=
"LuCI.ui.FileUpload.html#isChanged">isChanged
</a></li>
3083 <li data-name=
"LuCI.ui.FileUpload#isValid"><a href=
"LuCI.ui.FileUpload.html#isValid">isValid
</a></li>
3085 <li data-name=
"LuCI.ui.FileUpload#registerEvents"><a href=
"LuCI.ui.FileUpload.html#registerEvents">registerEvents
</a></li>
3087 <li data-name=
"LuCI.ui.FileUpload#render"><a href=
"LuCI.ui.FileUpload.html#render">render
</a></li>
3089 <li data-name=
"LuCI.ui.FileUpload#setChangeEvents"><a href=
"LuCI.ui.FileUpload.html#setChangeEvents">setChangeEvents
</a></li>
3091 <li data-name=
"LuCI.ui.FileUpload#setPlaceholder"><a href=
"LuCI.ui.FileUpload.html#setPlaceholder">setPlaceholder
</a></li>
3093 <li data-name=
"LuCI.ui.FileUpload#setUpdateEvents"><a href=
"LuCI.ui.FileUpload.html#setUpdateEvents">setUpdateEvents
</a></li>
3095 <li data-name=
"LuCI.ui.FileUpload#setValue"><a href=
"LuCI.ui.FileUpload.html#setValue">setValue
</a></li>
3097 <li data-name=
"LuCI.ui.FileUpload#triggerValidation"><a href=
"LuCI.ui.FileUpload.html#triggerValidation">triggerValidation
</a></li>
3100 <ul class=
"events itemMembers">
3105 <li class=
"item" data-name=
"LuCI.ui.Hiddenfield">
3106 <span class=
"title">
3107 <a href=
"LuCI.ui.Hiddenfield.html">LuCI.ui.Hiddenfield
</a>
3110 <ul class=
"members itemMembers">
3113 <ul class=
"typedefs itemMembers">
3116 <ul class=
"typedefs itemMembers">
3119 <ul class=
"methods itemMembers">
3121 <span class=
"subtitle">Methods
</span>
3123 <li data-name=
"LuCI.ui.Hiddenfield#getValue"><a href=
"LuCI.ui.Hiddenfield.html#getValue">getValue
</a></li>
3125 <li data-name=
"LuCI.ui.Hiddenfield#isChanged"><a href=
"LuCI.ui.Hiddenfield.html#isChanged">isChanged
</a></li>
3127 <li data-name=
"LuCI.ui.Hiddenfield#isValid"><a href=
"LuCI.ui.Hiddenfield.html#isValid">isValid
</a></li>
3129 <li data-name=
"LuCI.ui.Hiddenfield#registerEvents"><a href=
"LuCI.ui.Hiddenfield.html#registerEvents">registerEvents
</a></li>
3131 <li data-name=
"LuCI.ui.Hiddenfield#render"><a href=
"LuCI.ui.Hiddenfield.html#render">render
</a></li>
3133 <li data-name=
"LuCI.ui.Hiddenfield#setChangeEvents"><a href=
"LuCI.ui.Hiddenfield.html#setChangeEvents">setChangeEvents
</a></li>
3135 <li data-name=
"LuCI.ui.Hiddenfield#setPlaceholder"><a href=
"LuCI.ui.Hiddenfield.html#setPlaceholder">setPlaceholder
</a></li>
3137 <li data-name=
"LuCI.ui.Hiddenfield#setUpdateEvents"><a href=
"LuCI.ui.Hiddenfield.html#setUpdateEvents">setUpdateEvents
</a></li>
3139 <li data-name=
"LuCI.ui.Hiddenfield#setValue"><a href=
"LuCI.ui.Hiddenfield.html#setValue">setValue
</a></li>
3141 <li data-name=
"LuCI.ui.Hiddenfield#triggerValidation"><a href=
"LuCI.ui.Hiddenfield.html#triggerValidation">triggerValidation
</a></li>
3144 <ul class=
"events itemMembers">
3149 <li class=
"item" data-name=
"LuCI.ui.menu">
3150 <span class=
"title">
3151 <a href=
"LuCI.ui.menu.html">LuCI.ui.menu
</a>
3154 <ul class=
"members itemMembers">
3157 <ul class=
"typedefs itemMembers">
3159 <span class=
"subtitle">Typedefs
</span>
3161 <li data-name=
"LuCI.ui.menu.MenuNode"><a href=
"LuCI.ui.menu.html#.MenuNode">MenuNode
</a></li>
3164 <ul class=
"typedefs itemMembers">
3167 <ul class=
"methods itemMembers">
3169 <span class=
"subtitle">Methods
</span>
3171 <li data-name=
"LuCI.ui.menu#flushCache"><a href=
"LuCI.ui.menu.html#flushCache">flushCache
</a></li>
3173 <li data-name=
"LuCI.ui.menu#getChildren"><a href=
"LuCI.ui.menu.html#getChildren">getChildren
</a></li>
3175 <li data-name=
"LuCI.ui.menu#load"><a href=
"LuCI.ui.menu.html#load">load
</a></li>
3178 <ul class=
"events itemMembers">
3183 <li class=
"item" data-name=
"LuCI.ui.Select">
3184 <span class=
"title">
3185 <a href=
"LuCI.ui.Select.html">LuCI.ui.Select
</a>
3188 <ul class=
"members itemMembers">
3191 <ul class=
"typedefs itemMembers">
3193 <span class=
"subtitle">Typedefs
</span>
3195 <li data-name=
"LuCI.ui.Select.InitOptions"><a href=
"LuCI.ui.Select.html#.InitOptions">InitOptions
</a></li>
3198 <ul class=
"typedefs itemMembers">
3201 <ul class=
"methods itemMembers">
3203 <span class=
"subtitle">Methods
</span>
3205 <li data-name=
"LuCI.ui.Select#getValue"><a href=
"LuCI.ui.Select.html#getValue">getValue
</a></li>
3207 <li data-name=
"LuCI.ui.Select#isChanged"><a href=
"LuCI.ui.Select.html#isChanged">isChanged
</a></li>
3209 <li data-name=
"LuCI.ui.Select#isValid"><a href=
"LuCI.ui.Select.html#isValid">isValid
</a></li>
3211 <li data-name=
"LuCI.ui.Select#registerEvents"><a href=
"LuCI.ui.Select.html#registerEvents">registerEvents
</a></li>
3213 <li data-name=
"LuCI.ui.Select#render"><a href=
"LuCI.ui.Select.html#render">render
</a></li>
3215 <li data-name=
"LuCI.ui.Select#setChangeEvents"><a href=
"LuCI.ui.Select.html#setChangeEvents">setChangeEvents
</a></li>
3217 <li data-name=
"LuCI.ui.Select#setPlaceholder"><a href=
"LuCI.ui.Select.html#setPlaceholder">setPlaceholder
</a></li>
3219 <li data-name=
"LuCI.ui.Select#setUpdateEvents"><a href=
"LuCI.ui.Select.html#setUpdateEvents">setUpdateEvents
</a></li>
3221 <li data-name=
"LuCI.ui.Select#setValue"><a href=
"LuCI.ui.Select.html#setValue">setValue
</a></li>
3223 <li data-name=
"LuCI.ui.Select#triggerValidation"><a href=
"LuCI.ui.Select.html#triggerValidation">triggerValidation
</a></li>
3226 <ul class=
"events itemMembers">
3231 <li class=
"item" data-name=
"LuCI.ui.tabs">
3232 <span class=
"title">
3233 <a href=
"LuCI.ui.tabs.html">LuCI.ui.tabs
</a>
3236 <ul class=
"members itemMembers">
3239 <ul class=
"typedefs itemMembers">
3242 <ul class=
"typedefs itemMembers">
3245 <ul class=
"methods itemMembers">
3247 <span class=
"subtitle">Methods
</span>
3249 <li data-name=
"LuCI.ui.tabs#initTabGroup"><a href=
"LuCI.ui.tabs.html#initTabGroup">initTabGroup
</a></li>
3251 <li data-name=
"LuCI.ui.tabs#isEmptyPane"><a href=
"LuCI.ui.tabs.html#isEmptyPane">isEmptyPane
</a></li>
3254 <ul class=
"events itemMembers">
3259 <li class=
"item" data-name=
"LuCI.ui.Textarea">
3260 <span class=
"title">
3261 <a href=
"LuCI.ui.Textarea.html">LuCI.ui.Textarea
</a>
3264 <ul class=
"members itemMembers">
3267 <ul class=
"typedefs itemMembers">
3269 <span class=
"subtitle">Typedefs
</span>
3271 <li data-name=
"LuCI.ui.Textarea.InitOptions"><a href=
"LuCI.ui.Textarea.html#.InitOptions">InitOptions
</a></li>
3274 <ul class=
"typedefs itemMembers">
3277 <ul class=
"methods itemMembers">
3279 <span class=
"subtitle">Methods
</span>
3281 <li data-name=
"LuCI.ui.Textarea#getValue"><a href=
"LuCI.ui.Textarea.html#getValue">getValue
</a></li>
3283 <li data-name=
"LuCI.ui.Textarea#isChanged"><a href=
"LuCI.ui.Textarea.html#isChanged">isChanged
</a></li>
3285 <li data-name=
"LuCI.ui.Textarea#isValid"><a href=
"LuCI.ui.Textarea.html#isValid">isValid
</a></li>
3287 <li data-name=
"LuCI.ui.Textarea#registerEvents"><a href=
"LuCI.ui.Textarea.html#registerEvents">registerEvents
</a></li>
3289 <li data-name=
"LuCI.ui.Textarea#render"><a href=
"LuCI.ui.Textarea.html#render">render
</a></li>
3291 <li data-name=
"LuCI.ui.Textarea#setChangeEvents"><a href=
"LuCI.ui.Textarea.html#setChangeEvents">setChangeEvents
</a></li>
3293 <li data-name=
"LuCI.ui.Textarea#setPlaceholder"><a href=
"LuCI.ui.Textarea.html#setPlaceholder">setPlaceholder
</a></li>
3295 <li data-name=
"LuCI.ui.Textarea#setUpdateEvents"><a href=
"LuCI.ui.Textarea.html#setUpdateEvents">setUpdateEvents
</a></li>
3297 <li data-name=
"LuCI.ui.Textarea#setValue"><a href=
"LuCI.ui.Textarea.html#setValue">setValue
</a></li>
3299 <li data-name=
"LuCI.ui.Textarea#triggerValidation"><a href=
"LuCI.ui.Textarea.html#triggerValidation">triggerValidation
</a></li>
3302 <ul class=
"events itemMembers">
3307 <li class=
"item" data-name=
"LuCI.ui.Textfield">
3308 <span class=
"title">
3309 <a href=
"LuCI.ui.Textfield.html">LuCI.ui.Textfield
</a>
3312 <ul class=
"members itemMembers">
3315 <ul class=
"typedefs itemMembers">
3317 <span class=
"subtitle">Typedefs
</span>
3319 <li data-name=
"LuCI.ui.Textfield.InitOptions"><a href=
"LuCI.ui.Textfield.html#.InitOptions">InitOptions
</a></li>
3322 <ul class=
"typedefs itemMembers">
3325 <ul class=
"methods itemMembers">
3327 <span class=
"subtitle">Methods
</span>
3329 <li data-name=
"LuCI.ui.Textfield#getValue"><a href=
"LuCI.ui.Textfield.html#getValue">getValue
</a></li>
3331 <li data-name=
"LuCI.ui.Textfield#isChanged"><a href=
"LuCI.ui.Textfield.html#isChanged">isChanged
</a></li>
3333 <li data-name=
"LuCI.ui.Textfield#isValid"><a href=
"LuCI.ui.Textfield.html#isValid">isValid
</a></li>
3335 <li data-name=
"LuCI.ui.Textfield#registerEvents"><a href=
"LuCI.ui.Textfield.html#registerEvents">registerEvents
</a></li>
3337 <li data-name=
"LuCI.ui.Textfield#render"><a href=
"LuCI.ui.Textfield.html#render">render
</a></li>
3339 <li data-name=
"LuCI.ui.Textfield#setChangeEvents"><a href=
"LuCI.ui.Textfield.html#setChangeEvents">setChangeEvents
</a></li>
3341 <li data-name=
"LuCI.ui.Textfield#setPlaceholder"><a href=
"LuCI.ui.Textfield.html#setPlaceholder">setPlaceholder
</a></li>
3343 <li data-name=
"LuCI.ui.Textfield#setUpdateEvents"><a href=
"LuCI.ui.Textfield.html#setUpdateEvents">setUpdateEvents
</a></li>
3345 <li data-name=
"LuCI.ui.Textfield#setValue"><a href=
"LuCI.ui.Textfield.html#setValue">setValue
</a></li>
3347 <li data-name=
"LuCI.ui.Textfield#triggerValidation"><a href=
"LuCI.ui.Textfield.html#triggerValidation">triggerValidation
</a></li>
3350 <ul class=
"events itemMembers">
3355 <li class=
"item" data-name=
"LuCI.view">
3356 <span class=
"title">
3357 <a href=
"LuCI.view.html">LuCI.view
</a>
3360 <ul class=
"members itemMembers">
3363 <ul class=
"typedefs itemMembers">
3366 <ul class=
"typedefs itemMembers">
3369 <ul class=
"methods itemMembers">
3371 <span class=
"subtitle">Methods
</span>
3373 <li data-name=
"LuCI.view#addFooter"><a href=
"LuCI.view.html#addFooter">addFooter
</a></li>
3375 <li data-name=
"LuCI.view#handleReset"><a href=
"LuCI.view.html#handleReset">handleReset
</a></li>
3377 <li data-name=
"LuCI.view#handleSave"><a href=
"LuCI.view.html#handleSave">handleSave
</a></li>
3379 <li data-name=
"LuCI.view#handleSaveApply"><a href=
"LuCI.view.html#handleSaveApply">handleSaveApply
</a></li>
3381 <li data-name=
"LuCI.view#load"><a href=
"LuCI.view.html#load">load
</a></li>
3383 <li data-name=
"LuCI.view#render"><a href=
"LuCI.view.html#render">render
</a></li>
3386 <ul class=
"events itemMembers">
3391 <li class=
"item" data-name=
"LuCI.xhr">
3392 <span class=
"title">
3393 <a href=
"LuCI.xhr.html">LuCI.xhr
</a>
3396 <ul class=
"members itemMembers">
3399 <ul class=
"typedefs itemMembers">
3402 <ul class=
"typedefs itemMembers">
3405 <ul class=
"methods itemMembers">
3407 <span class=
"subtitle">Methods
</span>
3409 <li data-name=
"LuCI.xhr#abort"><a href=
"LuCI.xhr.html#abort">abort
</a></li>
3411 <li data-name=
"LuCI.xhr#busy"><a href=
"LuCI.xhr.html#busy">busy
</a></li>
3413 <li data-name=
"LuCI.xhr#cancel"><a href=
"LuCI.xhr.html#cancel">cancel
</a></li>
3415 <li data-name=
"LuCI.xhr#get"><a href=
"LuCI.xhr.html#get">get
</a></li>
3417 <li data-name=
"LuCI.xhr#post"><a href=
"LuCI.xhr.html#post">post
</a></li>
3419 <li data-name=
"LuCI.xhr#send_form"><a href=
"LuCI.xhr.html#send_form">send_form
</a></li>
3422 <ul class=
"events itemMembers">
3430 <h1 class=
"page-title" data-filename=
"form.js.html">Source: form.js
</h1>
3437 <pre id=
"source-code" class=
"prettyprint source "><code>'use strict';
3442 'require baseclass';
3446 var callSessionAccess = rpc.declare({
3449 params: [ 'scope', 'object', 'function' ],
3450 expect: { 'access': false }
3453 var CBIJSONConfig = baseclass.extend({
3454 __init__: function(data) {
3455 data = Object.assign({}, data);
3459 var num_sections =
0,
3462 for (var sectiontype in data) {
3463 if (!data.hasOwnProperty(sectiontype))
3466 if (Array.isArray(data[sectiontype])) {
3467 for (var i =
0, index =
0; i
< data[sectiontype].length; i++) {
3468 var item = data[sectiontype][i],
3471 if (!L.isObject(item))
3474 if (typeof(item['.name']) == 'string') {
3475 name = item['.name'];
3479 name = sectiontype + num_sections;
3483 if (!this.data.hasOwnProperty(name))
3484 section_ids.push(name);
3486 this.data[name] = Object.assign(item, {
3487 '.index': num_sections++,
3488 '.anonymous': anonymous,
3490 '.type': sectiontype
3494 else if (L.isObject(data[sectiontype])) {
3495 this.data[sectiontype] = Object.assign(data[sectiontype], {
3496 '.anonymous': false,
3497 '.name': sectiontype,
3498 '.type': sectiontype
3501 section_ids.push(sectiontype);
3506 section_ids.sort(L.bind(function(a, b) {
3507 var indexA = (this.data[a]['.index'] != null) ? +this.data[a]['.index'] :
9999,
3508 indexB = (this.data[b]['.index'] != null) ? +this.data[b]['.index'] :
9999;
3510 if (indexA != indexB)
3511 return (indexA - indexB);
3516 for (var i =
0; i
< section_ids.length; i++)
3517 this.data[section_ids[i]]['.index'] = i;
3521 return Promise.resolve(this.data);
3525 return Promise.resolve();
3528 get: function(config, section, option) {
3529 if (section == null)
3533 return this.data[section];
3535 if (!this.data.hasOwnProperty(section))
3538 var value = this.data[section][option];
3540 if (Array.isArray(value))
3544 return String(value);
3549 set: function(config, section, option, value) {
3550 if (section == null || option == null || option.charAt(
0) == '.')
3553 if (!this.data.hasOwnProperty(section))
3557 delete this.data[section][option];
3558 else if (Array.isArray(value))
3559 this.data[section][option] = value;
3561 this.data[section][option] = String(value);
3564 unset: function(config, section, option) {
3565 return this.set(config, section, option, null);
3568 sections: function(config, sectiontype, callback) {
3571 for (var section_id in this.data)
3572 if (sectiontype == null || this.data[section_id]['.type'] == sectiontype)
3573 rv.push(this.data[section_id]);
3575 rv.sort(function(a, b) { return a['.index'] - b['.index'] });
3577 if (typeof(callback) == 'function')
3578 for (var i =
0; i
< rv.length; i++)
3579 callback.call(this, rv[i], rv[i]['.name']);
3584 add: function(config, sectiontype, sectionname) {
3585 var num_sections_type =
0, next_index =
0;
3587 for (var name in this.data) {
3588 num_sections_type += (this.data[name]['.type'] == sectiontype);
3589 next_index = Math.max(next_index, this.data[name]['.index']);
3592 var section_id = sectionname || sectiontype + num_sections_type;
3594 if (!this.data.hasOwnProperty(section_id)) {
3595 this.data[section_id] = {
3596 '.name': section_id,
3597 '.type': sectiontype,
3598 '.anonymous': (sectionname == null),
3599 '.index': next_index +
1
3606 remove: function(config, section) {
3607 if (this.data.hasOwnProperty(section))
3608 delete this.data[section];
3611 resolveSID: function(config, section_id) {
3615 move: function(config, section_id1, section_id2, after) {
3616 return uci.move.apply(this, [config, section_id1, section_id2, after]);
3621 * @class AbstractElement
3622 * @memberof LuCI.form
3626 * The `AbstractElement` class serves as abstract base for the different form
3627 * elements implemented by `LuCI.form`. It provides the common logic for
3628 * loading and rendering values, for nesting elements and for defining common
3631 * This class is private and not directly accessible by user code.
3633 var CBIAbstractElement = baseclass.extend(/** @lends LuCI.form.AbstractElement.prototype */ {
3634 __init__: function(title, description) {
3635 this.title = title || '';
3636 this.description = description || '';
3641 * Add another form element as children to this element.
3643 * @param {AbstractElement} element
3644 * The form element to add.
3646 append: function(obj) {
3647 this.children.push(obj);
3651 * Parse this elements form input.
3653 * The `parse()` function recursively walks the form element tree and
3654 * triggers input value reading and validation for each encountered element.
3656 * Elements which are hidden due to unsatisified dependencies are skipped.
3658 * @returns {Promise
<void
>}
3659 * Returns a promise resolving once this element's value and the values of
3660 * all child elements have been parsed. The returned promise is rejected
3661 * if any parsed values are not meeting the validation constraints of their
3662 * respective elements.
3665 var args = arguments;
3666 this.children.forEach(function(child) {
3667 child.parse.apply(child, args);
3672 * Render the form element.
3674 * The `render()` function recursively walks the form element tree and
3675 * renders the markup for each element, returning the assembled DOM tree.
3678 * @returns {Node|Promise
<Node
>}
3679 * May return a DOM Node or a promise resolving to a DOM node containing
3680 * the form element's markup, including the markup of any child elements.
3682 render: function() {
3683 L.error('InternalError', 'Not implemented');
3687 loadChildren: function(/* ... */) {
3690 if (Array.isArray(this.children))
3691 for (var i =
0; i
< this.children.length; i++)
3692 if (!this.children[i].disable)
3693 tasks.push(this.children[i].load.apply(this.children[i], arguments));
3695 return Promise.all(tasks);
3699 renderChildren: function(tab_name /*, ... */) {
3703 if (Array.isArray(this.children))
3704 for (var i =
0; i
< this.children.length; i++)
3705 if (tab_name === null || this.children[i].tab === tab_name)
3706 if (!this.children[i].disable)
3707 tasks.push(this.children[i].render.apply(
3708 this.children[i], this.varargs(arguments,
1, index++)));
3710 return Promise.all(tasks);
3714 * Strip any HTML tags from the given input string.
3716 * @param {string} input
3717 * The input string to clean.
3720 * The cleaned input string with HTML removes removed.
3722 stripTags: function(s) {
3723 if (typeof(s) == 'string'
&& !s.match(/[
<>]/))
3726 var x = E('div', {}, s);
3727 return x.textContent || x.innerText || '';
3731 * Format the given named property as title string.
3733 * This function looks up the given named property and formats its value
3734 * suitable for use as element caption or description string. It also
3735 * strips any HTML tags from the result.
3737 * If the property value is a string, it is passed to `String.format()`
3738 * along with any additional parameters passed to `titleFn()`.
3740 * If the property value is a function, it is invoked with any additional
3741 * `titleFn()` parameters as arguments and the obtained return value is
3742 * converted to a string.
3744 * In all other cases, `null` is returned.
3746 * @param {string} property
3747 * The name of the element property to use.
3749 * @param {...*} fmt_args
3750 * Extra values to format the title string with.
3752 * @returns {string|null}
3753 * The formatted title string or `null` if the property did not exist or
3754 * was neither a string nor a function.
3756 titleFn: function(attr /*, ... */) {
3759 if (typeof(this[attr]) == 'function')
3760 s = this[attr].apply(this, this.varargs(arguments,
1));
3761 else if (typeof(this[attr]) == 'string')
3762 s = (arguments.length
> 1) ? ''.format.apply(this[attr], this.varargs(arguments,
1)) : this[attr];
3765 s = this.stripTags(String(s)).trim();
3767 if (s == null || s == '')
3776 * @memberof LuCI.form
3777 * @augments LuCI.form.AbstractElement
3781 * The `Map` class represents one complete form. A form usually maps one UCI
3782 * configuraton file and is divided into multiple sections containing multiple
3785 * It serves as main entry point into the `LuCI.form` for typical view code.
3787 * @param {string} config
3788 * The UCI configuration to map. It is automatically loaded along when the
3789 * resulting map instance.
3791 * @param {string} [title]
3792 * The title caption of the form. A form title is usually rendered as separate
3793 * headline element before the actual form contents. If omitted, the
3794 * corresponding headline element will not be rendered.
3796 * @param {string} [description]
3797 * The description text of the form which is usually rendered as text
3798 * paragraph below the form title and before the actual form conents.
3799 * If omitted, the corresponding paragraph element will not be rendered.
3801 var CBIMap = CBIAbstractElement.extend(/** @lends LuCI.form.Map.prototype */ {
3802 __init__: function(config /*, ... */) {
3803 this.super('__init__', this.varargs(arguments,
1));
3805 this.config = config;
3806 this.parsechain = [ config ];
3811 * Toggle readonly state of the form.
3813 * If set to `true`, the Map instance is marked readonly and any form
3814 * option elements added to it will inherit the readonly state.
3816 * If left unset, the Map will test the access permission of the primary
3817 * uci configuration upon loading and mark the form readonly if no write
3818 * permissions are granted.
3820 * @name LuCI.form.Map.prototype#readonly
3825 * Find all DOM nodes within this Map which match the given search
3826 * parameters. This function is essentially a convenience wrapper around
3827 * `querySelectorAll()`.
3829 * This function is sensitive to the amount of arguments passed to it;
3830 * if only one argument is specified, it is used as selector-expression
3831 * as-is. When two arguments are passed, the first argument is treated
3832 * as attribute name, the second one as attribute value to match.
3834 * As an example, `map.findElements('input')` would find all `
<input
>`
3835 * nodes while `map.findElements('type', 'text')` would find any DOM node
3836 * with a `
type=
"text"` attribute.
3838 * @param {string} selector_or_attrname
3839 * If invoked with only one parameter, this argument is a
3840 * `querySelectorAll()` compatible selector expression. If invoked with
3841 * two parameters, this argument is the attribute name to filter for.
3843 * @param {string} [attrvalue]
3844 * In case the function is invoked with two parameters, this argument
3845 * specifies the attribute value to match.
3847 * @throws {InternalError}
3848 * Throws an `InternalError` if more than two function parameters are
3851 * @returns {NodeList}
3852 * Returns a (possibly empty) DOM `NodeList` containing the found DOM nodes.
3854 findElements: function(/* ... */) {
3857 if (arguments.length ==
1)
3859 else if (arguments.length ==
2)
3860 q = '[%
s=
"%s"]'.format(arguments[
0], arguments[
1]);
3862 L.error('InternalError', 'Expecting one or two arguments to findElements()');
3864 return this.root.querySelectorAll(q);
3868 * Find the first DOM node within this Map which matches the given search
3869 * parameters. This function is essentially a convenience wrapper around
3870 * `findElements()` which only returns the first found node.
3872 * This function is sensitive to the amount of arguments passed to it;
3873 * if only one argument is specified, it is used as selector-expression
3874 * as-is. When two arguments are passed, the first argument is treated
3875 * as attribute name, the second one as attribute value to match.
3877 * As an example, `map.findElement('input')` would find the first `
<input
>`
3878 * node while `map.findElement('type', 'text')` would find the first DOM
3879 * node with a `
type=
"text"` attribute.
3881 * @param {string} selector_or_attrname
3882 * If invoked with only one parameter, this argument is a `querySelector()`
3883 * compatible selector expression. If invoked with two parameters, this
3884 * argument is the attribute name to filter for.
3886 * @param {string} [attrvalue]
3887 * In case the function is invoked with two parameters, this argument
3888 * specifies the attribute value to match.
3890 * @throws {InternalError}
3891 * Throws an `InternalError` if more than two function parameters are
3894 * @returns {Node|null}
3895 * Returns the first found DOM node or `null` if no element matched.
3897 findElement: function(/* ... */) {
3898 var res = this.findElements.apply(this, arguments);
3899 return res.length ? res[
0] : null;
3903 * Tie another UCI configuration to the map.
3905 * By default, a map instance will only load the UCI configuration file
3906 * specified in the constructor but sometimes access to values from
3907 * further configuration files is required. This function allows for such
3908 * use cases by registering further UCI configuration files which are
3909 * needed by the map.
3911 * @param {string} config
3912 * The additional UCI configuration file to tie to the map. If the given
3913 * config already is in the list of required files, it will be ignored.
3915 chain: function(config) {
3916 if (this.parsechain.indexOf(config) == -
1)
3917 this.parsechain.push(config);
3921 * Add a configuration section to the map.
3923 * LuCI forms follow the structure of the underlying UCI configurations,
3924 * means that a map, which represents a single UCI configuration, is
3925 * divided into multiple sections which in turn contain an arbitrary
3926 * number of options.
3928 * While UCI itself only knows two kinds of sections - named and anonymous
3929 * ones - the form class offers various flavors of form section elements
3930 * to present configuration sections in different ways. Refer to the
3931 * documentation of the different section classes for details.
3933 * @param {LuCI.form.AbstractSection} sectionclass
3934 * The section class to use for rendering the configuration section.
3935 * Note that this value must be the class itself, not a class instance
3936 * obtained from calling `new`. It must also be a class dervied from
3937 * `LuCI.form.AbstractSection`.
3939 * @param {...string} classargs
3940 * Additional arguments which are passed as-is to the contructor of the
3941 * given section class. Refer to the class specific constructor
3942 * documentation for details.
3944 * @returns {LuCI.form.AbstractSection}
3945 * Returns the instantiated section class instance.
3947 section: function(cbiClass /*, ... */) {
3948 if (!CBIAbstractSection.isSubclass(cbiClass))
3949 L.error('TypeError', 'Class must be a descendent of CBIAbstractSection');
3951 var obj = cbiClass.instantiate(this.varargs(arguments,
1, this));
3957 * Load the configuration covered by this map.
3959 * The `load()` function first loads all referenced UCI configurations,
3960 * then it recursively walks the form element tree and invokes the
3961 * load function of each child element.
3963 * @returns {Promise
<void
>}
3964 * Returns a promise resolving once the entire form completed loading all
3965 * data. The promise may reject with an error if any configuration failed
3966 * to load or if any of the child elements load functions rejected with
3970 var doCheckACL = (!(this instanceof CBIJSONMap)
&& this.readonly == null),
3971 loadTasks = [ doCheckACL ? callSessionAccess('uci', this.config, 'write') : true ],
3972 configs = this.parsechain || [ this.config ];
3974 loadTasks.push.apply(loadTasks, configs.map(L.bind(function(config, i) {
3975 return i ? L.resolveDefault(this.data.load(config)) : this.data.load(config);
3978 return Promise.all(loadTasks).then(L.bind(function(res) {
3979 if (res[
0] === false)
3980 this.readonly = true;
3982 return this.loadChildren();
3987 * Parse the form input values.
3989 * The `parse()` function recursively walks the form element tree and
3990 * triggers input value reading and validation for each child element.
3992 * Elements which are hidden due to unsatisified dependencies are skipped.
3994 * @returns {Promise
<void
>}
3995 * Returns a promise resolving once the entire form completed parsing all
3996 * input values. The returned promise is rejected if any parsed values are
3997 * not meeting the validation constraints of their respective elements.
4002 if (Array.isArray(this.children))
4003 for (var i =
0; i
< this.children.length; i++)
4004 tasks.push(this.children[i].parse());
4006 return Promise.all(tasks);
4010 * Save the form input values.
4012 * This function parses the current form, saves the resulting UCI changes,
4013 * reloads the UCI configuration data and redraws the form elements.
4015 * @param {function} [cb]
4016 * An optional callback function that is invoked after the form is parsed
4017 * but before the changed UCI data is saved. This is useful to perform
4018 * additional data manipulation steps before saving the changes.
4020 * @param {boolean} [silent=false]
4021 * If set to `true`, trigger an alert message to the user in case saving
4022 * the form data failes. Otherwise fail silently.
4024 * @returns {Promise
<void
>}
4025 * Returns a promise resolving once the entire save operation is complete.
4026 * The returned promise is rejected if any step of the save operation
4029 save: function(cb, silent) {
4030 this.checkDepends();
4034 .then(this.data.save.bind(this.data))
4035 .then(this.load.bind(this))
4036 .catch(function(e) {
4038 ui.showModal(_('Save error'), [
4039 E('p', {}, [ _('An error occurred while saving the form:') ]),
4040 E('p', {}, [ E('em', { 'style': 'white-space:pre' }, [ e.message ]) ]),
4041 E('div', { 'class': 'right' }, [
4042 E('button', { 'class': 'btn', 'click': ui.hideModal }, [ _('Dismiss') ])
4047 return Promise.reject(e);
4048 }).then(this.renderContents.bind(this));
4052 * Reset the form by re-rendering its contents. This will revert all
4053 * unsaved user inputs to their initial form state.
4055 * @returns {Promise
<Node
>}
4056 * Returns a promise resolving to the toplevel form DOM node once the
4057 * re-rendering is complete.
4060 return this.renderContents();
4064 * Render the form markup.
4066 * @returns {Promise
<Node
>}
4067 * Returns a promise resolving to the toplevel form DOM node once the
4068 * rendering is complete.
4070 render: function() {
4071 return this.load().then(this.renderContents.bind(this));
4075 renderContents: function() {
4076 var mapEl = this.root || (this.root = E('div', {
4077 'id': 'cbi-%s'.format(this.config),
4079 'cbi-dependency-check': L.bind(this.checkDepends, this)
4082 dom.bindClassInstance(mapEl, this);
4084 return this.renderChildren(null).then(L.bind(function(nodes) {
4085 var initialRender = !mapEl.firstChild;
4087 dom.content(mapEl, null);
4089 if (this.title != null
&& this.title != '')
4090 mapEl.appendChild(E('h2', { 'name': 'content' }, this.title));
4092 if (this.description != null
&& this.description != '')
4093 mapEl.appendChild(E('div', { 'class': 'cbi-map-descr' }, this.description));
4096 dom.append(mapEl, E('div', { 'class': 'cbi-map-tabbed' }, nodes));
4098 dom.append(mapEl, nodes);
4100 if (!initialRender) {
4101 mapEl.classList.remove('flash');
4103 window.setTimeout(function() {
4104 mapEl.classList.add('flash');
4108 this.checkDepends();
4110 var tabGroups = mapEl.querySelectorAll('.cbi-map-tabbed, .cbi-section-node-tabbed');
4112 for (var i =
0; i
< tabGroups.length; i++)
4113 ui.tabs.initTabGroup(tabGroups[i].childNodes);
4120 * Find a form option element instance.
4122 * @param {string} name_or_id
4123 * The name or the full ID of the option element to look up.
4125 * @param {string} [section_id]
4126 * The ID of the UCI section containing the option to look up. May be
4127 * omitted if a full ID is passed as first argument.
4129 * @param {string} [config]
4130 * The name of the UCI configuration the option instance is belonging to.
4131 * Defaults to the main UCI configuration of the map if omitted.
4133 * @returns {Array
<LuCI.form.AbstractValue,string
>|null}
4134 * Returns a two-element array containing the form option instance as
4135 * first item and the corresponding UCI section ID as second item.
4136 * Returns `null` if the option could not be found.
4138 lookupOption: function(name, section_id, config_name) {
4139 var id, elem, sid, inst;
4141 if (name.indexOf('.')
> -
1)
4142 id = 'cbid.%s'.format(name);
4144 id = 'cbid.%s.%s.%s'.format(config_name || this.config, section_id, name);
4146 elem = this.findElement('data-field', id);
4147 sid = elem ? id.split(/\./)[
2] : null;
4148 inst = elem ? dom.findClassInstance(elem) : null;
4150 return (inst instanceof CBIAbstractValue) ? [ inst, sid ] : null;
4154 checkDepends: function(ev, n) {
4155 var changed = false;
4157 for (var i =
0, s = this.children[
0]; (s = this.children[i]) != null; i++)
4158 if (s.checkDepends(ev, n))
4161 if (changed
&& (n ||
0)
< 10)
4162 this.checkDepends(ev, (n ||
10) +
1);
4164 ui.tabs.updateTabs(ev, this.root);
4168 isDependencySatisfied: function(depends, config_name, section_id) {
4171 if (!Array.isArray(depends) || !depends.length)
4174 for (var i =
0; i
< depends.length; i++) {
4176 reverse = depends[i]['!reverse'],
4177 contains = depends[i]['!contains'];
4179 for (var dep in depends[i]) {
4180 if (dep == '!reverse' || dep == '!contains') {
4183 else if (dep == '!default') {
4188 var res = this.lookupOption(dep, section_id, config_name),
4189 val = (res
&& res[
0].isActive(res[
1])) ? res[
0].formvalue(res[
1]) : null;
4191 var equal = contains
4192 ? isContained(val, depends[i][dep])
4193 : isEqual(val, depends[i][dep]);
4195 istat = (istat
&& equal);
4199 if (istat ^ reverse)
4208 * @constructor JSONMap
4209 * @memberof LuCI.form
4210 * @augments LuCI.form.Map
4214 * A `JSONMap` class functions similar to [LuCI.form.Map]{@link LuCI.form.Map}
4215 * but uses a multidimensional JavaScript object instead of UCI configuration
4218 * @param {Object
<string, Object
<string, *
>|Array
<Object
<string, *
>>>} data
4219 * The JavaScript object to use as data source. Internally, the object is
4220 * converted into an UCI-like format. Its toplevel keys are treated like UCI
4221 * section types while the object or array-of-object values are treated as
4224 * @param {string} [title]
4225 * The title caption of the form. A form title is usually rendered as separate
4226 * headline element before the actual form contents. If omitted, the
4227 * corresponding headline element will not be rendered.
4229 * @param {string} [description]
4230 * The description text of the form which is usually rendered as text
4231 * paragraph below the form title and before the actual form conents.
4232 * If omitted, the corresponding paragraph element will not be rendered.
4234 var CBIJSONMap = CBIMap.extend(/** @lends LuCI.form.JSONMap.prototype */ {
4235 __init__: function(data /*, ... */) {
4236 this.super('__init__', this.varargs(arguments,
1, 'json'));
4238 this.config = 'json';
4239 this.parsechain = [ 'json' ];
4240 this.data = new CBIJSONConfig(data);
4245 * @class AbstractSection
4246 * @memberof LuCI.form
4247 * @augments LuCI.form.AbstractElement
4251 * The `AbstractSection` class serves as abstract base for the different form
4252 * section styles implemented by `LuCI.form`. It provides the common logic for
4253 * enumerating underlying configuration section instances, for registering
4254 * form options and for handling tabs to segment child options.
4256 * This class is private and not directly accessible by user code.
4258 var CBIAbstractSection = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractSection.prototype */ {
4259 __init__: function(map, sectionType /*, ... */) {
4260 this.super('__init__', this.varargs(arguments,
2));
4262 this.sectiontype = sectionType;
4264 this.config = map.config;
4266 this.optional = true;
4267 this.addremove = false;
4268 this.dynamic = false;
4272 * Access the parent option container instance.
4274 * In case this section is nested within an option element container,
4275 * this property will hold a reference to the parent option instance.
4277 * If this section is not nested, the property is `null`.
4279 * @name LuCI.form.AbstractSection.prototype#parentoption
4280 * @type LuCI.form.AbstractValue
4285 * Enumerate the UCI section IDs covered by this form section element.
4288 * @throws {InternalError}
4289 * Throws an `InternalError` exception if the function is not implemented.
4291 * @returns {string[]}
4292 * Returns an array of UCI section IDs covered by this form element.
4293 * The sections will be rendered in the same order as the returned array.
4295 cfgsections: function() {
4296 L.error('InternalError', 'Not implemented');
4300 * Filter UCI section IDs to render.
4302 * The filter function is invoked for each UCI section ID of a given type
4303 * and controls whether the given UCI section is rendered or ignored by
4304 * the form section element.
4306 * The default implementation always returns `true`. User code or
4307 * classes extending `AbstractSection` may overwrite this function with
4308 * custom implementations.
4311 * @param {string} section_id
4312 * The UCI section ID to test.
4314 * @returns {boolean}
4315 * Returns `true` when the given UCI section ID should be handled and
4316 * `false` when it should be ignored.
4318 filter: function(section_id) {
4323 * Load the configuration covered by this section.
4325 * The `load()` function recursively walks the section element tree and
4326 * invokes the load function of each child option element.
4328 * @returns {Promise
<void
>}
4329 * Returns a promise resolving once the values of all child elements have
4330 * been loaded. The promise may reject with an error if any of the child
4331 * elements load functions rejected with an error.
4334 var section_ids = this.cfgsections(),
4337 if (Array.isArray(this.children))
4338 for (var i =
0; i
< section_ids.length; i++)
4339 tasks.push(this.loadChildren(section_ids[i])
4340 .then(Function.prototype.bind.call(function(section_id, set_values) {
4341 for (var i =
0; i
< set_values.length; i++)
4342 this.children[i].cfgvalue(section_id, set_values[i]);
4343 }, this, section_ids[i])));
4345 return Promise.all(tasks);
4349 * Parse this sections form input.
4351 * The `parse()` function recursively walks the section element tree and
4352 * triggers input value reading and validation for each encountered child
4355 * Options which are hidden due to unsatisified dependencies are skipped.
4357 * @returns {Promise
<void
>}
4358 * Returns a promise resolving once the values of all child elements have
4359 * been parsed. The returned promise is rejected if any parsed values are
4360 * not meeting the validation constraints of their respective elements.
4363 var section_ids = this.cfgsections(),
4366 if (Array.isArray(this.children))
4367 for (var i =
0; i
< section_ids.length; i++)
4368 for (var j =
0; j
< this.children.length; j++)
4369 tasks.push(this.children[j].parse(section_ids[i]));
4371 return Promise.all(tasks);
4375 * Add an option tab to the section.
4377 * The child option elements of a section may be divided into multiple
4378 * tabs to provide a better overview to the user.
4380 * Before options can be moved into a tab pane, the corresponding tab
4381 * has to be defined first, which is done by calling this function.
4383 * Note that once tabs are defined, user code must use the `taboption()`
4384 * method to add options to specific tabs. Option elements added by
4385 * `option()` will not be assigned to any tab and not be rendered in this
4388 * @param {string} name
4389 * The name of the tab to register. It may be freely chosen and just serves
4390 * as an identifier to differentiate tabs.
4392 * @param {string} title
4393 * The human readable caption of the tab.
4395 * @param {string} [description]
4396 * An additional description text for the corresponding tab pane. It is
4397 * displayed as text paragraph below the tab but before the tab pane
4398 * contents. If omitted, no description will be rendered.
4401 * Throws an exeption if a tab with the same `name` already exists.
4403 tab: function(name, title, description) {
4404 if (this.tabs
&& this.tabs[name])
4405 throw 'Tab already declared';
4410 description: description,
4414 this.tabs = this.tabs || [];
4415 this.tabs.push(entry);
4416 this.tabs[name] = entry;
4418 this.tab_names = this.tab_names || [];
4419 this.tab_names.push(name);
4423 * Add a configuration option widget to the section.
4425 * Note that [taboption()]{@link LuCI.form.AbstractSection#taboption}
4426 * should be used instead if this form section element uses tabs.
4428 * @param {LuCI.form.AbstractValue} optionclass
4429 * The option class to use for rendering the configuration option. Note
4430 * that this value must be the class itself, not a class instance obtained
4431 * from calling `new`. It must also be a class dervied from
4432 * [LuCI.form.AbstractSection]{@link LuCI.form.AbstractSection}.
4434 * @param {...*} classargs
4435 * Additional arguments which are passed as-is to the contructor of the
4436 * given option class. Refer to the class specific constructor
4437 * documentation for details.
4439 * @throws {TypeError}
4440 * Throws a `TypeError` exception in case the passed class value is not a
4441 * descendent of `AbstractValue`.
4443 * @returns {LuCI.form.AbstractValue}
4444 * Returns the instantiated option class instance.
4446 option: function(cbiClass /*, ... */) {
4447 if (!CBIAbstractValue.isSubclass(cbiClass))
4448 throw L.error('TypeError', 'Class must be a descendent of CBIAbstractValue');
4450 var obj = cbiClass.instantiate(this.varargs(arguments,
1, this.map, this));
4456 * Add a configuration option widget to a tab of the section.
4458 * @param {string} tabname
4459 * The name of the section tab to add the option element to.
4461 * @param {LuCI.form.AbstractValue} optionclass
4462 * The option class to use for rendering the configuration option. Note
4463 * that this value must be the class itself, not a class instance obtained
4464 * from calling `new`. It must also be a class dervied from
4465 * [LuCI.form.AbstractSection]{@link LuCI.form.AbstractSection}.
4467 * @param {...*} classargs
4468 * Additional arguments which are passed as-is to the contructor of the
4469 * given option class. Refer to the class specific constructor
4470 * documentation for details.
4472 * @throws {ReferenceError}
4473 * Throws a `ReferenceError` exception when the given tab name does not
4476 * @throws {TypeError}
4477 * Throws a `TypeError` exception in case the passed class value is not a
4478 * descendent of `AbstractValue`.
4480 * @returns {LuCI.form.AbstractValue}
4481 * Returns the instantiated option class instance.
4483 taboption: function(tabName /*, ... */) {
4484 if (!this.tabs || !this.tabs[tabName])
4485 throw L.error('ReferenceError', 'Associated tab not declared');
4487 var obj = this.option.apply(this, this.varargs(arguments,
1));
4489 this.tabs[tabName].children.push(obj);
4494 * Query underlying option configuration values.
4496 * This function is sensitive to the amount of arguments passed to it;
4497 * if only one argument is specified, the configuration values of all
4498 * options within this section are returned as dictionary.
4500 * If both the section ID and an option name are supplied, this function
4501 * returns the configuration value of the specified option only.
4503 * @param {string} section_id
4504 * The configuration section ID
4506 * @param {string} [option]
4507 * The name of the option to query
4509 * @returns {null|string|string[]|Object
<string, null|string|string[]
>}
4510 * Returns either a dictionary of option names and their corresponding
4511 * configuration values or just a single configuration value, depending
4512 * on the amount of passed arguments.
4514 cfgvalue: function(section_id, option) {
4515 var rv = (arguments.length ==
1) ? {} : null;
4517 for (var i =
0, o; (o = this.children[i]) != null; i++)
4519 rv[o.option] = o.cfgvalue(section_id);
4520 else if (o.option == option)
4521 return o.cfgvalue(section_id);
4527 * Query underlying option widget input values.
4529 * This function is sensitive to the amount of arguments passed to it;
4530 * if only one argument is specified, the widget input values of all
4531 * options within this section are returned as dictionary.
4533 * If both the section ID and an option name are supplied, this function
4534 * returns the widget input value of the specified option only.
4536 * @param {string} section_id
4537 * The configuration section ID
4539 * @param {string} [option]
4540 * The name of the option to query
4542 * @returns {null|string|string[]|Object
<string, null|string|string[]
>}
4543 * Returns either a dictionary of option names and their corresponding
4544 * widget input values or just a single widget input value, depending
4545 * on the amount of passed arguments.
4547 formvalue: function(section_id, option) {
4548 var rv = (arguments.length ==
1) ? {} : null;
4550 for (var i =
0, o; (o = this.children[i]) != null; i++) {
4551 var func = this.map.root ? this.children[i].formvalue : this.children[i].cfgvalue;
4554 rv[o.option] = func.call(o, section_id);
4555 else if (o.option == option)
4556 return func.call(o, section_id);
4563 * Obtain underlying option LuCI.ui widget instances.
4565 * This function is sensitive to the amount of arguments passed to it;
4566 * if only one argument is specified, the LuCI.ui widget instances of all
4567 * options within this section are returned as dictionary.
4569 * If both the section ID and an option name are supplied, this function
4570 * returns the LuCI.ui widget instance value of the specified option only.
4572 * @param {string} section_id
4573 * The configuration section ID
4575 * @param {string} [option]
4576 * The name of the option to query
4578 * @returns {null|LuCI.ui.AbstractElement|Object
<string, null|LuCI.ui.AbstractElement
>}
4579 * Returns either a dictionary of option names and their corresponding
4580 * widget input values or just a single widget input value, depending
4581 * on the amount of passed arguments.
4583 getUIElement: function(section_id, option) {
4584 var rv = (arguments.length ==
1) ? {} : null;
4586 for (var i =
0, o; (o = this.children[i]) != null; i++)
4588 rv[o.option] = o.getUIElement(section_id);
4589 else if (o.option == option)
4590 return o.getUIElement(section_id);
4596 * Obtain underlying option objects.
4598 * This function is sensitive to the amount of arguments passed to it;
4599 * if no option name is specified, all options within this section are
4600 * returned as dictionary.
4602 * If an option name is supplied, this function returns the matching
4603 * LuCI.form.AbstractValue instance only.
4605 * @param {string} [option]
4606 * The name of the option object to obtain
4608 * @returns {null|LuCI.form.AbstractValue|Object
<string, LuCI.form.AbstractValue
>}
4609 * Returns either a dictionary of option names and their corresponding
4610 * option instance objects or just a single object instance value,
4611 * depending on the amount of passed arguments.
4613 getOption: function(option) {
4614 var rv = (arguments.length ==
0) ? {} : null;
4616 for (var i =
0, o; (o = this.children[i]) != null; i++)
4619 else if (o.option == option)
4626 renderUCISection: function(section_id) {
4627 var renderTasks = [];
4630 return this.renderOptions(null, section_id);
4632 for (var i =
0; i
< this.tab_names.length; i++)
4633 renderTasks.push(this.renderOptions(this.tab_names[i], section_id));
4635 return Promise.all(renderTasks)
4636 .then(this.renderTabContainers.bind(this, section_id));
4640 renderTabContainers: function(section_id, nodes) {
4641 var config_name = this.uciconfig || this.map.config,
4642 containerEls = E([]);
4644 for (var i =
0; i
< nodes.length; i++) {
4645 var tab_name = this.tab_names[i],
4646 tab_data = this.tabs[tab_name],
4647 containerEl = E('div', {
4648 'id': 'container.%s.%s.%s'.format(config_name, section_id, tab_name),
4649 'data-tab': tab_name,
4650 'data-tab-title': tab_data.title,
4651 'data-tab-active': tab_name === this.selected_tab
4654 if (tab_data.description != null
&& tab_data.description != '')
4655 containerEl.appendChild(
4656 E('div', { 'class': 'cbi-tab-descr' }, tab_data.description));
4658 containerEl.appendChild(nodes[i]);
4659 containerEls.appendChild(containerEl);
4662 return containerEls;
4666 renderOptions: function(tab_name, section_id) {
4667 var in_table = (this instanceof CBITableSection);
4668 return this.renderChildren(tab_name, section_id, in_table).then(function(nodes) {
4669 var optionEls = E([]);
4670 for (var i =
0; i
< nodes.length; i++)
4671 optionEls.appendChild(nodes[i]);
4677 checkDepends: function(ev, n) {
4678 var changed = false,
4679 sids = this.cfgsections();
4681 for (var i =
0, sid = sids[
0]; (sid = sids[i]) != null; i++) {
4682 for (var j =
0, o = this.children[
0]; (o = this.children[j]) != null; j++) {
4683 var isActive = o.isActive(sid),
4684 isSatisified = o.checkDepends(sid);
4686 if (isActive != isSatisified) {
4687 o.setActive(sid, !isActive);
4688 isActive = !isActive;
4692 if (!n
&& isActive)
4693 o.triggerValidation(sid);
4702 var isEqual = function(x, y) {
4703 if (typeof(y) == 'object'
&& y instanceof RegExp)
4704 return (x == null) ? false : y.test(x);
4706 if (x != null
&& y != null
&& typeof(x) != typeof(y))
4709 if ((x == null
&& y != null) || (x != null
&& y == null))
4712 if (Array.isArray(x)) {
4713 if (x.length != y.length)
4716 for (var i =
0; i
< x.length; i++)
4717 if (!isEqual(x[i], y[i]))
4720 else if (typeof(x) == 'object') {
4722 if (x.hasOwnProperty(k)
&& !y.hasOwnProperty(k))
4725 if (!isEqual(x[k], y[k]))
4730 if (y.hasOwnProperty(k)
&& !x.hasOwnProperty(k))
4740 var isContained = function(x, y) {
4741 if (Array.isArray(x)) {
4742 for (var i =
0; i
< x.length; i++)
4746 else if (L.isObject(x)) {
4747 if (x.hasOwnProperty(y)
&& x[y] != null)
4750 else if (typeof(x) == 'string') {
4751 return (x.indexOf(y)
> -
1);
4758 * @class AbstractValue
4759 * @memberof LuCI.form
4760 * @augments LuCI.form.AbstractElement
4764 * The `AbstractValue` class serves as abstract base for the different form
4765 * option styles implemented by `LuCI.form`. It provides the common logic for
4766 * handling option input values, for dependencies among options and for
4767 * validation constraints that should be applied to entered values.
4769 * This class is private and not directly accessible by user code.
4771 var CBIAbstractValue = CBIAbstractElement.extend(/** @lends LuCI.form.AbstractValue.prototype */ {
4772 __init__: function(map, section, option /*, ... */) {
4773 this.super('__init__', this.varargs(arguments,
3));
4775 this.section = section;
4776 this.option = option;
4778 this.config = map.config;
4782 this.rmempty = true;
4783 this.default = null;
4785 this.optional = false;
4789 * If set to `false`, the underlying option value is retained upon saving
4790 * the form when the option element is disabled due to unsatisfied
4791 * dependency constraints.
4793 * @name LuCI.form.AbstractValue.prototype#rmempty
4799 * If set to `true`, the underlying ui input widget is allowed to be empty,
4800 * otherwise the option element is marked invalid when no value is entered
4801 * or selected by the user.
4803 * @name LuCI.form.AbstractValue.prototype#optional
4809 * Sets a default value to use when the underlying UCI option is not set.
4811 * @name LuCI.form.AbstractValue.prototype#default
4817 * Specifies a datatype constraint expression to validate input values
4818 * against. Refer to {@link LuCI.validation} for details on the format.
4820 * If the user entered input does not match the datatype validation, the
4821 * option element is marked as invalid.
4823 * @name LuCI.form.AbstractValue.prototype#datatype
4829 * Specifies a custom validation function to test the user input for
4830 * validity. The validation function must return `true` to accept the
4831 * value. Any other return value type is converted to a string and
4832 * displayed to the user as validation error message.
4834 * If the user entered input does not pass the validation function, the
4835 * option element is marked as invalid.
4837 * @name LuCI.form.AbstractValue.prototype#validate
4843 * Override the UCI configuration name to read the option value from.
4845 * By default, the configuration name is inherited from the parent Map.
4846 * By setting this property, a deviating configuration may be specified.
4848 * The default is null, means inheriting from the parent form.
4850 * @name LuCI.form.AbstractValue.prototype#uciconfig
4856 * Override the UCI section name to read the option value from.
4858 * By default, the section ID is inherited from the parent section element.
4859 * By setting this property, a deviating section may be specified.
4861 * The default is null, means inheriting from the parent section.
4863 * @name LuCI.form.AbstractValue.prototype#ucisection
4869 * Override the UCI option name to read the value from.
4871 * By default, the elements name, which is passed as third argument to
4872 * the constructor, is used as UCI option name. By setting this property,
4873 * a deviating UCI option may be specified.
4875 * The default is null, means using the option element name.
4877 * @name LuCI.form.AbstractValue.prototype#ucioption
4883 * Mark grid section option element as editable.
4885 * Options which are displayed in the table portion of a `GridSection`
4886 * instance are rendered as readonly text by default. By setting the
4887 * `editable` property of a child option element to `true`, that element
4888 * is rendered as full input widget within its cell instead of a text only
4891 * This property has no effect on options that are not children of grid
4894 * @name LuCI.form.AbstractValue.prototype#editable
4900 * Move grid section option element into the table, the modal popup or both.
4902 * If this property is `null` (the default), the option element is
4903 * displayed in both the table preview area and the per-section instance
4904 * modal popup of a grid section. When it is set to `false` the option
4905 * is only shown in the table but not the modal popup. When set to `true`,
4906 * the option is only visible in the modal popup but not the table.
4908 * This property has no effect on options that are not children of grid
4911 * @name LuCI.form.AbstractValue.prototype#modalonly
4917 * Make option element readonly.
4919 * This property defaults to the readonly state of the parent form element.
4920 * When set to `true`, the underlying widget is rendered in disabled state,
4921 * means its contents cannot be changed and the widget cannot be interacted
4924 * @name LuCI.form.AbstractValue.prototype#readonly
4930 * Override the cell width of a table or grid section child option.
4932 * If the property is set to a numeric value, it is treated as pixel width
4933 * which is set on the containing cell element of the option, essentially
4934 * forcing a certain column width. When the property is set to a string
4935 * value, it is applied as-is to the CSS `width` property.
4937 * This property has no effect on options that are not children of grid or
4938 * table section elements.
4940 * @name LuCI.form.AbstractValue.prototype#width
4941 * @type number|string
4946 * Register a custom value change handler.
4948 * If this property is set to a function value, the function is invoked
4949 * whenever the value of the underlying UI input element is changing.
4951 * The invoked handler function will receive the DOM click element as
4952 * first and the underlying configuration section ID as well as the input
4953 * value as second and third argument respectively.
4955 * @name LuCI.form.AbstractValue.prototype#onchange
4961 * Add a dependency contraint to the option.
4963 * Dependency constraints allow making the presence of option elements
4964 * dependant on the current values of certain other options within the
4965 * same form. An option element with unsatisfied dependencies will be
4966 * hidden from the view and its current value is omitted when saving.
4968 * Multiple constraints (that is, multiple calls to `depends()`) are
4969 * treated as alternatives, forming a logical
"or" expression.
4971 * By passing an object of name =
> value pairs as first argument, it is
4972 * possible to depend on multiple options simultaneously, allowing to form
4973 * a logical
"and" expression.
4975 * Option names may be given in
"dot notation" which allows to reference
4976 * option elements outside of the current form section. If a name without
4977 * dot is specified, it refers to an option within the same configuration
4978 * section. If specified as
<code
>configname.sectionid.optionname
</code
>,
4979 * options anywhere within the same form may be specified.
4981 * The object notation also allows for a number of special keys which are
4982 * not treated as option names but as modifiers to influence the dependency
4983 * constraint evaluation. The associated value of these special
"tag" keys
4984 * is ignored. The recognized tags are:
4988 *
<code
>!reverse
</code
><br
>
4989 * Invert the dependency, instead of requiring another option to be
4990 * equal to the dependency value, that option should
<em
>not
</em
> be
4994 *
<code
>!contains
</code
><br
>
4995 * Instead of requiring an exact match, the dependency is considered
4996 * satisfied when the dependency value is contained within the option
5000 *
<code
>!default
</code
><br
>
5001 * The dependency is always satisfied
5009 *
<code
>opt.depends(
"foo",
"test")
</code
><br
>
5010 * Require the value of `foo` to be `test`.
5013 *
<code
>opt.depends({ foo:
"test" })
</code
><br
>
5014 * Equivalent to the previous example.
5017 *
<code
>opt.depends({ foo: /test/ })
</code
><br
>
5018 * Require the value of `foo` to match the regular expression `/test/`.
5021 *
<code
>opt.depends({ foo:
"test", bar:
"qrx" })
</code
><br
>
5022 * Require the value of `foo` to be `test` and the value of `bar` to be
5026 *
<code
>opt.depends({ foo:
"test" })
<br
>
5027 * opt.depends({ bar:
"qrx" })
</code
><br
>
5028 * Require either
<code
>foo
</code
> to be set to
<code
>test
</code
>,
5029 *
<em
>or
</em
> the
<code
>bar
</code
> option to be
<code
>qrx
</code
>.
5032 *
<code
>opt.depends(
"test.section1.foo",
"bar")
</code
><br
>
5033 * Require the
"foo" form option within the
"section1" section to be
5037 *
<code
>opt.depends({ foo:
"test",
"!contains": true })
</code
><br
>
5038 * Require the
"foo" option value to contain the substring
"test".
5042 * @param {string|Object
<string, string|RegExp
>} optionname_or_depends
5043 * The name of the option to depend on or an object describing multiple
5044 * dependencies which must be satified (a logical
"and" expression).
5046 * @param {string} optionvalue|RegExp
5047 * When invoked with a plain option name as first argument, this parameter
5048 * specifies the expected value. In case an object is passed as first
5049 * argument, this parameter is ignored.
5051 depends: function(field, value) {
5054 if (typeof(field) === 'string')
5055 deps = {}, deps[field] = value;
5059 this.deps.push(deps);
5063 transformDepList: function(section_id, deplist) {
5064 var list = deplist || this.deps,
5067 if (Array.isArray(list)) {
5068 for (var i =
0; i
< list.length; i++) {
5071 for (var k in list[i]) {
5072 if (list[i].hasOwnProperty(k)) {
5073 if (k.charAt(
0) === '!')
5074 dep[k] = list[i][k];
5075 else if (k.indexOf('.') !== -
1)
5076 dep['cbid.%s'.format(k)] = list[i][k];
5078 dep['cbid.%s.%s.%s'.format(
5079 this.uciconfig || this.section.uciconfig || this.map.config,
5080 this.ucisection || section_id,
5086 for (var k in dep) {
5087 if (dep.hasOwnProperty(k)) {
5099 transformChoices: function() {
5100 if (!Array.isArray(this.keylist) || this.keylist.length ==
0)
5105 for (var i =
0; i
< this.keylist.length; i++)
5106 choices[this.keylist[i]] = this.vallist[i];
5112 checkDepends: function(section_id) {
5113 var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
5114 active = this.map.isDependencySatisfied(this.deps, config_name, section_id);
5117 this.updateDefaultValue(section_id);
5123 updateDefaultValue: function(section_id) {
5124 if (!L.isObject(this.defaults))
5127 var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
5128 cfgvalue = L.toArray(this.cfgvalue(section_id))[
0],
5129 default_defval = null, satisified_defval = null;
5131 for (var value in this.defaults) {
5132 if (!this.defaults[value] || this.defaults[value].length ==
0) {
5133 default_defval = value;
5136 else if (this.map.isDependencySatisfied(this.defaults[value], config_name, section_id)) {
5137 satisified_defval = value;
5142 if (satisified_defval == null)
5143 satisified_defval = default_defval;
5145 var node = this.map.findElement('id', this.cbid(section_id));
5146 if (node
&& node.getAttribute('data-changed') != 'true'
&& satisified_defval != null
&& cfgvalue == null)
5147 dom.callClassMethod(node, 'setValue', satisified_defval);
5149 this.default = satisified_defval;
5153 * Obtain the internal ID (
"cbid") of the element instance.
5155 * Since each form section element may map multiple underlying
5156 * configuration sections, the configuration section ID is required to
5157 * form a fully qualified ID pointing to the specific element instance
5158 * within the given specific section.
5160 * @param {string} section_id
5161 * The configuration section ID
5163 * @throws {TypeError}
5164 * Throws a `TypeError` exception when no `section_id` was specified.
5167 * Returns the element ID.
5169 cbid: function(section_id) {
5170 if (section_id == null)
5171 L.error('TypeError', 'Section ID required');
5173 return 'cbid.%s.%s.%s'.format(
5174 this.uciconfig || this.section.uciconfig || this.map.config,
5175 section_id, this.option);
5179 * Load the underlying configuration value.
5181 * The default implementation of this method reads and returns the
5182 * underlying UCI option value (or the related JavaScript property for
5183 * `JSONMap` instances). It may be overwritten by user code to load data
5184 * from nonstandard sources.
5186 * @param {string} section_id
5187 * The configuration section ID
5189 * @throws {TypeError}
5190 * Throws a `TypeError` exception when no `section_id` was specified.
5192 * @returns {*|Promise
<*
>}
5193 * Returns the configuration value to initialize the option element with.
5194 * The return value of this function is filtered through `Promise.resolve()`
5195 * so it may return promises if overridden by user code.
5197 load: function(section_id) {
5198 if (section_id == null)
5199 L.error('TypeError', 'Section ID required');
5201 return this.map.data.get(
5202 this.uciconfig || this.section.uciconfig || this.map.config,
5203 this.ucisection || section_id,
5204 this.ucioption || this.option);
5208 * Obtain the underlying `LuCI.ui` element instance.
5210 * @param {string} section_id
5211 * The configuration section ID
5213 * @throws {TypeError}
5214 * Throws a `TypeError` exception when no `section_id` was specified.
5216 * @return {LuCI.ui.AbstractElement|null}
5217 * Returns the `LuCI.ui` element instance or `null` in case the form
5218 * option implementation does not use `LuCI.ui` widgets.
5220 getUIElement: function(section_id) {
5221 var node = this.map.findElement('id', this.cbid(section_id)),
5222 inst = node ? dom.findClassInstance(node) : null;
5223 return (inst instanceof ui.AbstractElement) ? inst : null;
5227 * Query the underlying configuration value.
5229 * The default implementation of this method returns the cached return
5230 * value of [load()]{@link LuCI.form.AbstractValue#load}. It may be
5231 * overwritten by user code to obtain the configuration value in a
5234 * @param {string} section_id
5235 * The configuration section ID
5237 * @throws {TypeError}
5238 * Throws a `TypeError` exception when no `section_id` was specified.
5241 * Returns the configuration value.
5243 cfgvalue: function(section_id, set_value) {
5244 if (section_id == null)
5245 L.error('TypeError', 'Section ID required');
5247 if (arguments.length ==
2) {
5248 this.data = this.data || {};
5249 this.data[section_id] = set_value;
5252 return this.data ? this.data[section_id] : null;
5256 * Query the current form input value.
5258 * The default implementation of this method returns the current input
5259 * value of the underlying [LuCI.ui]{@link LuCI.ui.AbstractElement} widget.
5260 * It may be overwritten by user code to handle input values differently.
5262 * @param {string} section_id
5263 * The configuration section ID
5265 * @throws {TypeError}
5266 * Throws a `TypeError` exception when no `section_id` was specified.
5269 * Returns the current input value.
5271 formvalue: function(section_id) {
5272 var elem = this.getUIElement(section_id);
5273 return elem ? elem.getValue() : null;
5277 * Obtain a textual input representation.
5279 * The default implementation of this method returns the HTML escaped
5280 * current input value of the underlying
5281 * [LuCI.ui]{@link LuCI.ui.AbstractElement} widget. User code or specific
5282 * option element implementations may overwrite this function to apply a
5283 * different logic, e.g. to return `Yes` or `No` depending on the checked
5284 * state of checkbox elements.
5286 * @param {string} section_id
5287 * The configuration section ID
5289 * @throws {TypeError}
5290 * Throws a `TypeError` exception when no `section_id` was specified.
5293 * Returns the text representation of the current input value.
5295 textvalue: function(section_id) {
5296 var cval = this.cfgvalue(section_id);
5299 cval = this.default;
5301 return (cval != null) ? '%h'.format(cval) : null;
5305 * Apply custom validation logic.
5307 * This method is invoked whenever incremental validation is performed on
5308 * the user input, e.g. on keyup or blur events.
5310 * The default implementation of this method does nothing and always
5311 * returns `true`. User code may overwrite this method to provide
5312 * additional validation logic which is not covered by data type
5316 * @param {string} section_id
5317 * The configuration section ID
5320 * The value to validate
5323 * The method shall return `true` to accept the given value. Any other
5324 * return value is treated as failure, converted to a string and displayed
5325 * as error message to the user.
5327 validate: function(section_id, value) {
5332 * Test whether the input value is currently valid.
5334 * @param {string} section_id
5335 * The configuration section ID
5337 * @returns {boolean}
5338 * Returns `true` if the input value currently is valid, otherwise it
5341 isValid: function(section_id) {
5342 var elem = this.getUIElement(section_id);
5343 return elem ? elem.isValid() : true;
5347 * Test whether the option element is currently active.
5349 * An element is active when it is not hidden due to unsatisfied dependency
5352 * @param {string} section_id
5353 * The configuration section ID
5355 * @returns {boolean}
5356 * Returns `true` if the option element currently is active, otherwise it
5359 isActive: function(section_id) {
5360 var field = this.map.findElement('data-field', this.cbid(section_id));
5361 return (field != null
&& !field.classList.contains('hidden'));
5365 setActive: function(section_id, active) {
5366 var field = this.map.findElement('data-field', this.cbid(section_id));
5368 if (field
&& field.classList.contains('hidden') == active) {
5369 field.classList[active ? 'remove' : 'add']('hidden');
5371 if (dom.matches(field.parentNode, '.td.cbi-value-field'))
5372 field.parentNode.classList[active ? 'remove' : 'add']('inactive');
5381 triggerValidation: function(section_id) {
5382 var elem = this.getUIElement(section_id);
5383 return elem ? elem.triggerValidation() : true;
5387 * Parse the option element input.
5389 * The function is invoked when the `parse()` method has been invoked on
5390 * the parent form and triggers input value reading and validation.
5392 * @param {string} section_id
5393 * The configuration section ID
5395 * @returns {Promise
<void
>}
5396 * Returns a promise resolving once the input value has been read and
5397 * validated or rejecting in case the input value does not meet the
5398 * validation constraints.
5400 parse: function(section_id) {
5401 var active = this.isActive(section_id),
5402 cval = this.cfgvalue(section_id),
5403 fval = active ? this.formvalue(section_id) : null;
5405 if (active
&& !this.isValid(section_id)) {
5406 var title = this.stripTags(this.title).trim();
5407 return Promise.reject(new TypeError(_('Option
"%s" contains an invalid input value.').format(title || this.option)));
5410 if (fval != ''
&& fval != null) {
5411 if (this.forcewrite || !isEqual(cval, fval))
5412 return Promise.resolve(this.write(section_id, fval));
5415 if (!active || this.rmempty || this.optional) {
5416 return Promise.resolve(this.remove(section_id));
5418 else if (!isEqual(cval, fval)) {
5419 var title = this.stripTags(this.title).trim();
5420 return Promise.reject(new TypeError(_('Option
"%s" must not be empty.').format(title || this.option)));
5424 return Promise.resolve();
5428 * Write the current input value into the configuration.
5430 * This function is invoked upon saving the parent form when the option
5431 * element is valid and when its input value has been changed compared to
5432 * the initial value returned by
5433 * [cfgvalue()]{@link LuCI.form.AbstractValue#cfgvalue}.
5435 * The default implementation simply sets the given input value in the
5436 * UCI configuration (or the associated JavaScript object property in
5437 * case of `JSONMap` forms). It may be overwritten by user code to
5438 * implement alternative save logic, e.g. to transform the input value
5439 * before it is written.
5441 * @param {string} section_id
5442 * The configuration section ID
5444 * @param {string|string[]} formvalue
5445 * The input value to write.
5447 write: function(section_id, formvalue) {
5448 return this.map.data.set(
5449 this.uciconfig || this.section.uciconfig || this.map.config,
5450 this.ucisection || section_id,
5451 this.ucioption || this.option,
5456 * Remove the corresponding value from the configuration.
5458 * This function is invoked upon saving the parent form when the option
5459 * element has been hidden due to unsatisfied dependencies or when the
5460 * user cleared the input value and the option is marked optional.
5462 * The default implementation simply removes the associated option from the
5463 * UCI configuration (or the associated JavaScript object property in
5464 * case of `JSONMap` forms). It may be overwritten by user code to
5465 * implement alternative removal logic, e.g. to retain the original value.
5467 * @param {string} section_id
5468 * The configuration section ID
5470 remove: function(section_id) {
5471 return this.map.data.unset(
5472 this.uciconfig || this.section.uciconfig || this.map.config,
5473 this.ucisection || section_id,
5474 this.ucioption || this.option);
5479 * @class TypedSection
5480 * @memberof LuCI.form
5481 * @augments LuCI.form.AbstractSection
5485 * The `TypedSection` class maps all or - if `filter()` is overwritten - a
5486 * subset of the underlying UCI configuration sections of a given type.
5488 * Layout wise, the configuration section instances mapped by the section
5489 * element (sometimes referred to as
"section nodes") are stacked beneath
5490 * each other in a single column, with an optional section remove button next
5491 * to each section node and a section add button at the end, depending on the
5492 * value of the `addremove` property.
5494 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
5495 * The configuration form this section is added to. It is automatically passed
5496 * by [section()]{@link LuCI.form.Map#section}.
5498 * @param {string} section_type
5499 * The type of the UCI section to map.
5501 * @param {string} [title]
5502 * The title caption of the form section element.
5504 * @param {string} [description]
5505 * The description text of the form section element.
5507 var CBITypedSection = CBIAbstractSection.extend(/** @lends LuCI.form.TypedSection.prototype */ {
5508 __name__: 'CBI.TypedSection',
5511 * If set to `true`, the user may add or remove instances from the form
5512 * section widget, otherwise only preexisting sections may be edited.
5513 * The default is `false`.
5515 * @name LuCI.form.TypedSection.prototype#addremove
5521 * If set to `true`, mapped section instances are treated as anonymous
5522 * UCI sections, which means that section instance elements will be
5523 * rendered without title element and that no name is required when adding
5524 * new sections. The default is `false`.
5526 * @name LuCI.form.TypedSection.prototype#anonymous
5532 * When set to `true`, instead of rendering section instances one below
5533 * another, treat each instance as separate tab pane and render a tab menu
5534 * at the top of the form section element, allowing the user to switch
5535 * among instances. The default is `false`.
5537 * @name LuCI.form.TypedSection.prototype#tabbed
5543 * Override the caption used for the section add button at the bottom of
5544 * the section form element. If set to a string, it will be used as-is,
5545 * if set to a function, the function will be invoked and its return value
5546 * is used as caption, after converting it to a string. If this property
5547 * is not set, the default is `Add`.
5549 * @name LuCI.form.TypedSection.prototype#addbtntitle
5550 * @type string|function
5555 * Override the UCI configuration name to read the section IDs from. By
5556 * default, the configuration name is inherited from the parent `Map`.
5557 * By setting this property, a deviating configuration may be specified.
5558 * The default is `null`, means inheriting from the parent form.
5560 * @name LuCI.form.TypedSection.prototype#uciconfig
5566 cfgsections: function() {
5567 return this.map.data.sections(this.uciconfig || this.map.config, this.sectiontype)
5568 .map(function(s) { return s['.name'] })
5569 .filter(L.bind(this.filter, this));
5573 handleAdd: function(ev, name) {
5574 var config_name = this.uciconfig || this.map.config;
5576 this.map.data.add(config_name, this.sectiontype, name);
5577 return this.map.save(null, true);
5581 handleRemove: function(section_id, ev) {
5582 var config_name = this.uciconfig || this.map.config;
5584 this.map.data.remove(config_name, section_id);
5585 return this.map.save(null, true);
5589 renderSectionAdd: function(extra_class) {
5590 if (!this.addremove)
5593 var createEl = E('div', { 'class': 'cbi-section-create' }),
5594 config_name = this.uciconfig || this.map.config,
5595 btn_title = this.titleFn('addbtntitle');
5597 if (extra_class != null)
5598 createEl.classList.add(extra_class);
5600 if (this.anonymous) {
5601 createEl.appendChild(E('button', {
5602 'class': 'cbi-button cbi-button-add',
5603 'title': btn_title || _('Add'),
5604 'click': ui.createHandlerFn(this, 'handleAdd'),
5605 'disabled': this.map.readonly || null
5606 }, [ btn_title || _('Add') ]));
5609 var nameEl = E('input', {
5611 'class': 'cbi-section-create-name',
5612 'disabled': this.map.readonly || null
5615 dom.append(createEl, [
5616 E('div', {}, nameEl),
5618 'class': 'cbi-button cbi-button-add',
5620 'value': btn_title || _('Add'),
5621 'title': btn_title || _('Add'),
5622 'click': ui.createHandlerFn(this, function(ev) {
5623 if (nameEl.classList.contains('cbi-input-invalid'))
5626 return this.handleAdd(ev, nameEl.value);
5628 'disabled': this.map.readonly || null
5632 ui.addValidator(nameEl, 'uciname', true, 'blur', 'keyup');
5639 renderSectionPlaceholder: function() {
5641 E('em', _('This section contains no values yet')),
5647 renderContents: function(cfgsections, nodes) {
5648 var section_id = null,
5649 config_name = this.uciconfig || this.map.config,
5650 sectionEl = E('div', {
5651 'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
5652 'class': 'cbi-section',
5653 'data-tab': (this.map.tabbed
&& !this.parentoption) ? this.sectiontype : null,
5654 'data-tab-title': (this.map.tabbed
&& !this.parentoption) ? this.title || this.sectiontype : null
5657 if (this.title != null
&& this.title != '')
5658 sectionEl.appendChild(E('legend', {}, this.title));
5660 if (this.description != null
&& this.description != '')
5661 sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
5663 for (var i =
0; i
< nodes.length; i++) {
5664 if (this.addremove) {
5665 sectionEl.appendChild(
5666 E('div', { 'class': 'cbi-section-remove right' },
5668 'class': 'cbi-button',
5669 'name': 'cbi.rts.%s.%s'.format(config_name, cfgsections[i]),
5670 'data-section-id': cfgsections[i],
5671 'click': ui.createHandlerFn(this, 'handleRemove', cfgsections[i]),
5672 'disabled': this.map.readonly || null
5673 }, [ _('Delete') ])));
5676 if (!this.anonymous)
5677 sectionEl.appendChild(E('h3', cfgsections[i].toUpperCase()));
5679 sectionEl.appendChild(E('div', {
5680 'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
5682 ? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node',
5683 'data-section-id': cfgsections[i]
5687 if (nodes.length ==
0)
5688 sectionEl.appendChild(this.renderSectionPlaceholder());
5690 sectionEl.appendChild(this.renderSectionAdd());
5692 dom.bindClassInstance(sectionEl, this);
5698 render: function() {
5699 var cfgsections = this.cfgsections(),
5702 for (var i =
0; i
< cfgsections.length; i++)
5703 renderTasks.push(this.renderUCISection(cfgsections[i]));
5705 return Promise.all(renderTasks).then(this.renderContents.bind(this, cfgsections));
5710 * @class TableSection
5711 * @memberof LuCI.form
5712 * @augments LuCI.form.TypedSection
5716 * The `TableSection` class maps all or - if `filter()` is overwritten - a
5717 * subset of the underlying UCI configuration sections of a given type.
5719 * Layout wise, the configuration section instances mapped by the section
5720 * element (sometimes referred to as
"section nodes") are rendered as rows
5721 * within an HTML table element, with an optional section remove button in the
5722 * last column and a section add button below the table, depending on the
5723 * value of the `addremove` property.
5725 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
5726 * The configuration form this section is added to. It is automatically passed
5727 * by [section()]{@link LuCI.form.Map#section}.
5729 * @param {string} section_type
5730 * The type of the UCI section to map.
5732 * @param {string} [title]
5733 * The title caption of the form section element.
5735 * @param {string} [description]
5736 * The description text of the form section element.
5738 var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.prototype */ {
5739 __name__: 'CBI.TableSection',
5742 * If set to `true`, the user may add or remove instances from the form
5743 * section widget, otherwise only preexisting sections may be edited.
5744 * The default is `false`.
5746 * @name LuCI.form.TableSection.prototype#addremove
5752 * If set to `true`, mapped section instances are treated as anonymous
5753 * UCI sections, which means that section instance elements will be
5754 * rendered without title element and that no name is required when adding
5755 * new sections. The default is `false`.
5757 * @name LuCI.form.TableSection.prototype#anonymous
5763 * Override the caption used for the section add button at the bottom of
5764 * the section form element. If set to a string, it will be used as-is,
5765 * if set to a function, the function will be invoked and its return value
5766 * is used as caption, after converting it to a string. If this property
5767 * is not set, the default is `Add`.
5769 * @name LuCI.form.TableSection.prototype#addbtntitle
5770 * @type string|function
5775 * Override the per-section instance title caption shown in the first
5776 * column of the table unless `anonymous` is set to true. If set to a
5777 * string, it will be used as `String.format()` pattern with the name of
5778 * the underlying UCI section as first argument, if set to a function, the
5779 * function will be invoked with the section name as first argument and
5780 * its return value is used as caption, after converting it to a string.
5781 * If this property is not set, the default is the name of the underlying
5782 * UCI configuration section.
5784 * @name LuCI.form.TableSection.prototype#sectiontitle
5785 * @type string|function
5790 * Override the per-section instance modal popup title caption shown when
5791 * clicking the `More…` button in a section specifying `max_cols`. If set
5792 * to a string, it will be used as `String.format()` pattern with the name
5793 * of the underlying UCI section as first argument, if set to a function,
5794 * the function will be invoked with the section name as first argument and
5795 * its return value is used as caption, after converting it to a string.
5796 * If this property is not set, the default is the name of the underlying
5797 * UCI configuration section.
5799 * @name LuCI.form.TableSection.prototype#modaltitle
5800 * @type string|function
5805 * Override the UCI configuration name to read the section IDs from. By
5806 * default, the configuration name is inherited from the parent `Map`.
5807 * By setting this property, a deviating configuration may be specified.
5808 * The default is `null`, means inheriting from the parent form.
5810 * @name LuCI.form.TableSection.prototype#uciconfig
5816 * Specify a maximum amount of columns to display. By default, one table
5817 * column is rendered for each child option of the form section element.
5818 * When this option is set to a positive number, then no more columns than
5819 * the given amount are rendered. When the number of child options exceeds
5820 * the specified amount, a `More…` button is rendered in the last column,
5821 * opening a modal dialog presenting all options elements in `NamedSection`
5822 * style when clicked.
5824 * @name LuCI.form.TableSection.prototype#max_cols
5830 * If set to `true`, alternating `cbi-rowstyle-
1` and `cbi-rowstyle-
2` CSS
5831 * classes are added to the table row elements. Not all LuCI themes
5832 * implement these row style classes. The default is `false`.
5834 * @name LuCI.form.TableSection.prototype#rowcolors
5840 * Enables a per-section instance row `Edit` button which triggers a certain
5841 * action when clicked. If set to a string, the string value is used
5842 * as `String.format()` pattern with the name of the underlying UCI section
5843 * as first format argument. The result is then interpreted as URL which
5844 * LuCI will navigate to when the user clicks the edit button.
5846 * If set to a function, this function will be registered as click event
5847 * handler on the rendered edit button, receiving the section instance
5848 * name as first and the DOM click event as second argument.
5850 * @name LuCI.form.TableSection.prototype#extedit
5851 * @type string|function
5856 * If set to `true`, a sort button is added to the last column, allowing
5857 * the user to reorder the section instances mapped by the section form
5860 * @name LuCI.form.TableSection.prototype#sortable
5866 * If set to `true`, the header row with the options descriptions will
5867 * not be displayed. By default, descriptions row is automatically displayed
5868 * when at least one option has a description.
5870 * @name LuCI.form.TableSection.prototype#nodescriptions
5876 * The `TableSection` implementation does not support option tabbing, so
5877 * its implementation of `tab()` will always throw an exception when
5881 * @throws Throws an exception when invoked.
5884 throw 'Tabs are not supported by TableSection';
5888 renderContents: function(cfgsections, nodes) {
5889 var section_id = null,
5890 config_name = this.uciconfig || this.map.config,
5891 max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
5892 has_more = max_cols
< this.children.length,
5893 sectionEl = E('div', {
5894 'id': 'cbi-%s-%s'.format(config_name, this.sectiontype),
5895 'class': 'cbi-section cbi-tblsection',
5896 'data-tab': (this.map.tabbed
&& !this.parentoption) ? this.sectiontype : null,
5897 'data-tab-title': (this.map.tabbed
&& !this.parentoption) ? this.title || this.sectiontype : null
5899 tableEl = E('div', {
5900 'class': 'table cbi-section-table'
5903 if (this.title != null
&& this.title != '')
5904 sectionEl.appendChild(E('h3', {}, this.title));
5906 if (this.description != null
&& this.description != '')
5907 sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
5909 tableEl.appendChild(this.renderHeaderRows(max_cols));
5911 for (var i =
0; i
< nodes.length; i++) {
5912 var sectionname = this.titleFn('sectiontitle', cfgsections[i]);
5914 if (sectionname == null)
5915 sectionname = cfgsections[i];
5917 var trEl = E('div', {
5918 'id': 'cbi-%s-%s'.format(config_name, cfgsections[i]),
5919 'class': 'tr cbi-section-table-row',
5920 'data-sid': cfgsections[i],
5921 'draggable': this.sortable ? true : null,
5922 'mousedown': this.sortable ? L.bind(this.handleDragInit, this) : null,
5923 'dragstart': this.sortable ? L.bind(this.handleDragStart, this) : null,
5924 'dragover': this.sortable ? L.bind(this.handleDragOver, this) : null,
5925 'dragenter': this.sortable ? L.bind(this.handleDragEnter, this) : null,
5926 'dragleave': this.sortable ? L.bind(this.handleDragLeave, this) : null,
5927 'dragend': this.sortable ? L.bind(this.handleDragEnd, this) : null,
5928 'drop': this.sortable ? L.bind(this.handleDrop, this) : null,
5929 'data-title': (sectionname
&& (!this.anonymous || this.sectiontitle)) ? sectionname : null,
5930 'data-section-id': cfgsections[i]
5933 if (this.extedit || this.rowcolors)
5934 trEl.classList.add(!(tableEl.childNodes.length %
2)
5935 ? 'cbi-rowstyle-
1' : 'cbi-rowstyle-
2');
5937 for (var j =
0; j
< max_cols
&& nodes[i].firstChild; j++)
5938 trEl.appendChild(nodes[i].firstChild);
5940 trEl.appendChild(this.renderRowActions(cfgsections[i], has_more ? _('More…') : null));
5941 tableEl.appendChild(trEl);
5944 if (nodes.length ==
0)
5945 tableEl.appendChild(E('div', { 'class': 'tr cbi-section-table-row placeholder' },
5946 E('div', { 'class': 'td' },
5947 E('em', {}, _('This section contains no values yet')))));
5949 sectionEl.appendChild(tableEl);
5951 sectionEl.appendChild(this.renderSectionAdd('cbi-tblsection-create'));
5953 dom.bindClassInstance(sectionEl, this);
5959 renderHeaderRows: function(max_cols, has_action) {
5960 var has_titles = false,
5961 has_descriptions = false,
5962 max_cols = isNaN(this.max_cols) ? this.children.length : this.max_cols,
5963 has_more = max_cols
< this.children.length,
5964 anon_class = (!this.anonymous || this.sectiontitle) ? 'named' : 'anonymous',
5967 for (var i =
0, opt; i
< max_cols
&& (opt = this.children[i]) != null; i++) {
5971 has_titles = has_titles || !!opt.title;
5972 has_descriptions = has_descriptions || !!opt.description;
5976 var trEl = E('div', {
5977 'class': 'tr cbi-section-table-titles ' + anon_class,
5978 'data-title': (!this.anonymous || this.sectiontitle) ? _('Name') : null
5981 for (var i =
0, opt; i
< max_cols
&& (opt = this.children[i]) != null; i++) {
5985 trEl.appendChild(E('div', {
5986 'class': 'th cbi-section-table-cell',
5987 'data-widget': opt.__name__
5990 if (opt.width != null)
5991 trEl.lastElementChild.style.width =
5992 (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
5995 trEl.lastElementChild.appendChild(E('a', {
5996 'href': opt.titleref,
5997 'class': 'cbi-title-ref',
5998 'title': this.titledesc || _('Go to relevant configuration page')
6001 dom.content(trEl.lastElementChild, opt.title);
6004 if (this.sortable || this.extedit || this.addremove || has_more || has_action)
6005 trEl.appendChild(E('div', {
6006 'class': 'th cbi-section-table-cell cbi-section-actions'
6009 trEls.appendChild(trEl);
6012 if (has_descriptions
&& !this.nodescriptions) {
6013 var trEl = E('div', {
6014 'class': 'tr cbi-section-table-descr ' + anon_class
6017 for (var i =
0, opt; i
< max_cols
&& (opt = this.children[i]) != null; i++) {
6021 trEl.appendChild(E('div', {
6022 'class': 'th cbi-section-table-cell',
6023 'data-widget': opt.__name__
6024 }, opt.description));
6026 if (opt.width != null)
6027 trEl.lastElementChild.style.width =
6028 (typeof(opt.width) == 'number') ? opt.width+'px' : opt.width;
6031 if (this.sortable || this.extedit || this.addremove || has_more || has_action)
6032 trEl.appendChild(E('div', {
6033 'class': 'th cbi-section-table-cell cbi-section-actions'
6036 trEls.appendChild(trEl);
6043 renderRowActions: function(section_id, more_label) {
6044 var config_name = this.uciconfig || this.map.config;
6046 if (!this.sortable
&& !this.extedit
&& !this.addremove
&& !more_label)
6049 var tdEl = E('div', {
6050 'class': 'td cbi-section-table-cell nowrap cbi-section-actions'
6053 if (this.sortable) {
6054 dom.append(tdEl.lastElementChild, [
6056 'title': _('Drag to reorder'),
6057 'class': 'btn cbi-button drag-handle center',
6058 'style': 'cursor:move',
6059 'disabled': this.map.readonly || null
6067 if (typeof(this.extedit) == 'function')
6068 evFn = L.bind(this.extedit, this);
6069 else if (typeof(this.extedit) == 'string')
6070 evFn = L.bind(function(sid, ev) {
6071 location.href = this.extedit.format(sid);
6072 }, this, section_id);
6074 dom.append(tdEl.lastElementChild,
6077 'class': 'cbi-button cbi-button-edit',
6084 dom.append(tdEl.lastElementChild,
6086 'title': more_label,
6087 'class': 'cbi-button cbi-button-edit',
6088 'click': ui.createHandlerFn(this, 'renderMoreOptionsModal', section_id)
6093 if (this.addremove) {
6094 var btn_title = this.titleFn('removebtntitle', section_id);
6096 dom.append(tdEl.lastElementChild,
6098 'title': btn_title || _('Delete'),
6099 'class': 'cbi-button cbi-button-remove',
6100 'click': ui.createHandlerFn(this, 'handleRemove', section_id),
6101 'disabled': this.map.readonly || null
6102 }, [ btn_title || _('Delete') ])
6110 handleDragInit: function(ev) {
6111 scope.dragState = { node: ev.target };
6115 handleDragStart: function(ev) {
6116 if (!scope.dragState || !scope.dragState.node.classList.contains('drag-handle')) {
6117 scope.dragState = null;
6118 ev.preventDefault();
6122 scope.dragState.node = dom.parent(scope.dragState.node, '.tr');
6123 ev.dataTransfer.setData('text', 'drag');
6124 ev.target.style.opacity =
0.4;
6128 handleDragOver: function(ev) {
6129 var n = scope.dragState.targetNode,
6130 r = scope.dragState.rect,
6131 t = r.top + r.height /
2;
6133 if (ev.clientY
<= t) {
6134 n.classList.remove('drag-over-below');
6135 n.classList.add('drag-over-above');
6138 n.classList.remove('drag-over-above');
6139 n.classList.add('drag-over-below');
6142 ev.dataTransfer.dropEffect = 'move';
6143 ev.preventDefault();
6148 handleDragEnter: function(ev) {
6149 scope.dragState.rect = ev.currentTarget.getBoundingClientRect();
6150 scope.dragState.targetNode = ev.currentTarget;
6154 handleDragLeave: function(ev) {
6155 ev.currentTarget.classList.remove('drag-over-above');
6156 ev.currentTarget.classList.remove('drag-over-below');
6160 handleDragEnd: function(ev) {
6163 n.style.opacity = '';
6164 n.classList.add('flash');
6165 n.parentNode.querySelectorAll('.drag-over-above, .drag-over-below')
6166 .forEach(function(tr) {
6167 tr.classList.remove('drag-over-above');
6168 tr.classList.remove('drag-over-below');
6173 handleDrop: function(ev) {
6174 var s = scope.dragState;
6176 if (s.node
&& s.targetNode) {
6177 var config_name = this.uciconfig || this.map.config,
6178 ref_node = s.targetNode,
6181 if (ref_node.classList.contains('drag-over-below')) {
6182 ref_node = ref_node.nextElementSibling;
6186 var sid1 = s.node.getAttribute('data-sid'),
6187 sid2 = s.targetNode.getAttribute('data-sid');
6189 s.node.parentNode.insertBefore(s.node, ref_node);
6190 this.map.data.move(config_name, sid1, sid2, after);
6193 scope.dragState = null;
6194 ev.target.style.opacity = '';
6195 ev.stopPropagation();
6196 ev.preventDefault();
6201 handleModalCancel: function(modalMap, ev) {
6202 return Promise.resolve(ui.hideModal());
6206 handleModalSave: function(modalMap, ev) {
6207 return modalMap.save(null, true)
6208 .then(L.bind(this.map.load, this.map))
6209 .then(L.bind(this.map.reset, this.map))
6211 .catch(function() {});
6215 * Add further options to the per-section instanced modal popup.
6217 * This function may be overwritten by user code to perform additional
6218 * setup steps before displaying the more options modal which is useful to
6219 * e.g. query additional data or to inject further option elements.
6221 * The default implementation of this function does nothing.
6224 * @param {LuCI.form.NamedSection} modalSection
6225 * The `NamedSection` instance about to be rendered in the modal popup.
6227 * @param {string} section_id
6228 * The ID of the underlying UCI section the modal popup belongs to.
6231 * The DOM event emitted by clicking the `More…` button.
6233 * @returns {*|Promise
<*
>}
6234 * Return values of this function are ignored but if a promise is returned,
6235 * it is run to completion before the rendering is continued, allowing
6236 * custom logic to perform asynchroneous work before the modal dialog
6239 addModalOptions: function(modalSection, section_id, ev) {
6244 renderMoreOptionsModal: function(section_id, ev) {
6245 var parent = this.map,
6246 title = parent.title,
6248 m = new CBIMap(this.map.config, null, null),
6249 s = m.section(CBINamedSection, section_id, this.sectiontype);
6252 m.readonly = parent.readonly;
6255 s.tab_names = this.tab_names;
6257 if ((name = this.titleFn('modaltitle', section_id)) != null)
6259 else if ((name = this.titleFn('sectiontitle', section_id)) != null)
6260 title = '%s - %s'.format(parent.title, name);
6261 else if (!this.anonymous)
6262 title = '%s - %s'.format(parent.title, section_id);
6264 for (var i =
0; i
< this.children.length; i++) {
6265 var o1 = this.children[i];
6267 if (o1.modalonly === false)
6270 var o2 = s.option(o1.constructor, o1.option, o1.title, o1.description);
6273 if (!o1.hasOwnProperty(k))
6290 return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(L.bind(m.render, m)).then(L.bind(function(nodes) {
6291 ui.showModal(title, [
6293 E('div', { 'class': 'right' }, [
6296 'click': ui.createHandlerFn(this, 'handleModalCancel', m)
6297 }, [ _('Dismiss') ]), ' ',
6299 'class': 'cbi-button cbi-button-positive important',
6300 'click': ui.createHandlerFn(this, 'handleModalSave', m),
6301 'disabled': m.readonly || null
6305 }, this)).catch(L.error);
6310 * @class GridSection
6311 * @memberof LuCI.form
6312 * @augments LuCI.form.TableSection
6316 * The `GridSection` class maps all or - if `filter()` is overwritten - a
6317 * subset of the underlying UCI configuration sections of a given type.
6319 * A grid section functions similar to a {@link LuCI.form.TableSection} but
6320 * supports tabbing in the modal overlay. Option elements added with
6321 * [option()]{@link LuCI.form.GridSection#option} are shown in the table while
6322 * elements added with [taboption()]{@link LuCI.form.GridSection#taboption}
6323 * are displayed in the modal popup.
6325 * Another important difference is that the table cells show a readonly text
6326 * preview of the corresponding option elements by default, unless the child
6327 * option element is explicitely made writable by setting the `editable`
6328 * property to `true`.
6330 * Additionally, the grid section honours a `modalonly` property of child
6331 * option elements. Refer to the [AbstractValue]{@link LuCI.form.AbstractValue}
6332 * documentation for details.
6334 * Layout wise, a grid section looks mostly identical to table sections.
6336 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6337 * The configuration form this section is added to. It is automatically passed
6338 * by [section()]{@link LuCI.form.Map#section}.
6340 * @param {string} section_type
6341 * The type of the UCI section to map.
6343 * @param {string} [title]
6344 * The title caption of the form section element.
6346 * @param {string} [description]
6347 * The description text of the form section element.
6349 var CBIGridSection = CBITableSection.extend(/** @lends LuCI.form.GridSection.prototype */ {
6351 * Add an option tab to the section.
6353 * The modal option elements of a grid section may be divided into multiple
6354 * tabs to provide a better overview to the user.
6356 * Before options can be moved into a tab pane, the corresponding tab
6357 * has to be defined first, which is done by calling this function.
6359 * Note that tabs are only effective in modal popups, options added with
6360 * `option()` will not be assigned to a specific tab and are rendered in
6361 * the table view only.
6363 * @param {string} name
6364 * The name of the tab to register. It may be freely chosen and just serves
6365 * as an identifier to differentiate tabs.
6367 * @param {string} title
6368 * The human readable caption of the tab.
6370 * @param {string} [description]
6371 * An additional description text for the corresponding tab pane. It is
6372 * displayed as text paragraph below the tab but before the tab pane
6373 * contents. If omitted, no description will be rendered.
6376 * Throws an exeption if a tab with the same `name` already exists.
6378 tab: function(name, title, description) {
6379 CBIAbstractSection.prototype.tab.call(this, name, title, description);
6383 handleAdd: function(ev, name) {
6384 var config_name = this.uciconfig || this.map.config,
6385 section_id = this.map.data.add(config_name, this.sectiontype, name);
6387 this.addedSection = section_id;
6388 return this.renderMoreOptionsModal(section_id);
6392 handleModalSave: function(/* ... */) {
6393 return this.super('handleModalSave', arguments)
6394 .then(L.bind(function() { this.addedSection = null }, this));
6398 handleModalCancel: function(/* ... */) {
6399 var config_name = this.uciconfig || this.map.config;
6401 if (this.addedSection != null) {
6402 this.map.data.remove(config_name, this.addedSection);
6403 this.addedSection = null;
6406 return this.super('handleModalCancel', arguments);
6410 renderUCISection: function(section_id) {
6411 return this.renderOptions(null, section_id);
6415 renderChildren: function(tab_name, section_id, in_table) {
6416 var tasks = [], index =
0;
6418 for (var i =
0, opt; (opt = this.children[i]) != null; i++) {
6419 if (opt.disable || opt.modalonly)
6423 tasks.push(opt.render(index++, section_id, in_table));
6425 tasks.push(this.renderTextValue(section_id, opt));
6428 return Promise.all(tasks);
6432 renderTextValue: function(section_id, opt) {
6433 var title = this.stripTags(opt.title).trim(),
6434 descr = this.stripTags(opt.description).trim(),
6435 value = opt.textvalue(section_id);
6438 'class': 'td cbi-value-field',
6439 'data-title': (title != '') ? title : null,
6440 'data-description': (descr != '') ? descr : null,
6441 'data-name': opt.option,
6442 'data-widget': opt.typename || opt.__name__
6443 }, (value != null) ? value : E('em', _('none')));
6447 renderHeaderRows: function(section_id) {
6448 return this.super('renderHeaderRows', [ NaN, true ]);
6452 renderRowActions: function(section_id) {
6453 return this.super('renderRowActions', [ section_id, _('Edit') ]);
6458 var section_ids = this.cfgsections(),
6461 if (Array.isArray(this.children)) {
6462 for (var i =
0; i
< section_ids.length; i++) {
6463 for (var j =
0; j
< this.children.length; j++) {
6464 if (!this.children[j].editable || this.children[j].modalonly)
6467 tasks.push(this.children[j].parse(section_ids[i]));
6472 return Promise.all(tasks);
6477 * @class NamedSection
6478 * @memberof LuCI.form
6479 * @augments LuCI.form.AbstractSection
6483 * The `NamedSection` class maps exactly one UCI section instance which is
6484 * specified when constructing the class instance.
6486 * Layout and functionality wise, a named section is essentially a
6487 * `TypedSection` which allows exactly one section node.
6489 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6490 * The configuration form this section is added to. It is automatically passed
6491 * by [section()]{@link LuCI.form.Map#section}.
6493 * @param {string} section_id
6494 * The name (ID) of the UCI section to map.
6496 * @param {string} section_type
6497 * The type of the UCI section to map.
6499 * @param {string} [title]
6500 * The title caption of the form section element.
6502 * @param {string} [description]
6503 * The description text of the form section element.
6505 var CBINamedSection = CBIAbstractSection.extend(/** @lends LuCI.form.NamedSection.prototype */ {
6506 __name__: 'CBI.NamedSection',
6507 __init__: function(map, section_id /*, ... */) {
6508 this.super('__init__', this.varargs(arguments,
2, map));
6510 this.section = section_id;
6514 * If set to `true`, the user may remove or recreate the sole mapped
6515 * configuration instance from the form section widget, otherwise only a
6516 * preexisting section may be edited. The default is `false`.
6518 * @name LuCI.form.NamedSection.prototype#addremove
6524 * Override the UCI configuration name to read the section IDs from. By
6525 * default, the configuration name is inherited from the parent `Map`.
6526 * By setting this property, a deviating configuration may be specified.
6527 * The default is `null`, means inheriting from the parent form.
6529 * @name LuCI.form.NamedSection.prototype#uciconfig
6535 * The `NamedSection` class overwrites the generic `cfgsections()`
6536 * implementation to return a one-element array containing the mapped
6537 * section ID as sole element. User code should not normally change this.
6539 * @returns {string[]}
6540 * Returns a one-element array containing the mapped section ID.
6542 cfgsections: function() {
6543 return [ this.section ];
6547 handleAdd: function(ev) {
6548 var section_id = this.section,
6549 config_name = this.uciconfig || this.map.config;
6551 this.map.data.add(config_name, this.sectiontype, section_id);
6552 return this.map.save(null, true);
6556 handleRemove: function(ev) {
6557 var section_id = this.section,
6558 config_name = this.uciconfig || this.map.config;
6560 this.map.data.remove(config_name, section_id);
6561 return this.map.save(null, true);
6565 renderContents: function(data) {
6566 var ucidata = data[
0], nodes = data[
1],
6567 section_id = this.section,
6568 config_name = this.uciconfig || this.map.config,
6569 sectionEl = E('div', {
6570 'id': ucidata ? null : 'cbi-%s-%s'.format(config_name, section_id),
6571 'class': 'cbi-section',
6572 'data-tab': (this.map.tabbed
&& !this.parentoption) ? this.sectiontype : null,
6573 'data-tab-title': (this.map.tabbed
&& !this.parentoption) ? this.title || this.sectiontype : null
6576 if (typeof(this.title) === 'string'
&& this.title !== '')
6577 sectionEl.appendChild(E('legend', {}, this.title));
6579 if (typeof(this.description) === 'string'
&& this.description !== '')
6580 sectionEl.appendChild(E('div', { 'class': 'cbi-section-descr' }, this.description));
6583 if (this.addremove) {
6584 sectionEl.appendChild(
6585 E('div', { 'class': 'cbi-section-remove right' },
6587 'class': 'cbi-button',
6588 'click': ui.createHandlerFn(this, 'handleRemove'),
6589 'disabled': this.map.readonly || null
6590 }, [ _('Delete') ])));
6593 sectionEl.appendChild(E('div', {
6594 'id': 'cbi-%s-%s'.format(config_name, section_id),
6596 ? 'cbi-section-node cbi-section-node-tabbed' : 'cbi-section-node',
6597 'data-section-id': section_id
6600 else if (this.addremove) {
6601 sectionEl.appendChild(
6603 'class': 'cbi-button cbi-button-add',
6604 'click': ui.createHandlerFn(this, 'handleAdd'),
6605 'disabled': this.map.readonly || null
6609 dom.bindClassInstance(sectionEl, this);
6615 render: function() {
6616 var config_name = this.uciconfig || this.map.config,
6617 section_id = this.section;
6619 return Promise.all([
6620 this.map.data.get(config_name, section_id),
6621 this.renderUCISection(section_id)
6622 ]).then(this.renderContents.bind(this));
6628 * @memberof LuCI.form
6629 * @augments LuCI.form.AbstractValue
6633 * The `Value` class represents a simple one-line form input using the
6634 * {@link LuCI.ui.Textfield} or - in case choices are added - the
6635 * {@link LuCI.ui.Combobox} class as underlying widget.
6637 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6638 * The configuration form this section is added to. It is automatically passed
6639 * by [option()]{@link LuCI.form.AbstractSection#option} or
6640 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6641 * option to the section.
6643 * @param {LuCI.form.AbstractSection} section
6644 * The configuration section this option is added to. It is automatically passed
6645 * by [option()]{@link LuCI.form.AbstractSection#option} or
6646 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6647 * option to the section.
6649 * @param {string} option
6650 * The name of the UCI option to map.
6652 * @param {string} [title]
6653 * The title caption of the option element.
6655 * @param {string} [description]
6656 * The description text of the option element.
6658 var CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */ {
6659 __name__: 'CBI.Value',
6662 * If set to `true`, the field is rendered as password input, otherwise
6663 * as plain text input.
6665 * @name LuCI.form.Value.prototype#password
6671 * Set a placeholder string to use when the input field is empty.
6673 * @name LuCI.form.Value.prototype#placeholder
6679 * Add a predefined choice to the form option. By adding one or more
6680 * choices, the plain text input field is turned into a combobox widget
6681 * which prompts the user to select a predefined choice, or to enter a
6684 * @param {string} key
6685 * The choice value to add.
6687 * @param {Node|string} value
6688 * The caption for the choice value. May be a DOM node, a document fragment
6689 * or a plain text string. If omitted, the `key` value is used as caption.
6691 value: function(key, val) {
6692 this.keylist = this.keylist || [];
6693 this.keylist.push(String(key));
6695 this.vallist = this.vallist || [];
6696 this.vallist.push(dom.elem(val) ? val : String(val != null ? val : key));
6700 render: function(option_index, section_id, in_table) {
6701 return Promise.resolve(this.cfgvalue(section_id))
6702 .then(this.renderWidget.bind(this, section_id, option_index))
6703 .then(this.renderFrame.bind(this, section_id, in_table, option_index));
6707 handleValueChange: function(section_id, state, ev) {
6708 if (typeof(this.onchange) != 'function')
6711 var value = this.formvalue(section_id);
6713 if (isEqual(value, state.previousValue))
6716 state.previousValue = value;
6717 this.onchange.call(this, ev, section_id, value);
6721 renderFrame: function(section_id, in_table, option_index, nodes) {
6722 var config_name = this.uciconfig || this.section.uciconfig || this.map.config,
6723 depend_list = this.transformDepList(section_id),
6727 var title = this.stripTags(this.title).trim();
6728 optionEl = E('div', {
6729 'class': 'td cbi-value-field',
6730 'data-title': (title != '') ? title : null,
6731 'data-description': this.stripTags(this.description).trim(),
6732 'data-name': this.option,
6733 'data-widget': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
6735 'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
6736 'data-index': option_index,
6737 'data-depends': depend_list,
6738 'data-field': this.cbid(section_id)
6742 optionEl = E('div', {
6743 'class': 'cbi-value',
6744 'id': 'cbi-%s-%s-%s'.format(config_name, section_id, this.option),
6745 'data-index': option_index,
6746 'data-depends': depend_list,
6747 'data-field': this.cbid(section_id),
6748 'data-name': this.option,
6749 'data-widget': this.typename || (this.template ? this.template.replace(/^.+\//, '') : null) || this.__name__
6752 if (this.last_child)
6753 optionEl.classList.add('cbi-value-last');
6755 if (typeof(this.title) === 'string'
&& this.title !== '') {
6756 optionEl.appendChild(E('label', {
6757 'class': 'cbi-value-title',
6758 'for': 'widget.cbid.%s.%s.%s'.format(config_name, section_id, this.option),
6759 'click': function(ev) {
6760 var node = ev.currentTarget,
6761 elem = node.nextElementSibling.querySelector('#' + node.getAttribute('for')) || node.nextElementSibling.querySelector('[
data-widget-id=
"' + node.getAttribute('for') + '"]');
6769 this.titleref ? E('a', {
6770 'class': 'cbi-title-ref',
6771 'href': this.titleref,
6772 'title': this.titledesc || _('Go to relevant configuration page')
6773 }, this.title) : this.title));
6775 optionEl.appendChild(E('div', { 'class': 'cbi-value-field' }));
6780 (optionEl.lastChild || optionEl).appendChild(nodes);
6782 if (!in_table
&& typeof(this.description) === 'string'
&& this.description !== '')
6783 dom.append(optionEl.lastChild || optionEl,
6784 E('div', { 'class': 'cbi-value-description' }, this.description));
6786 if (depend_list
&& depend_list.length)
6787 optionEl.classList.add('hidden');
6789 optionEl.addEventListener('widget-change',
6790 L.bind(this.handleValueChange, this, section_id, {}));
6792 optionEl.addEventListener('widget-change',
6793 L.bind(this.map.checkDepends, this.map));
6795 dom.bindClassInstance(optionEl, this);
6801 renderWidget: function(section_id, option_index, cfgvalue) {
6802 var value = (cfgvalue != null) ? cfgvalue : this.default,
6803 choices = this.transformChoices(),
6807 var placeholder = (this.optional || this.rmempty)
6808 ? E('em', _('unspecified')) : _('-- Please choose --');
6810 widget = new ui.Combobox(Array.isArray(value) ? value.join(' ') : value, choices, {
6811 id: this.cbid(section_id),
6813 optional: this.optional || this.rmempty,
6814 datatype: this.datatype,
6815 select_placeholder: this.placeholder || placeholder,
6816 validate: L.bind(this.validate, this, section_id),
6817 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
6821 widget = new ui.Textfield(Array.isArray(value) ? value.join(' ') : value, {
6822 id: this.cbid(section_id),
6823 password: this.password,
6824 optional: this.optional || this.rmempty,
6825 datatype: this.datatype,
6826 placeholder: this.placeholder,
6827 validate: L.bind(this.validate, this, section_id),
6828 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
6832 return widget.render();
6837 * @class DynamicList
6838 * @memberof LuCI.form
6839 * @augments LuCI.form.Value
6843 * The `DynamicList` class represents a multi value widget allowing the user
6844 * to enter multiple unique values, optionally selected from a set of
6845 * predefined choices. It builds upon the {@link LuCI.ui.DynamicList} widget.
6847 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6848 * The configuration form this section is added to. It is automatically passed
6849 * by [option()]{@link LuCI.form.AbstractSection#option} or
6850 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6851 * option to the section.
6853 * @param {LuCI.form.AbstractSection} section
6854 * The configuration section this option is added to. It is automatically passed
6855 * by [option()]{@link LuCI.form.AbstractSection#option} or
6856 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6857 * option to the section.
6859 * @param {string} option
6860 * The name of the UCI option to map.
6862 * @param {string} [title]
6863 * The title caption of the option element.
6865 * @param {string} [description]
6866 * The description text of the option element.
6868 var CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype */ {
6869 __name__: 'CBI.DynamicList',
6872 renderWidget: function(section_id, option_index, cfgvalue) {
6873 var value = (cfgvalue != null) ? cfgvalue : this.default,
6874 choices = this.transformChoices(),
6875 items = L.toArray(value);
6877 var widget = new ui.DynamicList(items, choices, {
6878 id: this.cbid(section_id),
6880 optional: this.optional || this.rmempty,
6881 datatype: this.datatype,
6882 placeholder: this.placeholder,
6883 validate: L.bind(this.validate, this, section_id),
6884 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
6887 return widget.render();
6893 * @memberof LuCI.form
6894 * @augments LuCI.form.Value
6898 * The `ListValue` class implements a simple static HTML select element
6899 * allowing the user to chose a single value from a set of predefined choices.
6900 * It builds upon the {@link LuCI.ui.Select} widget.
6902 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6903 * The configuration form this section is added to. It is automatically passed
6904 * by [option()]{@link LuCI.form.AbstractSection#option} or
6905 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6906 * option to the section.
6908 * @param {LuCI.form.AbstractSection} section
6909 * The configuration section this option is added to. It is automatically passed
6910 * by [option()]{@link LuCI.form.AbstractSection#option} or
6911 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6912 * option to the section.
6914 * @param {string} option
6915 * The name of the UCI option to map.
6917 * @param {string} [title]
6918 * The title caption of the option element.
6920 * @param {string} [description]
6921 * The description text of the option element.
6923 var CBIListValue = CBIValue.extend(/** @lends LuCI.form.ListValue.prototype */ {
6924 __name__: 'CBI.ListValue',
6926 __init__: function() {
6927 this.super('__init__', arguments);
6928 this.widget = 'select';
6929 this.orientation = 'horizontal';
6934 * Set the size attribute of the underlying HTML select element.
6936 * @name LuCI.form.ListValue.prototype#size
6942 * Set the type of the underlying form controls.
6944 * May be one of `select` or `radio`. If set to `select`, an HTML
6945 * select element is rendered, otherwise a collection of `radio`
6948 * @name LuCI.form.ListValue.prototype#widget
6954 * Set the orientation of the underlying radio or checkbox elements.
6956 * May be one of `horizontal` or `vertical`. Only applies to non-select
6959 * @name LuCI.form.ListValue.prototype#orientation
6961 * @default horizontal
6965 renderWidget: function(section_id, option_index, cfgvalue) {
6966 var choices = this.transformChoices();
6967 var widget = new ui.Select((cfgvalue != null) ? cfgvalue : this.default, choices, {
6968 id: this.cbid(section_id),
6971 widget: this.widget,
6972 optional: this.optional,
6973 orientation: this.orientation,
6974 placeholder: this.placeholder,
6975 validate: L.bind(this.validate, this, section_id),
6976 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
6979 return widget.render();
6985 * @memberof LuCI.form
6986 * @augments LuCI.form.Value
6990 * The `FlagValue` element builds upon the {@link LuCI.ui.Checkbox} widget to
6991 * implement a simple checkbox element.
6993 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
6994 * The configuration form this section is added to. It is automatically passed
6995 * by [option()]{@link LuCI.form.AbstractSection#option} or
6996 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
6997 * option to the section.
6999 * @param {LuCI.form.AbstractSection} section
7000 * The configuration section this option is added to. It is automatically passed
7001 * by [option()]{@link LuCI.form.AbstractSection#option} or
7002 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7003 * option to the section.
7005 * @param {string} option
7006 * The name of the UCI option to map.
7008 * @param {string} [title]
7009 * The title caption of the option element.
7011 * @param {string} [description]
7012 * The description text of the option element.
7014 var CBIFlagValue = CBIValue.extend(/** @lends LuCI.form.FlagValue.prototype */ {
7015 __name__: 'CBI.FlagValue',
7017 __init__: function() {
7018 this.super('__init__', arguments);
7021 this.disabled = '
0';
7022 this.default = this.disabled;
7026 * Sets the input value to use for the checkbox checked state.
7028 * @name LuCI.form.FlagValue.prototype#enabled
7034 * Sets the input value to use for the checkbox unchecked state.
7036 * @name LuCI.form.FlagValue.prototype#disabled
7042 renderWidget: function(section_id, option_index, cfgvalue) {
7043 var widget = new ui.Checkbox((cfgvalue != null) ? cfgvalue : this.default, {
7044 id: this.cbid(section_id),
7045 value_enabled: this.enabled,
7046 value_disabled: this.disabled,
7047 validate: L.bind(this.validate, this, section_id),
7048 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
7051 return widget.render();
7055 * Query the checked state of the underlying checkbox widget and return
7056 * either the `enabled` or the `disabled` property value, depending on
7057 * the checked state.
7061 formvalue: function(section_id) {
7062 var elem = this.getUIElement(section_id),
7063 checked = elem ? elem.isChecked() : false;
7064 return checked ? this.enabled : this.disabled;
7068 * Query the checked state of the underlying checkbox widget and return
7069 * either a localized `Yes` or `No` string, depending on the checked state.
7073 textvalue: function(section_id) {
7074 var cval = this.cfgvalue(section_id);
7077 cval = this.default;
7079 return (cval == this.enabled) ? _('Yes') : _('No');
7083 parse: function(section_id) {
7084 if (this.isActive(section_id)) {
7085 var fval = this.formvalue(section_id);
7087 if (!this.isValid(section_id)) {
7088 var title = this.stripTags(this.title).trim();
7089 return Promise.reject(new TypeError(_('Option
"%s" contains an invalid input value.').format(title || this.option)));
7092 if (fval == this.default
&& (this.optional || this.rmempty))
7093 return Promise.resolve(this.remove(section_id));
7095 return Promise.resolve(this.write(section_id, fval));
7098 return Promise.resolve(this.remove(section_id));
7105 * @memberof LuCI.form
7106 * @augments LuCI.form.DynamicList
7110 * The `MultiValue` class is a modified variant of the `DynamicList` element
7111 * which leverages the {@link LuCI.ui.Dropdown} widget to implement a multi
7112 * select dropdown element.
7114 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7115 * The configuration form this section is added to. It is automatically passed
7116 * by [option()]{@link LuCI.form.AbstractSection#option} or
7117 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7118 * option to the section.
7120 * @param {LuCI.form.AbstractSection} section
7121 * The configuration section this option is added to. It is automatically passed
7122 * by [option()]{@link LuCI.form.AbstractSection#option} or
7123 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7124 * option to the section.
7126 * @param {string} option
7127 * The name of the UCI option to map.
7129 * @param {string} [title]
7130 * The title caption of the option element.
7132 * @param {string} [description]
7133 * The description text of the option element.
7135 var CBIMultiValue = CBIDynamicList.extend(/** @lends LuCI.form.MultiValue.prototype */ {
7136 __name__: 'CBI.MultiValue',
7138 __init__: function() {
7139 this.super('__init__', arguments);
7140 this.placeholder = _('-- Please choose --');
7144 * Allows to specify the [display_items]{@link LuCI.ui.Dropdown.InitOptions}
7145 * property of the underlying dropdown widget. If omitted, the value of
7146 * the `size` property is used or `
3` when `size` is unspecified as well.
7148 * @name LuCI.form.MultiValue.prototype#display_size
7154 * Allows to specify the [dropdown_items]{@link LuCI.ui.Dropdown.InitOptions}
7155 * property of the underlying dropdown widget. If omitted, the value of
7156 * the `size` property is used or `-
1` when `size` is unspecified as well.
7158 * @name LuCI.form.MultiValue.prototype#dropdown_size
7164 renderWidget: function(section_id, option_index, cfgvalue) {
7165 var value = (cfgvalue != null) ? cfgvalue : this.default,
7166 choices = this.transformChoices();
7168 var widget = new ui.Dropdown(L.toArray(value), choices, {
7169 id: this.cbid(section_id),
7172 optional: this.optional || this.rmempty,
7173 select_placeholder: this.placeholder,
7174 display_items: this.display_size || this.size ||
3,
7175 dropdown_items: this.dropdown_size || this.size || -
1,
7176 validate: L.bind(this.validate, this, section_id),
7177 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
7180 return widget.render();
7186 * @memberof LuCI.form
7187 * @augments LuCI.form.Value
7191 * The `TextValue` class implements a multi-line textarea input using
7192 * {@link LuCI.ui.Textarea}.
7194 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7195 * The configuration form this section is added to. It is automatically passed
7196 * by [option()]{@link LuCI.form.AbstractSection#option} or
7197 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7198 * option to the section.
7200 * @param {LuCI.form.AbstractSection} section
7201 * The configuration section this option is added to. It is automatically passed
7202 * by [option()]{@link LuCI.form.AbstractSection#option} or
7203 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7204 * option to the section.
7206 * @param {string} option
7207 * The name of the UCI option to map.
7209 * @param {string} [title]
7210 * The title caption of the option element.
7212 * @param {string} [description]
7213 * The description text of the option element.
7215 var CBITextValue = CBIValue.extend(/** @lends LuCI.form.TextValue.prototype */ {
7216 __name__: 'CBI.TextValue',
7222 * Enforces the use of a monospace font for the textarea contents when set
7225 * @name LuCI.form.TextValue.prototype#monospace
7231 * Allows to specify the [cols]{@link LuCI.ui.Textarea.InitOptions}
7232 * property of the underlying textarea widget.
7234 * @name LuCI.form.TextValue.prototype#cols
7240 * Allows to specify the [rows]{@link LuCI.ui.Textarea.InitOptions}
7241 * property of the underlying textarea widget.
7243 * @name LuCI.form.TextValue.prototype#rows
7249 * Allows to specify the [wrap]{@link LuCI.ui.Textarea.InitOptions}
7250 * property of the underlying textarea widget.
7252 * @name LuCI.form.TextValue.prototype#wrap
7258 renderWidget: function(section_id, option_index, cfgvalue) {
7259 var value = (cfgvalue != null) ? cfgvalue : this.default;
7261 var widget = new ui.Textarea(value, {
7262 id: this.cbid(section_id),
7263 optional: this.optional || this.rmempty,
7264 placeholder: this.placeholder,
7265 monospace: this.monospace,
7269 validate: L.bind(this.validate, this, section_id),
7270 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
7273 return widget.render();
7279 * @memberof LuCI.form
7280 * @augments LuCI.form.Value
7284 * The `DummyValue` element wraps an {@link LuCI.ui.Hiddenfield} widget and
7285 * renders the underlying UCI option or default value as readonly text.
7287 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7288 * The configuration form this section is added to. It is automatically passed
7289 * by [option()]{@link LuCI.form.AbstractSection#option} or
7290 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7291 * option to the section.
7293 * @param {LuCI.form.AbstractSection} section
7294 * The configuration section this option is added to. It is automatically passed
7295 * by [option()]{@link LuCI.form.AbstractSection#option} or
7296 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7297 * option to the section.
7299 * @param {string} option
7300 * The name of the UCI option to map.
7302 * @param {string} [title]
7303 * The title caption of the option element.
7305 * @param {string} [description]
7306 * The description text of the option element.
7308 var CBIDummyValue = CBIValue.extend(/** @lends LuCI.form.DummyValue.prototype */ {
7309 __name__: 'CBI.DummyValue',
7312 * Set an URL which is opened when clicking on the dummy value text.
7314 * By setting this property, the dummy value text is wrapped in an `
<a
>`
7315 * element with the property value used as `href` attribute.
7317 * @name LuCI.form.DummyValue.prototype#href
7323 * Treat the UCI option value (or the `default` property value) as HTML.
7325 * By default, the value text is HTML escaped before being rendered as
7326 * text. In some cases it may be needed to actually interpret and render
7327 * HTML contents as-is. When set to `true`, HTML escaping is disabled.
7329 * @name LuCI.form.DummyValue.prototype#rawhtml
7335 renderWidget: function(section_id, option_index, cfgvalue) {
7336 var value = (cfgvalue != null) ? cfgvalue : this.default,
7337 hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
7338 outputEl = E('div');
7340 if (this.href
&& !((this.readonly != null) ? this.readonly : this.map.readonly))
7341 outputEl.appendChild(E('a', { 'href': this.href }));
7343 dom.append(outputEl.lastChild || outputEl,
7344 this.rawhtml ? value : [ value ]);
7353 remove: function() {},
7356 write: function() {}
7360 * @class ButtonValue
7361 * @memberof LuCI.form
7362 * @augments LuCI.form.Value
7366 * The `DummyValue` element wraps an {@link LuCI.ui.Hiddenfield} widget and
7367 * renders the underlying UCI option or default value as readonly text.
7369 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7370 * The configuration form this section is added to. It is automatically passed
7371 * by [option()]{@link LuCI.form.AbstractSection#option} or
7372 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7373 * option to the section.
7375 * @param {LuCI.form.AbstractSection} section
7376 * The configuration section this option is added to. It is automatically passed
7377 * by [option()]{@link LuCI.form.AbstractSection#option} or
7378 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7379 * option to the section.
7381 * @param {string} option
7382 * The name of the UCI option to map.
7384 * @param {string} [title]
7385 * The title caption of the option element.
7387 * @param {string} [description]
7388 * The description text of the option element.
7390 var CBIButtonValue = CBIValue.extend(/** @lends LuCI.form.ButtonValue.prototype */ {
7391 __name__: 'CBI.ButtonValue',
7394 * Override the rendered button caption.
7396 * By default, the option title - which is passed as fourth argument to the
7397 * constructor - is used as caption for the button element. When setting
7398 * this property to a string, it is used as `String.format()` pattern with
7399 * the underlying UCI section name passed as first format argument. When
7400 * set to a function, it is invoked passing the section ID as sole argument
7401 * and the resulting return value is converted to a string before being
7402 * used as button caption.
7404 * The default is `null`, means the option title is used as caption.
7406 * @name LuCI.form.ButtonValue.prototype#inputtitle
7407 * @type string|function
7412 * Override the button style class.
7414 * By setting this property, a specific `cbi-button-*` CSS class can be
7415 * selected to influence the style of the resulting button.
7417 * Suitable values which are implemented by most themes are `positive`,
7418 * `negative` and `primary`.
7420 * The default is `null`, means a neutral button styling is used.
7422 * @name LuCI.form.ButtonValue.prototype#inputstyle
7428 * Override the button click action.
7430 * By default, the underlying UCI option (or default property) value is
7431 * copied into a hidden field tied to the button element and the save
7432 * action is triggered on the parent form element.
7434 * When this property is set to a function, it is invoked instead of
7435 * performing the default actions. The handler function will receive the
7436 * DOM click element as first and the underlying configuration section ID
7437 * as second argument.
7439 * @name LuCI.form.ButtonValue.prototype#onclick
7445 renderWidget: function(section_id, option_index, cfgvalue) {
7446 var value = (cfgvalue != null) ? cfgvalue : this.default,
7447 hiddenEl = new ui.Hiddenfield(value, { id: this.cbid(section_id) }),
7448 outputEl = E('div'),
7449 btn_title = this.titleFn('inputtitle', section_id) || this.titleFn('title', section_id);
7451 if (value !== false)
7452 dom.content(outputEl, [
7454 'class': 'cbi-button cbi-button-%s'.format(this.inputstyle || 'button'),
7455 'click': ui.createHandlerFn(this, function(section_id, ev) {
7457 return this.onclick(ev, section_id);
7459 ev.currentTarget.parentNode.nextElementSibling.value = value;
7460 return this.map.save();
7462 'disabled': ((this.readonly != null) ? this.readonly : this.map.readonly) || null
7466 dom.content(outputEl, ' - ');
7476 * @class HiddenValue
7477 * @memberof LuCI.form
7478 * @augments LuCI.form.Value
7482 * The `HiddenValue` element wraps an {@link LuCI.ui.Hiddenfield} widget.
7484 * Hidden value widgets used to be necessary in legacy code which actually
7485 * submitted the underlying HTML form the server. With client side handling of
7486 * forms, there are more efficient ways to store hidden state data.
7488 * Since this widget has no visible content, the title and description values
7489 * of this form element should be set to `null` as well to avoid a broken or
7490 * distorted form layout when rendering the option element.
7492 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7493 * The configuration form this section is added to. It is automatically passed
7494 * by [option()]{@link LuCI.form.AbstractSection#option} or
7495 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7496 * option to the section.
7498 * @param {LuCI.form.AbstractSection} section
7499 * The configuration section this option is added to. It is automatically passed
7500 * by [option()]{@link LuCI.form.AbstractSection#option} or
7501 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7502 * option to the section.
7504 * @param {string} option
7505 * The name of the UCI option to map.
7507 * @param {string} [title]
7508 * The title caption of the option element.
7510 * @param {string} [description]
7511 * The description text of the option element.
7513 var CBIHiddenValue = CBIValue.extend(/** @lends LuCI.form.HiddenValue.prototype */ {
7514 __name__: 'CBI.HiddenValue',
7517 renderWidget: function(section_id, option_index, cfgvalue) {
7518 var widget = new ui.Hiddenfield((cfgvalue != null) ? cfgvalue : this.default, {
7519 id: this.cbid(section_id)
7522 return widget.render();
7528 * @memberof LuCI.form
7529 * @augments LuCI.form.Value
7533 * The `FileUpload` element wraps an {@link LuCI.ui.FileUpload} widget and
7534 * offers the ability to browse, upload and select remote files.
7536 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7537 * The configuration form this section is added to. It is automatically passed
7538 * by [option()]{@link LuCI.form.AbstractSection#option} or
7539 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7540 * option to the section.
7542 * @param {LuCI.form.AbstractSection} section
7543 * The configuration section this option is added to. It is automatically passed
7544 * by [option()]{@link LuCI.form.AbstractSection#option} or
7545 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7546 * option to the section.
7548 * @param {string} option
7549 * The name of the UCI option to map.
7551 * @param {string} [title]
7552 * The title caption of the option element.
7554 * @param {string} [description]
7555 * The description text of the option element.
7557 var CBIFileUpload = CBIValue.extend(/** @lends LuCI.form.FileUpload.prototype */ {
7558 __name__: 'CBI.FileSelect',
7560 __init__: function(/* ... */) {
7561 this.super('__init__', arguments);
7563 this.show_hidden = false;
7564 this.enable_upload = true;
7565 this.enable_remove = true;
7566 this.root_directory = '/etc/luci-uploads';
7570 * Toggle display of hidden files.
7572 * Display hidden files when rendering the remote directory listing.
7573 * Note that this is merely a cosmetic feature, hidden files are always
7574 * included in received remote file listings.
7576 * The default is `false`, means hidden files are not displayed.
7578 * @name LuCI.form.FileUpload.prototype#show_hidden
7584 * Toggle file upload functionality.
7586 * When set to `true`, the underlying widget provides a button which lets
7587 * the user select and upload local files to the remote system.
7588 * Note that this is merely a cosmetic feature, remote upload access is
7589 * controlled by the session ACL rules.
7591 * The default is `true`, means file upload functionality is displayed.
7593 * @name LuCI.form.FileUpload.prototype#enable_upload
7599 * Toggle remote file delete functionality.
7601 * When set to `true`, the underlying widget provides a buttons which let
7602 * the user delete files from remote directories. Note that this is merely
7603 * a cosmetic feature, remote delete permissions are controlled by the
7604 * session ACL rules.
7606 * The default is `true`, means file removal buttons are displayed.
7608 * @name LuCI.form.FileUpload.prototype#enable_remove
7614 * Specify the root directory for file browsing.
7616 * This property defines the topmost directory the file browser widget may
7617 * navigate to, the UI will not allow browsing directories outside this
7618 * prefix. Note that this is merely a cosmetic feature, remote file access
7619 * and directory listing permissions are controlled by the session ACL
7622 * The default is `/etc/luci-uploads`.
7624 * @name LuCI.form.FileUpload.prototype#root_directory
7626 * @default /etc/luci-uploads
7630 renderWidget: function(section_id, option_index, cfgvalue) {
7631 var browserEl = new ui.FileUpload((cfgvalue != null) ? cfgvalue : this.default, {
7632 id: this.cbid(section_id),
7633 name: this.cbid(section_id),
7634 show_hidden: this.show_hidden,
7635 enable_upload: this.enable_upload,
7636 enable_remove: this.enable_remove,
7637 root_directory: this.root_directory,
7638 disabled: (this.readonly != null) ? this.readonly : this.map.readonly
7641 return browserEl.render();
7646 * @class SectionValue
7647 * @memberof LuCI.form
7648 * @augments LuCI.form.Value
7652 * The `SectionValue` widget embeds a form section element within an option
7653 * element container, allowing to nest form sections into other sections.
7655 * @param {LuCI.form.Map|LuCI.form.JSONMap} form
7656 * The configuration form this section is added to. It is automatically passed
7657 * by [option()]{@link LuCI.form.AbstractSection#option} or
7658 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7659 * option to the section.
7661 * @param {LuCI.form.AbstractSection} section
7662 * The configuration section this option is added to. It is automatically passed
7663 * by [option()]{@link LuCI.form.AbstractSection#option} or
7664 * [taboption()]{@link LuCI.form.AbstractSection#taboption} when adding the
7665 * option to the section.
7667 * @param {string} option
7668 * The internal name of the option element holding the section. Since a section
7669 * container element does not read or write any configuration itself, the name
7670 * is only used internally and does not need to relate to any underlying UCI
7673 * @param {LuCI.form.AbstractSection} subsection_class
7674 * The class to use for instantiating the nested section element. Note that
7675 * the class value itself is expected here, not a class instance obtained by
7676 * calling `new`. The given class argument must be a subclass of the
7677 * `AbstractSection` class.
7679 * @param {...*} [class_args]
7680 * All further arguments are passed as-is to the subclass constructor. Refer
7681 * to the corresponding class constructor documentations for details.
7683 var CBISectionValue = CBIValue.extend(/** @lends LuCI.form.SectionValue.prototype */ {
7684 __name__: 'CBI.ContainerValue',
7685 __init__: function(map, section, option, cbiClass /*, ... */) {
7686 this.super('__init__', [map, section, option]);
7688 if (!CBIAbstractSection.isSubclass(cbiClass))
7689 throw 'Sub section must be a descendent of CBIAbstractSection';
7691 this.subsection = cbiClass.instantiate(this.varargs(arguments,
4, this.map));
7692 this.subsection.parentoption = this;
7696 * Access the embedded section instance.
7698 * This property holds a reference to the instantiated nested section.
7700 * @name LuCI.form.SectionValue.prototype#subsection
7701 * @type LuCI.form.AbstractSection
7706 load: function(section_id) {
7707 return this.subsection.load(section_id);
7711 parse: function(section_id) {
7712 return this.subsection.parse(section_id);
7716 renderWidget: function(section_id, option_index, cfgvalue) {
7717 return this.subsection.render(section_id);
7721 checkDepends: function(section_id) {
7722 this.subsection.checkDepends(section_id);
7723 return CBIValue.prototype.checkDepends.apply(this, [ section_id ]);
7727 * Since the section container is not rendering an own widget,
7728 * its `value()` implementation is a no-op.
7732 value: function() {},
7735 * Since the section container is not tied to any UCI configuration,
7736 * its `write()` implementation is a no-op.
7740 write: function() {},
7743 * Since the section container is not tied to any UCI configuration,
7744 * its `remove()` implementation is a no-op.
7748 remove: function() {},
7751 * Since the section container is not tied to any UCI configuration,
7752 * its `cfgvalue()` implementation will always return `null`.
7757 cfgvalue: function() { return null },
7760 * Since the section container is not tied to any UCI configuration,
7761 * its `formvalue()` implementation will always return `null`.
7766 formvalue: function() { return null }
7775 * The LuCI form class provides high level abstractions for creating creating
7776 * UCI- or JSON backed configurations forms.
7778 * To import the class in views, use `'require form'`, to import it in
7779 * external JavaScript, use `L.require(
"form").then(...)`.
7781 * A typical form is created by first constructing a
7782 * {@link LuCI.form.Map} or {@link LuCI.form.JSONMap} instance using `new` and
7783 * by subsequently adding sections and options to it. Finally
7784 * [render()]{@link LuCI.form.Map#render} is invoked on the instance to
7785 * assemble the HTML markup and insert it into the DOM.
7795 * m = new form.Map('example', 'Example form',
7796 * 'This is an example form mapping the contents of /etc/config/example');
7798 * s = m.section(form.NamedSection, 'first_section', 'example', 'The first section',
7799 * 'This sections maps
"config example first_section" of /etc/config/example');
7801 * o = s.option(form.Flag, 'some_bool', 'A checkbox option');
7803 * o = s.option(form.ListValue, 'some_choice', 'A select element');
7804 * o.value('choice1', 'The first choice');
7805 * o.value('choice2', 'The second choice');
7807 * m.render().then(function(node) {
7808 * document.body.appendChild(node);
7812 return baseclass.extend(/** @lends LuCI.form.prototype */ {
7814 JSONMap: CBIJSONMap,
7815 AbstractSection: CBIAbstractSection,
7816 AbstractValue: CBIAbstractValue,
7818 TypedSection: CBITypedSection,
7819 TableSection: CBITableSection,
7820 GridSection: CBIGridSection,
7821 NamedSection: CBINamedSection,
7824 DynamicList: CBIDynamicList,
7825 ListValue: CBIListValue,
7827 MultiValue: CBIMultiValue,
7828 TextValue: CBITextValue,
7829 DummyValue: CBIDummyValue,
7830 Button: CBIButtonValue,
7831 HiddenValue: CBIHiddenValue,
7832 FileUpload: CBIFileUpload,
7833 SectionValue: CBISectionValue
7847 Documentation generated by
<a href=
"https://github.com/jsdoc3/jsdoc">JSDoc
3.6.3</a> on Thu Aug
06 2020 17:
58:
02 GMT+
0200 (Central European Summer Time)
7851 <script>prettyPrint();
</script>
7852 <script src=
"scripts/jaguar.js"></script>