From 2519f686bff24962798ef5b7d0f9b13d56590678 Mon Sep 17 00:00:00 2001
From: Arkerthan <arkerthan@gmail.com>
Date: Mon, 1 Mar 2021 00:14:50 +0100
Subject: [PATCH] Simplify fsDeco and fix options callback

---
 src/futureSocieties/fsDecoration.js | 98 +++++++++--------------------
 src/gui/options/optionsGroup.js     | 19 +++---
 2 files changed, 42 insertions(+), 75 deletions(-)

diff --git a/src/futureSocieties/fsDecoration.js b/src/futureSocieties/fsDecoration.js
index 789d1f662bb..a8521b78cbf 100644
--- a/src/futureSocieties/fsDecoration.js
+++ b/src/futureSocieties/fsDecoration.js
@@ -3,6 +3,9 @@
  */
 App.UI.facilityRedecoration = function() {
 	const el = new DocumentFragment();
+	/**
+	 * @type {Map<string, string>}
+	 */
 	const activeFacilities = new Map([]);
 	const options = new App.UI.OptionsGroup();
 	const arc = V.arcologies[0];
@@ -60,67 +63,16 @@ App.UI.facilityRedecoration = function() {
 		activeFacilities.set(V.masterSuiteName, "masterSuiteDecoration");
 	}
 
-	options.addOption(`Change style for all facilities`)
-		.addCustomDOM(modifyAll());
-
-	for (const [name, decoration] of activeFacilities) {
-		options.addOption(`The decoration style of ${name} is`)
-			.addCustomDOM(createPulldown(decoration));
-	}
-	el.append(options.render());
-
-	return el;
-
-	function createPulldown(variable) {
-		const select = document.createElement("select");
-		select.classList.add("rajs-list");
-
-		// Standard decorations
-		const choice = App.UI.DOM.appendNewElement("option", select, "Standard");
-		choice.value = "standard";
-		if (V[variable] === "standard") {
-			choice.selected = true;
-		}
-
-		// FS decorations
-		for (const decorationName of decorationNames) {
-			const choice = App.UI.DOM.makeElement("option", decorationName);
-			if (V[variable] === decorationName) {
-				choice.selected = true;
-			}
-			select.append(choice);
-		}
-
-		select.onchange = () => {
-			const O = select.options[select.selectedIndex];
-			if (O.value !== "standard") {
-				cashX(-5000, "capEx");
-			}
-			V[variable] = O.value;
-			App.UI.reload();
-		};
-		return select;
-	}
-
-	function modifyAll() {
-		const select = document.createElement("select");
-		select.classList.add("rajs-list");
-
-		// Standard decorations
-		const standard = App.UI.DOM.appendNewElement("option", select, "Standard");
-		standard.value = "standard";
-
-		// FS decorations
-		for (const decorationName of decorationNames) {
-			App.UI.DOM.appendNewElement("option", select, decorationName);
-		}
-
-		// Round Robin
-		App.UI.DOM.appendNewElement("option", select, "Distribute Evenly");
-
-		select.onchange = () => {
-			const O = select.options[select.selectedIndex];
-			if (O.value === "Distribute Evenly") { // Cycles through the list of available FS decorations, and distributes them to facilities round robin style.
+	// dummy variable to make sure the first option is selected by default
+	const currentSelected = {value: "none"};
+	options.addOption(`The decoration style of ${name} is`, "value", currentSelected)
+		.addValue("(Select option)", "none")
+		.addValue("Standard", "standard")
+		.addValueList(decorationNames)
+		.addValue("Distribute Evenly", "even")
+		.addCallbackToEach(value => {
+			console.log(value);
+			if (value === "even") { // Cycles through the list of available FS decorations, and distributes them to facilities round robin style.
 				let i = 0;
 				for (const decoration of activeFacilities.values()) {
 					cashX(-5000, "capEx");
@@ -132,17 +84,29 @@ App.UI.facilityRedecoration = function() {
 				}
 			} else {
 				for (const decoration of activeFacilities.values()) {
-					if (O.value !== "standard") {
+					if (value !== "standard") {
 						cashX(-5000, "capEx");
 					}
-					V[decoration] = O.value;
+					V[decoration] = value;
 				}
 			}
-			App.UI.reload();
-		};
-		select.selectedIndex = -1;
-		return select;
+		})
+		.pulldown();
+
+	for (const [name, decoration] of activeFacilities) {
+		options.addOption(`The decoration style of ${name} is`, decoration)
+			.addValue("Standard", "standard")
+			.addValueList(decorationNames)
+			.addCallbackToEach(value => {
+				if (value !== "standard") {
+					cashX(-5000, "capEx");
+				}
+			})
+			.pulldown();
 	}
+	el.append(options.render());
+
+	return el;
 };
 
 /**
diff --git a/src/gui/options/optionsGroup.js b/src/gui/options/optionsGroup.js
index 60fea477428..c56a48914f4 100644
--- a/src/gui/options/optionsGroup.js
+++ b/src/gui/options/optionsGroup.js
@@ -37,9 +37,10 @@ App.UI.OptionsGroup = (function() {
 		}
 
 		/**
-		 * @param {*} name
-		 * @param {*} [value=name]
-		 * @param {Function} [callback]
+		 * @template {any} T
+		 * @param {string} name
+		 * @param {T|string} [value=name]
+		 * @param {function(T|string):void} [callback]
 		 * @returns {Option}
 		 */
 		addValue(name, value = name, callback = undefined) {
@@ -113,7 +114,7 @@ App.UI.OptionsGroup = (function() {
 		 * Adds a button that executes the callback when clicked AND reloads the passage
 		 *
 		 * @param {string} name
-		 * @param {Function} callback
+		 * @param {function():void} callback
 		 * @param {string} passage
 		 */
 		customButton(name, callback, passage) {
@@ -147,7 +148,7 @@ App.UI.OptionsGroup = (function() {
 		}
 
 		/**
-		 * @param {Function} callback gets executed on every button click. Selected value is given as argument.
+		 * @param {function(any):void} callback gets executed on every button click. Selected value is given as argument.
 		 */
 		addCallback(callback) {
 			this.valuePairs.last().callback = callback;
@@ -155,7 +156,9 @@ App.UI.OptionsGroup = (function() {
 		}
 
 		/**
-		 * @param {Function} callback gets executed on every button click. Selected value is given as argument.
+		 * TODO Replace with a global callback
+		 *
+		 * @param {function(any):void} callback gets executed on every button click. Selected value is given as argument.
 		 */
 		addCallbackToEach(callback) {
 			this.valuePairs.forEach(pair => pair.callback = callback);
@@ -263,7 +266,7 @@ App.UI.OptionsGroup = (function() {
 						button.onclick = () => {
 							this.object[this.property] = value.value;
 							if (value.callback) {
-								value.callback();
+								value.callback(value.value);
 							}
 							App.UI.reload();
 						};
@@ -296,7 +299,7 @@ App.UI.OptionsGroup = (function() {
 					}
 					const originalObj = this.valuePairs.find(obj => obj.name === O.textContent);
 					if (originalObj && typeof originalObj.callback === "function") {
-						originalObj.callback();
+						originalObj.callback(originalObj.value);
 					}
 					App.UI.reload();
 				};
-- 
GitLab