From: jow- args array beginning with
diff --git a/jsapi/LuCI.dom.html b/jsapi/LuCI.dom.html
index d0b6c6b1e9..61de4ff08f 100644
--- a/jsapi/LuCI.dom.html
+++ b/jsapi/LuCI.dom.html
@@ -6328,7 +6328,7 @@ ignored, else not.
key value is used as captio
@@ -7580,7 +7580,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.DynamicList.html b/jsapi/LuCI.form.DynamicList.html
index 97f8dfdec1..593887d6cd 100644
--- a/jsapi/LuCI.form.DynamicList.html
+++ b/jsapi/LuCI.form.DynamicList.html
@@ -3556,7 +3556,7 @@ predefined choices. It builds upon the
@@ -7124,7 +7124,7 @@ was neither a string nor a function.
@@ -7431,7 +7431,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.FileUpload.html b/jsapi/LuCI.form.FileUpload.html
index 9f0629ea04..d181843976 100644
--- a/jsapi/LuCI.form.FileUpload.html
+++ b/jsapi/LuCI.form.FileUpload.html
@@ -3555,7 +3555,7 @@ offers the ability to browse, upload and select remote files.
@@ -7335,7 +7335,7 @@ was neither a string nor a function.
@@ -7642,7 +7642,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.FlagValue.html b/jsapi/LuCI.form.FlagValue.html
index f7220f768b..026e690275 100644
--- a/jsapi/LuCI.form.FlagValue.html
+++ b/jsapi/LuCI.form.FlagValue.html
@@ -3555,7 +3555,7 @@ implement a simple checkbox element.
@@ -5438,7 +5438,7 @@ argument, this parameter is ignored.
@@ -6420,7 +6420,7 @@ so it may return promises if overridden by user code.
@@ -6843,7 +6843,7 @@ implement alternative removal logic, e.g. to retain the original value.
@@ -7213,7 +7213,7 @@ was neither a string nor a function.
@@ -7520,7 +7520,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.GridSection.html b/jsapi/LuCI.form.GridSection.html
index 938024d9fa..0faead3dcb 100644
--- a/jsapi/LuCI.form.GridSection.html
+++ b/jsapi/LuCI.form.GridSection.html
@@ -3568,7 +3568,7 @@ documentation for details.
@@ -4581,7 +4581,7 @@ The default is null, means inheriting from the parent form.
@@ -6137,7 +6137,7 @@ descendent of AbstractValue.
@@ -6390,7 +6390,7 @@ not meeting the validation constraints of their respective elements.
@@ -7078,7 +7078,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.HiddenValue.html b/jsapi/LuCI.form.HiddenValue.html
index caa500a0b7..d6f7f588b9 100644
--- a/jsapi/LuCI.form.HiddenValue.html
+++ b/jsapi/LuCI.form.HiddenValue.html
@@ -3560,7 +3560,7 @@ distorted form layout when rendering the option element.
@@ -7128,7 +7128,7 @@ was neither a string nor a function.
@@ -7435,7 +7435,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.JSONMap.html b/jsapi/LuCI.form.JSONMap.html
index 1333893b9f..4ae8de80dc 100644
--- a/jsapi/LuCI.form.JSONMap.html
+++ b/jsapi/LuCI.form.JSONMap.html
@@ -5896,7 +5896,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.ListValue.html b/jsapi/LuCI.form.ListValue.html
index 43011f27f8..82faab7f2d 100644
--- a/jsapi/LuCI.form.ListValue.html
+++ b/jsapi/LuCI.form.ListValue.html
@@ -3556,7 +3556,7 @@ It builds upon the LuCI.ui.Select
@@ -7273,7 +7273,7 @@ was neither a string nor a function.
@@ -7580,7 +7580,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.Map.html b/jsapi/LuCI.form.Map.html
index df6ced19cc..a9ad04a0ef 100644
--- a/jsapi/LuCI.form.Map.html
+++ b/jsapi/LuCI.form.Map.html
@@ -5875,7 +5875,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.MultiValue.html b/jsapi/LuCI.form.MultiValue.html
index 4a8d65b0ae..18fabff693 100644
--- a/jsapi/LuCI.form.MultiValue.html
+++ b/jsapi/LuCI.form.MultiValue.html
@@ -3556,7 +3556,7 @@ select dropdown element.
@@ -7224,7 +7224,7 @@ was neither a string nor a function.
@@ -7531,7 +7531,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.NamedSection.html b/jsapi/LuCI.form.NamedSection.html
index 77aa024acc..8114544d72 100644
--- a/jsapi/LuCI.form.NamedSection.html
+++ b/jsapi/LuCI.form.NamedSection.html
@@ -3557,7 +3557,7 @@ specified when constructing the class instance.
@@ -4089,7 +4089,7 @@ this property will hold a reference to the parent option instance.
@@ -5536,7 +5536,7 @@ not meeting the validation constraints of their respective elements.
@@ -6480,7 +6480,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.SectionValue.html b/jsapi/LuCI.form.SectionValue.html
index 75f3969eb3..11ecfced64 100644
--- a/jsapi/LuCI.form.SectionValue.html
+++ b/jsapi/LuCI.form.SectionValue.html
@@ -3555,7 +3555,7 @@ element container, allowing to nest form sections into other sections.
@@ -4999,7 +4999,7 @@ within the given specific section.
@@ -5392,7 +5392,7 @@ argument, this parameter is ignored.
@@ -6190,7 +6190,7 @@ returns false.
@@ -6373,7 +6373,7 @@ so it may return promises if overridden by user code.
@@ -6524,7 +6524,7 @@ validation constraints.
@@ -7165,7 +7165,7 @@ was neither a string nor a function.
@@ -7311,7 +7311,7 @@ or a plain text string. If omitted, the key value is used as captio
@@ -7462,7 +7462,7 @@ its write() implementation is a no-op.
diff --git a/jsapi/LuCI.form.TableSection.html b/jsapi/LuCI.form.TableSection.html
index 92da56becc..b61979780a 100644
--- a/jsapi/LuCI.form.TableSection.html
+++ b/jsapi/LuCI.form.TableSection.html
@@ -4775,7 +4775,7 @@ The default is null, means inheriting from the parent form.
@@ -7254,7 +7254,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.TextValue.html b/jsapi/LuCI.form.TextValue.html
index 88156e6a90..0b55382e53 100644
--- a/jsapi/LuCI.form.TextValue.html
+++ b/jsapi/LuCI.form.TextValue.html
@@ -3555,7 +3555,7 @@
@@ -7478,7 +7478,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.TypedSection.html b/jsapi/LuCI.form.TypedSection.html
index e1b8e3a380..6a2b1fea48 100644
--- a/jsapi/LuCI.form.TypedSection.html
+++ b/jsapi/LuCI.form.TypedSection.html
@@ -6739,7 +6739,7 @@ was neither a string nor a function.
diff --git a/jsapi/LuCI.form.Value.html b/jsapi/LuCI.form.Value.html
index e2033beed3..121d3f4da4 100644
--- a/jsapi/LuCI.form.Value.html
+++ b/jsapi/LuCI.form.Value.html
@@ -3556,7 +3556,7 @@
@@ -6602,7 +6602,7 @@ implement alternative removal logic, e.g. to retain the original value.
@@ -7230,7 +7230,7 @@ was neither a string nor a function.
@@ -7537,7 +7537,7 @@ before it is written.
diff --git a/jsapi/LuCI.form.html b/jsapi/LuCI.form.html
index 3aba2a2dc1..5db1540a1b 100644
--- a/jsapi/LuCI.form.html
+++ b/jsapi/LuCI.form.html
@@ -3585,7 +3585,7 @@ m.render().then(function(node) {
@@ -3738,7 +3738,7 @@ m.render().then(function(node) {
diff --git a/jsapi/LuCI.fs.html b/jsapi/LuCI.fs.html
index d08c582e87..f3012500e1 100644
--- a/jsapi/LuCI.fs.html
+++ b/jsapi/LuCI.fs.html
@@ -5915,7 +5915,7 @@ the failure reason.
diff --git a/jsapi/LuCI.headers.html b/jsapi/LuCI.headers.html
index 6cc826810d..fb16c1e7d5 100644
--- a/jsapi/LuCI.headers.html
+++ b/jsapi/LuCI.headers.html
@@ -3943,7 +3943,7 @@ Note: Header-Names are case-insensitive.
diff --git a/jsapi/LuCI.html b/jsapi/LuCI.html
index 7c116e0b31..13642e86e4 100644
--- a/jsapi/LuCI.html
+++ b/jsapi/LuCI.html
@@ -8138,7 +8138,7 @@ else null.
diff --git a/jsapi/LuCI.network.Device.html b/jsapi/LuCI.network.Device.html
index 14877e14b0..acaf75ffb1 100644
--- a/jsapi/LuCI.network.Device.html
+++ b/jsapi/LuCI.network.Device.html
@@ -6308,7 +6308,7 @@ when it is down or absent.
diff --git a/jsapi/LuCI.network.Hosts.html b/jsapi/LuCI.network.Hosts.html
index 96bcd5f327..938048c4a2 100644
--- a/jsapi/LuCI.network.Hosts.html
+++ b/jsapi/LuCI.network.Hosts.html
@@ -4869,7 +4869,7 @@ is used as hint.
diff --git a/jsapi/LuCI.network.Protocol.html b/jsapi/LuCI.network.Protocol.html
index 43831c1fb7..a60cbc8116 100644
--- a/jsapi/LuCI.network.Protocol.html
+++ b/jsapi/LuCI.network.Protocol.html
@@ -8099,7 +8099,7 @@ configuration.
diff --git a/jsapi/LuCI.network.WifiDevice.html b/jsapi/LuCI.network.WifiDevice.html
index 2c01f6673b..c2ed0a2788 100644
--- a/jsapi/LuCI.network.WifiDevice.html
+++ b/jsapi/LuCI.network.WifiDevice.html
@@ -5240,7 +5240,7 @@ configuration.
diff --git a/jsapi/LuCI.network.WifiNetwork.html b/jsapi/LuCI.network.WifiNetwork.html
index 69ae9f4f00..85da9d46e2 100644
--- a/jsapi/LuCI.network.WifiNetwork.html
+++ b/jsapi/LuCI.network.WifiNetwork.html
@@ -7830,7 +7830,7 @@ configuration.
diff --git a/jsapi/LuCI.network.html b/jsapi/LuCI.network.html
index e5cc5875dc..ed64341c97 100644
--- a/jsapi/LuCI.network.html
+++ b/jsapi/LuCI.network.html
@@ -9678,7 +9678,7 @@ conjunction with quality to calculate a quality percentage.
- Documentation generated by JSDoc 3.6.10 on Mon May 16 2022 08:05:25 GMT+0000 (Coordinated Universal Time)
+ Documentation generated by JSDoc 3.6.10 on Mon May 16 2022 11:45:57 GMT+0000 (Coordinated Universal Time)
diff --git a/jsapi/LuCI.poll.html b/jsapi/LuCI.poll.html
index 561862aad1..55528f2f0e 100644
--- a/jsapi/LuCI.poll.html
+++ b/jsapi/LuCI.poll.html
@@ -4326,7 +4326,7 @@ run to begin with.
diff --git a/jsapi/LuCI.request.html b/jsapi/LuCI.request.html
index cf77659a2b..20a6a2f994 100644
--- a/jsapi/LuCI.request.html
+++ b/jsapi/LuCI.request.html
@@ -5261,7 +5261,7 @@ instances as sole argument during the HTTP request transfer.
diff --git a/jsapi/LuCI.request.poll.html b/jsapi/LuCI.request.poll.html
index 638fdab3a2..a94b4b4eee 100644
--- a/jsapi/LuCI.request.poll.html
+++ b/jsapi/LuCI.request.poll.html
@@ -4445,7 +4445,7 @@ else null.
diff --git a/jsapi/LuCI.response.html b/jsapi/LuCI.response.html
index b59966c6e5..c782414e9f 100644
--- a/jsapi/LuCI.response.html
+++ b/jsapi/LuCI.response.html
@@ -4403,7 +4403,7 @@ using String() and treated as response text.
diff --git a/jsapi/LuCI.rpc.html b/jsapi/LuCI.rpc.html
index f83ca1baf4..69331870e2 100644
--- a/jsapi/LuCI.rpc.html
+++ b/jsapi/LuCI.rpc.html
@@ -5734,7 +5734,7 @@ to the expect and filter declarations.
diff --git a/jsapi/LuCI.session.html b/jsapi/LuCI.session.html
index 7a8818dcff..ab79de48a0 100644
--- a/jsapi/LuCI.session.html
+++ b/jsapi/LuCI.session.html
@@ -4173,7 +4173,7 @@ being put in the session store.
diff --git a/jsapi/LuCI.uci.html b/jsapi/LuCI.uci.html
index 3d1e55e766..80ddfbb34e 100644
--- a/jsapi/LuCI.uci.html
+++ b/jsapi/LuCI.uci.html
@@ -7221,7 +7221,7 @@ associated name as arguments.
diff --git a/jsapi/LuCI.ui.AbstractElement.html b/jsapi/LuCI.ui.AbstractElement.html
index d064b8b989..54c43cf19a 100644
--- a/jsapi/LuCI.ui.AbstractElement.html
+++ b/jsapi/LuCI.ui.AbstractElement.html
@@ -5277,7 +5277,7 @@ and are displayed in a slightly faded style.
diff --git a/jsapi/LuCI.ui.Checkbox.html b/jsapi/LuCI.ui.Checkbox.html
index f9d0570011..0ea83d6d14 100644
--- a/jsapi/LuCI.ui.Checkbox.html
+++ b/jsapi/LuCI.ui.Checkbox.html
@@ -5391,7 +5391,7 @@ it is required for HTML based form submissions.
diff --git a/jsapi/LuCI.ui.ComboButton.html b/jsapi/LuCI.ui.ComboButton.html
index 8208e40ff8..edcbbcfafe 100644
--- a/jsapi/LuCI.ui.ComboButton.html
+++ b/jsapi/LuCI.ui.ComboButton.html
@@ -5421,7 +5421,7 @@ choice value as second argument.
diff --git a/jsapi/LuCI.ui.Combobox.html b/jsapi/LuCI.ui.Combobox.html
index 48222c0de7..869af72fa4 100644
--- a/jsapi/LuCI.ui.Combobox.html
+++ b/jsapi/LuCI.ui.Combobox.html
@@ -5324,7 +5324,7 @@ forcibly set to true.
diff --git a/jsapi/LuCI.ui.Dropdown.html b/jsapi/LuCI.ui.Dropdown.html
index e5e446f1e6..1f1543e8e0 100644
--- a/jsapi/LuCI.ui.Dropdown.html
+++ b/jsapi/LuCI.ui.Dropdown.html
@@ -6122,7 +6122,7 @@ expression. Only applicable when create is true.
diff --git a/jsapi/LuCI.ui.DynamicList.html b/jsapi/LuCI.ui.DynamicList.html
index 7e0a35c680..821c17e5b0 100644
--- a/jsapi/LuCI.ui.DynamicList.html
+++ b/jsapi/LuCI.ui.DynamicList.html
@@ -5499,7 +5499,7 @@ it to remain unselected.
diff --git a/jsapi/LuCI.ui.FileUpload.html b/jsapi/LuCI.ui.FileUpload.html
index 376a564651..ba1869abd6 100644
--- a/jsapi/LuCI.ui.FileUpload.html
+++ b/jsapi/LuCI.ui.FileUpload.html
@@ -5348,7 +5348,7 @@ ACL setup for the current session.
diff --git a/jsapi/LuCI.ui.Hiddenfield.html b/jsapi/LuCI.ui.Hiddenfield.html
index 0e9a02aa8d..465f0ad1bd 100644
--- a/jsapi/LuCI.ui.Hiddenfield.html
+++ b/jsapi/LuCI.ui.Hiddenfield.html
@@ -5102,7 +5102,7 @@ trigger validation runs, e.g. when programmatically altering values.
diff --git a/jsapi/LuCI.ui.Select.html b/jsapi/LuCI.ui.Select.html
index 634f57e118..9033da550d 100644
--- a/jsapi/LuCI.ui.Select.html
+++ b/jsapi/LuCI.ui.Select.html
@@ -5451,7 +5451,7 @@ selected yet. Only applicable to the select widget type.
diff --git a/jsapi/LuCI.ui.Textarea.html b/jsapi/LuCI.ui.Textarea.html
index 414719de9e..c09fad8528 100644
--- a/jsapi/LuCI.ui.Textarea.html
+++ b/jsapi/LuCI.ui.Textarea.html
@@ -5400,7 +5400,7 @@ contents.
diff --git a/jsapi/LuCI.ui.Textfield.html b/jsapi/LuCI.ui.Textfield.html
index 5f1f3fb43e..6792ad2906 100644
--- a/jsapi/LuCI.ui.Textfield.html
+++ b/jsapi/LuCI.ui.Textfield.html
@@ -5328,7 +5328,7 @@ corresponding <input> element is empty.
diff --git a/jsapi/LuCI.ui.changes.html b/jsapi/LuCI.ui.changes.html
index 0f07ebb08c..23bbf0a18a 100644
--- a/jsapi/LuCI.ui.changes.html
+++ b/jsapi/LuCI.ui.changes.html
@@ -3644,7 +3644,7 @@ external JavaScript, use L.require("ui").then(...) and ac
@@ -3976,7 +3976,7 @@ UCI changeset structure.
@@ -4180,7 +4180,7 @@ is removed.
diff --git a/jsapi/LuCI.ui.html b/jsapi/LuCI.ui.html
index 9bfe7ebc5c..f9019819db 100644
--- a/jsapi/LuCI.ui.html
+++ b/jsapi/LuCI.ui.html
@@ -3917,7 +3917,7 @@ banner element.
@@ -4368,7 +4368,7 @@ default.
@@ -4818,7 +4818,7 @@ handler as-is without the need to bind it first.
@@ -6273,7 +6273,7 @@ cancelled by the user.
diff --git a/jsapi/LuCI.ui.menu.html b/jsapi/LuCI.ui.menu.html
index 72a5838920..0e7ef6700a 100644
--- a/jsapi/LuCI.ui.menu.html
+++ b/jsapi/LuCI.ui.menu.html
@@ -4227,7 +4227,7 @@ internal root node if omitted.
diff --git a/jsapi/LuCI.ui.tabs.html b/jsapi/LuCI.ui.tabs.html
index 2ffc002610..9eaba75877 100644
--- a/jsapi/LuCI.ui.tabs.html
+++ b/jsapi/LuCI.ui.tabs.html
@@ -3927,7 +3927,7 @@ DOM node.
diff --git a/jsapi/LuCI.view.html b/jsapi/LuCI.view.html
index 3a656ac223..ba8806193f 100644
--- a/jsapi/LuCI.view.html
+++ b/jsapi/LuCI.view.html
@@ -4531,7 +4531,7 @@ to a Node value.
diff --git a/jsapi/LuCI.xhr.html b/jsapi/LuCI.xhr.html
index ae27b7e439..3b9e5a2793 100644
--- a/jsapi/LuCI.xhr.html
+++ b/jsapi/LuCI.xhr.html
@@ -4495,7 +4495,7 @@ when invoked.
diff --git a/jsapi/form.js.html b/jsapi/form.js.html
index b31e1ac361..b418203943 100644
--- a/jsapi/form.js.html
+++ b/jsapi/form.js.html
@@ -6113,8 +6113,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
if (nodes.length == 0)
tableEl.appendChild(E('tr', { 'class': 'tr cbi-section-table-row placeholder' },
- E('td', { 'class': 'td' },
- E('em', {}, _('This section contains no values yet')))));
+ E('td', { 'class': 'td' }, this.renderSectionPlaceholder())));
sectionEl.appendChild(tableEl);
@@ -6525,10 +6524,20 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
/** @private */
handleModalCancel: function(modalMap, ev) {
- var prevNode = this.getPreviousModalMap();
+ var prevNode = this.getPreviousModalMap(),
+ resetTasks = Promise.resolve();
if (prevNode) {
- var heading = prevNode.parentNode.querySelector('h4');
+ var heading = prevNode.parentNode.querySelector('h4'),
+ prevMap = dom.findClassInstance(prevNode);
+
+ while (prevMap) {
+ resetTasks = resetTasks
+ .then(L.bind(prevMap.load, prevMap))
+ .then(L.bind(prevMap.reset, prevMap));
+
+ prevMap = prevMap.parent;
+ }
prevNode.classList.add('flash');
prevNode.classList.remove('hidden');
@@ -6545,7 +6554,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
ui.hideModal();
}
- return Promise.resolve();
+ return resetTasks;
},
/** @private */
@@ -6671,34 +6680,38 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
},
/** @private */
- renderMoreOptionsModal: function(section_id, ev) {
- var parent = this.map,
- title = parent.title,
- name = null,
- m = new CBIMap(this.map.config, null, null),
- s = m.section(CBINamedSection, section_id, this.sectiontype);
+ cloneOptions: function(src_section, dest_section) {
+ for (var i = 0; i < src_section.children.length; i++) {
+ var o1 = src_section.children[i];
- m.parent = parent;
- m.section = section_id;
- m.readonly = parent.readonly;
+ if (o1.modalonly === false && src_section === this)
+ continue;
- s.tabs = this.tabs;
- s.tab_names = this.tab_names;
+ var o2;
- if ((name = this.titleFn('modaltitle', section_id)) != null)
- title = name;
- else if ((name = this.titleFn('sectiontitle', section_id)) != null)
- title = '%s - %s'.format(parent.title, name);
- else if (!this.anonymous)
- title = '%s - %s'.format(parent.title, section_id);
+ if (o1.subsection) {
+ o2 = dest_section.option(o1.constructor, o1.option, o1.subsection.constructor, o1.subsection.sectiontype, o1.subsection.title, o1.subsection.description);
- for (var i = 0; i < this.children.length; i++) {
- var o1 = this.children[i];
+ for (var k in o1.subsection) {
+ if (!o1.subsection.hasOwnProperty(k))
+ continue;
- if (o1.modalonly === false)
- continue;
+ switch (k) {
+ case 'map':
+ case 'children':
+ case 'parentoption':
+ continue;
- var o2 = s.option(o1.constructor, o1.option, o1.title, o1.description);
+ default:
+ o2.subsection[k] = o1.subsection[k];
+ }
+ }
+
+ this.cloneOptions(o1.subsection, o2.subsection);
+ }
+ else {
+ o2 = dest_section.option(o1.constructor, o1.option, o1.title, o1.description);
+ }
for (var k in o1) {
if (!o1.hasOwnProperty(k))
@@ -6710,6 +6723,7 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
case 'option':
case 'title':
case 'description':
+ case 'subsection':
continue;
default:
@@ -6717,43 +6731,75 @@ var CBITableSection = CBITypedSection.extend(/** @lends LuCI.form.TableSection.p
}
}
}
+ },
- return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(L.bind(m.render, m)).then(L.bind(function(nodes) {
- var mapNode = this.getActiveModalMap(),
- activeMap = mapNode ? dom.findClassInstance(mapNode) : null;
+ /** @private */
+ renderMoreOptionsModal: function(section_id, ev) {
+ var parent = this.map,
+ sref = parent.data.get(parent.config, section_id),
+ mapNode = this.getActiveModalMap(),
+ activeMap = mapNode ? dom.findClassInstance(mapNode) : null,
+ stackedMap = activeMap && (activeMap.parent !== parent || activeMap.section !== section_id);
- if (activeMap && (activeMap.parent !== parent || activeMap.section !== section_id)) {
- mapNode.parentNode
- .querySelector('h4')
- .appendChild(E('span', title ? ' » ' + title : ''));
+ return (stackedMap ? activeMap.save(null, true) : Promise.resolve()).then(L.bind(function() {
+ section_id = sref['.name'];
- mapNode.parentNode
- .querySelector('div.right > button')
- .firstChild.data = _('Back');
+ var m = new CBIMap(parent.config, null, null),
+ s = m.section(CBINamedSection, section_id, this.sectiontype);
+
+ m.parent = parent;
+ m.section = section_id;
+ m.readonly = parent.readonly;
+
+ s.tabs = this.tabs;
+ s.tab_names = this.tab_names;
+
+ this.cloneOptions(this, s);
+
+ return Promise.resolve(this.addModalOptions(s, section_id, ev)).then(function() {
+ return m.render();
+ }).then(L.bind(function(nodes) {
+ var title = parent.title,
+ name = null;
- mapNode.classList.add('hidden');
- mapNode.parentNode.insertBefore(nodes, mapNode.nextElementSibling);
+ if ((name = this.titleFn('modaltitle', section_id)) != null)
+ title = name;
+ else if ((name = this.titleFn('sectiontitle', section_id)) != null)
+ title = '%s - %s'.format(parent.title, name);
+ else if (!this.anonymous)
+ title = '%s - %s'.format(parent.title, section_id);
+
+ if (stackedMap) {
+ mapNode.parentNode
+ .querySelector('h4')
+ .appendChild(E('span', title ? ' » ' + title : ''));
+
+ mapNode.parentNode
+ .querySelector('div.right > button')
+ .firstChild.data = _('Back');
+
+ mapNode.classList.add('hidden');
+ mapNode.parentNode.insertBefore(nodes, mapNode.nextElementSibling);
- return activeMap.save(null, true).then(function() {
nodes.classList.add('flash');
- }, function() {});
- }
- else {
- ui.showModal(title, [
- nodes,
- E('div', { 'class': 'right' }, [
- E('button', {
- 'class': 'cbi-button',
- 'click': ui.createHandlerFn(this, 'handleModalCancel', m)
- }, [ _('Dismiss') ]), ' ',
- E('button', {
- 'class': 'cbi-button cbi-button-positive important',
- 'click': ui.createHandlerFn(this, 'handleModalSave', m),
- 'disabled': m.readonly || null
- }, [ _('Save') ])
- ])
- ], 'cbi-modal');
- }
+ }
+ else {
+ ui.showModal(title, [
+ nodes,
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'cbi-button',
+ 'click': ui.createHandlerFn(this, 'handleModalCancel', m)
+ }, [ _('Dismiss') ]), ' ',
+ E('button', {
+ 'class': 'cbi-button cbi-button-positive important',
+ 'click': ui.createHandlerFn(this, 'handleModalSave', m),
+ 'disabled': m.readonly || null
+ }, [ _('Save') ])
+ ])
+ ], 'cbi-modal');
+ }
+ }, this));
}, this)).catch(L.error);
}
});
@@ -8350,7 +8396,7 @@ return baseclass.extend(/** @lends LuCI.form.prototype */ {
diff --git a/jsapi/fs.js.html b/jsapi/fs.js.html
index a99ac4f035..a2e8d9e70b 100644
--- a/jsapi/fs.js.html
+++ b/jsapi/fs.js.html
@@ -3969,7 +3969,7 @@ return FileSystem;
diff --git a/jsapi/index.html b/jsapi/index.html
index 42c4021f1a..b56d7da0b6 100644
--- a/jsapi/index.html
+++ b/jsapi/index.html
@@ -3556,7 +3556,7 @@ is the central JSDoc 3.6.10 on Mon May 16 2022 08:05:24 GMT+0000 (Coordinated Universal Time)
+ Documentation generated by JSDoc 3.6.10 on Mon May 16 2022 11:45:57 GMT+0000 (Coordinated Universal Time)
diff --git a/jsapi/luci.js.html b/jsapi/luci.js.html
index b2fc042b27..b09ebbea1f 100644
--- a/jsapi/luci.js.html
+++ b/jsapi/luci.js.html
@@ -6963,7 +6963,7 @@
diff --git a/jsapi/network.js.html b/jsapi/network.js.html
index bf045ffb42..ba4ca32b1d 100644
--- a/jsapi/network.js.html
+++ b/jsapi/network.js.html
@@ -7929,7 +7929,7 @@ return Network;
diff --git a/jsapi/rpc.js.html b/jsapi/rpc.js.html
index df2036f402..0e3ed7b1cc 100644
--- a/jsapi/rpc.js.html
+++ b/jsapi/rpc.js.html
@@ -4025,7 +4025,7 @@ return baseclass.extend(/** @lends LuCI.rpc.prototype */ {
diff --git a/jsapi/uci.js.html b/jsapi/uci.js.html
index 801e429948..aa09bd2f0d 100644
--- a/jsapi/uci.js.html
+++ b/jsapi/uci.js.html
@@ -4525,7 +4525,7 @@ return baseclass.extend(/** @lends LuCI.uci.prototype */ {
diff --git a/jsapi/ui.js.html b/jsapi/ui.js.html
index 5cfa2340d2..8980571e19 100644
--- a/jsapi/ui.js.html
+++ b/jsapi/ui.js.html
@@ -8007,6 +8007,26 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
}
},
+ /** @private */
+ checkConnectivityAffected: function() {
+ return L.resolveDefault(fs.exec_direct('/usr/libexec/luci-peeraddr', null, 'json')).then(L.bind(function(info) {
+ if (L.isObject(info) && Array.isArray(info.inbound_interfaces)) {
+ for (var i = 0; i < info.inbound_interfaces.length; i++) {
+ var iif = info.inbound_interfaces[i];
+
+ for (var j = 0; this.changes && this.changes.network && j < this.changes.network.length; j++) {
+ var chg = this.changes.network[j];
+
+ if (chg[0] == 'set' && chg[1] == iif && (chg[2] == 'proto' || chg[2] == 'ipaddr' || chg[2] == 'netmask'))
+ return iif;
+ }
+ }
+ }
+
+ return null;
+ }, this));
+ },
+
/** @private */
rollback: function(checked) {
if (checked) {
@@ -8144,35 +8164,65 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
this.displayStatus('notice spinning',
E('p', _('Starting configuration applyâ¦')));
- request.request(L.url('admin/uci', checked ? 'apply_rollback' : 'apply_unchecked'), {
- method: 'post',
- query: { sid: L.env.sessionid, token: L.env.token }
- }).then(function(r) {
- if (r.status === (checked ? 200 : 204)) {
- var tok = null; try { tok = r.json(); } catch(e) {}
- if (checked && tok !== null && typeof(tok) === 'object' && typeof(tok.token) === 'string')
- UI.prototype.changes.confirm_auth = tok;
-
- UI.prototype.changes.confirm(checked, Date.now() + L.env.apply_rollback * 1000);
- }
- else if (checked && r.status === 204) {
- UI.prototype.changes.displayStatus('notice',
- E('p', _('There are no changes to apply')));
+ (new Promise(function(resolveFn, rejectFn) {
+ if (!checked)
+ return resolveFn(false);
+
+ UI.prototype.changes.checkConnectivityAffected().then(function(affected) {
+ if (!affected)
+ return resolveFn(true);
+
+ UI.prototype.changes.displayStatus('warning', [
+ E('h4', _('Connectivity change')),
+ E('p', _('The network access to this device could be interrupted by changing settings of the "%h" interface.').format(affected)),
+ E('p', _('If the IP address used to access LuCI changes, a <strong>manual reconnect to the new IP</strong> is required within %d seconds to confirm the settings, otherwise modifications will be reverted.').format(L.env.apply_rollback)),
+ E('div', { 'class': 'right' }, [
+ E('button', {
+ 'class': 'btn',
+ 'click': rejectFn,
+ }, [ _('Cancel') ]), ' ',
+ E('button', {
+ 'class': 'btn cbi-button-action important',
+ 'click': resolveFn.bind(null, true)
+ }, [ _('Apply and revert on connectivity loss') ]), ' ',
+ E('button', {
+ 'class': 'btn cbi-button-negative important',
+ 'click': resolveFn.bind(null, false)
+ }, [ _('Apply and keep settings') ])
+ ])
+ ]);
+ });
+ })).then(function(checked) {
+ request.request(L.url('admin/uci', checked ? 'apply_rollback' : 'apply_unchecked'), {
+ method: 'post',
+ query: { sid: L.env.sessionid, token: L.env.token }
+ }).then(function(r) {
+ if (r.status === (checked ? 200 : 204)) {
+ var tok = null; try { tok = r.json(); } catch(e) {}
+ if (checked && tok !== null && typeof(tok) === 'object' && typeof(tok.token) === 'string')
+ UI.prototype.changes.confirm_auth = tok;
+
+ UI.prototype.changes.confirm(checked, Date.now() + L.env.apply_rollback * 1000);
+ }
+ else if (checked && r.status === 204) {
+ UI.prototype.changes.displayStatus('notice',
+ E('p', _('There are no changes to apply')));
- window.setTimeout(function() {
- UI.prototype.changes.displayStatus(false);
- }, L.env.apply_display * 1000);
- }
- else {
- UI.prototype.changes.displayStatus('warning',
- E('p', _('Apply request failed with status <code>%h</code>')
- .format(r.responseText || r.statusText || r.status)));
+ window.setTimeout(function() {
+ UI.prototype.changes.displayStatus(false);
+ }, L.env.apply_display * 1000);
+ }
+ else {
+ UI.prototype.changes.displayStatus('warning',
+ E('p', _('Apply request failed with status <code>%h</code>')
+ .format(r.responseText || r.statusText || r.status)));
- window.setTimeout(function() {
- UI.prototype.changes.displayStatus(false);
- }, L.env.apply_display * 1000);
- }
- });
+ window.setTimeout(function() {
+ UI.prototype.changes.displayStatus(false);
+ }, L.env.apply_display * 1000);
+ }
+ });
+ }, this.displayStatus.bind(this, false));
},
/**
@@ -8395,7 +8445,7 @@ return UI;