@saltcorn/server 0.8.7-beta.3 → 0.8.7-beta.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @popperjs/core v2.11.6 - MIT License
3
+ */
4
+
5
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Popper={})}(this,(function(e){"use strict";function t(e){if(null==e)return window;if("[object Window]"!==e.toString()){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function n(e){return e instanceof t(e).Element||e instanceof Element}function r(e){return e instanceof t(e).HTMLElement||e instanceof HTMLElement}function o(e){return"undefined"!=typeof ShadowRoot&&(e instanceof t(e).ShadowRoot||e instanceof ShadowRoot)}var i=Math.max,a=Math.min,s=Math.round;function f(){var e=navigator.userAgentData;return null!=e&&e.brands?e.brands.map((function(e){return e.brand+"/"+e.version})).join(" "):navigator.userAgent}function c(){return!/^((?!chrome|android).)*safari/i.test(f())}function p(e,o,i){void 0===o&&(o=!1),void 0===i&&(i=!1);var a=e.getBoundingClientRect(),f=1,p=1;o&&r(e)&&(f=e.offsetWidth>0&&s(a.width)/e.offsetWidth||1,p=e.offsetHeight>0&&s(a.height)/e.offsetHeight||1);var u=(n(e)?t(e):window).visualViewport,l=!c()&&i,d=(a.left+(l&&u?u.offsetLeft:0))/f,h=(a.top+(l&&u?u.offsetTop:0))/p,m=a.width/f,v=a.height/p;return{width:m,height:v,top:h,right:d+m,bottom:h+v,left:d,x:d,y:h}}function u(e){var n=t(e);return{scrollLeft:n.pageXOffset,scrollTop:n.pageYOffset}}function l(e){return e?(e.nodeName||"").toLowerCase():null}function d(e){return((n(e)?e.ownerDocument:e.document)||window.document).documentElement}function h(e){return p(d(e)).left+u(e).scrollLeft}function m(e){return t(e).getComputedStyle(e)}function v(e){var t=m(e),n=t.overflow,r=t.overflowX,o=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+o+r)}function y(e,n,o){void 0===o&&(o=!1);var i,a,f=r(n),c=r(n)&&function(e){var t=e.getBoundingClientRect(),n=s(t.width)/e.offsetWidth||1,r=s(t.height)/e.offsetHeight||1;return 1!==n||1!==r}(n),m=d(n),y=p(e,c,o),g={scrollLeft:0,scrollTop:0},b={x:0,y:0};return(f||!f&&!o)&&(("body"!==l(n)||v(m))&&(g=(i=n)!==t(i)&&r(i)?{scrollLeft:(a=i).scrollLeft,scrollTop:a.scrollTop}:u(i)),r(n)?((b=p(n,!0)).x+=n.clientLeft,b.y+=n.clientTop):m&&(b.x=h(m))),{x:y.left+g.scrollLeft-b.x,y:y.top+g.scrollTop-b.y,width:y.width,height:y.height}}function g(e){var t=p(e),n=e.offsetWidth,r=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-r)<=1&&(r=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:r}}function b(e){return"html"===l(e)?e:e.assignedSlot||e.parentNode||(o(e)?e.host:null)||d(e)}function w(e){return["html","body","#document"].indexOf(l(e))>=0?e.ownerDocument.body:r(e)&&v(e)?e:w(b(e))}function x(e,n){var r;void 0===n&&(n=[]);var o=w(e),i=o===(null==(r=e.ownerDocument)?void 0:r.body),a=t(o),s=i?[a].concat(a.visualViewport||[],v(o)?o:[]):o,f=n.concat(s);return i?f:f.concat(x(b(s)))}function O(e){return["table","td","th"].indexOf(l(e))>=0}function j(e){return r(e)&&"fixed"!==m(e).position?e.offsetParent:null}function E(e){for(var n=t(e),i=j(e);i&&O(i)&&"static"===m(i).position;)i=j(i);return i&&("html"===l(i)||"body"===l(i)&&"static"===m(i).position)?n:i||function(e){var t=/firefox/i.test(f());if(/Trident/i.test(f())&&r(e)&&"fixed"===m(e).position)return null;var n=b(e);for(o(n)&&(n=n.host);r(n)&&["html","body"].indexOf(l(n))<0;){var i=m(n);if("none"!==i.transform||"none"!==i.perspective||"paint"===i.contain||-1!==["transform","perspective"].indexOf(i.willChange)||t&&"filter"===i.willChange||t&&i.filter&&"none"!==i.filter)return n;n=n.parentNode}return null}(e)||n}var D="top",A="bottom",L="right",P="left",M="auto",k=[D,A,L,P],W="start",B="end",H="viewport",T="popper",R=k.reduce((function(e,t){return e.concat([t+"-"+W,t+"-"+B])}),[]),S=[].concat(k,[M]).reduce((function(e,t){return e.concat([t,t+"-"+W,t+"-"+B])}),[]),V=["beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite"];function q(e){var t=new Map,n=new Set,r=[];function o(e){n.add(e.name),[].concat(e.requires||[],e.requiresIfExists||[]).forEach((function(e){if(!n.has(e)){var r=t.get(e);r&&o(r)}})),r.push(e)}return e.forEach((function(e){t.set(e.name,e)})),e.forEach((function(e){n.has(e.name)||o(e)})),r}function C(e){return e.split("-")[0]}function N(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&o(n)){var r=t;do{if(r&&e.isSameNode(r))return!0;r=r.parentNode||r.host}while(r)}return!1}function I(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function _(e,r,o){return r===H?I(function(e,n){var r=t(e),o=d(e),i=r.visualViewport,a=o.clientWidth,s=o.clientHeight,f=0,p=0;if(i){a=i.width,s=i.height;var u=c();(u||!u&&"fixed"===n)&&(f=i.offsetLeft,p=i.offsetTop)}return{width:a,height:s,x:f+h(e),y:p}}(e,o)):n(r)?function(e,t){var n=p(e,!1,"fixed"===t);return n.top=n.top+e.clientTop,n.left=n.left+e.clientLeft,n.bottom=n.top+e.clientHeight,n.right=n.left+e.clientWidth,n.width=e.clientWidth,n.height=e.clientHeight,n.x=n.left,n.y=n.top,n}(r,o):I(function(e){var t,n=d(e),r=u(e),o=null==(t=e.ownerDocument)?void 0:t.body,a=i(n.scrollWidth,n.clientWidth,o?o.scrollWidth:0,o?o.clientWidth:0),s=i(n.scrollHeight,n.clientHeight,o?o.scrollHeight:0,o?o.clientHeight:0),f=-r.scrollLeft+h(e),c=-r.scrollTop;return"rtl"===m(o||n).direction&&(f+=i(n.clientWidth,o?o.clientWidth:0)-a),{width:a,height:s,x:f,y:c}}(d(e)))}function F(e,t,o,s){var f="clippingParents"===t?function(e){var t=x(b(e)),o=["absolute","fixed"].indexOf(m(e).position)>=0&&r(e)?E(e):e;return n(o)?t.filter((function(e){return n(e)&&N(e,o)&&"body"!==l(e)})):[]}(e):[].concat(t),c=[].concat(f,[o]),p=c[0],u=c.reduce((function(t,n){var r=_(e,n,s);return t.top=i(r.top,t.top),t.right=a(r.right,t.right),t.bottom=a(r.bottom,t.bottom),t.left=i(r.left,t.left),t}),_(e,p,s));return u.width=u.right-u.left,u.height=u.bottom-u.top,u.x=u.left,u.y=u.top,u}function U(e){return e.split("-")[1]}function z(e){return["top","bottom"].indexOf(e)>=0?"x":"y"}function X(e){var t,n=e.reference,r=e.element,o=e.placement,i=o?C(o):null,a=o?U(o):null,s=n.x+n.width/2-r.width/2,f=n.y+n.height/2-r.height/2;switch(i){case D:t={x:s,y:n.y-r.height};break;case A:t={x:s,y:n.y+n.height};break;case L:t={x:n.x+n.width,y:f};break;case P:t={x:n.x-r.width,y:f};break;default:t={x:n.x,y:n.y}}var c=i?z(i):null;if(null!=c){var p="y"===c?"height":"width";switch(a){case W:t[c]=t[c]-(n[p]/2-r[p]/2);break;case B:t[c]=t[c]+(n[p]/2-r[p]/2)}}return t}function Y(e){return Object.assign({},{top:0,right:0,bottom:0,left:0},e)}function G(e,t){return t.reduce((function(t,n){return t[n]=e,t}),{})}function J(e,t){void 0===t&&(t={});var r=t,o=r.placement,i=void 0===o?e.placement:o,a=r.strategy,s=void 0===a?e.strategy:a,f=r.boundary,c=void 0===f?"clippingParents":f,u=r.rootBoundary,l=void 0===u?H:u,h=r.elementContext,m=void 0===h?T:h,v=r.altBoundary,y=void 0!==v&&v,g=r.padding,b=void 0===g?0:g,w=Y("number"!=typeof b?b:G(b,k)),x=m===T?"reference":T,O=e.rects.popper,j=e.elements[y?x:m],E=F(n(j)?j:j.contextElement||d(e.elements.popper),c,l,s),P=p(e.elements.reference),M=X({reference:P,element:O,strategy:"absolute",placement:i}),W=I(Object.assign({},O,M)),B=m===T?W:P,R={top:E.top-B.top+w.top,bottom:B.bottom-E.bottom+w.bottom,left:E.left-B.left+w.left,right:B.right-E.right+w.right},S=e.modifiersData.offset;if(m===T&&S){var V=S[i];Object.keys(R).forEach((function(e){var t=[L,A].indexOf(e)>=0?1:-1,n=[D,A].indexOf(e)>=0?"y":"x";R[e]+=V[n]*t}))}return R}var K={placement:"bottom",modifiers:[],strategy:"absolute"};function Q(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some((function(e){return!(e&&"function"==typeof e.getBoundingClientRect)}))}function Z(e){void 0===e&&(e={});var t=e,r=t.defaultModifiers,o=void 0===r?[]:r,i=t.defaultOptions,a=void 0===i?K:i;return function(e,t,r){void 0===r&&(r=a);var i,s,f={placement:"bottom",orderedModifiers:[],options:Object.assign({},K,a),modifiersData:{},elements:{reference:e,popper:t},attributes:{},styles:{}},c=[],p=!1,u={state:f,setOptions:function(r){var i="function"==typeof r?r(f.options):r;l(),f.options=Object.assign({},a,f.options,i),f.scrollParents={reference:n(e)?x(e):e.contextElement?x(e.contextElement):[],popper:x(t)};var s,p,d=function(e){var t=q(e);return V.reduce((function(e,n){return e.concat(t.filter((function(e){return e.phase===n})))}),[])}((s=[].concat(o,f.options.modifiers),p=s.reduce((function(e,t){var n=e[t.name];return e[t.name]=n?Object.assign({},n,t,{options:Object.assign({},n.options,t.options),data:Object.assign({},n.data,t.data)}):t,e}),{}),Object.keys(p).map((function(e){return p[e]}))));return f.orderedModifiers=d.filter((function(e){return e.enabled})),f.orderedModifiers.forEach((function(e){var t=e.name,n=e.options,r=void 0===n?{}:n,o=e.effect;if("function"==typeof o){var i=o({state:f,name:t,instance:u,options:r}),a=function(){};c.push(i||a)}})),u.update()},forceUpdate:function(){if(!p){var e=f.elements,t=e.reference,n=e.popper;if(Q(t,n)){f.rects={reference:y(t,E(n),"fixed"===f.options.strategy),popper:g(n)},f.reset=!1,f.placement=f.options.placement,f.orderedModifiers.forEach((function(e){return f.modifiersData[e.name]=Object.assign({},e.data)}));for(var r=0;r<f.orderedModifiers.length;r++)if(!0!==f.reset){var o=f.orderedModifiers[r],i=o.fn,a=o.options,s=void 0===a?{}:a,c=o.name;"function"==typeof i&&(f=i({state:f,options:s,name:c,instance:u})||f)}else f.reset=!1,r=-1}}},update:(i=function(){return new Promise((function(e){u.forceUpdate(),e(f)}))},function(){return s||(s=new Promise((function(e){Promise.resolve().then((function(){s=void 0,e(i())}))}))),s}),destroy:function(){l(),p=!0}};if(!Q(e,t))return u;function l(){c.forEach((function(e){return e()})),c=[]}return u.setOptions(r).then((function(e){!p&&r.onFirstUpdate&&r.onFirstUpdate(e)})),u}}var $={passive:!0};var ee={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(e){var n=e.state,r=e.instance,o=e.options,i=o.scroll,a=void 0===i||i,s=o.resize,f=void 0===s||s,c=t(n.elements.popper),p=[].concat(n.scrollParents.reference,n.scrollParents.popper);return a&&p.forEach((function(e){e.addEventListener("scroll",r.update,$)})),f&&c.addEventListener("resize",r.update,$),function(){a&&p.forEach((function(e){e.removeEventListener("scroll",r.update,$)})),f&&c.removeEventListener("resize",r.update,$)}},data:{}};var te={name:"popperOffsets",enabled:!0,phase:"read",fn:function(e){var t=e.state,n=e.name;t.modifiersData[n]=X({reference:t.rects.reference,element:t.rects.popper,strategy:"absolute",placement:t.placement})},data:{}},ne={top:"auto",right:"auto",bottom:"auto",left:"auto"};function re(e){var n,r=e.popper,o=e.popperRect,i=e.placement,a=e.variation,f=e.offsets,c=e.position,p=e.gpuAcceleration,u=e.adaptive,l=e.roundOffsets,h=e.isFixed,v=f.x,y=void 0===v?0:v,g=f.y,b=void 0===g?0:g,w="function"==typeof l?l({x:y,y:b}):{x:y,y:b};y=w.x,b=w.y;var x=f.hasOwnProperty("x"),O=f.hasOwnProperty("y"),j=P,M=D,k=window;if(u){var W=E(r),H="clientHeight",T="clientWidth";if(W===t(r)&&"static"!==m(W=d(r)).position&&"absolute"===c&&(H="scrollHeight",T="scrollWidth"),W=W,i===D||(i===P||i===L)&&a===B)M=A,b-=(h&&W===k&&k.visualViewport?k.visualViewport.height:W[H])-o.height,b*=p?1:-1;if(i===P||(i===D||i===A)&&a===B)j=L,y-=(h&&W===k&&k.visualViewport?k.visualViewport.width:W[T])-o.width,y*=p?1:-1}var R,S=Object.assign({position:c},u&&ne),V=!0===l?function(e){var t=e.x,n=e.y,r=window.devicePixelRatio||1;return{x:s(t*r)/r||0,y:s(n*r)/r||0}}({x:y,y:b}):{x:y,y:b};return y=V.x,b=V.y,p?Object.assign({},S,((R={})[M]=O?"0":"",R[j]=x?"0":"",R.transform=(k.devicePixelRatio||1)<=1?"translate("+y+"px, "+b+"px)":"translate3d("+y+"px, "+b+"px, 0)",R)):Object.assign({},S,((n={})[M]=O?b+"px":"",n[j]=x?y+"px":"",n.transform="",n))}var oe={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(e){var t=e.state,n=e.options,r=n.gpuAcceleration,o=void 0===r||r,i=n.adaptive,a=void 0===i||i,s=n.roundOffsets,f=void 0===s||s,c={placement:C(t.placement),variation:U(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:o,isFixed:"fixed"===t.options.strategy};null!=t.modifiersData.popperOffsets&&(t.styles.popper=Object.assign({},t.styles.popper,re(Object.assign({},c,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:f})))),null!=t.modifiersData.arrow&&(t.styles.arrow=Object.assign({},t.styles.arrow,re(Object.assign({},c,{offsets:t.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:f})))),t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-placement":t.placement})},data:{}};var ie={name:"applyStyles",enabled:!0,phase:"write",fn:function(e){var t=e.state;Object.keys(t.elements).forEach((function(e){var n=t.styles[e]||{},o=t.attributes[e]||{},i=t.elements[e];r(i)&&l(i)&&(Object.assign(i.style,n),Object.keys(o).forEach((function(e){var t=o[e];!1===t?i.removeAttribute(e):i.setAttribute(e,!0===t?"":t)})))}))},effect:function(e){var t=e.state,n={popper:{position:t.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(t.elements.popper.style,n.popper),t.styles=n,t.elements.arrow&&Object.assign(t.elements.arrow.style,n.arrow),function(){Object.keys(t.elements).forEach((function(e){var o=t.elements[e],i=t.attributes[e]||{},a=Object.keys(t.styles.hasOwnProperty(e)?t.styles[e]:n[e]).reduce((function(e,t){return e[t]="",e}),{});r(o)&&l(o)&&(Object.assign(o.style,a),Object.keys(i).forEach((function(e){o.removeAttribute(e)})))}))}},requires:["computeStyles"]};var ae={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.offset,i=void 0===o?[0,0]:o,a=S.reduce((function(e,n){return e[n]=function(e,t,n){var r=C(e),o=[P,D].indexOf(r)>=0?-1:1,i="function"==typeof n?n(Object.assign({},t,{placement:e})):n,a=i[0],s=i[1];return a=a||0,s=(s||0)*o,[P,L].indexOf(r)>=0?{x:s,y:a}:{x:a,y:s}}(n,t.rects,i),e}),{}),s=a[t.placement],f=s.x,c=s.y;null!=t.modifiersData.popperOffsets&&(t.modifiersData.popperOffsets.x+=f,t.modifiersData.popperOffsets.y+=c),t.modifiersData[r]=a}},se={left:"right",right:"left",bottom:"top",top:"bottom"};function fe(e){return e.replace(/left|right|bottom|top/g,(function(e){return se[e]}))}var ce={start:"end",end:"start"};function pe(e){return e.replace(/start|end/g,(function(e){return ce[e]}))}function ue(e,t){void 0===t&&(t={});var n=t,r=n.placement,o=n.boundary,i=n.rootBoundary,a=n.padding,s=n.flipVariations,f=n.allowedAutoPlacements,c=void 0===f?S:f,p=U(r),u=p?s?R:R.filter((function(e){return U(e)===p})):k,l=u.filter((function(e){return c.indexOf(e)>=0}));0===l.length&&(l=u);var d=l.reduce((function(t,n){return t[n]=J(e,{placement:n,boundary:o,rootBoundary:i,padding:a})[C(n)],t}),{});return Object.keys(d).sort((function(e,t){return d[e]-d[t]}))}var le={name:"flip",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name;if(!t.modifiersData[r]._skip){for(var o=n.mainAxis,i=void 0===o||o,a=n.altAxis,s=void 0===a||a,f=n.fallbackPlacements,c=n.padding,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.flipVariations,h=void 0===d||d,m=n.allowedAutoPlacements,v=t.options.placement,y=C(v),g=f||(y===v||!h?[fe(v)]:function(e){if(C(e)===M)return[];var t=fe(e);return[pe(e),t,pe(t)]}(v)),b=[v].concat(g).reduce((function(e,n){return e.concat(C(n)===M?ue(t,{placement:n,boundary:p,rootBoundary:u,padding:c,flipVariations:h,allowedAutoPlacements:m}):n)}),[]),w=t.rects.reference,x=t.rects.popper,O=new Map,j=!0,E=b[0],k=0;k<b.length;k++){var B=b[k],H=C(B),T=U(B)===W,R=[D,A].indexOf(H)>=0,S=R?"width":"height",V=J(t,{placement:B,boundary:p,rootBoundary:u,altBoundary:l,padding:c}),q=R?T?L:P:T?A:D;w[S]>x[S]&&(q=fe(q));var N=fe(q),I=[];if(i&&I.push(V[H]<=0),s&&I.push(V[q]<=0,V[N]<=0),I.every((function(e){return e}))){E=B,j=!1;break}O.set(B,I)}if(j)for(var _=function(e){var t=b.find((function(t){var n=O.get(t);if(n)return n.slice(0,e).every((function(e){return e}))}));if(t)return E=t,"break"},F=h?3:1;F>0;F--){if("break"===_(F))break}t.placement!==E&&(t.modifiersData[r]._skip=!0,t.placement=E,t.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function de(e,t,n){return i(e,a(t,n))}var he={name:"preventOverflow",enabled:!0,phase:"main",fn:function(e){var t=e.state,n=e.options,r=e.name,o=n.mainAxis,s=void 0===o||o,f=n.altAxis,c=void 0!==f&&f,p=n.boundary,u=n.rootBoundary,l=n.altBoundary,d=n.padding,h=n.tether,m=void 0===h||h,v=n.tetherOffset,y=void 0===v?0:v,b=J(t,{boundary:p,rootBoundary:u,padding:d,altBoundary:l}),w=C(t.placement),x=U(t.placement),O=!x,j=z(w),M="x"===j?"y":"x",k=t.modifiersData.popperOffsets,B=t.rects.reference,H=t.rects.popper,T="function"==typeof y?y(Object.assign({},t.rects,{placement:t.placement})):y,R="number"==typeof T?{mainAxis:T,altAxis:T}:Object.assign({mainAxis:0,altAxis:0},T),S=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,V={x:0,y:0};if(k){if(s){var q,N="y"===j?D:P,I="y"===j?A:L,_="y"===j?"height":"width",F=k[j],X=F+b[N],Y=F-b[I],G=m?-H[_]/2:0,K=x===W?B[_]:H[_],Q=x===W?-H[_]:-B[_],Z=t.elements.arrow,$=m&&Z?g(Z):{width:0,height:0},ee=t.modifiersData["arrow#persistent"]?t.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},te=ee[N],ne=ee[I],re=de(0,B[_],$[_]),oe=O?B[_]/2-G-re-te-R.mainAxis:K-re-te-R.mainAxis,ie=O?-B[_]/2+G+re+ne+R.mainAxis:Q+re+ne+R.mainAxis,ae=t.elements.arrow&&E(t.elements.arrow),se=ae?"y"===j?ae.clientTop||0:ae.clientLeft||0:0,fe=null!=(q=null==S?void 0:S[j])?q:0,ce=F+ie-fe,pe=de(m?a(X,F+oe-fe-se):X,F,m?i(Y,ce):Y);k[j]=pe,V[j]=pe-F}if(c){var ue,le="x"===j?D:P,he="x"===j?A:L,me=k[M],ve="y"===M?"height":"width",ye=me+b[le],ge=me-b[he],be=-1!==[D,P].indexOf(w),we=null!=(ue=null==S?void 0:S[M])?ue:0,xe=be?ye:me-B[ve]-H[ve]-we+R.altAxis,Oe=be?me+B[ve]+H[ve]-we-R.altAxis:ge,je=m&&be?function(e,t,n){var r=de(e,t,n);return r>n?n:r}(xe,me,Oe):de(m?xe:ye,me,m?Oe:ge);k[M]=je,V[M]=je-me}t.modifiersData[r]=V}},requiresIfExists:["offset"]};var me={name:"arrow",enabled:!0,phase:"main",fn:function(e){var t,n=e.state,r=e.name,o=e.options,i=n.elements.arrow,a=n.modifiersData.popperOffsets,s=C(n.placement),f=z(s),c=[P,L].indexOf(s)>=0?"height":"width";if(i&&a){var p=function(e,t){return Y("number"!=typeof(e="function"==typeof e?e(Object.assign({},t.rects,{placement:t.placement})):e)?e:G(e,k))}(o.padding,n),u=g(i),l="y"===f?D:P,d="y"===f?A:L,h=n.rects.reference[c]+n.rects.reference[f]-a[f]-n.rects.popper[c],m=a[f]-n.rects.reference[f],v=E(i),y=v?"y"===f?v.clientHeight||0:v.clientWidth||0:0,b=h/2-m/2,w=p[l],x=y-u[c]-p[d],O=y/2-u[c]/2+b,j=de(w,O,x),M=f;n.modifiersData[r]=((t={})[M]=j,t.centerOffset=j-O,t)}},effect:function(e){var t=e.state,n=e.options.element,r=void 0===n?"[data-popper-arrow]":n;null!=r&&("string"!=typeof r||(r=t.elements.popper.querySelector(r)))&&N(t.elements.popper,r)&&(t.elements.arrow=r)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function ve(e,t,n){return void 0===n&&(n={x:0,y:0}),{top:e.top-t.height-n.y,right:e.right-t.width+n.x,bottom:e.bottom-t.height+n.y,left:e.left-t.width-n.x}}function ye(e){return[D,L,A,P].some((function(t){return e[t]>=0}))}var ge={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(e){var t=e.state,n=e.name,r=t.rects.reference,o=t.rects.popper,i=t.modifiersData.preventOverflow,a=J(t,{elementContext:"reference"}),s=J(t,{altBoundary:!0}),f=ve(a,r),c=ve(s,o,i),p=ye(f),u=ye(c);t.modifiersData[n]={referenceClippingOffsets:f,popperEscapeOffsets:c,isReferenceHidden:p,hasPopperEscaped:u},t.attributes.popper=Object.assign({},t.attributes.popper,{"data-popper-reference-hidden":p,"data-popper-escaped":u})}},be=Z({defaultModifiers:[ee,te,oe,ie]}),we=[ee,te,oe,ie,ae,le,he,me,ge],xe=Z({defaultModifiers:we});e.applyStyles=ie,e.arrow=me,e.computeStyles=oe,e.createPopper=xe,e.createPopperLite=be,e.defaultModifiers=we,e.detectOverflow=J,e.eventListeners=ee,e.flip=le,e.hide=ge,e.offset=ae,e.popperGenerator=Z,e.popperOffsets=te,e.preventOverflow=he,Object.defineProperty(e,"__esModule",{value:!0})}));
6
+ //# sourceMappingURL=popper.min.js.map
@@ -0,0 +1,75 @@
1
+ var erHelper = (() => {
2
+ const parseHelper = (arr, parseFn, start) => {
3
+ return arr?.length === 2 ? parseFn(arr[1]) : start;
4
+ };
5
+
6
+ const parseTransform = () => {
7
+ const transform = $("svg[aria-roledescription='er']")[0].style.transform;
8
+ if (!transform)
9
+ return {
10
+ translateX: 0,
11
+ translateY: 0,
12
+ scale: 1.0,
13
+ };
14
+ else
15
+ return {
16
+ translateX: parseHelper(
17
+ /translateX\((.*)px\)/.exec(transform),
18
+ Number.parseInt,
19
+ 0
20
+ ),
21
+ translateY: parseHelper(
22
+ /translateY\((.*)px\)/.exec(transform),
23
+ Number.parseInt,
24
+ 0
25
+ ),
26
+ scale: parseHelper(
27
+ /scale\((.*)\)/.exec(transform),
28
+ Number.parseFloat,
29
+ 1.0
30
+ ),
31
+ };
32
+ };
33
+
34
+ const buildTransform = ({ translateX, translateY, scale } = {}) => {
35
+ $("svg[aria-roledescription='er']").css(
36
+ "transform",
37
+ `translateX(${translateX || 0}px) translateY(${
38
+ translateY || 0
39
+ }px) scale(${scale || 1.0})`
40
+ );
41
+ };
42
+
43
+ return {
44
+ translateY: (val) => {
45
+ const parsed = parseTransform();
46
+ parsed.translateY += val;
47
+ buildTransform(parsed);
48
+ },
49
+ translateX: (val) => {
50
+ const parsed = parseTransform();
51
+ parsed.translateX += val;
52
+ buildTransform(parsed);
53
+ },
54
+ zoom: (val) => {
55
+ const parsed = parseTransform();
56
+ parsed.scale += val;
57
+ buildTransform(parsed);
58
+ },
59
+ reset: () => {
60
+ buildTransform();
61
+ },
62
+ takePicture: () => {
63
+ // TODO as png, so that you can download it via right click
64
+ // right now, you can only print it to pdf
65
+ const svg = $("svg[aria-roledescription='er']")[0];
66
+ const DOMURL = self.URL || self.webkitURL || self;
67
+ const blob = new Blob([new XMLSerializer().serializeToString(svg)], {
68
+ type: "image/svg+xml;charset=utf-8",
69
+ });
70
+ const url = DOMURL.createObjectURL(blob);
71
+ window.open(url);
72
+ DOMURL.revokeObjectURL(url);
73
+ },
74
+ };
75
+ })();
@@ -143,6 +143,13 @@ function apply_showif() {
143
143
  } value="${value}">${label}</option>`;
144
144
  e.append($(html));
145
145
  });
146
+ //TODO: also sort inserted HTML options
147
+ dataOptions.sort((a, b) =>
148
+ (a.text?.toLowerCase?.() || a.text) >
149
+ (b.text?.toLowerCase?.() || b.text)
150
+ ? 1
151
+ : -1
152
+ );
146
153
  element.dispatchEvent(new Event("RefreshSelectOptions"));
147
154
  if (e.hasClass("selectized") && $().selectize) {
148
155
  e.selectize()[0].selectize.clearOptions(true);
@@ -841,6 +848,10 @@ function notifyAlert(note, spin) {
841
848
  </div>`);
842
849
  }
843
850
 
851
+ function emptyAlerts() {
852
+ $("#alerts-area").html("");
853
+ }
854
+
844
855
  function press_store_button(clicked) {
845
856
  const width = $(clicked).width();
846
857
  $(clicked).html('<i class="fas fa-spinner fa-spin"></i>').width(width);
@@ -419,3 +419,48 @@ div.unread-notify {
419
419
  .mt-6 {
420
420
  margin-top: 5rem;
421
421
  }
422
+
423
+ .er-navigation-panel {
424
+ position: absolute;
425
+ bottom: 1em;
426
+ right: 1em;
427
+ display: grid;
428
+ grid-template-columns: 1fr 1fr 1fr;
429
+ gap: 0.2em;
430
+ }
431
+
432
+ .er-screenshot-panel {
433
+ position: absolute;
434
+ top: 1em;
435
+ right: 1em;
436
+ z-index: 1;
437
+ }
438
+
439
+ .er-up {
440
+ grid-column: 2;
441
+ grid-row: 1;
442
+ }
443
+ .er-zoom-in {
444
+ grid-column: 3;
445
+ grid-row: 1;
446
+ }
447
+ .er-left {
448
+ grid-column: 1;
449
+ grid-row: 2;
450
+ }
451
+ .er-reset {
452
+ grid-column: 2;
453
+ grid-row: 2;
454
+ }
455
+ .er-right {
456
+ grid-column: 3;
457
+ grid-row: 2;
458
+ }
459
+ .er-down {
460
+ grid-column: 2;
461
+ grid-row: 3;
462
+ }
463
+ .er-zoom-out {
464
+ grid-column: 3;
465
+ grid-row: 3;
466
+ }
@@ -51,13 +51,13 @@ function removeQueryStringParameter(uri1, key) {
51
51
  uri = uris[0];
52
52
  }
53
53
 
54
- var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
55
- var separator = uri.indexOf("?") !== -1 ? "&" : "?";
54
+ var re = new RegExp("([?&])" + key + "=.*?(&|$)", "gi");
56
55
  if (uri.match(re)) {
57
56
  uri = uri.replace(re, "$1" + "$2");
58
57
  }
59
58
  if (uri[uri.length - 1] === "?" || uri[uri.length - 1] === "&")
60
59
  uri = uri.substring(0, uri.length - 1);
60
+ if (uri.match(re)) return removeQueryStringParameter(uri + hash, key);
61
61
  return uri + hash;
62
62
  }
63
63
 
@@ -561,6 +561,22 @@ function create_new_folder(folder) {
561
561
  });
562
562
  }
563
563
 
564
+ function handle_upload_file_change(form) {
565
+ const url = new URL(window.location);
566
+ const dir = url.searchParams.get("dir");
567
+ if (dir !== null) $("#uploadFolderInpId").val(dir);
568
+ const jqForm = $(form);
569
+ const sortBy = url.searchParams.get("sortBy");
570
+ if (sortBy) {
571
+ jqForm.append(`<input type="hidden" name="sortBy" value="${sortBy}" />`);
572
+ }
573
+ const sortDesc = url.searchParams.get("sortDesc");
574
+ if (sortDesc === "on") {
575
+ jqForm.append('<input type="hidden" name="sortDesc" value="on" />');
576
+ }
577
+ form.submit();
578
+ }
579
+
564
580
  async function fill_formula_btn_click(btn, k) {
565
581
  const formula = decodeURIComponent($(btn).attr("data-formula"));
566
582
  const free_vars = JSON.parse(
package/routes/actions.js CHANGED
@@ -173,9 +173,9 @@ const triggerForm = async (req, trigger) => {
173
173
  sublabel: req.__("Event type which runs the trigger"),
174
174
  attributes: {
175
175
  explainers: {
176
- Often: "Every 5 minutes",
176
+ Often: req.__("Every 5 minutes"),
177
177
  Never:
178
- "Not scheduled but can be run as an action from a button click",
178
+ req.__("Not scheduled but can be run as an action from a button click"),
179
179
  },
180
180
  },
181
181
  },
@@ -358,7 +358,7 @@ router.post(
358
358
  });
359
359
  } else {
360
360
  await Trigger.update(trigger.id, form.values); //{configuration: form.values});
361
- req.flash("success", "Action information saved");
361
+ req.flash("success", req.__("Action information saved"));
362
362
  res.redirect(`/actions/`);
363
363
  }
364
364
  })
