From 76966e587bac8d126b5f5b4085311184efc692c5 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Thu, 19 Sep 2019 17:33:38 +0200 Subject: [PATCH 1/4] Manually select the row when applying wide interims --- bika/lims/browser/js/bika.lims.worksheet.js | 20 ++++++++++++---- .../js/coffee/bika.lims.worksheet.coffee | 23 +++++++++++++++---- 2 files changed, 33 insertions(+), 10 deletions(-) diff --git a/bika/lims/browser/js/bika.lims.worksheet.js b/bika/lims/browser/js/bika.lims.worksheet.js index 3ec8865361..8696fcf299 100644 --- a/bika/lims/browser/js/bika.lims.worksheet.js +++ b/bika/lims/browser/js/bika.lims.worksheet.js @@ -1113,22 +1113,32 @@ /* * Eventhandler when the wide interim apply button was clicked */ - var $el, analysis, empty_only, interim; + var $el, analysis, empty_only, interim, set_value, value; console.debug("°°° WorksheetManageResultsView::on_wideinterims_apply_click °°°"); event.preventDefault(); $el = $(event.currentTarget); analysis = $("#wideinterims_analyses").val(); interim = $("#wideinterims_interims").val(); empty_only = $("#wideinterims_empty").is(":checked"); - return $("tr td input[column_key='" + interim + "']").each(function(index, element) { + value = $("#wideinterims_value").val(); + set_value = function(input, value) { + var cb, tr; + input.value = value; + tr = input.closest("tr"); + cb = tr.querySelector("input[type='checkbox']"); + if (!cb.checked) { + return cb.click(); + } + }; + return $("tr td input[column_key='" + interim + "']").each(function(index, input) { if (empty_only) { if ($(this).val() === "" || $(this).val().match(/\d+/) === "0") { - $(this).val($("#wideinterims_value").val()); + set_value(input, value); } } else { - $(this).val($("#wideinterims_value").val()); + set_value(input, value); } - return $(this).trigger("change"); + return true; }); }; diff --git a/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee b/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee index b035ae4d6b..c99df48fea 100644 --- a/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee +++ b/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee @@ -1040,11 +1040,24 @@ class window.WorksheetManageResultsView analysis = $("#wideinterims_analyses").val() interim = $("#wideinterims_interims").val() empty_only = $("#wideinterims_empty").is(":checked") - - $("tr td input[column_key='#{interim}']").each (index, element) -> + value = $("#wideinterims_value").val() + + # N.B.: Workaround to notify the ReactJS listing component about the changed + # values + set_value = (input, value) -> + # Set the value in the input field + input.value = value + # Manually select the checkbox of this row + # https://github.com/senaite/senaite.core/issues/1202 + tr = input.closest("tr") + cb = tr.querySelector("input[type='checkbox']") + if not cb.checked + cb.click() + + $("tr td input[column_key='#{interim}']").each (index, input) -> if empty_only if $(this).val() == "" or $(this).val().match(/\d+/) == "0" - $(this).val $("#wideinterims_value").val() + set_value input, value else - $(this).val $("#wideinterims_value").val() - $(this).trigger "change" + set_value input, value + return true From a7bd77740ce988485efb58a38c08ecd063f83f2e Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Thu, 19 Sep 2019 18:38:16 +0200 Subject: [PATCH 2/4] No need to handle interimfields of calculations here --- bika/lims/browser/worksheet/views/results.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/bika/lims/browser/worksheet/views/results.py b/bika/lims/browser/worksheet/views/results.py index 9b095b0f55..0b93c3a0a4 100644 --- a/bika/lims/browser/worksheet/views/results.py +++ b/bika/lims/browser/worksheet/views/results.py @@ -164,10 +164,6 @@ def get_wide_interims(self): if analysis.getKeyword() in outdict.keys(): continue - calculation = analysis.getCalculation() - if not calculation: - continue - andict = { "analysis": analysis.Title(), "keyword": analysis.getKeyword(), @@ -179,12 +175,6 @@ def get_wide_interims(self): if field.get("wide", False): andict["interims"][field["keyword"]] = field - # Interims from calculation - for field in calculation.getInterimFields(): - if field["keyword"] not in andict["interims"].keys() \ - and field.get("wide", False): - andict["interims"][field["keyword"]] = field - if andict["interims"]: outdict[analysis.getKeyword()] = andict return outdict From 994bdaf1e8bc61814683f6f84c37de3375f37622 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Thu, 19 Sep 2019 18:39:52 +0200 Subject: [PATCH 3/4] Handle ReactJS input field setting --- bika/lims/browser/js/bika.lims.worksheet.js | 14 +++++++------- .../browser/js/coffee/bika.lims.worksheet.coffee | 12 ++++++------ 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/bika/lims/browser/js/bika.lims.worksheet.js b/bika/lims/browser/js/bika.lims.worksheet.js index 8696fcf299..575d770274 100644 --- a/bika/lims/browser/js/bika.lims.worksheet.js +++ b/bika/lims/browser/js/bika.lims.worksheet.js @@ -1122,13 +1122,13 @@ empty_only = $("#wideinterims_empty").is(":checked"); value = $("#wideinterims_value").val(); set_value = function(input, value) { - var cb, tr; - input.value = value; - tr = input.closest("tr"); - cb = tr.querySelector("input[type='checkbox']"); - if (!cb.checked) { - return cb.click(); - } + var evt, nativeInputValueSetter; + nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set; + nativeInputValueSetter.call(input, value); + evt = new Event('input', { + bubbles: true + }); + return input.dispatchEvent(evt); }; return $("tr td input[column_key='" + interim + "']").each(function(index, input) { if (empty_only) { diff --git a/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee b/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee index c99df48fea..3dfcefdb8b 100644 --- a/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee +++ b/bika/lims/browser/js/coffee/bika.lims.worksheet.coffee @@ -1045,14 +1045,14 @@ class window.WorksheetManageResultsView # N.B.: Workaround to notify the ReactJS listing component about the changed # values set_value = (input, value) -> - # Set the value in the input field - input.value = value # Manually select the checkbox of this row # https://github.com/senaite/senaite.core/issues/1202 - tr = input.closest("tr") - cb = tr.querySelector("input[type='checkbox']") - if not cb.checked - cb.click() + # https://stackoverflow.com/questions/23892547/what-is-the-best-way-to-trigger-onchange-event-in-react-js + # TL;DR: React library overrides input value setter + nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, "value").set + nativeInputValueSetter.call(input, value) + evt = new Event('input', {bubbles: true}) + input.dispatchEvent(evt) $("tr td input[column_key='#{interim}']").each (index, input) -> if empty_only From 7beed2f7afcd2aae855a0a928b3f5551cb44dd50 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Thu, 19 Sep 2019 18:46:40 +0200 Subject: [PATCH 4/4] Changelog updated --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index b5d3da8f88..ea6f94af7f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -22,6 +22,7 @@ Changelog **Fixed** +- #1444 Fixed Worksheet autofill of wide Iterims - #1426 Render HTML Texts in Info Popups correctly - #1423 Use the value set for ui_item property when displaying ReferenceWidget - #1425 Fix adapter priority for widget visibility