From 7488b7a57fb02f2776dd2f36ed7a9a80b4e2745f Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@mailbox.org>
Date: Thu, 28 Apr 2022 20:02:54 +0200
Subject: [PATCH] Improve RA condition editor UI (mainly custom getter)

---
 css/rulesAssistant/conditionEditor.css |  9 ++++
 js/rulesAssistant/conditionEditor.js   | 59 ++++++++++++++------------
 2 files changed, 40 insertions(+), 28 deletions(-)

diff --git a/css/rulesAssistant/conditionEditor.css b/css/rulesAssistant/conditionEditor.css
index 49465343054..da364358499 100644
--- a/css/rulesAssistant/conditionEditor.css
+++ b/css/rulesAssistant/conditionEditor.css
@@ -80,6 +80,15 @@
     margin-left: 0.2em;
 }
 
+.rule-custom-controls {
+    display: inline-block;
+    vertical-align: top;
+}
+
+.rule-custom-mode {
+    text-align: center;
+}
+
 .rule-trash {
     border: #F55 1px;
     border-radius: 4px;
diff --git a/js/rulesAssistant/conditionEditor.js b/js/rulesAssistant/conditionEditor.js
index 34900917960..b966c943bff 100644
--- a/js/rulesAssistant/conditionEditor.js
+++ b/js/rulesAssistant/conditionEditor.js
@@ -97,7 +97,7 @@ App.RA.Activation.Editor = (function() {
 		div.append(new RulePartProvider(() => new RuleMapCheck(App.RA.Activation.getterManager.assignmentDefault)).render());
 		div.append(new RulePartProvider(() => new RuleConstant(0)).render());
 		div.append(new RulePartProvider(() => new RuleBooleanConstant(true)).render());
-		div.append(new RulePartProvider(() => new RuleConstant("string")).render());
+		div.append(new RulePartProvider(() => new RuleConstant("some text")).render());
 		div.append(new RulePartProvider(() => new RuleCustomCheck("bcontext => false")).render());
 		div.append(new RulePartTrash().render());
 		container.append(div);
@@ -857,21 +857,7 @@ App.RA.Activation.Editor = (function() {
 
 		render() {
 			const div = App.UI.DOM.makeElement("div", createDragElement(this), ["rule-part"]);
-			const button = document.createElement("button");
-			button.append(this._stringMode ? "String" : "Number");
-			button.onclick = () => {
-				this._stringMode = !this._stringMode;
-				if (this._stringMode) {
-					this.value = String(this.value);
-				} else {
-					this.value = Number(this.value);
-					if (Number.isNaN(this.value)) {
-						this.value = 0;
-					}
-				}
-				refreshEditor();
-			};
-			div.append(button);
+			div.append(this._stringMode ? " String" : " Number");
 			div.append(makeTextBoxDragSafe(App.UI.DOM.makeTextBox(this.value, (v) => {
 				this.value = v;
 				refreshEditor();
@@ -968,7 +954,34 @@ App.RA.Activation.Editor = (function() {
 		}
 
 		render() {
-			const div = App.UI.DOM.makeElement("div", createDragElement(this), ["rule-part"]);
+			const outerDiv = App.UI.DOM.makeElement("div", null, ["rule-part"]);
+			const leftDiv = document.createElement("div");
+			leftDiv.classList.add("rule-custom-controls");
+
+			const upperDiv = document.createElement("div");
+			upperDiv.append(createDragElement(this), " Custom Getter");
+			leftDiv.append(upperDiv);
+
+			const lowerDiv = document.createElement("div");
+			lowerDiv.classList.add("rule-custom-mode");
+			lowerDiv.append("Mode:", this._makeToggleButton());
+			leftDiv.append(lowerDiv);
+
+			outerDiv.append(leftDiv);
+
+			const textArea = document.createElement("textarea");
+			textArea.append(this.check.slice(1));
+			textArea.onchange = ev => {
+				// @ts-ignore
+				this.check = this._expectedType.first() + ev.target.value;
+				refreshEditor();
+			};
+			outerDiv.append(makeTextBoxDragSafe(textArea, this));
+			this._markValidationError(outerDiv);
+			return outerDiv;
+		}
+
+		_makeToggleButton() {
 			const button = document.createElement("button");
 			button.append(capFirstChar(this._expectedType));
 			button.onclick = () => {
@@ -982,17 +995,7 @@ App.RA.Activation.Editor = (function() {
 				this.check = this._expectedType.first() + this.check.slice(1);
 				refreshEditor();
 			};
-			div.append(button);
-			const textArea = document.createElement("textarea");
-			textArea.append(this.check.slice(1));
-			textArea.onchange = ev => {
-				// @ts-ignore
-				this.check = this._expectedType.first() + ev.target.value;
-				refreshEditor();
-			};
-			div.append(makeTextBoxDragSafe(textArea, this));
-			this._markValidationError(div);
-			return div;
+			return button;
 		}
 
 		validate(errorList) {
-- 
GitLab