@@ -443,13 +443,13 @@ router.get(
443
443
  )
444
444
  )
445
445
  ),
446
- h6({ class: "mt-1" }, "JavaScript code:"),
446
+ h6({ class: "mt-1" }, req.__("JavaScript code:")),
447
447
  div(
448
448
  { class: "mt-1" },
449
449
 
450
450
  pre(
451
451
  { class: "js-code-display" },
452
- code({ id: "blockly_js_output" }, "code here")
452
+ code({ id: "blockly_js_output" }, req.__("code here"))
453
453
  )
454
454
  ),
455
455
  ],
@@ -538,7 +538,7 @@ router.post(
538
538
  res.json({ success: "ok" });
539
539
  return;
540
540
  }
541
- req.flash("success", "Action configuration saved");
541
+ req.flash("success", req.__("Action configuration saved"));
542
542
  res.redirect(
543
543
  req.query.on_done_redirect &&
544
544
  is_relative_url(req.query.on_done_redirect)
package/routes/admin.js CHANGED
@@ -249,6 +249,11 @@ router.get(
249
249
  "/backup",
250
250
  isAdmin,
251
251
  error_catcher(async (req, res) => {
252
+ //
253
+ const aBackupFilePrefixForm = backupFilePrefixForm(req);
254
+ aBackupFilePrefixForm.values.backup_file_prefix =
255
+ getState().getConfig("backup_file_prefix");
256
+ //
252
257
  const backupForm = autoBackupForm(req);
253
258
  backupForm.values.auto_backup_frequency = getState().getConfig(
254
259
  "auto_backup_frequency"
@@ -262,11 +267,13 @@ router.get(
262
267
  backupForm.values.auto_backup_expire_days = getState().getConfig(
263
268
  "auto_backup_expire_days"
264
269
  );
270
+ //
265
271
  const aSnapshotForm = snapshotForm(req);
266
272
  aSnapshotForm.values.snapshots_enabled =
267
273
  getState().getConfig("snapshots_enabled");
274
+ //
268
275
  const isRoot = db.getTenantSchema() === db.connectObj.default_schema;
269
-
276
+ //
270
277
  send_admin_page({
271
278
  res,
272
279
  req,
@@ -367,6 +374,12 @@ router.get(
367
374
  )
368
375
  ),
369
376
  },
377
+ {
378
+ type: "card",
379
+ title: req.__("Backup settings"),
380
+ titleAjaxIndicator: true,
381
+ contents: div(renderForm(aBackupFilePrefixForm, req.csrfToken())),
382
+ },
370
383
  ],
371
384
  },
372
385
  });
@@ -388,10 +401,17 @@ router.get(
388
401
  return;
389
402
  }
390
403
  const auto_backup_directory = getState().getConfig("auto_backup_directory");
391
- const fileNms = await fs.promises.readdir(auto_backup_directory);
404
+
405
+ const backup_file_prefix = getState().getConfig("backup_file_prefix");
406
+
407
+ const fileNms = auto_backup_directory
408
+ ? await fs.promises.readdir(auto_backup_directory)
409
+ : [];
410
+
392
411
  const backupFiles = fileNms.filter(
393
- (fnm) => fnm.startsWith("sc-backup") && fnm.endsWith(".zip")
412
+ (fnm) => fnm.startsWith(backup_file_prefix) && fnm.endsWith(".zip")
394
413
  );
414
+
395
415
  send_admin_page({
396
416
  res,
397
417
  req,
@@ -402,20 +422,22 @@ router.get(
402
422
  type: "card",
403
423
  title: req.__("Download automated backup"),
404
424
  contents: div(
405
- ul(
406
- backupFiles.map((fnm) =>
407
- li(
408
- a(
409
- {
410
- href: `/admin/auto-backup-download/${encodeURIComponent(
425
+ backupFiles.length > 0
426
+ ? ul(
427
+ backupFiles.map((fnm) =>
428
+ li(
429
+ a(
430
+ {
431
+ href: `/admin/auto-backup-download/${encodeURIComponent(
432
+ fnm
433
+ )}`,
434
+ },
411
435
  fnm
412
- )}`,
413
- },
414
- fnm
436
+ )
437
+ )
415
438
  )
416
439
  )
417
- )
418
- )
440
+ : p(req.__("No files"))
419
441
  ),
420
442
  },
421
443
  {
@@ -465,23 +487,25 @@ router.get(
465
487
  type: "card",
466
488
  title: req.__("Download snapshots"),
467
489
  contents: div(
468
- ul(
469
- snaps.map((snap) =>
470
- li(
471
- a(
472
- {
473
- href: `/admin/snapshot-download/${encodeURIComponent(
474
- snap.id
475
- )}`,
476
- target: "_blank",
477
- },
478
- `${localeDateTime(snap.created)} (${moment(
479
- snap.created
480
- ).fromNow()})`
490
+ snaps.length > 0
491
+ ? ul(
492
+ snaps.map((snap) =>
493
+ li(
494
+ a(
495
+ {
496
+ href: `/admin/snapshot-download/${encodeURIComponent(
497
+ snap.id
498
+ )}`,
499
+ target: "_blank",
500
+ },
501
+ `${localeDateTime(snap.created)} (${moment(
502
+ snap.created
503
+ ).fromNow()})`
504
+ )
505
+ )
481
506
  )
482
507
  )
483
- )
484
- )
508
+ : p(req.__("No files"))
485
509
  ),
486
510
  },
487
511
  ],
@@ -588,9 +612,10 @@ router.get(
588
612
  error_catcher(async (req, res) => {
589
613
  const { filename } = req.params;
590
614
  const isRoot = db.getTenantSchema() === db.connectObj.default_schema;
615
+ const backup_file_prefix = getState().getConfig("backup_file_prefix");
591
616
  if (
592
617
  !isRoot ||
593
- !(filename.startsWith("sc-backup") && filename.endsWith(".zip"))
618
+ !(filename.startsWith(backup_file_prefix) && filename.endsWith(".zip"))
594
619
  ) {
595
620
  res.redirect("/admin/backup");
596
621
  return;
@@ -600,6 +625,27 @@ router.get(
600
625
  })
601
626
  );
602
627
 
628
+ /**
629
+ * Set Backup File Prefix Form
630
+ * @param req
631
+ * @returns {Form}
632
+ */
633
+ const backupFilePrefixForm = (req) =>
634
+ new Form({
635
+ action: "/admin/set-backup-prefix",
636
+ onChange: `saveAndContinue(this);`,
637
+ noSubmitButton: true,
638
+ fields: [
639
+ {
640
+ type: "String",
641
+ label: req.__("Backup file prefix"),
642
+ name: "backup_file_prefix",
643
+ sublabel: req.__("Backup file prefix"),
644
+ default: "sc-backup-",
645
+ },
646
+ ],
647
+ });
648
+
603
649
  /**
604
650
  * Auto backup Form
605
651
  * @param {object} req
@@ -638,9 +684,10 @@ const autoBackupForm = (req) =>
638
684
  type: "String",
639
685
  label: req.__("Directory"),
640
686
  name: "auto_backup_directory",
687
+ sublabel: req.__("Directory for backup files"),
641
688
  showIf: {
642
689
  auto_backup_frequency: ["Daily", "Weekly"],
643
- auto_backup_destination: "Local directory",
690
+ //auto_backup_destination: "Local directory",
644
691
  },
645
692
  },
646
693
  {
@@ -658,6 +705,11 @@ const autoBackupForm = (req) =>
658
705
  ],
659
706
  });
660
707
 
708
+ /**
709
+ * Snapshot Form
710
+ * @param req
711
+ * @returns {Form}
712
+ */
661
713
  const snapshotForm = (req) =>
662
714
  new Form({
663
715
  action: "/admin/set-snapshot",
@@ -682,6 +734,9 @@ const snapshotForm = (req) =>
682
734
  },
683
735
  ],
684
736
  });
737
+ /**
738
+ * Do Set snapshot
739
+ */
685
740
  router.post(
686
741
  "/set-snapshot",
687
742
  isAdmin,
@@ -697,6 +752,38 @@ router.post(
697
752
  } else res.json({ success: "ok" });
698
753
  })
699
754
  );
755
+ /**
756
+ * Do Set Backup Prefix
757
+ */
758
+ router.post(
759
+ "/set-backup-prefix",
760
+ isAdmin,
761
+ error_catcher(async (req, res) => {
762
+ const form = await backupFilePrefixForm(req);
763
+ form.validate(req.body);
764
+ if (form.hasErrors) {
765
+ send_admin_page({
766
+ res,
767
+ req,
768
+ active_sub: "Backup",
769
+ contents: {
770
+ type: "card",
771
+ title: req.__("Backup settings"),
772
+ contents: [renderForm(form, req.csrfToken())],
773
+ },
774
+ });
775
+ } else {
776
+ await save_config_from_form(form);
777
+ if (!req.xhr) {
778
+ req.flash("success", req.__("Backup settings updated"));
779
+ res.redirect("/admin/backup");
780
+ } else res.json({ success: "ok" });
781
+ }
782
+ })
783
+ );
784
+ /**
785
+ * Do Set auto backup
786
+ */
700
787
  router.post(
701
788
  "/set-auto-backup",
702
789
  isAdmin,
@@ -723,6 +810,9 @@ router.post(
723
810
  }
724
811
  })
725
812
  );
