luci-base: cbi.js: set .value property of cbi dropdown elements

In order to make cbi dropdowns usable for validation and other code
expecting native form elements, set the .value DOM property on the
dropdown parent element whenever the selection is changed.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
Jo-Philipp Wich 2018-11-05 16:52:05 +01:00
parent bbb800556d
commit 207fc0121e

View file

@ -833,6 +833,7 @@ function cbi_combobox_init(id, values, def, man) {
}) })
])); ]));
sb.value = obj.value;
obj.parentNode.replaceChild(sb, obj); obj.parentNode.replaceChild(sb, obj);
} }
@ -1729,6 +1730,7 @@ CBIDropdown = {
saveValues: function(sb, ul) { saveValues: function(sb, ul) {
var sel = ul.querySelectorAll('li[selected]'), var sel = ul.querySelectorAll('li[selected]'),
div = sb.lastElementChild, div = sb.lastElementChild,
strval = '',
values = []; values = [];
while (div.lastElementChild) while (div.lastElementChild)
@ -1738,17 +1740,21 @@ CBIDropdown = {
if (s.hasAttribute('placeholder')) if (s.hasAttribute('placeholder'))
return; return;
div.appendChild(E('input', { var v = {
type: 'hidden',
name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText
}));
values.push({
text: s.innerText, text: s.innerText,
value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText, value: s.hasAttribute('data-value') ? s.getAttribute('data-value') : s.innerText,
element: s element: s
}); };
div.appendChild(E('input', {
type: 'hidden',
name: s.hasAttribute('name') ? s.getAttribute('name') : (sb.getAttribute('name') || ''),
value: v.value
}));
values.push(v);
strval += strval.length ? ' ' + v.value : v.value;
}); });
var detail = { var detail = {
@ -1761,6 +1767,8 @@ CBIDropdown = {
else else
detail.value = values.length ? values[0] : null; detail.value = values.length ? values[0] : null;
sb.value = strval;
sb.dispatchEvent(new CustomEvent('cbi-dropdown-change', { sb.dispatchEvent(new CustomEvent('cbi-dropdown-change', {
bubbles: true, bubbles: true,
detail: detail detail: detail