From 6993d10cf20cf7711d956ae54826a1c6ffe7ded1 Mon Sep 17 00:00:00 2001
From: Florian Spreckelsen <f.spreckelsen@indiscale.com>
Date: Thu, 20 Feb 2025 18:21:43 +0100
Subject: [PATCH] ENH: Make more parts of the datamodel configurable in js

---
 .../src/ext/js/a_box_loan_config.js           |  18 ++-
 .../caosdb-webui/src/ext/js/box_loan.js       | 142 +++++++++---------
 2 files changed, 85 insertions(+), 75 deletions(-)

diff --git a/loan-custom/caosdb-server/caosdb-webui/src/ext/js/a_box_loan_config.js b/loan-custom/caosdb-server/caosdb-webui/src/ext/js/a_box_loan_config.js
index 096613e..3ad17f3 100644
--- a/loan-custom/caosdb-server/caosdb-webui/src/ext/js/a_box_loan_config.js
+++ b/loan-custom/caosdb-server/caosdb-webui/src/ext/js/a_box_loan_config.js
@@ -21,20 +21,30 @@
 
 
 
-var box_loan_config = function () {
+var box_loan_config = function() {
 
     var datamodel = {
         loan: "Loan",
         box: "Box",
         returned: "returned",
+        returnAccepted: "returnAccepted",
+        returnRequested: "returnRequested",
+        lent: "lent",
+        loanAccepted: "loanAccepted",
+        loanRequested: "loanRequested",
+        location: "Location",
+        firstName: "firstName",
+        lastName: "lastName",
+        email: "email",
+        number: "Number",
+        expectedReturn: "expectedReturn",
     }
 
-    var init = function () {
-    }
+    var init = function() {}
 
     return {
         init: init,
-        datamodel: datamodel    
+        datamodel: datamodel
     };
 
 }();
diff --git a/loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js b/loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
index da61f5d..f48b25e 100644
--- a/loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
+++ b/loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
@@ -37,17 +37,17 @@ var getHTMLForm = async function(pageName, variables) {
     var site = await connection.get("webinterface/html/forms/" + pageName + ".html", "html");
     var htmltext = site.getElementById("caosdb-form").innerHTML;
     var req = /\{([0-9a-z-A-Z_]+)\}/g;
-    return htmltext.replace(req, (match, p1) => { 
-        return variables[p1] || ""; 
-    }); 
+    return htmltext.replace(req, (match, p1) => {
+        return variables[p1] || "";
+    });
 }
 
 /**
  * Box Loan, refactored code.
  */
-var box_loan = function (logger, box_loan_config) {
+var box_loan = function(logger, box_loan_config) {
 
-    var datamodel = box_loan_config.datamodel;
+    const datamodel = box_loan_config.datamodel;
 
     const _dismiss_button = '<button class="btn btn-secondary box-loan-btn">OK</button>'
     const _server_did_not_respond = "The server did not respond. Please reload the page.";
@@ -78,21 +78,21 @@ var box_loan = function (logger, box_loan_config) {
      * @param text
      * @return HTMLElement
      */
-    var getPleaseWaitSpan = function (text = "Processing. Please wait...") {
+    var getPleaseWaitSpan = function(text = "Processing. Please wait...") {
         return $('<span>' + text + '</span>')[0];
     }
 
     /**
      * Return the actions panel of a box entity.
      */
-    var get_actions_panel = function (box) {
+    var get_actions_panel = function(box) {
         return $(box).find('.caosdb-entity-actions-panel');
     }
 
     /**
      * Open a mail with recepient address address, subject subject and body text.
      */
-    this.open_mail_generic = function (address, subject, text) {
+    this.open_mail_generic = function(address, subject, text) {
         const mailto = 'mailto:' + address + '?subject=' + subject + '&body=' + text;
         location.href = mailto;
     }
@@ -102,7 +102,7 @@ var box_loan = function (logger, box_loan_config) {
      * is present in the property list p.
      * This function is used for determining the loan state.
      */
-    var loan_state_function = function (p, name) {
+    var loan_state_function = function(p, name) {
         var p1 = p.filter(x => x.name == name);
         if (p1.length == 1 && p1[0].value.length > 0) {
             return true;
@@ -113,24 +113,24 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * This function returns a string on the state of the loan.
      */
-    var get_loan_state_string = function (loan) {
+    var get_loan_state_string = function(loan) {
         const p = getProperties(loan);
         if (loan_state_function(p, datamodel.returned)) {
             return "returned";
         }
-        if (loan_state_function(p, "returnAccepted")) {
+        if (loan_state_function(p, datamodel.returnAccepted)) {
             return "return_accepted";
         }
-        if (loan_state_function(p, "returnRequested")) {
+        if (loan_state_function(p, datamodel.returnRequested)) {
             return "return_requested";
         }
-        if (loan_state_function(p, "lent")) {
+        if (loan_state_function(p, datamodel.lent)) {
             return "lent";
         }
-        if (loan_state_function(p, "loanAccepted")) {
+        if (loan_state_function(p, datamodel.loanAccepted)) {
             return "loan_accepted";
         }
-        if (loan_state_function(p, "loanRequested")) {
+        if (loan_state_function(p, datamodel.loanRequested)) {
             return "loan_requested";
         }
 
@@ -143,14 +143,14 @@ var box_loan = function (logger, box_loan_config) {
      * Query for a Loan entity which references the box and which has no
      * `returned` property.
      */
-    var get_active_loans = async function (box) {
+    var get_active_loans = async function(box) {
         return await query(`FIND ${datamodel.loan} WITH ${datamodel.box} -> ${box.id} AND WHICH DOES NOT HAVE A ${datamodel.returned}`);
     }
 
     /**
      * Returns detailed information about the loan state of this box:
      */
-    var get_loan_state = async function (box) {
+    var get_loan_state = async function(box) {
         const loan_state = {
             loan: undefined,
             state: undefined,
@@ -167,7 +167,7 @@ var box_loan = function (logger, box_loan_config) {
         return loan_state;
     }
 
-    var run_script = async function (script, data) {
+    var run_script = async function(script, data) {
         const json_str = JSON.stringify(data);
         const params = {
             "-p0": {
@@ -185,7 +185,7 @@ var box_loan = function (logger, box_loan_config) {
         }
     }
 
-    var show_result = function (container, result, box) {
+    var show_result = function(container, result, box) {
         const dismissable = $('<div/>');
         const restore = $(container).children();
         restore.hide();
@@ -208,7 +208,7 @@ var box_loan = function (logger, box_loan_config) {
         }
 
         const dismiss_btn = $(_dismiss_button);
-        dismiss_btn.click(function () {
+        dismiss_btn.click(function() {
             dismissable.remove();
             restore.show();
             init(box);
@@ -217,7 +217,7 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var get_request_data = function (form) {
+    var get_request_data = function(form) {
         const email = $(form).find("#email").val();
         const first_name = $(form).find("#first-name").val();
         const last_name = $(form).find("#last-name").val();
@@ -252,7 +252,7 @@ var box_loan = function (logger, box_loan_config) {
      * Generate a borrow function for a box.
      * This function can also be used to assign values to multiple boxes.
      */
-    var borrow_function = async function (form, box) {
+    var borrow_function = async function(form, box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -271,7 +271,7 @@ var box_loan = function (logger, box_loan_config) {
         show_result(actions_panel, result, box);
     }
 
-    var _add_form = async function (box, form_generator, submit_callback) {
+    var _add_form = async function(box, form_generator, submit_callback) {
         const form = $(await form_generator(box));
         form.insertAfter($(box).find('.caosdb-entity-actions-panel')).hide();
         form.submit(() => {
@@ -290,7 +290,7 @@ var box_loan = function (logger, box_loan_config) {
         return form[0];
     }
 
-    var _init_validator = function (form) {
+    var _init_validator = function(form) {
         // initiate validator
         // Workaround for missing checkValidity function:
         if (form.checkValidity == undefined) {
@@ -307,7 +307,7 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add Return button to boxes' actions panels.
      */
-    var add_return_button = async function (box) {
+    var add_return_button = async function(box) {
         const but = $(_return_box_button);
 
         get_actions_panel(box).append(but);
@@ -317,7 +317,7 @@ var box_loan = function (logger, box_loan_config) {
             name: "location",
             label: "",
             required: true,
-            query: "FIND Record Location",
+            query: `FIND Record ${datamodel.location}`,
             make_desc: getEntityName,
         }
         const dd = form_elements.make_form_field(config);
@@ -339,7 +339,7 @@ var box_loan = function (logger, box_loan_config) {
      * If the user is administrator (or a data curator) a button is added
      * to accept the borrow request. Else a message is added "pending loan request".
      */
-    var add_borrow_accept_button = function (box, loan) {
+    var add_borrow_accept_button = function(box, loan) {
         const actionPanel = get_actions_panel(box);
         if (userIsAdministrator() === true || userHasRole("curator") === true) {
             const but = $(_accept_loan_button);
@@ -354,7 +354,7 @@ var box_loan = function (logger, box_loan_config) {
         }
     }
 
-    var create_link_to_loan = function (loan, text) {
+    var create_link_to_loan = function(loan, text) {
         const loan_id = getEntityID(loan);
         const href = `${connection.getBasePath()}Entity/${loan_id}`;
         const title = "Open loan entity.";
@@ -366,7 +366,7 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add Borrow buttons to the boxes' action panels
      */
-    var add_borrow_button = async function (box) {
+    var add_borrow_button = async function(box) {
         const but = $(_borrow_box_button);
         get_actions_panel(box).append(but);
 
@@ -375,7 +375,7 @@ var box_loan = function (logger, box_loan_config) {
             name: "destination",
             label: "",
             required: true,
-            query: "FIND Record Location",
+            query: `FIND Record ${datamodel.location}`,
             make_desc: getEntityName,
         }
         const dd = form_elements.make_form_field(config);
@@ -394,19 +394,19 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var open_accept_loan_mail = async function (loan, box) {
+    var open_accept_loan_mail = async function(loan, box) {
         try {
             const borrower = (await retrieve(getProperty(loan, "Borrower"), case_sensitive = false))[0];
 
-            const email = getProperty(borrower, "email", case_sensitive = false);
-            const firstName = getProperty(borrower, "firstName", case_sensitive = false);
-            const lastName = getProperty(borrower, "lastName", case_sensitive = false);
-            const bn = getProperty(box, "Number", case_sensitive = false);
-            const date = getProperty(loan, "expectedReturn", case_sensitive = false);
+            const email = getProperty(borrower, datamodel.email, case_sensitive = false);
+            const firstName = getProperty(borrower, datamodel.firstName, case_sensitive = false);
+            const lastName = getProperty(borrower, datamodel.lastName, case_sensitive = false);
+            const bn = getProperty(box, datamodel.number, case_sensitive = false);
+            const date = getProperty(loan, datamodel.expectedReturn, case_sensitive = false);
 
-            const subject = `Loan Request for Box ${bn} accepted`;
+            const subject = `Loan Request for ${datamodel.box} ${bn} accepted`;
             const body = `Dear ${firstName} ${lastName}, %0D%0D` +
-                `You can pickup box number ${bn} on ${date}. %0D%0D` +
+                `You can pickup ${datamodel.box} number ${bn} on ${date}. %0D%0D` +
                 `Kind Regards,%0D%0D ${getUserName()}`;
             open_mail_generic(email, subject, body)
         } catch (err) {
@@ -415,7 +415,7 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var accept_loan_function = async function (box) {
+    var accept_loan_function = async function(box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -433,7 +433,7 @@ var box_loan = function (logger, box_loan_config) {
         open_accept_loan_mail(loan, box);
     }
 
-    var manual_return_function = async function (box) {
+    var manual_return_function = async function(box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -452,7 +452,7 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add Manual Return button to boxes' actions panels.
      */
-    var add_manual_return_button = function (box, loan) {
+    var add_manual_return_button = function(box, loan) {
         const actionPanel = get_actions_panel(box);
         if (userIsAdministrator() === true || userHasRole("curator") === true) {
             const but = $(_manual_return_button);
@@ -483,7 +483,7 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var confirm_loan_function = async function (box) {
+    var confirm_loan_function = async function(box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -500,18 +500,18 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var open_reject_return_mail = async function (loan, box) {
+    var open_reject_return_mail = async function(loan, box) {
         try {
             const borrower = (await retrieve(getProperty(loan, "Borrower"), case_sensitive = false))[0];
 
-            const email = getProperty(borrower, "email", case_sensitive = false);
-            const firstName = getProperty(borrower, "firstName", case_sensitive = false);
-            const lastName = getProperty(borrower, "lastName", case_sensitive = false);
-            const bn = getProperty(box, "Number", case_sensitive = false);
+            const email = getProperty(borrower, datamodel.email, case_sensitive = false);
+            const firstName = getProperty(borrower, datamodel.firstName, case_sensitive = false);
+            const lastName = getProperty(borrower, datamodel.lastName, case_sensitive = false);
+            const bn = getProperty(box, datamodel.number, case_sensitive = false);
 
-            const subject = `Return Request for Box ${bn} rejected`;
+            const subject = `Return Request for ${datamodel.box} ${bn} rejected`;
             const body = `Dear ${firstName} ${lastName}, %0D%0D` +
-                `your return request for box number ${bn} cannot be accepted.` +
+                `your return request for ${datamodel.box} number ${bn} cannot be accepted.` +
                 `Kind Regards,%0D ${getUserName()}`;
             open_mail_generic(email, subject, body)
         } catch (err) {
@@ -520,18 +520,18 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var open_accept_return_mail = async function (loan, box) {
+    var open_accept_return_mail = async function(loan, box) {
         try {
             const borrower = (await retrieve(getProperty(loan, "Borrower"), case_sensitive = false))[0];
 
-            const email = getProperty(borrower, "email", case_sensitive = false);
-            const firstName = getProperty(borrower, "firstName", case_sensitive = false);
-            const lastName = getProperty(borrower, "lastName", case_sensitive = false);
-            const bn = getProperty(box, "Number", case_sensitive = false);
-            const date = getProperty(loan, "expectedReturn", case_sensitive = false);
-            const subject = `Return Request for Box ${bn} accepted`;
+            const email = getProperty(borrower, datamodel.email, case_sensitive = false);
+            const firstName = getProperty(borrower, datamodel.firstName, case_sensitive = false);
+            const lastName = getProperty(borrower, datamodel.lastName, case_sensitive = false);
+            const bn = getProperty(box, datamodel.number, case_sensitive = false);
+            const date = getProperty(loan, datamodel.expectedReturn, case_sensitive = false);
+            const subject = `Return Request for ${datamodel.box} ${bn} accepted`;
             const body = `Dear ${firstName} ${lastName}, %0D%0D` +
-                `please return box number ${bn} on ${date}. %0D%0D` +
+                `please return ${datamodel.box} number ${bn} on ${date}. %0D%0D` +
                 `Kind Regards,%0D ${getUserName()}`;
             open_mail_generic(email, subject, body)
         } catch (err) {
@@ -540,7 +540,7 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var accept_return_function = async function (box) {
+    var accept_return_function = async function(box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -559,7 +559,7 @@ var box_loan = function (logger, box_loan_config) {
     }
 
 
-    var reject_return_function = async function (box) {
+    var reject_return_function = async function(box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -583,7 +583,7 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add two buttons for confirming or rejecting a return request.
      */
-    var add_confirm_reject_return = function (box, loan) {
+    var add_confirm_reject_return = function(box, loan) {
         const actionPanel = get_actions_panel(box);
         if (userIsAdministrator() === true || userHasRole("curator") === true) {
             const confirmButton = $(_accept_return_button);
@@ -611,7 +611,7 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add a button for confirming the loan.
      */
-    var add_confirm_loan_button = function (box, loan) {
+    var add_confirm_loan_button = function(box, loan) {
         const actionsPanel = get_actions_panel(box);
         if (userIsAdministrator() === true || userHasRole("curator") === true) {
             const but = $(_confirm_loan_button);
@@ -626,7 +626,7 @@ var box_loan = function (logger, box_loan_config) {
         }
     }
 
-    var return_function = async function (form, box) {
+    var return_function = async function(form, box) {
         const wait = getPleaseWaitSpan();
         const actions_panel = get_actions_panel(box);
         $(actions_panel).append(wait).find('btn').hide()
@@ -653,9 +653,9 @@ var box_loan = function (logger, box_loan_config) {
     /**
      * Add buttons for borrowing boxes.
      */
-    var add_buttons = function (boxes) {
+    var add_buttons = function(boxes) {
         $(boxes).find('.box-loan-btn').remove();
-        $(boxes).each(async function () {
+        $(boxes).each(async function() {
             const loan_state = await get_loan_state(this);
             if (typeof loan_state.loan !== "undefined") {
                 if (loan_state.state == "loan_requested") {
@@ -680,7 +680,7 @@ var box_loan = function (logger, box_loan_config) {
      * selectform can be used to generate the form for multiple boxes.
      * In case selectform is true, box will be ignored.
      */
-    var generate_form_borrow_checkout = async function (box) {
+    var generate_form_borrow_checkout = async function(box) {
         const email = window.localStorage["borrower_email"];
         const firstname = window.localStorage["borrower_first_name"];
         const lastname = window.localStorage["borrower_last_name"];
@@ -714,16 +714,16 @@ var box_loan = function (logger, box_loan_config) {
      * currentlocation (pre-filled)
      * comment
      */
-    var generate_return_form = async function (box) {
+    var generate_return_form = async function(box) {
         const loan = (await get_active_loans(box))[0];
         const borrower = (await retrieve(getProperty(loan, "Borrower", case_sensitive = false)))[0];
 
-        var email = getProperty(borrower, "email", case_sensitive = false);
-        var first_name = getProperty(borrower, "firstName",
+        var email = getProperty(borrower, datamodel.email, case_sensitive = false);
+        var first_name = getProperty(borrower, datamodel.firstName,
             case_sensitive = false);
-        var last_name = getProperty(borrower, "lastName",
+        var last_name = getProperty(borrower, datamodel.lastName,
             case_sensitive = false);
-        var exp_return = getProperty(loan, "expectedReturn",
+        var exp_return = getProperty(loan, datamodel.expectedReturn,
             case_sensitive = false);
         var cur_loc = getProperty(loan, "destination", case_sensitive = false);
 
@@ -738,7 +738,7 @@ var box_loan = function (logger, box_loan_config) {
         });
     }
 
-    var init = function (boxes) {
+    var init = function(boxes) {
         const init_boxes = boxes || $(".caosdb-entity-panel")
             .not("[data-version-successor]")
             .filter(function() {
-- 
GitLab