813
+ /**
814
+ * Do Auto backup now
815
+ */
726
816
  router.post(
727
817
  "/auto-backup-now",
728
818
  isAdmin,
@@ -737,7 +827,9 @@ router.post(
737
827
  res.json({ reload_page: true });
738
828
  })
739
829
  );
740
-
830
+ /**
831
+ * Do Snapshot now
832
+ */
741
833
  router.post(
742
834
  "/snapshot-now",
743
835
  isAdmin,
@@ -755,6 +847,7 @@ router.post(
755
847
  );
756
848
 
757
849
  /**
850
+ * Show System page
758
851
  * @name get/system
759
852
  * @function
760
853
  * @memberof module:routes/admin~routes/adminRouter
@@ -948,6 +1041,7 @@ router.get(
948
1041
  );
949
1042
 
950
1043
  /**
1044
+ * Do Restart
951
1045
  * @name post/restart
952
1046
  * @function
953
1047
  * @memberof module:routes/admin~routes/adminRouter
@@ -972,6 +1066,7 @@ router.post(
972
1066
  );
973
1067
 
974
1068
  /**
1069
+ * Do Upgrade
975
1070
  * @name post/upgrade
976
1071
  * @function
977
1072
  * @memberof module:routes/admin~routes/adminRouter
@@ -1013,7 +1108,7 @@ router.post(
1013
1108
  })
1014
1109
  );
1015
1110
  /**
1016
- * /check-for-updates
1111
+ * Do Check for Update
1017
1112
  */
1018
1113
  router.post(
1019
1114
  "/check-for-upgrade",
@@ -1025,6 +1120,7 @@ router.post(
1025
1120
  })
1026
1121
  );
