diff --git a/src/js/DefaultRules.js b/src/js/DefaultRules.js index f2e2f0a69220c282fe8bcb7d8abd3667218d74f7..46d0eeb7ddee0d9cd08acdd763a09989c005ea06 100644 --- a/src/js/DefaultRules.js +++ b/src/js/DefaultRules.js @@ -2902,15 +2902,43 @@ window.DefaultRules = (function() { * @param {App.RA.RuleSetters} rule */ function ProcessLabel(slave, rule) { - if (rule.label !== null && rule.label !== '' && !slave.custom.label.includes(`[${rule.label}]`)) { - slave.custom.label = `${slave.custom.label}[${rule.label}]`; - r += `<br>${slave.slaveName} has been tagged as ${rule.label}`; + + //mass removal of old tags, variant from '*' mask. + if (rule.removeLabel !== null && rule.removeLabel !== '' && rule.removeLabel == '*') { + slave.custom.label = slave.custom.label.replace(/(?:\[.+\])+/, ""); + r += `<br>All ${slave.slaveName}'s tags is removed.`; } - if (rule.removeLabel !== null && rule.removeLabel !== '' && slave.custom.label.includes(`[${rule.removeLabel}]`)) { - slave.custom.label = slave.custom.label.replace(`[${rule.removeLabel}]`, ""); - r += `<br>${slave.slaveName}'s tag [${rule.removeLabel}] is removed.`; + //mass removal of old tags, variant from GUI swith. + if (rule.labelTagsClear === true) { + slave.custom.label = slave.custom.label.replace(/(?:\[.+\])+/, ""); + r += `<br>All ${slave.slaveName}'s tags is removed.`; } + + //removing tags selected for removal. + let tags = [], i; + if (rule.removeLabel != null && rule.removeLabel !== '') + tags = rule.removeLabel.split("|"); + + for (i in tags) { + if (tags[i] !== null && tags[i] !== '' && slave.custom.label.includes(`[${tags[i]}]`)) { + slave.custom.label = slave.custom.label.replace(`[${tags[i]}]`, ""); + r += `<br>${slave.slaveName}'s tag [${tags[i]}] is removed.`; + } + } + + //finally adding new tags. + tags = []; + if (rule.label != null && rule.label !== '') + tags = rule.label.split("|"); + + for (i in tags) { + if (tags[i] != null && tags[i] !== '' && !slave.custom.label.includes(`[${tags[i]}]`)) { + slave.custom.label = `${slave.custom.label}[${tags[i]}]`; + r += `<br>${slave.slaveName} has been tagged as ${tags[i]}`; + } + } + } return DefaultRules; diff --git a/src/js/rulesAssistant.js b/src/js/rulesAssistant.js index 8a492943876c6815cd0672e1721c966b7e33d1a8..abab9a1e041d4230795d43013b000c6654eafe8e 100644 --- a/src/js/rulesAssistant.js +++ b/src/js/rulesAssistant.js @@ -594,6 +594,12 @@ App.RA.ruleDeepAssign = function deepAssign(target, source) { target[key] = {}; } deepAssign(target[key], source[key]); + } else if (key == "label" || key == "removeLabel") { + if (source[key] != null) + if (target[key] != null) + target[key] += "|" + source[key]; + else + target[key] = source[key]; } else { // A rule overrides any preceding ones if, // * there are no preceding ones, @@ -608,5 +614,6 @@ App.RA.ruleDeepAssign = function deepAssign(target, source) { } } } + return target; }; diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 9074ecd66f5ab06917395cffaa99bcc8e6d15bc0..add70b98472f00374756fd60f75956f6af52b567 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -1545,8 +1545,18 @@ window.rulesAssistantOptions = (function() { class OtherTab extends Tab { constructor(tabButtons) { super("other", "Other", tabButtons); + this.appendChild(new ClearLabelSwitch()); this.appendChild(new LabelList()); this.appendChild(new LabelRemoveList()); + + } + } + + class ClearLabelSwitch extends BooleanSwitch { + constructor() { + super("Remove all tags (Gobal swith)", [false, true]); + this.setValue(current_rule.set.labelTagsClear); + this.onchange = (value) => current_rule.set.labelTagsClear = value; } } @@ -4133,7 +4143,7 @@ window.rulesAssistantOptions = (function() { class LabelList extends StringEditor { constructor() { - super("Custom label", [], true, true); + super("Custom label(s) (separate by '|')", [], true, true); this.setValue(current_rule.set.label); this.onchange = (value) => current_rule.set.label = value; } @@ -4141,7 +4151,7 @@ window.rulesAssistantOptions = (function() { class LabelRemoveList extends StringEditor { constructor() { - super("Remove custom label", [], true, true); + super("Remove custom label(s) (separate by '|')", [], true, true); this.setValue(current_rule.set.removeLabel); this.onchange = (value) => current_rule.set.removeLabel = value; }