diff --git a/modules/ui/resources-editor.js b/modules/ui/resources-editor.js index fb60e075..840d15b1 100644 --- a/modules/ui/resources-editor.js +++ b/modules/ui/resources-editor.js @@ -63,15 +63,20 @@ function editResources() { if (bonus === 'cavalry') return ``; } - body.addEventListener("click", function(ev) { - const el = ev.target, cl = el.classList, line = el.parentNode, i = +line.dataset.id; + body.addEventListener("click", function (ev) { + const el = ev.target, + cl = el.classList, + line = el.parentNode, + i = +line.dataset.id; const resource = Resources.get(+line.dataset.id); if (cl.contains("resourceCategory")) return changeCategory(resource, line, el); if (cl.contains("resourceModel")) return changeModel(resource, line, el); }); - body.addEventListener("change", function(ev) { - const el = ev.target, cl = el.classList, line = el.parentNode; + body.addEventListener("change", function (ev) { + const el = ev.target, + cl = el.classList, + line = el.parentNode; const resource = Resources.get(+line.dataset.id); if (cl.contains("resourceName")) return changeName(resource, el.value, line); }); @@ -484,10 +489,17 @@ function editResources() { `; - $("#alert").dialog({resizable: false, title: "Change category", + $("#alert").dialog({ + resizable: false, + title: "Change category", buttons: { - Cancel: function() {$(this).dialog("close");}, - Apply: function() {applyChanges(); $(this).dialog("close");} + Cancel: function () { + $(this).dialog("close"); + }, + Apply: function () { + applyChanges(); + $(this).dialog("close"); + } } }); @@ -502,20 +514,26 @@ function editResources() { function changeModel(resource, line, el) { const defaultModels = Resources.defaultModels; const model = line.dataset.model; - const modelOptions = Object.keys(defaultModels).map(m => ``).join(""); + const modelOptions = Object.keys(defaultModels).sort().map(m => ``).join(""); const wikiURL = "https://github.com/Azgaar/Fantasy-Map-Generator/wiki/Resources:-spread-functions"; + const onSelect = "resouceModelFunction.innerHTML = Resources.defaultModels[this.value] || ' '; resouceModelCustomName.value = ''; resouceModelCustomFunction.value = ''"; alertMessage.innerHTML = `
Predefined models
Name:
- +
Function:
-
${defaultModels[model]}
+
+ ${defaultModels[model] || " "} +
@@ -523,23 +541,29 @@ function editResources() { Custom model
Name:
- +
Function:
- +
`; - $("#alert").dialog({resizable: false, title: "Change spread model", + $("#alert").dialog({ + resizable: false, + title: "Change spread model", buttons: { Help: () => openURL(wikiURL), - Cancel: function() {$(this).dialog("close");}, - Apply: function() {applyChanges(this);} + Cancel: function () { + $(this).dialog("close"); + }, + Apply: function () { + applyChanges(this); + } } }); @@ -548,17 +572,29 @@ function editResources() { const customFn = document.getElementById("resouceModelCustomFunction").value; const message = document.getElementById("resourceModelMessage"); - if (customName && !customFn) return message.innerHTML = "Error. Custom model function is required"; - if (!customName && customFn) return message.innerHTML = "Error. Custom model name is required"; + if (customName && !customFn) return (message.innerHTML = "Error. Custom model function is required"); + if (!customName && customFn) return (message.innerHTML = "Error. Custom model name is required"); message.innerHTML = ""; if (customName && customFn) { + try { + const allMethods = "{" + Object.keys(Resources.methods).join(", ") + "}"; + const fn = new Function(allMethods, "return " + customFn); + fn({...Resources.methods}); + } catch (err) { + message.innerHTML = "Error. " + err.message || err; + return; + } + resource.model = line.dataset.model = el.innerHTML = customName; resource.custom = customFn; + $(dialog).dialog("close"); return; } const model = document.getElementById("resouceModelSelect").value; + if (!model) return (message.innerHTML = "Error. Model is not set"); + resource.model = line.dataset.model = el.innerHTML = model; $(dialog).dialog("close"); } @@ -568,14 +604,14 @@ function editResources() { const circle = this.querySelector("circle"); const resource = Resources.get(+this.parentNode.dataset.id); - const callback = function(fill) { + const callback = function (fill) { const stroke = Resources.getStroke(fill); circle.setAttribute("fill", fill); circle.setAttribute("stroke", stroke); resource.color = fill; resource.stroke = stroke; goods.selectAll(`circle[data-i='${resource.i}']`).attr("fill", fill).attr("stroke", stroke); - } + }; openPicker(resource.color, callback, {allowHatching: false}); }