1027
1122
  /**
1123
+ * Do Manual Backup
1028
1124
  * @name post/backup
1029
1125
  * @function
1030
1126
  * @memberof module:routes/admin~routes/adminRouter
@@ -1045,6 +1141,7 @@ router.post(
1045
1141
  );
1046
1142
 
1047
1143
  /**
1144
+ * Do Restore from Backup
1048
1145
  * @name post/restore
1049
1146
  * @function
1050
1147
  * @memberof module:routes/admin~routes/adminRouter
@@ -1143,6 +1240,7 @@ const clearAllForm = (req) =>
1143
1240
  });
1144
1241
 
1145
1242
  /**
1243
+ * Do Enable letsencrypt
1146
1244
  * @name post/enable-letsencrypt
1147
1245
  * @function
1148
1246
  * @memberof module:routes/admin~routes/adminRouter
@@ -1222,6 +1320,7 @@ router.post(
1222
1320
  );
1223
1321
 
1224
1322
  /**
1323
+ * Do Clear All
1225
1324
  * @name get/clear-all
1226
1325
  * @function
1227
1326
  * @memberof module:routes/admin~routes/adminRouter
@@ -1250,7 +1349,7 @@ router.get(
1250
1349
  })
1251
1350
  );
1252
1351
  /**
1253
- * /configuration-check
1352
+ * Do Configuration Check
1254
1353
  */
