diff --git a/src/004-base/facility.js b/src/004-base/facility.js index 1298e01d2001f7ef8cc026f1952a01b00120c284..047d6f8f3b46bd67a79c57a827eb4bf027f4d386 100644 --- a/src/004-base/facility.js +++ b/src/004-base/facility.js @@ -106,6 +106,7 @@ App.Entity.Facilities.Job = class { /** * @callback assignmentCallback + * @param {App.Entity.SlaveState} slave the slave whose assignment changes * @param {string} assignment new assignment * @returns {void} */ @@ -524,6 +525,29 @@ App.Entity.Facilities.FacilitySingleJob = class extends App.Entity.Facilities.Jo return `<<link "${linkText}" "Assign">><<set $assignTo = "${this.facility.genericName}", $i = ${i}${psg}>>${linkAction}<</link>>`; } + /** + * @param {number} i slave index + * @param {string} [targetPassage] passage to go to + * @param {assignmentCallback} [callback] + * @param {string} [linkText] + * @returns {HTMLAnchorElement} + */ + assignmentLinkElement(i, targetPassage, callback, linkText) { + linkText = linkText || this.desc.position; + return App.UI.DOM.assignmentLink(State.variables.slaves[i], this.desc.assignment, "Assign", + (slave, assignment) => { + if (callback) { + callback(slave, assignment); + } + // Set up environment for the "Assign" passage + const V = State.variables; + V.i = V.slaveIndices[slave.ID]; + V.activeSlave = slave; + V.assignTo = this.facility.genericName; + V.returnTo = targetPassage ? targetPassage : passage(); + }, linkText); + } + /** @returns {number[]} */ employeesIndices() { const V = State.variables; diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 094cd5751c84e2db12a32d47243c62faddeb3d1e..7e597d555194f4cccb4e376b41693432f2fad7dc 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -42,18 +42,19 @@ App.UI.DOM.passageLink = function(linkText, passage, handler, tooltip = '', elem * @param {App.Entity.SlaveState} slave * @param {string} assignment * @param {string} [passage] passage to go to - * @param {assignmentCallback} [callback] + * @param {assignmentCallback} [action] action that changes slave state. The default one is a call to assignJob() * @param {string} [linkText] * @returns {HTMLAnchorElement} */ -App.UI.DOM.assignmentLink = function(slave, assignment, passage, callback, linkText) { +App.UI.DOM.assignmentLink = function(slave, assignment, passage, action, linkText) { let res = document.createElement("a"); res.textContent = linkText; res.onclick = (e) => { e.preventDefault(); - assignJob(slave, assignment); - if (callback) { - callback(this.desc.assignment); + if (action) { + action(slave, assignment); + } else { + assignJob(slave, assignment); } if (passage !== '') { SugarCube.Engine.play(passage);