luci-base: add member `allowduplicates` to `DynamicList`
authorAnya Lin <hukk1996@gmail.com>
Sat, 11 Jan 2025 09:34:19 +0000 (17:34 +0800)
committerPaul Donald <newtwen+github@gmail.com>
Wed, 22 Jan 2025 14:36:05 +0000 (15:36 +0100)
Add member `allowduplicates` to `DynamicList` to allow duplicate
underlying form values.

`allowduplicates` defaults is `null`, `DynamicList` will keep the
same behavior as before.
If `true`, the underlying form value will not be checked
for duplication.

Signed-off-by: Anya Lin <hukk1996@gmail.com>
modules/luci-base/htdocs/luci-static/resources/form.js
modules/luci-base/htdocs/luci-static/resources/ui.js

index e1fc3ff3e9dd39520ac3d1c4ceda9bbdb341c109..2d0304003cd75e30c4dbd7c7d2319a340465e144 100644 (file)
@@ -3863,6 +3863,17 @@ const CBIValue = CBIAbstractValue.extend(/** @lends LuCI.form.Value.prototype */
 const CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototype */ {
        __name__: 'CBI.DynamicList',
 
+       /**
+        * Allows the underlying form controls to have multiple identical values.
+        *
+        * Default is `null`. If `true`, the underlying form value will
+        * not be checked for duplication.
+        *
+        * @name LuCI.form.DynamicList.prototype#allowduplicates
+        * @type boolean
+        * @default null
+        */
+
        /** @private */
        renderWidget(section_id, option_index, cfgvalue) {
                const value = (cfgvalue != null) ? cfgvalue : this.default;
@@ -3872,6 +3883,7 @@ const CBIDynamicList = CBIValue.extend(/** @lends LuCI.form.DynamicList.prototyp
                const widget = new ui.DynamicList(items, choices, {
                        id: this.cbid(section_id),
                        sort: this.keylist,
+                       allowduplicates: this.allowduplicates,
                        optional: this.optional || this.rmempty,
                        datatype: this.datatype,
                        placeholder: this.placeholder,
index 391d64a35449240523db7cba3af6b940db135eb7..1dc5ee15bfe70c2a99b97fb9bd707d9a459ecc79 100644 (file)
@@ -2424,7 +2424,7 @@ const UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype
                                exists = true;
                });
 
-               if (!exists) {
+               if (this.options.allowduplicates || !exists) {
                        const ai = dl.querySelector('.add-item');
                        ai.parentNode.insertBefore(new_item, ai);
                }
@@ -2505,7 +2505,8 @@ const UIDynamicList = UIElement.extend(/** @lends LuCI.ui.DynamicList.prototype
                        return;
 
                sbIn.setValues(sbEl, null);
-               sbVal.element.setAttribute('unselectable', '');
+               if (!this.options.allowduplicates)
+                       sbVal.element.setAttribute('unselectable', '');
 
                if (sbVal.element.hasAttribute('created')) {
                        sbVal.element.removeAttribute('created');