1255
1354
  router.get(
1256
1355
  "/configuration-check",
@@ -1337,7 +1436,6 @@ router.get(
1337
1436
  });
1338
1437
  })
1339
1438
  );
1340
-
1341
1439
  const buildDialogScript = () => {
1342
1440
  return `<script>
1343
1441
  function swapEntryInputs(activeTab, activeInput, disabledTab, disabledInput) {
@@ -1760,7 +1858,9 @@ router.get(
1760
1858
  });
1761
1859
  })
1762
1860
  );
1763
-
1861
+ /**
1862
+ * Do Build Mobile App
1863
+ */
1764
1864
  router.post(
1765
1865
  "/build-mobile-app",
1766
1866
  isAdmin,
@@ -1788,7 +1888,7 @@ router.post(
1788
1888
  error: req.__("Only the android build supports docker."),
1789
1889
  });
1790
1890
  }
1791
- if (!serverURL || serverURL.length == 0) {
1891
+ if (!serverURL || serverURL.length === 0) {
1792
1892
  serverURL = getState().getConfig("base_url") || "";
1793
1893
  }
1794
1894
  if (!serverURL.startsWith("http")) {
@@ -1888,8 +1988,7 @@ router.post(
1888
1988
  );
1889
1989
 
1890
1990
  /**
1891
- * Clear all
1892
- * @name post/clear-all
1991
+ * Do Clear All
1893
1992
  * @function
1894
1993
  * @memberof module:routes/admin~routes/adminRouter
1895
1994
  */
@@ -2012,7 +2111,9 @@ router.post(
2012
2111
  }
2013
2112
  })
2014
2113
  );
2015
-
2114
+ /**
2115
+ * Dev / Admin
2116
+ */
2016
2117
  admin_config_route({
2017
2118
  router,
2018
2119
  path: "/dev",
@@ -2051,7 +2152,9 @@ admin_config_route({
2051
2152
  });
2052
2153
  },
2053
2154
  });
2054
-
2155
+ /**
2156
+ * Notifications
2157
+ */
2055
2158
  admin_config_route({
2056
2159
  router,
2057
2160
  path: "/notifications",
@@ -44,7 +44,7 @@ const listClass = (tagId, showList) =>
44
44
 
45
45
  const tablesList = async (tables, req, { tagId, domId, showList } = {}) => {
46
46
  const roles = await User.get_roles();
47
- const getRole = (rid) => roles.find((r) => r.id === rid).role;
47
+ const getRole = (rid) => roles.find((r) => r.id === rid)?.role || "?";
48
48
  return tables.length > 0
49
49
  ? mkTable(
50
50
  [