@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.
- package/auth/admin.js +3 -3
- package/locales/en.json +17 -1
- package/locales/no.json +57 -57
- package/locales/ru.json +49 -8
- package/markup/admin.js +1 -1
- package/markup/forms.js +8 -2
- package/package.json +8 -8
- package/public/cytoscape-popper.min.js +1 -0
- package/public/cytoscape.min.js +32 -0
- package/public/mermaid.min.js +1630 -0
- package/public/popper.min.js +6 -0
- package/public/relationship_diagram_utils.js +75 -0
- package/public/saltcorn-common.js +11 -0
- package/public/saltcorn.css +45 -0
- package/public/saltcorn.js +18 -2
- package/routes/actions.js +6 -6
- package/routes/admin.js +144 -41
- package/routes/common_lists.js +1 -1
- package/routes/diagram.js +4 -6
- package/routes/fields.js +3 -3
- package/routes/files.js +21 -21
- package/routes/list.js +1 -9
- package/routes/notifications.js +1 -1
- package/routes/plugins.js +4 -3
- package/routes/tables.js +127 -48
- package/tests/clientjs.test.js +3 -0
- package/tests/files.test.js +123 -2
|
@@ -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);
|
package/public/saltcorn.css
CHANGED
|
@@ -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
|
+
}
|
package/public/saltcorn.js
CHANGED
|
@@ -51,13 +51,13 @@ function removeQueryStringParameter(uri1, key) {
|
|
|
51
51
|
uri = uris[0];
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
var re = new RegExp("([?&])" + key + "=.*?(&|$)", "
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
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
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
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(
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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",
|
package/routes/common_lists.js
CHANGED
|
@@ -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)
|
|
47
|
+
const getRole = (rid) => roles.find((r) => r.id === rid)?.role || "?";
|
|
48
48
|
return tables.length > 0
|
|
49
49
|
? mkTable(
|
|
50
50
|
[
|