From e7558cfa5c466d3d8ad240048b39df95ef5a38fb Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Sun, 12 Nov 2023 18:03:07 +0100 Subject: [PATCH] Fix page reload in multi results classic view (#2420) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix page reload in multi results classic view * Changelog updated --------- Co-authored-by: Jordi Puiggené --- CHANGES.rst | 1 + src/senaite/core/browser/static/bundles/senaite.core.js | 2 +- .../core/browser/static/bundles/senaite.core.js.map | 2 +- webpack/app/senaite.core.js | 9 ++++++--- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 20eea41d72..c234ce3a60 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,7 @@ Changelog 2.5.0 (unreleased) ------------------ +- #2420 Fix page reload in multi results classic view - #2419 Check permission when automatic sample reception is enabled - #2416 Fix Template select empties existing Sample Type-, Point- and Profile values in sample add form - #2414 Fix missing empty selection in result option choices when no default value is set diff --git a/src/senaite/core/browser/static/bundles/senaite.core.js b/src/senaite/core/browser/static/bundles/senaite.core.js index 3812204b65..232cb2030c 100644 --- a/src/senaite/core/browser/static/bundles/senaite.core.js +++ b/src/senaite/core/browser/static/bundles/senaite.core.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e={311:e=>{e.exports=jQuery}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var a=t[i]={exports:{}};return e[i](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e=n(311),t=n.n(e);const i=function(){var e=this;e.baseUrl=t()("body").attr("data-i18ncatalogurl"),e.currentLanguage=t()("html").attr("lang")||"en",e.currentLanguage.split("-").length>1&&(e.currentLanguage=e.currentLanguage.split("-")[0]+"_"+e.currentLanguage.split("-")[1].toUpperCase()),e.storage=null,e.catalogs={},e.ttl=864e5,Date.now||(Date.now=function(){return(new Date).valueOf()});try{"localStorage"in window&&null!==window.localStorage&&"JSON"in window&&null!==window.JSON&&(e.storage=window.localStorage)}catch(e){}e.configure=function(t){for(var n in t)e[n]=t[n]},e._setCatalog=function(t,n,i){t in e.catalogs||(e.catalogs[t]={}),e.catalogs[t][n]=i},e._storeCatalog=function(t,n,i){var r=t+"-"+n;null!==e.storage&&null!==i&&(e.storage.setItem(r,JSON.stringify(i)),e.storage.setItem(r+"-updated",Date.now()))},e.getUrl=function(t,n){return e.baseUrl+"?domain="+t+"&language="+n},e.loadCatalog=function(n,i){if(void 0===i&&(i=e.currentLanguage),null!==e.storage){var r=n+"-"+i;if(r in e.storage&&Date.now()-parseInt(e.storage.getItem(r+"-updated"),10)=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function b(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=k(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){l=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw a}}}}function k(e,t){if(e){if("string"==typeof e)return w(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?w(e,t):void 0}}function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1])||arguments[1],n=e.closest(".field"),i="d-none";!1===t?n.classList.add(i):n.classList.remove(i)}},{key:"has_field_errors",value:function(e){return e.querySelectorAll(".is-invalid").length>0}},{key:"set_field_readonly",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.setAttribute("readonly","");var n=e.parentElement.querySelector("div.message");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="message text-secondary small",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"set_field_editable",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.removeAttribute("readonly");var n=e.parentElement.querySelector("div.message");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="message text-secondary small",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"set_field_error",value:function(e,t){e.classList.add("is-invalid");var n=e.parentElement.querySelector("div.invalid-feedback");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="invalid-feedback",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"remove_field_error",value:function(e){e.classList.remove("is-invalid");var t=e.parentElement.querySelector(".invalid-feedback");t&&t.remove()}},{key:"add_statusmessage",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",n=arguments.length>2?arguments[2]:void 0;n=n||{};var i=document.createElement("div"),r=n.title||"".concat(t.charAt(0).toUpperCase()+t.slice(1));i.innerHTML='\n \n '),i=i.firstElementChild;var a=document.getElementById("viewlet-above-content");if(n.flush){var o,l=b(a.querySelectorAll(".alert"));try{for(l.s();!(o=l.n()).done;)o.value.remove()}catch(e){l.e(e)}finally{l.f()}}return a.appendChild(i),i}},{key:"add_notification",value:function(e,t,n){n=n||{},n=Object.assign({animation:!0,autohide:!0,delay:5e3},n);var i=document.createElement("div");i.innerHTML='\n \n "),i=i.firstElementChild;var r=document.querySelector(".toast-container");return r||((r=document.createElement("div")).innerHTML='\n
\n
\n
\n
\n ',document.querySelector(".container-fluid").appendChild(r),r=r.querySelector(".toast-container")),r.appendChild(i),i}},{key:"update_form",value:function(e,n){var i,r=n.hide||[],a=n.show||[],o=n.readonly||[],l=n.editable||[],g=n.errors||[],k=n.messages||[],w=n.notifications||[],S=n.updates||[],x=n.html||[],E=n.attributes||[],L=b(g);try{for(L.s();!(i=L.n()).done;){var j,O,T=i.value;j=T.name,O=T.error,p(T,s);var C=this.get_form_field_by_name(e,j);C&&(O?this.set_field_error(C,O):this.remove_field_error(C))}}catch(e){L.e(e)}finally{L.f()}var A,q=b(k);try{for(q.s();!(A=q.n()).done;){var M,N=A.value;P=N.message,I=N.level,M=p(N,u);var I=I||"info",P=P||"";this.add_statusmessage(P,I,M)}}catch(e){q.e(e)}finally{q.f()}var U,z=b(w);try{for(z.s();!(U=z.n()).done;){var H,D,F,J=U.value;H=J.title,D=J.message,F=p(J,c);var R=this.add_notification(H,D,F);t()(R).toast("show")}}catch(e){z.e(e)}finally{z.f()}var B,X=b(r);try{for(X.s();!(B=X.n()).done;){var $,K=B.value;$=K.name,p(K,d);var Q=this.get_form_field_by_name(e,$);Q&&this.toggle_field_visibility(Q,!1)}}catch(e){X.e(e)}finally{X.f()}var G,V=b(a);try{for(V.s();!(G=V.n()).done;){var W,Y=G.value;W=Y.name,p(Y,f);var Z=this.get_form_field_by_name(e,W);Z&&this.toggle_field_visibility(Z,!0)}}catch(e){V.e(e)}finally{V.f()}var ee,te=b(o);try{for(te.s();!(ee=te.n()).done;){var ne,ie,re=ee.value;ne=re.name,ie=re.message,p(re,v);var ae=this.get_form_field_by_name(e,ne);ae&&this.set_field_readonly(ae,ie)}}catch(e){te.e(e)}finally{te.f()}var oe,le=b(l);try{for(le.s();!(oe=le.n()).done;){var se,ue,ce=oe.value;se=ce.name,ue=ce.message,p(ce,m);var de=this.get_form_field_by_name(e,se);de&&this.set_field_editable(de,ue)}}catch(e){le.e(e)}finally{le.f()}var fe,ve=b(S);try{for(ve.s();!(fe=ve.n()).done;){var me,he,ye=fe.value;me=ye.name,he=ye.value,p(ye,h);var _e=this.get_form_field_by_name(e,me);_e&&this.set_field_value(_e,he)}}catch(e){ve.e(e)}finally{ve.f()}var ge,pe=b(x);try{for(pe.s();!(ge=pe.n()).done;){var be,ke,we,Se=ge.value;be=Se.selector,ke=Se.html,we=p(Se,y);var xe=e.querySelector(be);xe&&(we.append?xe.innerHTML=xe.innerHTML+ke:xe.innerHTML=ke)}}catch(e){pe.e(e)}finally{pe.f()}var Ee,Le=b(E);try{for(Le.s();!(Ee=Le.n()).done;){var je,Oe,Te,Ce=Ee.value;je=Ce.selector,Oe=Ce.name,Te=Ce.value,p(Ce,_);var Ae=e.querySelector(je);Ae&&(null===Te?Ae.removeAttribute(Oe):Ae.addAttribute(Oe,Te))}}catch(e){Le.e(e)}finally{Le.f()}this.has_field_errors(e)?this.toggle_submit(e,!1):this.toggle_submit(e,!0)}},{key:"get_form_field_by_name",value:function(e,t){var n=e.querySelector("[name='".concat(t,"']")),i=e.querySelector("[name^='".concat(t,"']")),r=n||i||null;return null===r?null:r}},{key:"get_form_data",value:function(e){var t={};return new FormData(e).forEach((function(e,n){t[n]=e})),t}},{key:"get_form_fields",value:function(e){var t,n,i=[],r=b(this.config.field_selectors);try{for(r.s();!(t=r.n()).done;){var a,o=t.value,l=e.querySelectorAll(o);i=(a=i).concat.apply(a,function(e){if(Array.isArray(e))return w(e)}(n=l.values())||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||k(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())}}catch(e){r.e(e)}finally{r.f()}return i}},{key:"get_field_name",value:function(e){return e.name.split(":")[0]}},{key:"get_field_value",value:function(e){if(this.is_checkbox(e))return e.checked;if(this.is_select(e)){var t=e.selectedOptions;return Array.prototype.map.call(t,(function(e){return e.value}))}return this.is_reference(e)?e.value.split("\n"):e.value}},{key:"set_field_value",value:function(e,t){var n=t.selected||[],i=t.options||[];if(this.is_reference(e))e.value=n.join("\n");else if(this.is_select(e)){if(0==n.length){var r=e.options[e.selected];r&&(n=[r.value])}e.options.length=0,i.sort((function(e,t){var n=e.title.toLowerCase(),i=t.title.toLowerCase();return null===e.value&&(n=""),null===t.value&&(i=""),ni?1:void 0}));var a,o=b(i);try{for(o.s();!(a=o.n()).done;){var l=a.value,s=document.createElement("option");s.value=l.value,s.innerHTML=l.title,-1!==n.indexOf(l.value)&&(s.selected=!0),e.appendChild(s)}}catch(e){o.e(e)}finally{o.f()}0==n.length&&(e.selectedIndex=0)}else this.is_checkbox(e)?e.checked=t:e.value=t}},{key:"modified",value:function(e){var t=new CustomEvent("modified",{detail:{field:e,form:e.form}});e.form.dispatchEvent(t)}},{key:"loading",value:function(){var e=new CustomEvent(arguments.length>0&&void 0!==arguments[0]&&!arguments[0]?"ajaxStop":"ajaxStart");document.dispatchEvent(e)}},{key:"notify",value:function(e,t,n){var i={name:this.get_field_name(t),value:this.get_field_value(t)};this.ajax_send(e,i,n)}},{key:"ajax_send",value:function(e,t,n){var i=document.body.dataset.viewUrl,r="".concat(i,"/ajax_form/").concat(n),a=Object.assign({form:this.get_form_data(e)},t),o={method:"POST",credentials:"include",body:JSON.stringify(a),headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector("#protect-script").dataset.token}};return this.ajax_request(e,r,o)}},{key:"ajax_submit",value:function(e,t,n){for(var i=document.body.dataset.viewUrl,r="".concat(i,"/ajax_form/").concat(n),a=new FormData(e),o=0,l=Object.entries(t);o-1||(i=i.concat(a.target),this.handle_mutation(n,a))}}catch(e){r.e(e)}finally{r.f()}}},{key:"on_modified",value:function(e){var t=e.detail.form,n=e.detail.field;this.notify(t,n,"modified")}},{key:"on_submit",value:function(e){var t=this;e.preventDefault();var n={},i=e.currentTarget.closest("form"),r=e.submitter;r&&(n[r.name]=r.value,this.toggle_disable(r,!0)),this.ajax_submit(i,n,"submit").then((function(e){return t.toggle_disable(r,!1)}))}},{key:"on_blur",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_click",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_change",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_reference_select",value:function(e){var t=e.currentTarget,n=t.value.split("\n");n=n.concat(e.detail.value),t.value=n.join("\n"),this.modified(t)}},{key:"on_reference_deselect",value:function(e){var t=e.currentTarget,n=t.value.split("\n"),i=n.indexOf(e.detail.value);i>-1&&n.splice(i,1),t.value=n.join("\n"),this.modified(t)}}],i&&S(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),e}();var E=n(311),L=function(e,t){return function(){return e.apply(t,arguments)}};const j=function(){function e(){this.set_cookie=L(this.set_cookie,this),this.read_cookie=L(this.read_cookie,this),this.authenticator=L(this.authenticator,this)}return e.prototype.authenticator=function(){var e;return(e=E("input[name='_authenticator']").val())||(e=new URLSearchParams(window.location.search).get("_authenticator")),e},e.prototype.read_cookie=function(e){var t,n,i;for(e+="=",n=document.cookie.split(";"),i=0;i0&&void 0!==arguments[0]&&arguments[0];window.site.set_cookie(this.config.cookie_key,e),e?(this.el.classList.add("toggled"),this.maximize()):(this.el.classList.remove("toggled"),this.minimize())}},{key:"minimize",value:function(){this.el.classList.add("minimized")}},{key:"maximize",value:function(){this.el.classList.remove("minimized")}},{key:"on_click",value:function(e){clearTimeout(this.tid),this.toggle(!this.is_toggled())}},{key:"on_mouseenter",value:function(e){clearTimeout(this.tid),this.is_toggled()||(this.tid=setTimeout(this.maximize,this.config.timeout))}},{key:"on_mouseleave",value:function(e){clearTimeout(this.tid),this.is_toggled()||this.minimize()}}],n&&T(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();document.addEventListener("DOMContentLoaded",(function(){window.i18n=new i,window._t=a,window._p=l,window.portal_url=document.body.dataset.portalUrl,window.site=new j,window.sidebar=new C({el:"sidebar"}),new x({form_selectors:["form[name='edit_form']","form.senaite-ajax-form"],field_selectors:["input[type='text']","input[type='number']","input[type='checkbox']","input[type='radio']","input[type='file']","select","textarea"]}),t()((function(){t()("[data-toggle='tooltip']").tooltip(),t()("select.selectpicker").selectpicker()})),document.body.addEventListener("listing:after_transition_event",(function(e){document.body.classList.contains("template-multi_results")||document.body.dataset.reviewState!=e.detail.config.view_context_state&&location.reload()}))}))})()})(); +(()=>{"use strict";var e={311:e=>{e.exports=jQuery}},t={};function n(i){var r=t[i];if(void 0!==r)return r.exports;var a=t[i]={exports:{}};return e[i](a,a.exports,n),a.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var i in t)n.o(t,i)&&!n.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e=n(311),t=n.n(e);const i=function(){var e=this;e.baseUrl=t()("body").attr("data-i18ncatalogurl"),e.currentLanguage=t()("html").attr("lang")||"en",e.currentLanguage.split("-").length>1&&(e.currentLanguage=e.currentLanguage.split("-")[0]+"_"+e.currentLanguage.split("-")[1].toUpperCase()),e.storage=null,e.catalogs={},e.ttl=864e5,Date.now||(Date.now=function(){return(new Date).valueOf()});try{"localStorage"in window&&null!==window.localStorage&&"JSON"in window&&null!==window.JSON&&(e.storage=window.localStorage)}catch(e){}e.configure=function(t){for(var n in t)e[n]=t[n]},e._setCatalog=function(t,n,i){t in e.catalogs||(e.catalogs[t]={}),e.catalogs[t][n]=i},e._storeCatalog=function(t,n,i){var r=t+"-"+n;null!==e.storage&&null!==i&&(e.storage.setItem(r,JSON.stringify(i)),e.storage.setItem(r+"-updated",Date.now()))},e.getUrl=function(t,n){return e.baseUrl+"?domain="+t+"&language="+n},e.loadCatalog=function(n,i){if(void 0===i&&(i=e.currentLanguage),null!==e.storage){var r=n+"-"+i;if(r in e.storage&&Date.now()-parseInt(e.storage.getItem(r+"-updated"),10)=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function b(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=k(e))||t&&e&&"number"==typeof e.length){n&&(e=n);var i=0,r=function(){};return{s:r,n:function(){return i>=e.length?{done:!0}:{done:!1,value:e[i++]}},e:function(e){throw e},f:r}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,o=!0,l=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){l=!0,a=e},f:function(){try{o||null==n.return||n.return()}finally{if(l)throw a}}}}function k(e,t){if(e){if("string"==typeof e)return w(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?w(e,t):void 0}}function w(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n1&&void 0!==arguments[1])||arguments[1],n=e.closest(".field"),i="d-none";!1===t?n.classList.add(i):n.classList.remove(i)}},{key:"has_field_errors",value:function(e){return e.querySelectorAll(".is-invalid").length>0}},{key:"set_field_readonly",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.setAttribute("readonly","");var n=e.parentElement.querySelector("div.message");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="message text-secondary small",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"set_field_editable",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;e.removeAttribute("readonly");var n=e.parentElement.querySelector("div.message");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="message text-secondary small",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"set_field_error",value:function(e,t){e.classList.add("is-invalid");var n=e.parentElement.querySelector("div.invalid-feedback");if(n)n.innerHTML=_t(t);else{var i=document.createElement("div");i.className="invalid-feedback",i.innerHTML=_t(t),e.parentElement.appendChild(i)}}},{key:"remove_field_error",value:function(e){e.classList.remove("is-invalid");var t=e.parentElement.querySelector(".invalid-feedback");t&&t.remove()}},{key:"add_statusmessage",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"info",n=arguments.length>2?arguments[2]:void 0;n=n||{};var i=document.createElement("div"),r=n.title||"".concat(t.charAt(0).toUpperCase()+t.slice(1));i.innerHTML='\n \n '),i=i.firstElementChild;var a=document.getElementById("viewlet-above-content");if(n.flush){var o,l=b(a.querySelectorAll(".alert"));try{for(l.s();!(o=l.n()).done;)o.value.remove()}catch(e){l.e(e)}finally{l.f()}}return a.appendChild(i),i}},{key:"add_notification",value:function(e,t,n){n=n||{},n=Object.assign({animation:!0,autohide:!0,delay:5e3},n);var i=document.createElement("div");i.innerHTML='\n \n "),i=i.firstElementChild;var r=document.querySelector(".toast-container");return r||((r=document.createElement("div")).innerHTML='\n
\n
\n
\n
\n ',document.querySelector(".container-fluid").appendChild(r),r=r.querySelector(".toast-container")),r.appendChild(i),i}},{key:"update_form",value:function(e,n){var i,r=n.hide||[],a=n.show||[],o=n.readonly||[],l=n.editable||[],g=n.errors||[],k=n.messages||[],w=n.notifications||[],S=n.updates||[],x=n.html||[],E=n.attributes||[],L=b(g);try{for(L.s();!(i=L.n()).done;){var j,O,T=i.value;j=T.name,O=T.error,p(T,s);var C=this.get_form_field_by_name(e,j);C&&(O?this.set_field_error(C,O):this.remove_field_error(C))}}catch(e){L.e(e)}finally{L.f()}var A,q=b(k);try{for(q.s();!(A=q.n()).done;){var M,N=A.value;P=N.message,I=N.level,M=p(N,u);var I=I||"info",P=P||"";this.add_statusmessage(P,I,M)}}catch(e){q.e(e)}finally{q.f()}var U,z=b(w);try{for(z.s();!(U=z.n()).done;){var H,D,F,J=U.value;H=J.title,D=J.message,F=p(J,c);var R=this.add_notification(H,D,F);t()(R).toast("show")}}catch(e){z.e(e)}finally{z.f()}var B,X=b(r);try{for(X.s();!(B=X.n()).done;){var $,K=B.value;$=K.name,p(K,d);var Q=this.get_form_field_by_name(e,$);Q&&this.toggle_field_visibility(Q,!1)}}catch(e){X.e(e)}finally{X.f()}var G,V=b(a);try{for(V.s();!(G=V.n()).done;){var W,Y=G.value;W=Y.name,p(Y,f);var Z=this.get_form_field_by_name(e,W);Z&&this.toggle_field_visibility(Z,!0)}}catch(e){V.e(e)}finally{V.f()}var ee,te=b(o);try{for(te.s();!(ee=te.n()).done;){var ne,ie,re=ee.value;ne=re.name,ie=re.message,p(re,v);var ae=this.get_form_field_by_name(e,ne);ae&&this.set_field_readonly(ae,ie)}}catch(e){te.e(e)}finally{te.f()}var oe,le=b(l);try{for(le.s();!(oe=le.n()).done;){var se,ue,ce=oe.value;se=ce.name,ue=ce.message,p(ce,m);var de=this.get_form_field_by_name(e,se);de&&this.set_field_editable(de,ue)}}catch(e){le.e(e)}finally{le.f()}var fe,ve=b(S);try{for(ve.s();!(fe=ve.n()).done;){var me,he,ye=fe.value;me=ye.name,he=ye.value,p(ye,h);var _e=this.get_form_field_by_name(e,me);_e&&this.set_field_value(_e,he)}}catch(e){ve.e(e)}finally{ve.f()}var ge,pe=b(x);try{for(pe.s();!(ge=pe.n()).done;){var be,ke,we,Se=ge.value;be=Se.selector,ke=Se.html,we=p(Se,y);var xe=e.querySelector(be);xe&&(we.append?xe.innerHTML=xe.innerHTML+ke:xe.innerHTML=ke)}}catch(e){pe.e(e)}finally{pe.f()}var Ee,Le=b(E);try{for(Le.s();!(Ee=Le.n()).done;){var je,Oe,Te,Ce=Ee.value;je=Ce.selector,Oe=Ce.name,Te=Ce.value,p(Ce,_);var Ae=e.querySelector(je);Ae&&(null===Te?Ae.removeAttribute(Oe):Ae.addAttribute(Oe,Te))}}catch(e){Le.e(e)}finally{Le.f()}this.has_field_errors(e)?this.toggle_submit(e,!1):this.toggle_submit(e,!0)}},{key:"get_form_field_by_name",value:function(e,t){var n=e.querySelector("[name='".concat(t,"']")),i=e.querySelector("[name^='".concat(t,"']")),r=n||i||null;return null===r?null:r}},{key:"get_form_data",value:function(e){var t={};return new FormData(e).forEach((function(e,n){t[n]=e})),t}},{key:"get_form_fields",value:function(e){var t,n,i=[],r=b(this.config.field_selectors);try{for(r.s();!(t=r.n()).done;){var a,o=t.value,l=e.querySelectorAll(o);i=(a=i).concat.apply(a,function(e){if(Array.isArray(e))return w(e)}(n=l.values())||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(n)||k(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}())}}catch(e){r.e(e)}finally{r.f()}return i}},{key:"get_field_name",value:function(e){return e.name.split(":")[0]}},{key:"get_field_value",value:function(e){if(this.is_checkbox(e))return e.checked;if(this.is_select(e)){var t=e.selectedOptions;return Array.prototype.map.call(t,(function(e){return e.value}))}return this.is_reference(e)?e.value.split("\n"):e.value}},{key:"set_field_value",value:function(e,t){var n=t.selected||[],i=t.options||[];if(this.is_reference(e))e.value=n.join("\n");else if(this.is_select(e)){if(0==n.length){var r=e.options[e.selected];r&&(n=[r.value])}e.options.length=0,i.sort((function(e,t){var n=e.title.toLowerCase(),i=t.title.toLowerCase();return null===e.value&&(n=""),null===t.value&&(i=""),ni?1:void 0}));var a,o=b(i);try{for(o.s();!(a=o.n()).done;){var l=a.value,s=document.createElement("option");s.value=l.value,s.innerHTML=l.title,-1!==n.indexOf(l.value)&&(s.selected=!0),e.appendChild(s)}}catch(e){o.e(e)}finally{o.f()}0==n.length&&(e.selectedIndex=0)}else this.is_checkbox(e)?e.checked=t:e.value=t}},{key:"modified",value:function(e){var t=new CustomEvent("modified",{detail:{field:e,form:e.form}});e.form.dispatchEvent(t)}},{key:"loading",value:function(){var e=new CustomEvent(arguments.length>0&&void 0!==arguments[0]&&!arguments[0]?"ajaxStop":"ajaxStart");document.dispatchEvent(e)}},{key:"notify",value:function(e,t,n){var i={name:this.get_field_name(t),value:this.get_field_value(t)};this.ajax_send(e,i,n)}},{key:"ajax_send",value:function(e,t,n){var i=document.body.dataset.viewUrl,r="".concat(i,"/ajax_form/").concat(n),a=Object.assign({form:this.get_form_data(e)},t),o={method:"POST",credentials:"include",body:JSON.stringify(a),headers:{"Content-Type":"application/json","X-CSRF-TOKEN":document.querySelector("#protect-script").dataset.token}};return this.ajax_request(e,r,o)}},{key:"ajax_submit",value:function(e,t,n){for(var i=document.body.dataset.viewUrl,r="".concat(i,"/ajax_form/").concat(n),a=new FormData(e),o=0,l=Object.entries(t);o-1||(i=i.concat(a.target),this.handle_mutation(n,a))}}catch(e){r.e(e)}finally{r.f()}}},{key:"on_modified",value:function(e){var t=e.detail.form,n=e.detail.field;this.notify(t,n,"modified")}},{key:"on_submit",value:function(e){var t=this;e.preventDefault();var n={},i=e.currentTarget.closest("form"),r=e.submitter;r&&(n[r.name]=r.value,this.toggle_disable(r,!0)),this.ajax_submit(i,n,"submit").then((function(e){return t.toggle_disable(r,!1)}))}},{key:"on_blur",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_click",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_change",value:function(e){var t=e.currentTarget;this.modified(t)}},{key:"on_reference_select",value:function(e){var t=e.currentTarget,n=t.value.split("\n");n=n.concat(e.detail.value),t.value=n.join("\n"),this.modified(t)}},{key:"on_reference_deselect",value:function(e){var t=e.currentTarget,n=t.value.split("\n"),i=n.indexOf(e.detail.value);i>-1&&n.splice(i,1),t.value=n.join("\n"),this.modified(t)}}],i&&S(n.prototype,i),Object.defineProperty(n,"prototype",{writable:!1}),e}();var E=n(311),L=function(e,t){return function(){return e.apply(t,arguments)}};const j=function(){function e(){this.set_cookie=L(this.set_cookie,this),this.read_cookie=L(this.read_cookie,this),this.authenticator=L(this.authenticator,this)}return e.prototype.authenticator=function(){var e;return(e=E("input[name='_authenticator']").val())||(e=new URLSearchParams(window.location.search).get("_authenticator")),e},e.prototype.read_cookie=function(e){var t,n,i;for(e+="=",n=document.cookie.split(";"),i=0;i0&&void 0!==arguments[0]&&arguments[0];window.site.set_cookie(this.config.cookie_key,e),e?(this.el.classList.add("toggled"),this.maximize()):(this.el.classList.remove("toggled"),this.minimize())}},{key:"minimize",value:function(){this.el.classList.add("minimized")}},{key:"maximize",value:function(){this.el.classList.remove("minimized")}},{key:"on_click",value:function(e){clearTimeout(this.tid),this.toggle(!this.is_toggled())}},{key:"on_mouseenter",value:function(e){clearTimeout(this.tid),this.is_toggled()||(this.tid=setTimeout(this.maximize,this.config.timeout))}},{key:"on_mouseleave",value:function(e){clearTimeout(this.tid),this.is_toggled()||this.minimize()}}],n&&T(t.prototype,n),Object.defineProperty(t,"prototype",{writable:!1}),e}();document.addEventListener("DOMContentLoaded",(function(){window.i18n=new i,window._t=a,window._p=l,window.portal_url=document.body.dataset.portalUrl,window.site=new j,window.sidebar=new C({el:"sidebar"}),new x({form_selectors:["form[name='edit_form']","form.senaite-ajax-form"],field_selectors:["input[type='text']","input[type='number']","input[type='checkbox']","input[type='radio']","input[type='file']","select","textarea"]}),t()((function(){t()("[data-toggle='tooltip']").tooltip(),t()("select.selectpicker").selectpicker()})),document.body.addEventListener("listing:after_transition_event",(function(e){for(var t=document.body.classList,n=0,i=["template-multi_results","template-multi_results_classic"];n {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* i18n integration. This is forked from jarn.jsi18n\n *\n * This is a singleton.\n * Configuration is done on the body tag data-i18ncatalogurl attribute\n * \n *\n * Or, it'll default to \"/plonejsi18n\"\n */\n\nimport $ from \"jquery\";\n\n\nvar I18N = function() {\n var self = this;\n self.baseUrl = $('body').attr('data-i18ncatalogurl');\n self.currentLanguage = $('html').attr('lang') || 'en';\n\n // Fix for country specific languages\n if (self.currentLanguage.split('-').length > 1) {\n self.currentLanguage = self.currentLanguage.split('-')[0] + '_' + self.currentLanguage.split('-')[1].toUpperCase();\n }\n\n self.storage = null;\n self.catalogs = {};\n self.ttl = 24 * 3600 * 1000;\n\n // Internet Explorer 8 does not know Date.now() which is used in e.g. loadCatalog, so we \"define\" it\n if (!Date.now) {\n Date.now = function() {\n return new Date().valueOf();\n };\n }\n\n try {\n if ('localStorage' in window && window.localStorage !== null && 'JSON' in window && window.JSON !== null) {\n self.storage = window.localStorage;\n }\n } catch (e) {}\n\n self.configure = function(config) {\n for (var key in config){\n self[key] = config[key];\n }\n };\n\n self._setCatalog = function (domain, language, catalog) {\n if (domain in self.catalogs) {\n self.catalogs[domain][language] = catalog;\n } else {\n self.catalogs[domain] = {};\n self.catalogs[domain][language] = catalog;\n }\n };\n\n self._storeCatalog = function (domain, language, catalog) {\n var key = domain + '-' + language;\n if (self.storage !== null && catalog !== null) {\n self.storage.setItem(key, JSON.stringify(catalog));\n self.storage.setItem(key + '-updated', Date.now());\n }\n };\n\n self.getUrl = function(domain, language) {\n return self.baseUrl + '?domain=' + domain + '&language=' + language;\n };\n\n self.loadCatalog = function (domain, language) {\n if (language === undefined) {\n language = self.currentLanguage;\n }\n if (self.storage !== null) {\n var key = domain + '-' + language;\n if (key in self.storage) {\n if ((Date.now() - parseInt(self.storage.getItem(key + '-updated'), 10)) < self.ttl) {\n var catalog = JSON.parse(self.storage.getItem(key));\n self._setCatalog(domain, language, catalog);\n return;\n }\n }\n }\n if (!self.baseUrl) {\n return;\n }\n $.getJSON(self.getUrl(domain, language), function (catalog) {\n if (catalog === null) {\n return;\n }\n self._setCatalog(domain, language, catalog);\n self._storeCatalog(domain, language, catalog);\n });\n };\n\n self.MessageFactory = function (domain, language) {\n language = language || self.currentLanguage;\n return function translate (msgid, keywords) {\n var msgstr;\n if ((domain in self.catalogs) && (language in self.catalogs[domain]) && (msgid in self.catalogs[domain][language])) {\n msgstr = self.catalogs[domain][language][msgid];\n } else {\n msgstr = msgid;\n }\n if (keywords) {\n var regexp, keyword;\n for (keyword in keywords) {\n if (keywords.hasOwnProperty(keyword)) {\n regexp = new RegExp('\\\\$\\\\{' + keyword + '\\\\}', 'g');\n msgstr = msgstr.replace(regexp, keywords[keyword]);\n }\n }\n }\n return msgstr;\n };\n };\n};\n\nexport default I18N;\n","import I18N from \"./components/i18n.js\";\n\n// SENAITE message factory\nvar t = null;\nexport var _t = (msgid, keywords) => {\n if (t === null) {\n let i18n = new I18N();\n console.debug(\"*** Loading `senaite.core` i18n MessageFactory ***\");\n i18n.loadCatalog(\"senaite.core\")\n t = i18n.MessageFactory(\"senaite.core\")\n }\n return t(msgid, keywords);\n}\n\n// Plone message factory\nvar p = null;\nexport var _p = (msgid, keywords) => {\n if (p === null) {\n let i18n = new I18N();\n console.debug(\"*** Loading `plone` i18n MessageFactory ***\");\n i18n.loadCatalog(\"plone\")\n p = i18n.MessageFactory(\"plone\")\n }\n return p(msgid, keywords);\n}\n","/* SENAITE Edit Form Handler\n *\n * This code handles field changes in edit forms and updates others according to\n * the changes with the help of adapters.\n *\n */\n\n// needed for Bootstrap toasts\nimport $ from \"jquery\";\n\n\nclass EditForm {\n\n constructor(config) {\n this.config = Object.assign({\n \"form_selectors\": [],\n \"field_selectors\": []\n }, config);\n\n this.hooked_fields = [];\n\n // bind event handlers\n this.on_mutated = this.on_mutated.bind(this);\n this.on_modified = this.on_modified.bind(this);\n this.on_submit = this.on_submit.bind(this);\n this.on_blur = this.on_blur.bind(this);\n this.on_click = this.on_click.bind(this);\n this.on_change = this.on_change.bind(this);\n this.on_reference_select = this.on_reference_select.bind(this);\n this.on_reference_deselect = this.on_reference_deselect.bind(this);\n this.init_forms();\n }\n\n /**\n * Initialize all form elements given by the config\n */\n init_forms() {\n let selectors = this.config.form_selectors;\n for (const selector of selectors) {\n let form = document.querySelector(selector);\n if (form && form.tagName === \"FORM\") {\n this.setup_form(form);\n this.watch_form(form);\n }\n }\n }\n\n /**\n * Trigger `initialized` event on the form element\n */\n setup_form(form) {\n console.debug(`EditForm::setup_form(${form})`);\n this.ajax_send(form, {}, \"initialized\");\n }\n\n /**\n * Bind event handlers on form fields to monitor changes\n */\n watch_form(form) {\n console.debug(`EditForm::watch_form(${form})`);\n let fields = this.get_form_fields(form);\n for (const field of fields) {\n this.hook_field(field)\n }\n // observe DOM mutations in form\n this.observe_mutations(form);\n // bind custom form event handlers\n form.addEventListener(\"modified\", this.on_modified);\n form.addEventListener(\"mutated\", this.on_mutated);\n if (form.hasAttribute(\"ajax-submit\")) {\n form.addEventListener(\"submit\", this.on_submit);\n }\n }\n\n /**\n * Bind event handlers to field\n */\n hook_field(field) {\n // return immediately if the fields is already hooked\n if (this.hooked_fields.indexOf(field) !== -1) {\n // console.debug(`Field '${field.name}' is already hooked`);\n return\n }\n if (this.is_button(field) || this.is_input_button(field)) {\n // bind click event\n field.addEventListener(\"click\", this.on_click);\n }\n else if (this.is_reference(field)) {\n // bind custom events from the ReactJS queryselect widget\n field.addEventListener(\"select\", this.on_reference_select);\n field.addEventListener(\"deselect\", this.on_reference_deselect);\n }\n else if (this.is_text(field) || this.is_textarea(field) || this.is_select(field)) {\n // bind change event\n field.addEventListener(\"change\", this.on_change);\n }\n else if (this.is_radio(field) || this.is_checkbox(field)) {\n // bind click event\n field.addEventListener(\"click\", this.on_click);\n } else {\n // bind blur event\n field.addEventListener(\"blur\", this.on_blur);\n }\n // console.debug(`Hooked field '${field.name}'`);\n // remember hooked fields\n this.hooked_fields = this.hooked_fields.concat(field);\n }\n\n /**\n * Initialize a DOM mutation observer to rebind dynamic added fields,\n * e.g. for records field etc.\n */\n observe_mutations(form) {\n let observer = new MutationObserver(function(mutations) {\n let event = new CustomEvent(\"mutated\", {\n detail: {\n form: form,\n mutations: mutations\n }\n });\n form.dispatchEvent(event);\n });\n // observe the form with all contained elements\n observer.observe(form, {\n childList: true,\n subtree: true\n });\n }\n\n /**\n * Handle a single DOM mutation\n */\n handle_mutation(form, mutation) {\n let target = mutation.target;\n let parent = target.closest(\".field\");\n let added = mutation.addedNodes;\n let removed = mutation.removedNodes;\n let selectors = this.config.field_selectors;\n // handle picklist widget\n if (this.is_multiple_select(target)) {\n return this.notify(form, target, \"modified\");\n }\n // hook new fields, e.g. when the records field \"More\" button was clicked\n if (added && target.ELEMENT_NODE) {\n for (const field of target.querySelectorAll(selectors)) {\n this.hook_field(field);\n }\n }\n }\n\n /**\n * toggles the submit button\n */\n toggle_submit(form, toggle) {\n let btn = form.querySelector(\"input[type='submit']\");\n btn.disabled = !toggle;\n }\n\n /**\n * toggles the display of the field with the `d-none` class\n */\n toggle_field_visibility(field, toggle=true) {\n let parent = field.closest(\".field\");\n let css_class = \"d-none\";\n if (toggle === false) {\n parent.classList.add(css_class);\n } else {\n parent.classList.remove(css_class);\n }\n }\n\n /**\n * check if fields have errors\n */\n has_field_errors(form) {\n let fields_with_errors = form.querySelectorAll(\".is-invalid\");\n if (fields_with_errors.length > 0) {\n return true;\n }\n return false;\n }\n\n /**\n * set field readonly\n */\n set_field_readonly(field, message=null) {\n field.setAttribute(\"readonly\", \"\");\n let existing_message = field.parentElement.querySelector(\"div.message\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"message text-secondary small\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * set field editable\n */\n set_field_editable(field, message=null) {\n field.removeAttribute(\"readonly\");\n let existing_message = field.parentElement.querySelector(\"div.message\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"message text-secondary small\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * set field error\n */\n set_field_error(field, message) {\n field.classList.add(\"is-invalid\");\n let existing_message = field.parentElement.querySelector(\"div.invalid-feedback\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"invalid-feedback\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * remove field error\n */\n remove_field_error(field) {\n field.classList.remove(\"is-invalid\")\n let msg = field.parentElement.querySelector(\".invalid-feedback\");\n if (msg) {\n msg.remove();\n }\n }\n\n /**\n * add a status message\n * @param {string} message the message to display in the alert\n * @param {string} level one of \"info\", \"success\", \"warning\", \"danger\"\n * @param {object} options additional options to control the behavior\n * - option {string} title: alert title in bold\n * - option {string} flush: remove previous alerts\n */\n add_statusmessage(message, level=\"info\", options) {\n options = options || {};\n let el = document.createElement(\"div\");\n let title = options.title || `${level.charAt(0).toUpperCase() + level.slice(1)}`;\n el.innerHTML = `\n
\n ${title}\n ${_t(message)}\n \n
\n `\n el = el.firstElementChild\n let parent = document.getElementById(\"viewlet-above-content\");\n\n // clear put previous alerts\n if (options.flush) {\n for (let el of parent.querySelectorAll(\".alert\")) {\n el.remove();\n }\n }\n parent.appendChild(el);\n return el;\n }\n\n /**\n * add a notification message\n */\n add_notification(title, message, options) {\n options = options || {};\n options = Object.assign({\n animation: true,\n autohide: true,\n delay: 5000,\n }, options)\n let el = document.createElement(\"div\");\n el.innerHTML = `\n
\n
\n ${title.charAt(0).toUpperCase() + title.slice(1)}\n \n
\n
\n ${_t(message)}\n
\n
\n `\n el = el.firstElementChild;\n let parent = document.querySelector(\".toast-container\");\n if (!parent) {\n parent = document.createElement(\"div\");\n parent.innerHTML = `\n
\n
\n
\n
\n `\n let wrapper = document.querySelector(\".container-fluid\");\n wrapper.appendChild(parent);\n parent = parent.querySelector(\".toast-container\");\n }\n parent.appendChild(el);\n return el;\n }\n\n /**\n * update the form with the response from the server\n */\n update_form(form, data) {\n console.info(\"*** UPDATE FORM ***\", data)\n\n let hide = data.hide || [];\n let show = data.show || [];\n let readonly = data.readonly || [];\n let editable = data.editable || [];\n let errors = data.errors || [];\n let messages = data.messages || [];\n let notifications = data.notifications || [];\n let updates = data.updates || [];\n let html = data.html || [];\n let attributes = data.attributes || [];\n\n // render field errors\n for (const record of errors) {\n let name, error, rest;\n ({name, error, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n if (error) {\n this.set_field_error(el, error);\n } else {\n this.remove_field_error(el);\n }\n }\n\n // render status messages\n for (const record of messages) {\n let name, error, rest;\n ({message, level, ...rest} = record);\n let level = level || \"info\";\n let message = message || \"\";\n this.add_statusmessage(message, level, rest);\n }\n\n // render notification messages\n for (const record of notifications) {\n let title, message, rest;\n ({title, message, ...rest} = record);\n let el = this.add_notification(title, message, rest);\n $(el).toast(\"show\");\n }\n\n // hide fields\n for (const record of hide) {\n let name, rest;\n ({name, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.toggle_field_visibility(el, false);\n }\n\n // show fields\n for (const record of show) {\n let name, rest;\n ({name, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.toggle_field_visibility(el, true);\n }\n\n // readonly fields\n for (const record of readonly) {\n let name, message, rest;\n ({name, message, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_readonly(el, message);\n }\n\n // editable fields\n for (const record of editable) {\n let name, message, rest;\n ({name, message, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_editable(el, message);\n }\n\n // updated fields\n for (const record of updates) {\n let name, value, rest;\n ({name, value, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_value(el, value);\n }\n\n // html\n for (const record of html) {\n let selector, html, rest;\n ({selector, html, ...rest} = record);\n let el = form.querySelector(selector);\n if (!el) continue;\n if (rest.append) {\n el.innerHTML = el.innerHTML + html;\n } else {\n el.innerHTML = html;\n }\n }\n\n // set attribute to an element\n for (const record of attributes) {\n let selector, name, value, rest;\n ({selector, name, value, ...rest} = record);\n let el = form.querySelector(selector);\n if (!el) continue;\n if (value === null) {\n el.removeAttribute(name);\n } else {\n el.addAttribute(name, value);\n }\n }\n\n // disallow submit when field errors are present\n if (this.has_field_errors(form)) {\n this.toggle_submit(form, false);\n } else {\n this.toggle_submit(form, true);\n }\n }\n\n /**\n * return a form field by name\n */\n get_form_field_by_name(form, name) {\n // get the first element that matches the name\n let exact = form.querySelector(`[name='${name}']`);\n let fuzzy = form.querySelector(`[name^='${name}']`);\n let field = exact || fuzzy || null;\n if (field === null) {\n return null;\n }\n return field;\n }\n\n /**\n * return a dictionary of all the form values\n */\n get_form_data(form) {\n let data = {};\n let form_data = new FormData(form);\n form_data.forEach(function(value, key) {\n data[key] = value;\n });\n return data;\n }\n\n /**\n * Return form fields for the given selectors of the config\n */\n get_form_fields(form) {\n console.debug(`EditForm::get_form_fields(${form})`);\n let fields = [];\n let selectors = this.config.field_selectors;\n for (const selector of selectors) {\n let nodes = form.querySelectorAll(selector);\n fields = fields.concat(...nodes.values())\n }\n return fields\n }\n\n /**\n * returns the name of the field w/o ZPublisher converter\n */\n get_field_name(field) {\n let name = field.name;\n return name.split(\":\")[0];\n }\n\n /**\n * return the value of the form field\n */\n get_field_value(field) {\n if (this.is_checkbox(field)) {\n // returns true/false for checkboxes\n return field.checked;\n } else if (this.is_select(field)) {\n // returns a list of selected option\n let selected = field.selectedOptions;\n return Array.prototype.map.call(selected, (option) => option.value)\n } else if (this.is_reference(field)) {\n return field.value.split(\"\\n\");\n }\n // return the plain field value\n return field.value;\n }\n\n /**\n * set the value of the form field\n */\n set_field_value(field, value) {\n // for reference/select fields\n let selected = value.selected || [];\n let options = value.options || [];\n\n // set reference value\n if (this.is_reference(field)) {\n field.value = selected.join(\"\\n\");\n }\n // set select field\n else if (this.is_select(field)) {\n if (selected.length == 0) {\n let old_selected = field.options[field.selected];\n if (old_selected) {\n selected = [old_selected.value];\n }\n }\n // remove all options\n field.options.length = 0;\n // sort options\n options.sort((a, b) => {\n let _a = a.title.toLowerCase();\n let _b = b.title.toLowerCase();\n if (a.value === null) _a = \"\";\n if (b.value === null) _b = \"\";\n if (_a < _b) return -1;\n if (_a > _b) return 1;\n });\n // build new options\n for (const option of options) {\n let el = document.createElement(\"option\");\n el.value = option.value;\n el.innerHTML = option.title;\n // select item if the value is in the selected array\n if (selected.indexOf(option.value) !== -1) {\n el.selected = true;\n }\n field.appendChild(el);\n }\n // select first item\n if (selected.length == 0) {\n field.selectedIndex = 0;\n }\n }\n // set checkbox value\n else if (this.is_checkbox(field)) {\n field.checked = value;\n }\n // set other field values\n else {\n field.value = value;\n }\n }\n\n\n /**\n * trigger `modified` event on the form\n */\n modified(el) {\n let event = new CustomEvent(\"modified\", {\n detail: {\n field: el,\n form: el.form\n }\n });\n // dispatch the event on the element\n el.form.dispatchEvent(event);\n }\n\n /**\n * trigger ajax loading events\n */\n loading(toggle=true) {\n let event_type = toggle ? \"ajaxStart\" : \"ajaxStop\";\n let event = new CustomEvent(event_type);\n document.dispatchEvent(event);\n }\n\n /**\n * notify a field change to the server ajax endpoint\n */\n notify(form, field, endpoint) {\n let data = {\n name: this.get_field_name(field),\n value: this.get_field_value(field),\n }\n this.ajax_send(form, data, endpoint);\n }\n\n /**\n * send application/json to the server\n */\n ajax_send(form, data, endpoint) {\n let view_url = document.body.dataset.viewUrl;\n let ajax_url = `${view_url}/ajax_form/${endpoint}`;\n\n let payload = Object.assign({\n \"form\": this.get_form_data(form)\n }, data)\n\n console.debug(\"EditForm::ajax_send --> \", payload)\n\n let init = {\n method: \"POST\",\n credentials: \"include\",\n body: JSON.stringify(payload),\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-CSRF-TOKEN\": document.querySelector(\"#protect-script\").dataset.token\n },\n }\n\n return this.ajax_request(form, ajax_url, init);\n }\n\n /**\n * send multipart/form-data to the server\n */\n ajax_submit(form, data, endpoint) {\n let view_url = document.body.dataset.viewUrl;\n let ajax_url = `${view_url}/ajax_form/${endpoint}`;\n\n let payload = new FormData(form);\n\n // update form data\n for(let [key, value] of Object.entries(data)) {\n payload.set(key, value);\n }\n\n console.debug(\"EditForm::ajax_submit --> \", payload)\n\n let init = {\n method: \"POST\",\n body: payload,\n }\n\n return this.ajax_request(form, ajax_url, init);\n }\n\n\n /**\n * execute ajax request\n */\n ajax_request(form, url, init) {\n // send ajax request to server\n this.loading(true);\n let request = new Request(url, init);\n return fetch(request)\n .then((response) => {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response.json();\n })\n .then((data) => {\n console.debug(\"EditForm::ajax_request --> \", data);\n this.update_form(form, data);\n this.loading(false);\n })\n .catch((error) => {\n console.error(error);\n this.loading(false);\n });\n }\n\n /**\n * Toggle element disable\n */\n toggle_disable(el, toggle) {\n if (el) {\n el.disabled = toggle;\n }\n }\n\n /**\n * Checks if the element is a textarea field\n */\n is_textarea(el) {\n return el.tagName == \"TEXTAREA\";\n }\n\n /**\n * Checks if the elment is a select field\n */\n is_select(el) {\n return el.tagName == \"SELECT\";\n }\n\n /**\n * Checks if the element is a multiple select field\n */\n is_multiple_select(el) {\n return this.is_select(el) && el.hasAttribute(\"multiple\");\n }\n\n /**\n * Checks if the element is an input field\n */\n is_input(el) {\n return el.tagName === \"INPUT\";\n }\n\n /**\n * Checks if the element is an input[type='text'] field\n */\n is_text(el) {\n return this.is_input(el) && el.type === \"text\";\n }\n\n /**\n * Checks if the element is a button field\n */\n is_button(el) {\n return el.tagName === \"BUTTON\";\n }\n\n /**\n * Checks if the element is an input[type='button'] field\n */\n is_input_button(el) {\n return this.is_input(el) && el.type === \"button\";\n }\n\n /**\n * Checks if the element is an input[type='checkbox'] field\n */\n is_checkbox(el) {\n return this.is_input(el) && el.type === \"checkbox\";\n }\n\n /**\n * Checks if the element is an input[type='radio'] field\n */\n is_radio(el) {\n return this.is_input(el) && el.type === \"radio\";\n }\n\n /**\n * Checks if the element is a SENAITE reference field (textarea)\n */\n is_reference(el) {\n if (!this.is_textarea(el)) {\n return false;\n }\n return el.classList.contains(\"queryselectwidget-value\");\n }\n\n /**\n * event handler for `mutated` event\n */\n on_mutated(event) {\n console.debug(\"EditForm::on_mutated\");\n let form = event.detail.form;\n let mutations = event.detail.mutations;\n // reduce multiple mutations on the same node to one\n let seen = [];\n for (const mutation of mutations) {\n if (seen.indexOf(mutation.target) > -1) {\n continue;\n }\n seen = seen.concat(mutation.target);\n this.handle_mutation(form, mutation);\n }\n }\n\n /**\n * event handler for `modified` event\n */\n on_modified(event) {\n console.debug(\"EditForm::on_modified\");\n let form = event.detail.form;\n let field = event.detail.field;\n this.notify(form, field, \"modified\");\n }\n\n /**\n * event handler for `submit` event\n */\n on_submit(event) {\n console.debug(\"EditForm::on_submit\");\n event.preventDefault();\n let data = {}\n let form = event.currentTarget.closest(\"form\");\n // NOTE: submit input field not included in request form data!\n let submitter = event.submitter;\n if (submitter) {\n data[submitter.name] = submitter.value;\n // disable submit button during ajax call\n this.toggle_disable(submitter, true);\n }\n this.ajax_submit(form, data, \"submit\")\n .then((response) =>\n // enable submit button after ajax call again\n this.toggle_disable(submitter, false));\n }\n\n /**\n * event handler for `blur` event\n */\n on_blur(event) {\n console.debug(\"EditForm::on_blur\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `click` event\n */\n on_click(event) {\n console.debug(\"EditForm::on_click\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `change` event\n */\n on_change(event) {\n console.debug(\"EditForm::on_change\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `select` event\n */\n on_reference_select(event) {\n console.debug(\"EditForm::on_reference_select\");\n let el = event.currentTarget;\n // add the selected value to the list\n let selected = el.value.split(\"\\n\");\n selected = selected.concat(event.detail.value);\n el.value = selected.join(\"\\n\");\n this.modified(el);\n }\n\n /**\n * event handler for `deselect` event\n */\n on_reference_deselect(event) {\n console.debug(\"EditForm::on_reference_deselect\");\n let el = event.currentTarget;\n // remove the delelected value from the list\n let selected = el.value.split(\"\\n\");\n let index = selected.indexOf(event.detail.value);\n if (index > -1) {\n selected.splice(index, 1)\n }\n el.value = selected.join(\"\\n\");\n this.modified(el);\n }\n\n}\n\nexport default EditForm;\n","\n/* Please use this command to compile this file into the parent `js` directory:\n coffee --no-header -w -o ../ -c site.coffee\n */\nvar Site,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\nSite = (function() {\n\n /**\n * Creates a new instance of Site\n */\n function Site() {\n this.set_cookie = bind(this.set_cookie, this);\n this.read_cookie = bind(this.read_cookie, this);\n this.authenticator = bind(this.authenticator, this);\n // console.debug(\"Site::init\");\n }\n\n\n /**\n * Returns the authenticator value\n */\n\n Site.prototype.authenticator = function() {\n var auth, url_params;\n auth = $(\"input[name='_authenticator']\").val();\n if (!auth) {\n url_params = new URLSearchParams(window.location.search);\n auth = url_params.get(\"_authenticator\");\n }\n return auth;\n };\n\n\n /**\n * Reads a cookie value\n * @param {name} the name of the cookie\n */\n\n Site.prototype.read_cookie = function(name) {\n var c, ca, i;\n // console.debug(\"Site::read_cookie:\" + name);\n name = name + '=';\n ca = document.cookie.split(';');\n i = 0;\n while (i < ca.length) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n i++;\n }\n return null;\n };\n\n\n /**\n * Sets a cookie value\n * @param {name} the name of the cookie\n * @param {value} the value of the cookie\n */\n\n Site.prototype.set_cookie = function(name, value) {\n var d, expires;\n // console.debug(\"Site::set_cookie:name=\" + name + \", value=\" + value);\n d = new Date;\n d.setTime(d.getTime() + 1 * 24 * 60 * 60 * 1000);\n expires = 'expires=' + d.toUTCString();\n document.cookie = name + '=' + value + ';' + expires + ';path=/';\n };\n\n return Site;\n\n})();\n\nexport default Site;\n","/* SENAITE Sidebar\n *\n * The sidebar shows when the mouse enters and hides when the mouse leaves the\n * HTML element.\n *\n * It keeps open when the toggle button was clicked.\n */\n\nclass Sidebar{\n\n constructor(config) {\n\n this.config = Object.assign({\n \"el\": \"sidebar\",\n \"toggle_el\": \"sidebar-header\",\n \"cookie_key\": \"sidebar-toggle\",\n \"timeout\": 1000,\n }, config);\n\n // Timer ID\n this.tid = null;\n\n // Bind \"this\" context when called\n this.maximize = this.maximize.bind(this);\n this.minimize = this.minimize.bind(this);\n this.on_click = this.on_click.bind(this);\n this.on_mouseenter = this.on_mouseenter.bind(this)\n this.on_mouseleave = this.on_mouseleave.bind(this);\n\n // toggle button handler\n this.toggle_el = document.getElementById(this.config.toggle_el);\n if (this.toggle_el) {\n this.toggle_el.addEventListener(\"click\", this.on_click);\n }\n\n // sidebar view/hide handler\n this.el = document.getElementById(this.config.el);\n if (this.el) {\n this.el.addEventListener(\"mouseenter\", this.on_mouseenter);\n this.el.addEventListener(\"mouseleave\", this.on_mouseleave);\n\n if (this.is_toggled()) {\n this.el.classList.remove(\"minimized\");\n this.el.classList.add(\"toggled\");\n }\n }\n\n return this;\n }\n\n is_toggled() {\n return window.site.read_cookie(this.config.cookie_key) == \"true\";\n }\n\n toggle(toggle=false) {\n window.site.set_cookie(this.config.cookie_key, toggle)\n if (toggle) {\n this.el.classList.add(\"toggled\")\n this.maximize();\n } else {\n this.el.classList.remove(\"toggled\")\n this.minimize();\n }\n }\n\n minimize() {\n this.el.classList.add(\"minimized\");\n }\n\n maximize() {\n this.el.classList.remove(\"minimized\");\n }\n\n on_click(event) {\n // console.debug(\"Sidebar::on_click:event=\", event)\n clearTimeout(this.tid);\n this.toggle(!this.is_toggled());\n }\n\n on_mouseenter(event) {\n // console.debug(\"Sidebar::on_mouseenter:event=\", event)\n clearTimeout(this.tid);\n if (this.is_toggled()) return\n this.tid = setTimeout(this.maximize, this.config.timeout);\n }\n\n on_mouseleave(event) {\n // console.debug(\"Sidebar::on_mouseleave:event=\", event)\n clearTimeout(this.tid);\n if (this.is_toggled()) return\n this.minimize();\n // console.debug(\"Clearing sidebar timeout\", this.tid);\n }\n}\n\nexport default Sidebar;\n","import $ from \"jquery\";\nimport I18N from \"./components/i18n.js\";\nimport {i18n, _t, _p} from \"./i18n-wrapper.js\"\nimport EditForm from \"./components/editform.js\"\nimport Site from \"./components/site.js\"\nimport Sidebar from \"./components/sidebar.js\"\n\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n console.info(\"*** SENAITE CORE JS LOADED ***\");\n\n // Initialize i18n message factories\n window.i18n = new I18N();\n window._t = _t;\n window._p = _p;\n\n // BBB: set global `portal_url` variable\n window.portal_url = document.body.dataset.portalUrl\n\n // Initialize Site\n window.site = new Site();\n\n // Initialize Sidebar\n window.sidebar = new Sidebar({\n \"el\": \"sidebar\",\n });\n\n // Ajax Edit Form Handler\n var form = new EditForm({\n form_selectors: [\n \"form[name='edit_form']\",\n \"form.senaite-ajax-form\",\n ],\n field_selectors: [\n \"input[type='text']\",\n \"input[type='number']\",\n \"input[type='checkbox']\",\n \"input[type='radio']\",\n \"input[type='file']\",\n \"select\",\n \"textarea\",\n ]\n })\n\n // Init Tooltips\n $(function () {\n $(\"[data-toggle='tooltip']\").tooltip();\n $(\"select.selectpicker\").selectpicker();\n });\n\n // Reload the whole view if the status of the view's context has changed\n // due to the transition submission of some items from the listing\n document.body.addEventListener(\"listing:after_transition_event\", (event) => {\n\n // skip site reload for multi_results view\n // TODO: find a better way for this check!\n if (document.body.classList.contains(\"template-multi_results\")) {\n return;\n }\n\n // get the old workflow state of the view context\n let old_workflow_state = document.body.dataset.reviewState;\n\n // get the new workflow state of the view context\n // https://github.com/senaite/senaite.app.listing/pull/92\n let config = event.detail.config;\n let new_workflow_state = config.view_context_state;\n\n // reload the entire page if workflow state of the view context changed\n if (old_workflow_state != new_workflow_state) {\n location.reload();\n }\n });\n\n});\n"],"names":["module","exports","jQuery","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","self","this","baseUrl","$","attr","currentLanguage","split","length","toUpperCase","storage","catalogs","ttl","Date","now","valueOf","window","localStorage","JSON","e","configure","config","_setCatalog","domain","language","catalog","_storeCatalog","setItem","stringify","getUrl","loadCatalog","parseInt","getItem","parse","MessageFactory","msgid","keywords","msgstr","regexp","keyword","RegExp","replace","t","_t","i18n","I18N","p","_p","EditForm","_classCallCheck","assign","hooked_fields","on_mutated","bind","on_modified","on_submit","on_blur","on_click","on_change","on_reference_select","on_reference_deselect","init_forms","value","_step","_iterator","_createForOfIteratorHelper","form_selectors","s","done","selector","form","document","querySelector","tagName","setup_form","watch_form","err","f","ajax_send","_step2","_iterator2","get_form_fields","field","hook_field","observe_mutations","addEventListener","hasAttribute","indexOf","is_button","is_input_button","is_reference","is_text","is_textarea","is_select","is_radio","is_checkbox","concat","MutationObserver","mutations","event","CustomEvent","detail","dispatchEvent","observe","childList","subtree","mutation","target","added","closest","addedNodes","selectors","removedNodes","field_selectors","is_multiple_select","notify","ELEMENT_NODE","_step3","_iterator3","querySelectorAll","toggle","disabled","arguments","parent","css_class","classList","add","remove","message","setAttribute","existing_message","parentElement","innerHTML","div","createElement","className","appendChild","removeAttribute","msg","level","options","el","title","charAt","slice","firstElementChild","getElementById","flush","_step4","_iterator4","animation","autohide","delay","data","_step5","hide","show","readonly","editable","errors","messages","notifications","updates","html","attributes","_iterator5","name","error","_record","_objectWithoutProperties","_excluded","get_form_field_by_name","set_field_error","remove_field_error","_step6","_iterator6","rest","_record3","_excluded2","add_statusmessage","_step7","_iterator7","_record5","_excluded3","add_notification","toast","_step8","_iterator8","_record7","_excluded4","toggle_field_visibility","_step9","_iterator9","_record9","_excluded5","_step10","_iterator10","_record11","_excluded6","set_field_readonly","_step11","_iterator11","_record13","_excluded7","set_field_editable","_step12","_iterator12","_record15","_excluded8","set_field_value","_step13","_iterator13","_record17","_excluded9","append","_step14","_iterator14","_record19","_excluded10","addAttribute","has_field_errors","toggle_submit","exact","fuzzy","FormData","forEach","_step15","fields","_iterator15","_fields","nodes","apply","values","checked","selected","selectedOptions","Array","map","option","join","old_selected","sort","b","_a","toLowerCase","_b","_step16","_iterator16","selectedIndex","endpoint","get_field_name","get_field_value","view_url","body","dataset","viewUrl","ajax_url","payload","get_form_data","init","method","credentials","headers","token","ajax_request","_i","_Object$entries","entries","_Object$entries$_i","set","url","_this","loading","request","Request","fetch","then","response","ok","json","Promise","reject","update_form","is_input","type","contains","_step17","seen","_iterator17","handle_mutation","_this2","preventDefault","currentTarget","submitter","toggle_disable","ajax_submit","modified","index","splice","fn","me","Site","set_cookie","read_cookie","authenticator","auth","val","URLSearchParams","location","search","c","ca","i","cookie","substring","expires","setTime","getTime","toUTCString","Sidebar","tid","maximize","minimize","on_mouseenter","on_mouseleave","toggle_el","is_toggled","site","cookie_key","clearTimeout","setTimeout","timeout","portal_url","portalUrl","sidebar","tooltip","selectpicker","reviewState","view_context_state","reload"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"senaite.core.js","mappings":"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","sources":["webpack:///external var \"jQuery\"","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./components/i18n.js","webpack:///./i18n-wrapper.js","webpack:///./components/editform.js","webpack:///./components/site.js","webpack:///./components/sidebar.js","webpack:///./senaite.core.js"],"sourcesContent":["module.exports = jQuery;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","/* i18n integration. This is forked from jarn.jsi18n\n *\n * This is a singleton.\n * Configuration is done on the body tag data-i18ncatalogurl attribute\n * \n *\n * Or, it'll default to \"/plonejsi18n\"\n */\n\nimport $ from \"jquery\";\n\n\nvar I18N = function() {\n var self = this;\n self.baseUrl = $('body').attr('data-i18ncatalogurl');\n self.currentLanguage = $('html').attr('lang') || 'en';\n\n // Fix for country specific languages\n if (self.currentLanguage.split('-').length > 1) {\n self.currentLanguage = self.currentLanguage.split('-')[0] + '_' + self.currentLanguage.split('-')[1].toUpperCase();\n }\n\n self.storage = null;\n self.catalogs = {};\n self.ttl = 24 * 3600 * 1000;\n\n // Internet Explorer 8 does not know Date.now() which is used in e.g. loadCatalog, so we \"define\" it\n if (!Date.now) {\n Date.now = function() {\n return new Date().valueOf();\n };\n }\n\n try {\n if ('localStorage' in window && window.localStorage !== null && 'JSON' in window && window.JSON !== null) {\n self.storage = window.localStorage;\n }\n } catch (e) {}\n\n self.configure = function(config) {\n for (var key in config){\n self[key] = config[key];\n }\n };\n\n self._setCatalog = function (domain, language, catalog) {\n if (domain in self.catalogs) {\n self.catalogs[domain][language] = catalog;\n } else {\n self.catalogs[domain] = {};\n self.catalogs[domain][language] = catalog;\n }\n };\n\n self._storeCatalog = function (domain, language, catalog) {\n var key = domain + '-' + language;\n if (self.storage !== null && catalog !== null) {\n self.storage.setItem(key, JSON.stringify(catalog));\n self.storage.setItem(key + '-updated', Date.now());\n }\n };\n\n self.getUrl = function(domain, language) {\n return self.baseUrl + '?domain=' + domain + '&language=' + language;\n };\n\n self.loadCatalog = function (domain, language) {\n if (language === undefined) {\n language = self.currentLanguage;\n }\n if (self.storage !== null) {\n var key = domain + '-' + language;\n if (key in self.storage) {\n if ((Date.now() - parseInt(self.storage.getItem(key + '-updated'), 10)) < self.ttl) {\n var catalog = JSON.parse(self.storage.getItem(key));\n self._setCatalog(domain, language, catalog);\n return;\n }\n }\n }\n if (!self.baseUrl) {\n return;\n }\n $.getJSON(self.getUrl(domain, language), function (catalog) {\n if (catalog === null) {\n return;\n }\n self._setCatalog(domain, language, catalog);\n self._storeCatalog(domain, language, catalog);\n });\n };\n\n self.MessageFactory = function (domain, language) {\n language = language || self.currentLanguage;\n return function translate (msgid, keywords) {\n var msgstr;\n if ((domain in self.catalogs) && (language in self.catalogs[domain]) && (msgid in self.catalogs[domain][language])) {\n msgstr = self.catalogs[domain][language][msgid];\n } else {\n msgstr = msgid;\n }\n if (keywords) {\n var regexp, keyword;\n for (keyword in keywords) {\n if (keywords.hasOwnProperty(keyword)) {\n regexp = new RegExp('\\\\$\\\\{' + keyword + '\\\\}', 'g');\n msgstr = msgstr.replace(regexp, keywords[keyword]);\n }\n }\n }\n return msgstr;\n };\n };\n};\n\nexport default I18N;\n","import I18N from \"./components/i18n.js\";\n\n// SENAITE message factory\nvar t = null;\nexport var _t = (msgid, keywords) => {\n if (t === null) {\n let i18n = new I18N();\n console.debug(\"*** Loading `senaite.core` i18n MessageFactory ***\");\n i18n.loadCatalog(\"senaite.core\")\n t = i18n.MessageFactory(\"senaite.core\")\n }\n return t(msgid, keywords);\n}\n\n// Plone message factory\nvar p = null;\nexport var _p = (msgid, keywords) => {\n if (p === null) {\n let i18n = new I18N();\n console.debug(\"*** Loading `plone` i18n MessageFactory ***\");\n i18n.loadCatalog(\"plone\")\n p = i18n.MessageFactory(\"plone\")\n }\n return p(msgid, keywords);\n}\n","/* SENAITE Edit Form Handler\n *\n * This code handles field changes in edit forms and updates others according to\n * the changes with the help of adapters.\n *\n */\n\n// needed for Bootstrap toasts\nimport $ from \"jquery\";\n\n\nclass EditForm {\n\n constructor(config) {\n this.config = Object.assign({\n \"form_selectors\": [],\n \"field_selectors\": []\n }, config);\n\n this.hooked_fields = [];\n\n // bind event handlers\n this.on_mutated = this.on_mutated.bind(this);\n this.on_modified = this.on_modified.bind(this);\n this.on_submit = this.on_submit.bind(this);\n this.on_blur = this.on_blur.bind(this);\n this.on_click = this.on_click.bind(this);\n this.on_change = this.on_change.bind(this);\n this.on_reference_select = this.on_reference_select.bind(this);\n this.on_reference_deselect = this.on_reference_deselect.bind(this);\n this.init_forms();\n }\n\n /**\n * Initialize all form elements given by the config\n */\n init_forms() {\n let selectors = this.config.form_selectors;\n for (const selector of selectors) {\n let form = document.querySelector(selector);\n if (form && form.tagName === \"FORM\") {\n this.setup_form(form);\n this.watch_form(form);\n }\n }\n }\n\n /**\n * Trigger `initialized` event on the form element\n */\n setup_form(form) {\n console.debug(`EditForm::setup_form(${form})`);\n this.ajax_send(form, {}, \"initialized\");\n }\n\n /**\n * Bind event handlers on form fields to monitor changes\n */\n watch_form(form) {\n console.debug(`EditForm::watch_form(${form})`);\n let fields = this.get_form_fields(form);\n for (const field of fields) {\n this.hook_field(field)\n }\n // observe DOM mutations in form\n this.observe_mutations(form);\n // bind custom form event handlers\n form.addEventListener(\"modified\", this.on_modified);\n form.addEventListener(\"mutated\", this.on_mutated);\n if (form.hasAttribute(\"ajax-submit\")) {\n form.addEventListener(\"submit\", this.on_submit);\n }\n }\n\n /**\n * Bind event handlers to field\n */\n hook_field(field) {\n // return immediately if the fields is already hooked\n if (this.hooked_fields.indexOf(field) !== -1) {\n // console.debug(`Field '${field.name}' is already hooked`);\n return\n }\n if (this.is_button(field) || this.is_input_button(field)) {\n // bind click event\n field.addEventListener(\"click\", this.on_click);\n }\n else if (this.is_reference(field)) {\n // bind custom events from the ReactJS queryselect widget\n field.addEventListener(\"select\", this.on_reference_select);\n field.addEventListener(\"deselect\", this.on_reference_deselect);\n }\n else if (this.is_text(field) || this.is_textarea(field) || this.is_select(field)) {\n // bind change event\n field.addEventListener(\"change\", this.on_change);\n }\n else if (this.is_radio(field) || this.is_checkbox(field)) {\n // bind click event\n field.addEventListener(\"click\", this.on_click);\n } else {\n // bind blur event\n field.addEventListener(\"blur\", this.on_blur);\n }\n // console.debug(`Hooked field '${field.name}'`);\n // remember hooked fields\n this.hooked_fields = this.hooked_fields.concat(field);\n }\n\n /**\n * Initialize a DOM mutation observer to rebind dynamic added fields,\n * e.g. for records field etc.\n */\n observe_mutations(form) {\n let observer = new MutationObserver(function(mutations) {\n let event = new CustomEvent(\"mutated\", {\n detail: {\n form: form,\n mutations: mutations\n }\n });\n form.dispatchEvent(event);\n });\n // observe the form with all contained elements\n observer.observe(form, {\n childList: true,\n subtree: true\n });\n }\n\n /**\n * Handle a single DOM mutation\n */\n handle_mutation(form, mutation) {\n let target = mutation.target;\n let parent = target.closest(\".field\");\n let added = mutation.addedNodes;\n let removed = mutation.removedNodes;\n let selectors = this.config.field_selectors;\n // handle picklist widget\n if (this.is_multiple_select(target)) {\n return this.notify(form, target, \"modified\");\n }\n // hook new fields, e.g. when the records field \"More\" button was clicked\n if (added && target.ELEMENT_NODE) {\n for (const field of target.querySelectorAll(selectors)) {\n this.hook_field(field);\n }\n }\n }\n\n /**\n * toggles the submit button\n */\n toggle_submit(form, toggle) {\n let btn = form.querySelector(\"input[type='submit']\");\n btn.disabled = !toggle;\n }\n\n /**\n * toggles the display of the field with the `d-none` class\n */\n toggle_field_visibility(field, toggle=true) {\n let parent = field.closest(\".field\");\n let css_class = \"d-none\";\n if (toggle === false) {\n parent.classList.add(css_class);\n } else {\n parent.classList.remove(css_class);\n }\n }\n\n /**\n * check if fields have errors\n */\n has_field_errors(form) {\n let fields_with_errors = form.querySelectorAll(\".is-invalid\");\n if (fields_with_errors.length > 0) {\n return true;\n }\n return false;\n }\n\n /**\n * set field readonly\n */\n set_field_readonly(field, message=null) {\n field.setAttribute(\"readonly\", \"\");\n let existing_message = field.parentElement.querySelector(\"div.message\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"message text-secondary small\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * set field editable\n */\n set_field_editable(field, message=null) {\n field.removeAttribute(\"readonly\");\n let existing_message = field.parentElement.querySelector(\"div.message\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"message text-secondary small\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * set field error\n */\n set_field_error(field, message) {\n field.classList.add(\"is-invalid\");\n let existing_message = field.parentElement.querySelector(\"div.invalid-feedback\");\n if (existing_message) {\n existing_message.innerHTML = _t(message)\n } else {\n let div = document.createElement(\"div\");\n div.className = \"invalid-feedback\";\n div.innerHTML = _t(message);\n field.parentElement.appendChild(div);\n }\n }\n\n /**\n * remove field error\n */\n remove_field_error(field) {\n field.classList.remove(\"is-invalid\")\n let msg = field.parentElement.querySelector(\".invalid-feedback\");\n if (msg) {\n msg.remove();\n }\n }\n\n /**\n * add a status message\n * @param {string} message the message to display in the alert\n * @param {string} level one of \"info\", \"success\", \"warning\", \"danger\"\n * @param {object} options additional options to control the behavior\n * - option {string} title: alert title in bold\n * - option {string} flush: remove previous alerts\n */\n add_statusmessage(message, level=\"info\", options) {\n options = options || {};\n let el = document.createElement(\"div\");\n let title = options.title || `${level.charAt(0).toUpperCase() + level.slice(1)}`;\n el.innerHTML = `\n
\n ${title}\n ${_t(message)}\n \n
\n `\n el = el.firstElementChild\n let parent = document.getElementById(\"viewlet-above-content\");\n\n // clear put previous alerts\n if (options.flush) {\n for (let el of parent.querySelectorAll(\".alert\")) {\n el.remove();\n }\n }\n parent.appendChild(el);\n return el;\n }\n\n /**\n * add a notification message\n */\n add_notification(title, message, options) {\n options = options || {};\n options = Object.assign({\n animation: true,\n autohide: true,\n delay: 5000,\n }, options)\n let el = document.createElement(\"div\");\n el.innerHTML = `\n
\n
\n ${title.charAt(0).toUpperCase() + title.slice(1)}\n \n
\n
\n ${_t(message)}\n
\n
\n `\n el = el.firstElementChild;\n let parent = document.querySelector(\".toast-container\");\n if (!parent) {\n parent = document.createElement(\"div\");\n parent.innerHTML = `\n
\n
\n
\n
\n `\n let wrapper = document.querySelector(\".container-fluid\");\n wrapper.appendChild(parent);\n parent = parent.querySelector(\".toast-container\");\n }\n parent.appendChild(el);\n return el;\n }\n\n /**\n * update the form with the response from the server\n */\n update_form(form, data) {\n console.info(\"*** UPDATE FORM ***\", data)\n\n let hide = data.hide || [];\n let show = data.show || [];\n let readonly = data.readonly || [];\n let editable = data.editable || [];\n let errors = data.errors || [];\n let messages = data.messages || [];\n let notifications = data.notifications || [];\n let updates = data.updates || [];\n let html = data.html || [];\n let attributes = data.attributes || [];\n\n // render field errors\n for (const record of errors) {\n let name, error, rest;\n ({name, error, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n if (error) {\n this.set_field_error(el, error);\n } else {\n this.remove_field_error(el);\n }\n }\n\n // render status messages\n for (const record of messages) {\n let name, error, rest;\n ({message, level, ...rest} = record);\n let level = level || \"info\";\n let message = message || \"\";\n this.add_statusmessage(message, level, rest);\n }\n\n // render notification messages\n for (const record of notifications) {\n let title, message, rest;\n ({title, message, ...rest} = record);\n let el = this.add_notification(title, message, rest);\n $(el).toast(\"show\");\n }\n\n // hide fields\n for (const record of hide) {\n let name, rest;\n ({name, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.toggle_field_visibility(el, false);\n }\n\n // show fields\n for (const record of show) {\n let name, rest;\n ({name, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.toggle_field_visibility(el, true);\n }\n\n // readonly fields\n for (const record of readonly) {\n let name, message, rest;\n ({name, message, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_readonly(el, message);\n }\n\n // editable fields\n for (const record of editable) {\n let name, message, rest;\n ({name, message, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_editable(el, message);\n }\n\n // updated fields\n for (const record of updates) {\n let name, value, rest;\n ({name, value, ...rest} = record);\n let el = this.get_form_field_by_name(form, name);\n if (!el) continue;\n this.set_field_value(el, value);\n }\n\n // html\n for (const record of html) {\n let selector, html, rest;\n ({selector, html, ...rest} = record);\n let el = form.querySelector(selector);\n if (!el) continue;\n if (rest.append) {\n el.innerHTML = el.innerHTML + html;\n } else {\n el.innerHTML = html;\n }\n }\n\n // set attribute to an element\n for (const record of attributes) {\n let selector, name, value, rest;\n ({selector, name, value, ...rest} = record);\n let el = form.querySelector(selector);\n if (!el) continue;\n if (value === null) {\n el.removeAttribute(name);\n } else {\n el.addAttribute(name, value);\n }\n }\n\n // disallow submit when field errors are present\n if (this.has_field_errors(form)) {\n this.toggle_submit(form, false);\n } else {\n this.toggle_submit(form, true);\n }\n }\n\n /**\n * return a form field by name\n */\n get_form_field_by_name(form, name) {\n // get the first element that matches the name\n let exact = form.querySelector(`[name='${name}']`);\n let fuzzy = form.querySelector(`[name^='${name}']`);\n let field = exact || fuzzy || null;\n if (field === null) {\n return null;\n }\n return field;\n }\n\n /**\n * return a dictionary of all the form values\n */\n get_form_data(form) {\n let data = {};\n let form_data = new FormData(form);\n form_data.forEach(function(value, key) {\n data[key] = value;\n });\n return data;\n }\n\n /**\n * Return form fields for the given selectors of the config\n */\n get_form_fields(form) {\n console.debug(`EditForm::get_form_fields(${form})`);\n let fields = [];\n let selectors = this.config.field_selectors;\n for (const selector of selectors) {\n let nodes = form.querySelectorAll(selector);\n fields = fields.concat(...nodes.values())\n }\n return fields\n }\n\n /**\n * returns the name of the field w/o ZPublisher converter\n */\n get_field_name(field) {\n let name = field.name;\n return name.split(\":\")[0];\n }\n\n /**\n * return the value of the form field\n */\n get_field_value(field) {\n if (this.is_checkbox(field)) {\n // returns true/false for checkboxes\n return field.checked;\n } else if (this.is_select(field)) {\n // returns a list of selected option\n let selected = field.selectedOptions;\n return Array.prototype.map.call(selected, (option) => option.value)\n } else if (this.is_reference(field)) {\n return field.value.split(\"\\n\");\n }\n // return the plain field value\n return field.value;\n }\n\n /**\n * set the value of the form field\n */\n set_field_value(field, value) {\n // for reference/select fields\n let selected = value.selected || [];\n let options = value.options || [];\n\n // set reference value\n if (this.is_reference(field)) {\n field.value = selected.join(\"\\n\");\n }\n // set select field\n else if (this.is_select(field)) {\n if (selected.length == 0) {\n let old_selected = field.options[field.selected];\n if (old_selected) {\n selected = [old_selected.value];\n }\n }\n // remove all options\n field.options.length = 0;\n // sort options\n options.sort((a, b) => {\n let _a = a.title.toLowerCase();\n let _b = b.title.toLowerCase();\n if (a.value === null) _a = \"\";\n if (b.value === null) _b = \"\";\n if (_a < _b) return -1;\n if (_a > _b) return 1;\n });\n // build new options\n for (const option of options) {\n let el = document.createElement(\"option\");\n el.value = option.value;\n el.innerHTML = option.title;\n // select item if the value is in the selected array\n if (selected.indexOf(option.value) !== -1) {\n el.selected = true;\n }\n field.appendChild(el);\n }\n // select first item\n if (selected.length == 0) {\n field.selectedIndex = 0;\n }\n }\n // set checkbox value\n else if (this.is_checkbox(field)) {\n field.checked = value;\n }\n // set other field values\n else {\n field.value = value;\n }\n }\n\n\n /**\n * trigger `modified` event on the form\n */\n modified(el) {\n let event = new CustomEvent(\"modified\", {\n detail: {\n field: el,\n form: el.form\n }\n });\n // dispatch the event on the element\n el.form.dispatchEvent(event);\n }\n\n /**\n * trigger ajax loading events\n */\n loading(toggle=true) {\n let event_type = toggle ? \"ajaxStart\" : \"ajaxStop\";\n let event = new CustomEvent(event_type);\n document.dispatchEvent(event);\n }\n\n /**\n * notify a field change to the server ajax endpoint\n */\n notify(form, field, endpoint) {\n let data = {\n name: this.get_field_name(field),\n value: this.get_field_value(field),\n }\n this.ajax_send(form, data, endpoint);\n }\n\n /**\n * send application/json to the server\n */\n ajax_send(form, data, endpoint) {\n let view_url = document.body.dataset.viewUrl;\n let ajax_url = `${view_url}/ajax_form/${endpoint}`;\n\n let payload = Object.assign({\n \"form\": this.get_form_data(form)\n }, data)\n\n console.debug(\"EditForm::ajax_send --> \", payload)\n\n let init = {\n method: \"POST\",\n credentials: \"include\",\n body: JSON.stringify(payload),\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-CSRF-TOKEN\": document.querySelector(\"#protect-script\").dataset.token\n },\n }\n\n return this.ajax_request(form, ajax_url, init);\n }\n\n /**\n * send multipart/form-data to the server\n */\n ajax_submit(form, data, endpoint) {\n let view_url = document.body.dataset.viewUrl;\n let ajax_url = `${view_url}/ajax_form/${endpoint}`;\n\n let payload = new FormData(form);\n\n // update form data\n for(let [key, value] of Object.entries(data)) {\n payload.set(key, value);\n }\n\n console.debug(\"EditForm::ajax_submit --> \", payload)\n\n let init = {\n method: \"POST\",\n body: payload,\n }\n\n return this.ajax_request(form, ajax_url, init);\n }\n\n\n /**\n * execute ajax request\n */\n ajax_request(form, url, init) {\n // send ajax request to server\n this.loading(true);\n let request = new Request(url, init);\n return fetch(request)\n .then((response) => {\n if (!response.ok) {\n return Promise.reject(response);\n }\n return response.json();\n })\n .then((data) => {\n console.debug(\"EditForm::ajax_request --> \", data);\n this.update_form(form, data);\n this.loading(false);\n })\n .catch((error) => {\n console.error(error);\n this.loading(false);\n });\n }\n\n /**\n * Toggle element disable\n */\n toggle_disable(el, toggle) {\n if (el) {\n el.disabled = toggle;\n }\n }\n\n /**\n * Checks if the element is a textarea field\n */\n is_textarea(el) {\n return el.tagName == \"TEXTAREA\";\n }\n\n /**\n * Checks if the elment is a select field\n */\n is_select(el) {\n return el.tagName == \"SELECT\";\n }\n\n /**\n * Checks if the element is a multiple select field\n */\n is_multiple_select(el) {\n return this.is_select(el) && el.hasAttribute(\"multiple\");\n }\n\n /**\n * Checks if the element is an input field\n */\n is_input(el) {\n return el.tagName === \"INPUT\";\n }\n\n /**\n * Checks if the element is an input[type='text'] field\n */\n is_text(el) {\n return this.is_input(el) && el.type === \"text\";\n }\n\n /**\n * Checks if the element is a button field\n */\n is_button(el) {\n return el.tagName === \"BUTTON\";\n }\n\n /**\n * Checks if the element is an input[type='button'] field\n */\n is_input_button(el) {\n return this.is_input(el) && el.type === \"button\";\n }\n\n /**\n * Checks if the element is an input[type='checkbox'] field\n */\n is_checkbox(el) {\n return this.is_input(el) && el.type === \"checkbox\";\n }\n\n /**\n * Checks if the element is an input[type='radio'] field\n */\n is_radio(el) {\n return this.is_input(el) && el.type === \"radio\";\n }\n\n /**\n * Checks if the element is a SENAITE reference field (textarea)\n */\n is_reference(el) {\n if (!this.is_textarea(el)) {\n return false;\n }\n return el.classList.contains(\"queryselectwidget-value\");\n }\n\n /**\n * event handler for `mutated` event\n */\n on_mutated(event) {\n console.debug(\"EditForm::on_mutated\");\n let form = event.detail.form;\n let mutations = event.detail.mutations;\n // reduce multiple mutations on the same node to one\n let seen = [];\n for (const mutation of mutations) {\n if (seen.indexOf(mutation.target) > -1) {\n continue;\n }\n seen = seen.concat(mutation.target);\n this.handle_mutation(form, mutation);\n }\n }\n\n /**\n * event handler for `modified` event\n */\n on_modified(event) {\n console.debug(\"EditForm::on_modified\");\n let form = event.detail.form;\n let field = event.detail.field;\n this.notify(form, field, \"modified\");\n }\n\n /**\n * event handler for `submit` event\n */\n on_submit(event) {\n console.debug(\"EditForm::on_submit\");\n event.preventDefault();\n let data = {}\n let form = event.currentTarget.closest(\"form\");\n // NOTE: submit input field not included in request form data!\n let submitter = event.submitter;\n if (submitter) {\n data[submitter.name] = submitter.value;\n // disable submit button during ajax call\n this.toggle_disable(submitter, true);\n }\n this.ajax_submit(form, data, \"submit\")\n .then((response) =>\n // enable submit button after ajax call again\n this.toggle_disable(submitter, false));\n }\n\n /**\n * event handler for `blur` event\n */\n on_blur(event) {\n console.debug(\"EditForm::on_blur\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `click` event\n */\n on_click(event) {\n console.debug(\"EditForm::on_click\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `change` event\n */\n on_change(event) {\n console.debug(\"EditForm::on_change\");\n let el = event.currentTarget;\n this.modified(el);\n }\n\n /**\n * event handler for `select` event\n */\n on_reference_select(event) {\n console.debug(\"EditForm::on_reference_select\");\n let el = event.currentTarget;\n // add the selected value to the list\n let selected = el.value.split(\"\\n\");\n selected = selected.concat(event.detail.value);\n el.value = selected.join(\"\\n\");\n this.modified(el);\n }\n\n /**\n * event handler for `deselect` event\n */\n on_reference_deselect(event) {\n console.debug(\"EditForm::on_reference_deselect\");\n let el = event.currentTarget;\n // remove the delelected value from the list\n let selected = el.value.split(\"\\n\");\n let index = selected.indexOf(event.detail.value);\n if (index > -1) {\n selected.splice(index, 1)\n }\n el.value = selected.join(\"\\n\");\n this.modified(el);\n }\n\n}\n\nexport default EditForm;\n","\n/* Please use this command to compile this file into the parent `js` directory:\n coffee --no-header -w -o ../ -c site.coffee\n */\nvar Site,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\nSite = (function() {\n\n /**\n * Creates a new instance of Site\n */\n function Site() {\n this.set_cookie = bind(this.set_cookie, this);\n this.read_cookie = bind(this.read_cookie, this);\n this.authenticator = bind(this.authenticator, this);\n // console.debug(\"Site::init\");\n }\n\n\n /**\n * Returns the authenticator value\n */\n\n Site.prototype.authenticator = function() {\n var auth, url_params;\n auth = $(\"input[name='_authenticator']\").val();\n if (!auth) {\n url_params = new URLSearchParams(window.location.search);\n auth = url_params.get(\"_authenticator\");\n }\n return auth;\n };\n\n\n /**\n * Reads a cookie value\n * @param {name} the name of the cookie\n */\n\n Site.prototype.read_cookie = function(name) {\n var c, ca, i;\n // console.debug(\"Site::read_cookie:\" + name);\n name = name + '=';\n ca = document.cookie.split(';');\n i = 0;\n while (i < ca.length) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.substring(1);\n }\n if (c.indexOf(name) === 0) {\n return c.substring(name.length, c.length);\n }\n i++;\n }\n return null;\n };\n\n\n /**\n * Sets a cookie value\n * @param {name} the name of the cookie\n * @param {value} the value of the cookie\n */\n\n Site.prototype.set_cookie = function(name, value) {\n var d, expires;\n // console.debug(\"Site::set_cookie:name=\" + name + \", value=\" + value);\n d = new Date;\n d.setTime(d.getTime() + 1 * 24 * 60 * 60 * 1000);\n expires = 'expires=' + d.toUTCString();\n document.cookie = name + '=' + value + ';' + expires + ';path=/';\n };\n\n return Site;\n\n})();\n\nexport default Site;\n","/* SENAITE Sidebar\n *\n * The sidebar shows when the mouse enters and hides when the mouse leaves the\n * HTML element.\n *\n * It keeps open when the toggle button was clicked.\n */\n\nclass Sidebar{\n\n constructor(config) {\n\n this.config = Object.assign({\n \"el\": \"sidebar\",\n \"toggle_el\": \"sidebar-header\",\n \"cookie_key\": \"sidebar-toggle\",\n \"timeout\": 1000,\n }, config);\n\n // Timer ID\n this.tid = null;\n\n // Bind \"this\" context when called\n this.maximize = this.maximize.bind(this);\n this.minimize = this.minimize.bind(this);\n this.on_click = this.on_click.bind(this);\n this.on_mouseenter = this.on_mouseenter.bind(this)\n this.on_mouseleave = this.on_mouseleave.bind(this);\n\n // toggle button handler\n this.toggle_el = document.getElementById(this.config.toggle_el);\n if (this.toggle_el) {\n this.toggle_el.addEventListener(\"click\", this.on_click);\n }\n\n // sidebar view/hide handler\n this.el = document.getElementById(this.config.el);\n if (this.el) {\n this.el.addEventListener(\"mouseenter\", this.on_mouseenter);\n this.el.addEventListener(\"mouseleave\", this.on_mouseleave);\n\n if (this.is_toggled()) {\n this.el.classList.remove(\"minimized\");\n this.el.classList.add(\"toggled\");\n }\n }\n\n return this;\n }\n\n is_toggled() {\n return window.site.read_cookie(this.config.cookie_key) == \"true\";\n }\n\n toggle(toggle=false) {\n window.site.set_cookie(this.config.cookie_key, toggle)\n if (toggle) {\n this.el.classList.add(\"toggled\")\n this.maximize();\n } else {\n this.el.classList.remove(\"toggled\")\n this.minimize();\n }\n }\n\n minimize() {\n this.el.classList.add(\"minimized\");\n }\n\n maximize() {\n this.el.classList.remove(\"minimized\");\n }\n\n on_click(event) {\n // console.debug(\"Sidebar::on_click:event=\", event)\n clearTimeout(this.tid);\n this.toggle(!this.is_toggled());\n }\n\n on_mouseenter(event) {\n // console.debug(\"Sidebar::on_mouseenter:event=\", event)\n clearTimeout(this.tid);\n if (this.is_toggled()) return\n this.tid = setTimeout(this.maximize, this.config.timeout);\n }\n\n on_mouseleave(event) {\n // console.debug(\"Sidebar::on_mouseleave:event=\", event)\n clearTimeout(this.tid);\n if (this.is_toggled()) return\n this.minimize();\n // console.debug(\"Clearing sidebar timeout\", this.tid);\n }\n}\n\nexport default Sidebar;\n","import $ from \"jquery\";\nimport I18N from \"./components/i18n.js\";\nimport {i18n, _t, _p} from \"./i18n-wrapper.js\"\nimport EditForm from \"./components/editform.js\"\nimport Site from \"./components/site.js\"\nimport Sidebar from \"./components/sidebar.js\"\n\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n console.info(\"*** SENAITE CORE JS LOADED ***\");\n\n // Initialize i18n message factories\n window.i18n = new I18N();\n window._t = _t;\n window._p = _p;\n\n // BBB: set global `portal_url` variable\n window.portal_url = document.body.dataset.portalUrl\n\n // Initialize Site\n window.site = new Site();\n\n // Initialize Sidebar\n window.sidebar = new Sidebar({\n \"el\": \"sidebar\",\n });\n\n // Ajax Edit Form Handler\n var form = new EditForm({\n form_selectors: [\n \"form[name='edit_form']\",\n \"form.senaite-ajax-form\",\n ],\n field_selectors: [\n \"input[type='text']\",\n \"input[type='number']\",\n \"input[type='checkbox']\",\n \"input[type='radio']\",\n \"input[type='file']\",\n \"select\",\n \"textarea\",\n ]\n })\n\n // Init Tooltips\n $(function () {\n $(\"[data-toggle='tooltip']\").tooltip();\n $(\"select.selectpicker\").selectpicker();\n });\n\n // Reload the whole view if the status of the view's context has changed\n // due to the transition submission of some items from the listing\n document.body.addEventListener(\"listing:after_transition_event\", (event) => {\n\n // skip site reload for multi_results view\n let multi_results_templates = [\"template-multi_results\", \"template-multi_results_classic\"];\n let body_class_list = document.body.classList;\n for (let class_name of multi_results_templates) {\n if (body_class_list.contains(class_name)) {\n return;\n }\n }\n\n // get the old workflow state of the view context\n let old_workflow_state = document.body.dataset.reviewState;\n\n // get the new workflow state of the view context\n // https://github.com/senaite/senaite.app.listing/pull/92\n let config = event.detail.config;\n let new_workflow_state = config.view_context_state;\n\n // reload the entire page if workflow state of the view context changed\n if (old_workflow_state != new_workflow_state) {\n location.reload();\n }\n });\n\n});\n"],"names":["module","exports","jQuery","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","self","this","baseUrl","$","attr","currentLanguage","split","length","toUpperCase","storage","catalogs","ttl","Date","now","valueOf","window","localStorage","JSON","e","configure","config","_setCatalog","domain","language","catalog","_storeCatalog","setItem","stringify","getUrl","loadCatalog","parseInt","getItem","parse","MessageFactory","msgid","keywords","msgstr","regexp","keyword","RegExp","replace","t","_t","i18n","I18N","p","_p","EditForm","_classCallCheck","assign","hooked_fields","on_mutated","bind","on_modified","on_submit","on_blur","on_click","on_change","on_reference_select","on_reference_deselect","init_forms","value","_step","_iterator","_createForOfIteratorHelper","form_selectors","s","done","selector","form","document","querySelector","tagName","setup_form","watch_form","err","f","ajax_send","_step2","_iterator2","get_form_fields","field","hook_field","observe_mutations","addEventListener","hasAttribute","indexOf","is_button","is_input_button","is_reference","is_text","is_textarea","is_select","is_radio","is_checkbox","concat","MutationObserver","mutations","event","CustomEvent","detail","dispatchEvent","observe","childList","subtree","mutation","target","added","closest","addedNodes","selectors","removedNodes","field_selectors","is_multiple_select","notify","ELEMENT_NODE","_step3","_iterator3","querySelectorAll","toggle","disabled","arguments","parent","css_class","classList","add","remove","message","setAttribute","existing_message","parentElement","innerHTML","div","createElement","className","appendChild","removeAttribute","msg","level","options","el","title","charAt","slice","firstElementChild","getElementById","flush","_step4","_iterator4","animation","autohide","delay","data","_step5","hide","show","readonly","editable","errors","messages","notifications","updates","html","attributes","_iterator5","name","error","_record","_objectWithoutProperties","_excluded","get_form_field_by_name","set_field_error","remove_field_error","_step6","_iterator6","rest","_record3","_excluded2","add_statusmessage","_step7","_iterator7","_record5","_excluded3","add_notification","toast","_step8","_iterator8","_record7","_excluded4","toggle_field_visibility","_step9","_iterator9","_record9","_excluded5","_step10","_iterator10","_record11","_excluded6","set_field_readonly","_step11","_iterator11","_record13","_excluded7","set_field_editable","_step12","_iterator12","_record15","_excluded8","set_field_value","_step13","_iterator13","_record17","_excluded9","append","_step14","_iterator14","_record19","_excluded10","addAttribute","has_field_errors","toggle_submit","exact","fuzzy","FormData","forEach","_step15","fields","_iterator15","_fields","nodes","apply","values","checked","selected","selectedOptions","Array","map","option","join","old_selected","sort","b","_a","toLowerCase","_b","_step16","_iterator16","selectedIndex","endpoint","get_field_name","get_field_value","view_url","body","dataset","viewUrl","ajax_url","payload","get_form_data","init","method","credentials","headers","token","ajax_request","_i","_Object$entries","entries","_Object$entries$_i","set","url","_this","loading","request","Request","fetch","then","response","ok","json","Promise","reject","update_form","is_input","type","contains","_step17","seen","_iterator17","handle_mutation","_this2","preventDefault","currentTarget","submitter","toggle_disable","ajax_submit","modified","index","splice","fn","me","Site","set_cookie","read_cookie","authenticator","auth","val","URLSearchParams","location","search","c","ca","i","cookie","substring","expires","setTime","getTime","toUTCString","Sidebar","tid","maximize","minimize","on_mouseenter","on_mouseleave","toggle_el","is_toggled","site","cookie_key","clearTimeout","setTimeout","timeout","portal_url","portalUrl","sidebar","tooltip","selectpicker","body_class_list","_multi_results_templa","class_name","reviewState","view_context_state","reload"],"sourceRoot":""} \ No newline at end of file diff --git a/webpack/app/senaite.core.js b/webpack/app/senaite.core.js index 0357b1d746..34c76da150 100644 --- a/webpack/app/senaite.core.js +++ b/webpack/app/senaite.core.js @@ -53,9 +53,12 @@ document.addEventListener("DOMContentLoaded", () => { document.body.addEventListener("listing:after_transition_event", (event) => { // skip site reload for multi_results view - // TODO: find a better way for this check! - if (document.body.classList.contains("template-multi_results")) { - return; + let multi_results_templates = ["template-multi_results", "template-multi_results_classic"]; + let body_class_list = document.body.classList; + for (let class_name of multi_results_templates) { + if (body_class_list.contains(class_name)) { + return; + } } // get the old workflow state of the view context