@opengis/admin 0.1.65 → 0.1.67

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/dist/style.css CHANGED
@@ -1 +1 @@
1
- .vs-popover>div{text-align:start}.map-popup__vertical[data-v-3f5a9aff]{overflow:auto;max-height:300px}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar{width:6px;height:6px;background-color:#f5f5f5}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar-thumb{border-radius:5px;background-color:#dedede}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar-track{background-color:#f5f5f5}.map__popup-body[data-v-3f5a9aff]{table-layout:fixed;width:100%}.map__popup-body-item[data-v-3f5a9aff]:not(:last-child){border-bottom:1px solid #eeeeee}.map__popup-body-item td[data-v-3f5a9aff]{width:50%;word-wrap:break-word;text-align:start}.map__popup-body-item td[data-v-3f5a9aff]:first-child{font-weight:600}.popup-image[data-v-deb51e0a]{max-width:100%;max-height:220px;margin-bottom:10px;-o-object-fit:contain;object-fit:contain}.maplibregl-ctrl-bottom-right,.maplibregl-popup-close-button{display:none}.widget-file .vs-button{background-color:#2563eb;color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:600}.ui-dialog__modal div.flex.justify-between.items-center.py-3.px-4.border-b{border-bottom-width:0px;--tw-text-opacity: 1;color:#1f2937;font-weight:500;font-size:1.125rem;line-height:1.75rem;padding-bottom:0rem}.ui-dialog__modal .ui-dialog__content .p-4{padding-top:0rem}.widget-images__item-desc span:first-child:after{content:"";width:2px;height:2px;border-radius:50%;display:flex;align-items:center;background:#676a6c;margin:0 5px}.disabled{cursor:not-allowed!important}.item__text-content,.item{transition:all .5s cubic-bezier(.4,0,.2,1)}.item:hover .item__text-content{opacity:.8}.vs-widget-images .vs-button{background-color:#2563eb;color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:600}.ProseMirror-focused{outline:none}.editor-toolbar{background-color:#f9fafb}.editor-content{min-height:160px}button{transition:background-color .2s ease;outline:none}button:focus{outline:none}.editor-content ul{margin-left:20px}.editor-content ul>li{list-style:disc}.editor-content ol{list-style-type:decimal;margin-left:20px}.editor-content pre{background-color:#e7e7e7;border-radius:4px;padding:0 2px}.mention-popup{background-color:#fafafa;padding:10px;border-radius:10px;box-shadow:0 4px 6px #0000001a;max-width:200px;overflow-y:auto;width:auto}.mention{padding:2px 4px;border-radius:8px;background-color:#e7e7e7}.mention-option{padding:5px 10px;cursor:pointer;transition:background-color .2s;border-radius:8px}.mention-option:hover{background-color:#f0f0f0}.border-top:not(:first-child){--tw-border-opacity: 1;border-color:#e5e7eb;border-top-width:1px}.widget-comment-form .vs-button{padding:.625rem 1rem;font-size:.75rem;line-height:1rem;font-weight:500}.widget-comment-form .vs-button:focus{border:transparent;--tw-ring-opacity: 1;--tw-ring-color: rgb(191 219 254);--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 rgba(0, 0, 0, 0))}li[data-v-87c0b333]{cursor:move}.grid[data-v-274c6efe]{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:1rem}.admin-wrapper[data-v-2f422765]{display:flex;height:100vh;align-items:start}.vs-popover__content>div{padding:.25rem}.hs-accordion-heading[data-v-4139bc00]{display:flex;align-items:center}.hs-accordion-toggle[data-v-4139bc00]{cursor:pointer}.hs-accordion-content[data-v-4139bc00]{padding-left:1.5rem}.table-info-card .editor-container{width:330px}.slide-fade-enter-active[data-v-9b255a47],.slide-fade-leave-active[data-v-9b255a47]{transition:all .3s linear}.slide-fade-enter-from[data-v-9b255a47],.slide-fade-leave-to[data-v-9b255a47]{transform:translate(20px);opacity:0}
1
+ .vs-popover>div{text-align:start}.map-popup__vertical[data-v-3f5a9aff]{overflow:auto;max-height:300px}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar{width:6px;height:6px;background-color:#f5f5f5}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar-thumb{border-radius:5px;background-color:#dedede}.map-popup__vertical[data-v-3f5a9aff]::-webkit-scrollbar-track{background-color:#f5f5f5}.map__popup-body[data-v-3f5a9aff]{table-layout:fixed;width:100%}.map__popup-body-item[data-v-3f5a9aff]:not(:last-child){border-bottom:1px solid #eeeeee}.map__popup-body-item td[data-v-3f5a9aff]{width:50%;word-wrap:break-word;text-align:start}.map__popup-body-item td[data-v-3f5a9aff]:first-child{font-weight:600}.popup-image[data-v-deb51e0a]{max-width:100%;max-height:220px;margin-bottom:10px;-o-object-fit:contain;object-fit:contain}.maplibregl-ctrl-bottom-right,.maplibregl-popup-close-button{display:none}.widget-file .vs-button{background-color:#2563eb;color:#fff;font-size:.875rem;line-height:1.25rem;font-weight:600}.ui-dialog__modal div.flex.justify-between.items-center.py-3.px-4.border-b{border-bottom-width:0px;--tw-text-opacity: 1;color:#1f2937;font-weight:500;font-size:1.125rem;line-height:1.75rem;padding-bottom:0rem}.ui-dialog__modal .ui-dialog__content .p-4{padding-top:0rem}:root{--f-spinner-width: 36px;--f-spinner-height: 36px;--f-spinner-color-1: rgba(0, 0, 0, .1);--f-spinner-color-2: rgba(17, 24, 28, .8);--f-spinner-stroke: 2.75}.f-spinner{margin:auto;padding:0;width:var(--f-spinner-width);height:var(--f-spinner-height)}.f-spinner svg{width:100%;height:100%;vertical-align:top;animation:f-spinner-rotate 2s linear infinite}.f-spinner svg *{stroke-width:var(--f-spinner-stroke);fill:none}.f-spinner svg *:first-child{stroke:var(--f-spinner-color-1)}.f-spinner svg *:last-child{stroke:var(--f-spinner-color-2);animation:f-spinner-dash 2s ease-in-out infinite}@keyframes f-spinner-rotate{to{transform:rotate(360deg)}}@keyframes f-spinner-dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.f-throwOutUp{animation:var(--f-throw-out-duration, .175s) ease-out both f-throwOutUp}.f-throwOutDown{animation:var(--f-throw-out-duration, .175s) ease-out both f-throwOutDown}@keyframes f-throwOutUp{to{transform:translate3d(0,calc(var(--f-throw-out-distance, 150px) * -1),0);opacity:0}}@keyframes f-throwOutDown{to{transform:translate3d(0,var(--f-throw-out-distance, 150px),0);opacity:0}}.f-zoomInUp{animation:var(--f-transition-duration, .2s) ease .1s both f-zoomInUp}.f-zoomOutDown{animation:var(--f-transition-duration, .2s) ease both f-zoomOutDown}@keyframes f-zoomInUp{0%{transform:scale(.975) translate3d(0,16px,0);opacity:0}to{transform:scale(1) translateZ(0);opacity:1}}@keyframes f-zoomOutDown{to{transform:scale(.975) translate3d(0,16px,0);opacity:0}}.f-fadeIn{animation:var(--f-transition-duration, .2s) var(--f-transition-easing, ease) var(--f-transition-delay, 0s) both f-fadeIn;z-index:2}.f-fadeOut{animation:var(--f-transition-duration, .2s) var(--f-transition-easing, ease) var(--f-transition-delay, 0s) both f-fadeOut;z-index:1}@keyframes f-fadeIn{0%{opacity:0}to{opacity:1}}@keyframes f-fadeOut{to{opacity:0}}.f-fadeFastIn{animation:var(--f-transition-duration, .2s) ease-out both f-fadeFastIn;z-index:2}.f-fadeFastOut{animation:var(--f-transition-duration, .1s) ease-out both f-fadeFastOut;z-index:2}@keyframes f-fadeFastIn{0%{opacity:.75}to{opacity:1}}@keyframes f-fadeFastOut{to{opacity:0}}.f-fadeSlowIn{animation:var(--f-transition-duration, .5s) ease both f-fadeSlowIn;z-index:2}.f-fadeSlowOut{animation:var(--f-transition-duration, .5s) ease both f-fadeSlowOut;z-index:1}@keyframes f-fadeSlowIn{0%{opacity:0}to{opacity:1}}@keyframes f-fadeSlowOut{to{opacity:0}}.f-crossfadeIn{animation:var(--f-transition-duration, .2s) ease-out both f-crossfadeIn;z-index:2}.f-crossfadeOut{animation:calc(var(--f-transition-duration, .2s)*.5) linear .1s both f-crossfadeOut;z-index:1}@keyframes f-crossfadeIn{0%{opacity:0}to{opacity:1}}@keyframes f-crossfadeOut{to{opacity:0}}.f-slideIn.from-next{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-slideInNext}.f-slideIn.from-prev{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-slideInPrev}.f-slideOut.to-next{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-slideOutNext}.f-slideOut.to-prev{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-slideOutPrev}@keyframes f-slideInPrev{0%{transform:translate(100%)}to{transform:translateZ(0)}}@keyframes f-slideInNext{0%{transform:translate(-100%)}to{transform:translateZ(0)}}@keyframes f-slideOutNext{to{transform:translate(-100%)}}@keyframes f-slideOutPrev{to{transform:translate(100%)}}.f-classicIn.from-next{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-classicInNext;z-index:2}.f-classicIn.from-prev{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-classicInPrev;z-index:2}.f-classicOut.to-next{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-classicOutNext;z-index:1}.f-classicOut.to-prev{animation:var(--f-transition-duration, .85s) cubic-bezier(.16,1,.3,1) f-classicOutPrev;z-index:1}@keyframes f-classicInNext{0%{transform:translate(-75px);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes f-classicInPrev{0%{transform:translate(75px);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes f-classicOutNext{to{transform:translate(-75px);opacity:0}}@keyframes f-classicOutPrev{to{transform:translate(75px);opacity:0}}:root{--f-button-width: 40px;--f-button-height: 40px;--f-button-border: 0;--f-button-border-radius: 0;--f-button-color: #374151;--f-button-bg: #f8f8f8;--f-button-hover-bg: #e0e0e0;--f-button-active-bg: #d0d0d0;--f-button-shadow: none;--f-button-transition: all .15s ease;--f-button-transform: none;--f-button-svg-width: 20px;--f-button-svg-height: 20px;--f-button-svg-stroke-width: 1.5;--f-button-svg-fill: none;--f-button-svg-filter: none;--f-button-svg-disabled-opacity: .65}.f-button{display:flex;justify-content:center;align-items:center;box-sizing:content-box;position:relative;margin:0;padding:0;width:var(--f-button-width);height:var(--f-button-height);border:var(--f-button-border);border-radius:var(--f-button-border-radius);color:var(--f-button-color);background:var(--f-button-bg);box-shadow:var(--f-button-shadow);pointer-events:all;cursor:pointer;transition:var(--f-button-transition)}@media (hover: hover){.f-button:hover:not([disabled]){color:var(--f-button-hover-color);background-color:var(--f-button-hover-bg)}}.f-button:active:not([disabled]){background-color:var(--f-button-active-bg)}.f-button:focus:not(:focus-visible){outline:none}.f-button:focus-visible{outline:none;box-shadow:inset 0 0 0 var(--f-button-outline, 2px) var(--f-button-outline-color, var(--f-button-color))}.f-button svg{width:var(--f-button-svg-width);height:var(--f-button-svg-height);fill:var(--f-button-svg-fill);stroke:currentColor;stroke-width:var(--f-button-svg-stroke-width);stroke-linecap:round;stroke-linejoin:round;transition:opacity .15s ease;transform:var(--f-button-transform);filter:var(--f-button-svg-filter);pointer-events:none}.f-button[disabled]{cursor:default}.f-button[disabled] svg{opacity:var(--f-button-svg-disabled-opacity)}.f-carousel__nav .f-button.is-prev,.f-carousel__nav .f-button.is-next,.fancybox__nav .f-button.is-prev,.fancybox__nav .f-button.is-next{position:absolute;z-index:1}.is-horizontal .f-carousel__nav .f-button.is-prev,.is-horizontal .f-carousel__nav .f-button.is-next,.is-horizontal .fancybox__nav .f-button.is-prev,.is-horizontal .fancybox__nav .f-button.is-next{top:50%;transform:translateY(-50%)}.is-horizontal .f-carousel__nav .f-button.is-prev,.is-horizontal .fancybox__nav .f-button.is-prev{left:var(--f-button-prev-pos)}.is-horizontal .f-carousel__nav .f-button.is-next,.is-horizontal .fancybox__nav .f-button.is-next{right:var(--f-button-next-pos)}.is-horizontal.is-rtl .f-carousel__nav .f-button.is-prev,.is-horizontal.is-rtl .fancybox__nav .f-button.is-prev{left:auto;right:var(--f-button-next-pos)}.is-horizontal.is-rtl .f-carousel__nav .f-button.is-next,.is-horizontal.is-rtl .fancybox__nav .f-button.is-next{right:auto;left:var(--f-button-prev-pos)}.is-vertical .f-carousel__nav .f-button.is-prev,.is-vertical .f-carousel__nav .f-button.is-next,.is-vertical .fancybox__nav .f-button.is-prev,.is-vertical .fancybox__nav .f-button.is-next{top:auto;left:50%;transform:translate(-50%)}.is-vertical .f-carousel__nav .f-button.is-prev,.is-vertical .fancybox__nav .f-button.is-prev{top:var(--f-button-next-pos)}.is-vertical .f-carousel__nav .f-button.is-next,.is-vertical .fancybox__nav .f-button.is-next{bottom:var(--f-button-next-pos)}.is-vertical .f-carousel__nav .f-button.is-prev svg,.is-vertical .f-carousel__nav .f-button.is-next svg,.is-vertical .fancybox__nav .f-button.is-prev svg,.is-vertical .fancybox__nav .f-button.is-next svg{transform:rotate(90deg)}.f-carousel__nav .f-button:disabled,.fancybox__nav .f-button:disabled{pointer-events:none}html.with-fancybox{width:auto;overflow:visible;scroll-behavior:auto}html.with-fancybox body{touch-action:none}html.with-fancybox body.hide-scrollbar{width:auto;margin-right:calc(var(--fancybox-body-margin, 0px) + var(--fancybox-scrollbar-compensate, 0px));overflow:hidden!important;overscroll-behavior-y:none}.fancybox__container{--fancybox-color: #dbdbdb;--fancybox-hover-color: #fff;--fancybox-bg: rgba(24, 24, 27, .98);--fancybox-slide-gap: 10px;--f-spinner-width: 50px;--f-spinner-height: 50px;--f-spinner-color-1: rgba(255, 255, 255, .1);--f-spinner-color-2: #bbb;--f-spinner-stroke: 3.65;position:fixed;top:0;left:0;bottom:0;right:0;direction:ltr;display:flex;flex-direction:column;box-sizing:border-box;margin:0;padding:0;color:#f8f8f8;-webkit-tap-highlight-color:rgba(0,0,0,0);overflow:visible;z-index:var(--fancybox-zIndex, 1050);outline:none;transform-origin:top left;-webkit-text-size-adjust:100%;-moz-text-size-adjust:none;text-size-adjust:100%;overscroll-behavior-y:contain}.fancybox__container *,.fancybox__container *:before,.fancybox__container *:after{box-sizing:inherit}.fancybox__container::backdrop{background-color:#0000}.fancybox__backdrop{position:fixed;top:0;left:0;bottom:0;right:0;z-index:-1;background:var(--fancybox-bg);opacity:var(--fancybox-opacity, 1);will-change:opacity}.fancybox__carousel{position:relative;box-sizing:border-box;flex:1;min-height:0;z-index:10;overflow-y:visible;overflow-x:clip}.fancybox__viewport{width:100%;height:100%}.fancybox__viewport.is-draggable{cursor:move;cursor:grab}.fancybox__viewport.is-dragging{cursor:move;cursor:grabbing}.fancybox__track{display:flex;margin:0 auto;height:100%}.fancybox__slide{flex:0 0 auto;position:relative;display:flex;flex-direction:column;align-items:center;width:100%;height:100%;margin:0 var(--fancybox-slide-gap) 0 0;padding:4px;overflow:auto;overscroll-behavior:contain;transform:translateZ(0);backface-visibility:hidden}.fancybox__container:not(.is-compact) .fancybox__slide.has-close-btn{padding-top:40px}.fancybox__slide.has-iframe,.fancybox__slide.has-video,.fancybox__slide.has-html5video,.fancybox__slide.has-image{overflow:hidden}.fancybox__slide.has-image.is-animating,.fancybox__slide.has-image.is-selected{overflow:visible}.fancybox__slide:before,.fancybox__slide:after{content:"";flex:0 0 0;margin:auto}.fancybox__backdrop:empty,.fancybox__viewport:empty,.fancybox__track:empty,.fancybox__slide:empty{display:block}.fancybox__content{align-self:center;display:flex;flex-direction:column;position:relative;margin:0;padding:2rem;max-width:100%;color:var(--fancybox-content-color, #374151);background:var(--fancybox-content-bg, #fff);cursor:default;border-radius:0;z-index:20}.is-loading .fancybox__content{opacity:0}.is-draggable .fancybox__content{cursor:move;cursor:grab}.can-zoom_in .fancybox__content{cursor:zoom-in}.can-zoom_out .fancybox__content{cursor:zoom-out}.is-dragging .fancybox__content{cursor:move;cursor:grabbing}.fancybox__content [data-selectable],.fancybox__content [contenteditable]{cursor:auto}.fancybox__slide.has-image>.fancybox__content{padding:0;background:#0000;min-height:1px;background-repeat:no-repeat;background-size:contain;background-position:center center;transition:none;transform:translateZ(0);backface-visibility:hidden}.fancybox__slide.has-image>.fancybox__content>picture>img{width:100%;height:auto;max-height:100%}.is-animating .fancybox__content,.is-dragging .fancybox__content{will-change:transform,width,height}.fancybox-image{margin:auto;display:block;width:100%;height:100%;min-height:0;-o-object-fit:contain;object-fit:contain;-webkit-user-select:none;-moz-user-select:none;user-select:none;filter:blur(0px)}.fancybox__caption{align-self:center;max-width:100%;flex-shrink:0;margin:0;padding:14px 0 4px;overflow-wrap:anywhere;line-height:1.375;color:var(--fancybox-color, currentColor);opacity:var(--fancybox-opacity, 1);cursor:auto;visibility:visible}.is-loading .fancybox__caption,.is-closing .fancybox__caption{opacity:0;visibility:hidden}.is-compact .fancybox__caption{padding-bottom:0}.f-button.is-close-btn{--f-button-svg-stroke-width: 2;position:absolute;top:0;right:8px;z-index:40}.fancybox__content>.f-button.is-close-btn{--f-button-width: 34px;--f-button-height: 34px;--f-button-border-radius: 4px;--f-button-color: var(--fancybox-color, #fff);--f-button-hover-color: var(--fancybox-color, #fff);--f-button-bg: transparent;--f-button-hover-bg: transparent;--f-button-active-bg: transparent;--f-button-svg-width: 22px;--f-button-svg-height: 22px;position:absolute;top:-38px;right:0;opacity:.75}.is-loading .fancybox__content>.f-button.is-close-btn{visibility:hidden}.is-zooming-out .fancybox__content>.f-button.is-close-btn{visibility:hidden}.fancybox__content>.f-button.is-close-btn:hover{opacity:1}.fancybox__footer{padding:0;margin:0;position:relative}.fancybox__footer .fancybox__caption{width:100%;padding:24px;opacity:var(--fancybox-opacity, 1);transition:all .25s ease}.is-compact .fancybox__footer{position:absolute;bottom:0;left:0;right:0;z-index:20;background:#18181b80}.is-compact .fancybox__footer .fancybox__caption{padding:12px}.is-compact .fancybox__content>.f-button.is-close-btn{--f-button-border-radius: 50%;--f-button-color: #fff;--f-button-hover-color: #fff;--f-button-outline-color: #000;--f-button-bg: rgba(0, 0, 0, .6);--f-button-active-bg: rgba(0, 0, 0, .6);--f-button-hover-bg: rgba(0, 0, 0, .6);--f-button-svg-width: 18px;--f-button-svg-height: 18px;--f-button-svg-filter: none;top:5px;right:5px}.fancybox__nav{--f-button-width: 50px;--f-button-height: 50px;--f-button-border: 0;--f-button-border-radius: 50%;--f-button-color: var(--fancybox-color);--f-button-hover-color: var(--fancybox-hover-color);--f-button-bg: transparent;--f-button-hover-bg: rgba(24, 24, 27, .3);--f-button-active-bg: rgba(24, 24, 27, .5);--f-button-shadow: none;--f-button-transition: all .15s ease;--f-button-transform: none;--f-button-svg-width: 26px;--f-button-svg-height: 26px;--f-button-svg-stroke-width: 2.5;--f-button-svg-fill: none;--f-button-svg-filter: drop-shadow(1px 1px 1px rgba(24, 24, 27, .5));--f-button-svg-disabled-opacity: .65;--f-button-next-pos: 1rem;--f-button-prev-pos: 1rem;opacity:var(--fancybox-opacity, 1)}.fancybox__nav .f-button:before{position:absolute;content:"";top:-30px;right:-20px;left:-20px;bottom:-30px;z-index:1}.is-idle .fancybox__nav{animation:.15s ease-out both f-fadeOut}.is-idle.is-compact .fancybox__footer{pointer-events:none;animation:.15s ease-out both f-fadeOut}.fancybox__slide>.f-spinner{position:absolute;top:50%;left:50%;margin:var(--f-spinner-top, calc(var(--f-spinner-width) * -.5)) 0 0 var(--f-spinner-left, calc(var(--f-spinner-height) * -.5));z-index:30;cursor:pointer}.fancybox-protected{position:absolute;top:0;left:0;right:0;bottom:0;z-index:40;-webkit-user-select:none;-moz-user-select:none;user-select:none}.fancybox-ghost{position:absolute;top:0;left:0;width:100%;height:100%;min-height:0;-o-object-fit:contain;object-fit:contain;z-index:40;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.fancybox-focus-guard{outline:none;opacity:0;position:fixed;pointer-events:none}.fancybox__container:not([aria-hidden]){opacity:0}.fancybox__container.is-animated[aria-hidden=false]>*:not(.fancybox__backdrop,.fancybox__carousel),.fancybox__container.is-animated[aria-hidden=false] .fancybox__carousel>*:not(.fancybox__viewport),.fancybox__container.is-animated[aria-hidden=false] .fancybox__slide>*:not(.fancybox__content){animation:var(--f-interface-enter-duration, .25s) ease .1s backwards f-fadeIn}.fancybox__container.is-animated[aria-hidden=false] .fancybox__backdrop{animation:var(--f-backdrop-enter-duration, .35s) ease backwards f-fadeIn}.fancybox__container.is-animated[aria-hidden=true]>*:not(.fancybox__backdrop,.fancybox__carousel),.fancybox__container.is-animated[aria-hidden=true] .fancybox__carousel>*:not(.fancybox__viewport),.fancybox__container.is-animated[aria-hidden=true] .fancybox__slide>*:not(.fancybox__content){animation:var(--f-interface-exit-duration, .15s) ease forwards f-fadeOut}.fancybox__container.is-animated[aria-hidden=true] .fancybox__backdrop{animation:var(--f-backdrop-exit-duration, .35s) ease forwards f-fadeOut}.has-iframe .fancybox__content,.has-map .fancybox__content,.has-pdf .fancybox__content,.has-youtube .fancybox__content,.has-vimeo .fancybox__content,.has-html5video .fancybox__content{max-width:100%;flex-shrink:1;min-height:1px;overflow:visible}.has-iframe .fancybox__content,.has-map .fancybox__content,.has-pdf .fancybox__content{width:calc(100% - 120px);height:90%}.fancybox__container.is-compact .has-iframe .fancybox__content,.fancybox__container.is-compact .has-map .fancybox__content,.fancybox__container.is-compact .has-pdf .fancybox__content{width:100%;height:100%}.has-youtube .fancybox__content,.has-vimeo .fancybox__content,.has-html5video .fancybox__content{width:960px;height:540px;max-width:100%;max-height:100%}.has-map .fancybox__content,.has-pdf .fancybox__content,.has-youtube .fancybox__content,.has-vimeo .fancybox__content,.has-html5video .fancybox__content{padding:0;background:#18181be6;color:#fff}.has-map .fancybox__content{background:#e5e3df}.fancybox__html5video,.fancybox__iframe{border:0;display:block;height:100%;width:100%;background:#0000}.fancybox-placeholder{border:0!important;clip:rect(1px,1px,1px,1px)!important;clip-path:inset(50%)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.f-carousel__thumbs{--f-thumb-width: 96px;--f-thumb-height: 72px;--f-thumb-outline: 0;--f-thumb-outline-color: #5eb0ef;--f-thumb-opacity: 1;--f-thumb-hover-opacity: 1;--f-thumb-selected-opacity: 1;--f-thumb-border-radius: 2px;--f-thumb-offset: 0px;--f-button-next-pos: 0;--f-button-prev-pos: 0}.f-carousel__thumbs.is-classic{--f-thumb-gap: 8px;--f-thumb-opacity: .5;--f-thumb-hover-opacity: 1;--f-thumb-selected-opacity: 1}.f-carousel__thumbs.is-modern{--f-thumb-gap: 4px;--f-thumb-extra-gap: 16px;--f-thumb-clip-width: 46px}.f-thumbs{position:relative;flex:0 0 auto;margin:0;overflow:hidden;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-user-select:none;-moz-user-select:none;user-select:none;perspective:1000px;transform:translateZ(0)}.f-thumbs .f-spinner{position:absolute;top:0;left:0;width:100%;height:100%;border-radius:2px;background-image:linear-gradient(#ebeff2,#e2e8f0);z-index:-1}.f-thumbs .f-spinner svg{display:none}.f-thumbs.is-vertical{height:100%}.f-thumbs__viewport{width:100%;height:auto;overflow:hidden;transform:translateZ(0)}.f-thumbs__track{display:flex}.f-thumbs__slide{position:relative;flex:0 0 auto;box-sizing:content-box;display:flex;align-items:center;justify-content:center;padding:0;margin:0;width:var(--f-thumb-width);height:var(--f-thumb-height);overflow:visible;cursor:pointer}.f-thumbs__slide.is-loading img{opacity:0}.is-classic .f-thumbs__viewport{height:100%}.is-modern .f-thumbs__track{width:-moz-max-content;width:max-content}.is-modern .f-thumbs__track:before{content:"";position:absolute;top:0;bottom:0;left:calc((var(--f-thumb-clip-width, 0))*-.5);width:calc(var(--width, 0)*1px + var(--f-thumb-clip-width, 0));cursor:pointer}.is-modern .f-thumbs__slide{width:var(--f-thumb-clip-width);transform:translate3d(calc(var(--shift, 0) * -1px),0,0);transition:none;pointer-events:none}.is-modern.is-resting .f-thumbs__slide{transition:transform .33s ease}.is-modern.is-resting .f-thumbs__slide__button{transition:clip-path .33s ease}.is-using-tab .is-modern .f-thumbs__slide:focus-within{filter:drop-shadow(-1px 0px 0px var(--f-thumb-outline-color)) drop-shadow(2px 0px 0px var(--f-thumb-outline-color)) drop-shadow(0px -1px 0px var(--f-thumb-outline-color)) drop-shadow(0px 2px 0px var(--f-thumb-outline-color))}.f-thumbs__slide__button{-webkit-appearance:none;-moz-appearance:none;appearance:none;width:var(--f-thumb-width);height:100%;margin:0 -100%;padding:0;border:0;position:relative;border-radius:var(--f-thumb-border-radius);overflow:hidden;background:#0000;outline:none;cursor:pointer;pointer-events:auto;touch-action:manipulation;opacity:var(--f-thumb-opacity);transition:opacity .2s ease}.f-thumbs__slide__button:hover{opacity:var(--f-thumb-hover-opacity)}.f-thumbs__slide__button:focus:not(:focus-visible){outline:none}.f-thumbs__slide__button:focus-visible{outline:none;opacity:var(--f-thumb-selected-opacity)}.is-modern .f-thumbs__slide__button{--clip-path: inset( 0 calc( ((var(--f-thumb-width, 0) - var(--f-thumb-clip-width, 0))) * (1 - var(--progress, 0)) * .5 ) round var(--f-thumb-border-radius, 0) );clip-path:var(--clip-path)}.is-classic .is-nav-selected .f-thumbs__slide__button{opacity:var(--f-thumb-selected-opacity)}.is-classic .is-nav-selected .f-thumbs__slide__button:after{content:"";position:absolute;top:0;left:0;right:0;height:auto;bottom:0;border:var(--f-thumb-outline, 0) solid var(--f-thumb-outline-color, transparent);border-radius:var(--f-thumb-border-radius);animation:f-fadeIn .2s ease-out;z-index:10}.f-thumbs__slide__img{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;margin:0;padding:var(--f-thumb-offset);box-sizing:border-box;pointer-events:none;-o-object-fit:cover;object-fit:cover;border-radius:var(--f-thumb-border-radius)}.f-thumbs.is-horizontal .f-thumbs__track{padding:8px 0 12px}.f-thumbs.is-horizontal .f-thumbs__slide{margin:0 var(--f-thumb-gap) 0 0}.f-thumbs.is-vertical .f-thumbs__track{flex-wrap:wrap;padding:0 8px}.f-thumbs.is-vertical .f-thumbs__slide{margin:0 0 var(--f-thumb-gap) 0}.fancybox__thumbs{--f-thumb-width: 96px;--f-thumb-height: 72px;--f-thumb-border-radius: 2px;--f-thumb-outline: 2px;--f-thumb-outline-color: #ededed;position:relative;opacity:var(--fancybox-opacity, 1);transition:max-height .35s cubic-bezier(.23,1,.32,1)}.fancybox__thumbs.is-classic{--f-thumb-gap: 8px;--f-thumb-opacity: .5;--f-thumb-hover-opacity: 1}.fancybox__thumbs.is-classic .f-spinner{background-image:linear-gradient(#ffffff1a,#ffffff0d)}.fancybox__thumbs.is-modern{--f-thumb-gap: 4px;--f-thumb-extra-gap: 16px;--f-thumb-clip-width: 46px;--f-thumb-opacity: 1;--f-thumb-hover-opacity: 1}.fancybox__thumbs.is-modern .f-spinner{background-image:linear-gradient(#ffffff1a,#ffffff0d)}.fancybox__thumbs.is-horizontal{padding:0 var(--f-thumb-gap)}.fancybox__thumbs.is-vertical{padding:var(--f-thumb-gap) 0}.is-compact .fancybox__thumbs{--f-thumb-width: 64px;--f-thumb-clip-width: 32px;--f-thumb-height: 48px;--f-thumb-extra-gap: 10px}.fancybox__thumbs.is-masked{max-height:0px!important}.is-closing .fancybox__thumbs{transition:none!important}.fancybox__toolbar{--f-progress-color: var(--fancybox-color, rgba(255, 255, 255, .94));--f-button-width: 46px;--f-button-height: 46px;--f-button-color: var(--fancybox-color);--f-button-hover-color: var(--fancybox-hover-color);--f-button-bg: rgba(24, 24, 27, .65);--f-button-hover-bg: rgba(70, 70, 73, .65);--f-button-active-bg: rgba(90, 90, 93, .65);--f-button-border-radius: 0;--f-button-svg-width: 24px;--f-button-svg-height: 24px;--f-button-svg-stroke-width: 1.5;--f-button-svg-filter: drop-shadow(1px 1px 1px rgba(24, 24, 27, .15));--f-button-svg-fill: none;--f-button-svg-disabled-opacity: .65;display:flex;flex-direction:row;justify-content:space-between;margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI Adjusted,Segoe UI,Liberation Sans,sans-serif;color:var(--fancybox-color, currentColor);opacity:var(--fancybox-opacity, 1);text-shadow:var(--fancybox-toolbar-text-shadow, 1px 1px 1px rgba(0, 0, 0, .5));pointer-events:none;z-index:20}.fancybox__toolbar :focus-visible{z-index:1}.fancybox__toolbar.is-absolute,.is-compact .fancybox__toolbar{position:absolute;top:0;left:0;right:0}.is-idle .fancybox__toolbar{pointer-events:none;animation:.15s ease-out both f-fadeOut}.fancybox__toolbar__column{display:flex;flex-direction:row;flex-wrap:wrap;align-content:flex-start}.fancybox__toolbar__column.is-left,.fancybox__toolbar__column.is-right{flex-grow:1;flex-basis:0}.fancybox__toolbar__column.is-right{display:flex;justify-content:flex-end;flex-wrap:nowrap}.fancybox__infobar{padding:0 5px;line-height:var(--f-button-height);text-align:center;font-size:17px;font-variant-numeric:tabular-nums;-webkit-font-smoothing:subpixel-antialiased;cursor:default;-webkit-user-select:none;-moz-user-select:none;user-select:none}.fancybox__infobar span{padding:0 5px}.fancybox__infobar:not(:first-child):not(:last-child){background:var(--f-button-bg)}[data-fancybox-toggle-slideshow]{position:relative}[data-fancybox-toggle-slideshow] .f-progress{height:100%;opacity:.3}[data-fancybox-toggle-slideshow] svg g:first-child{display:flex}[data-fancybox-toggle-slideshow] svg g:last-child{display:none}.has-slideshow [data-fancybox-toggle-slideshow] svg g:first-child{display:none}.has-slideshow [data-fancybox-toggle-slideshow] svg g:last-child{display:flex}[data-fancybox-toggle-fullscreen] svg g:first-child{display:flex}[data-fancybox-toggle-fullscreen] svg g:last-child{display:none}:fullscreen [data-fancybox-toggle-fullscreen] svg g:first-child{display:none}:fullscreen [data-fancybox-toggle-fullscreen] svg g:last-child{display:flex}.f-progress{position:absolute;top:0;left:0;right:0;height:3px;transform:scaleX(0);transform-origin:0;transition-property:transform;transition-timing-function:linear;background:var(--f-progress-color, var(--f-carousel-theme-color, #0091ff));z-index:30;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:none}.item__text-content,.item{transition:all .5s cubic-bezier(.4,0,.2,1)}.item:hover .item__text-content{opacity:.8}.item img{-o-object-fit:contain;object-fit:contain}.ProseMirror-focused{outline:none}.editor-toolbar{background-color:#f9fafb}.editor-content{min-height:160px}button{transition:background-color .2s ease;outline:none}button:focus{outline:none}.editor-content ul{margin-left:20px}.editor-content ul>li{list-style:disc}.editor-content ol{list-style-type:decimal;margin-left:20px}.editor-content pre{background-color:#e7e7e7;border-radius:4px;padding:0 2px}.mention-popup{background-color:#fafafa;padding:10px;border-radius:10px;box-shadow:0 4px 6px #0000001a;max-width:200px;overflow-y:auto;width:auto}.mention{padding:2px 4px;border-radius:8px;background-color:#e7e7e7}.mention-option{padding:5px 10px;cursor:pointer;transition:background-color .2s;border-radius:8px}.mention-option:hover{background-color:#f0f0f0}.border-top:not(:first-child){--tw-border-opacity: 1;border-color:#e5e7eb;border-top-width:1px}.widget-comment-form .vs-button{padding:.625rem 1rem;font-size:.75rem;line-height:1rem;font-weight:500}.widget-comment-form .vs-button:focus{border:transparent;--tw-ring-opacity: 1;--tw-ring-color: rgb(191 219 254);--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 rgba(0, 0, 0, 0))}li[data-v-87c0b333]{cursor:move}.grid[data-v-f2a27685]{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:1rem}.admin-wrapper[data-v-2f422765]{display:flex;height:100vh;align-items:start}.vs-popover__content>div{padding:.25rem}.hs-accordion-heading[data-v-4139bc00]{display:flex;align-items:center}.hs-accordion-toggle[data-v-4139bc00]{cursor:pointer}.hs-accordion-content[data-v-4139bc00]{padding-left:1.5rem}.table-info-card .editor-container{width:330px}.slide-fade-enter-active[data-v-30411599],.slide-fade-leave-active[data-v-30411599]{transition:all .3s linear}.slide-fade-enter-from[data-v-30411599],.slide-fade-leave-to[data-v-30411599]{transform:translate(20px);opacity:0}
@@ -1,3 +1,3 @@
1
- {
2
- "count": 1000
1
+ {
2
+ "count": 1000
3
3
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/admin",
3
- "version": "0.1.65",
3
+ "version": "0.1.67",
4
4
  "description": "This project Softpro Admin",
5
5
  "main": "dist/admin.js",
6
6
  "type": "module",
@@ -31,9 +31,10 @@
31
31
  "author": "Softpro",
32
32
  "license": "ISC",
33
33
  "dependencies": {
34
+ "@fancyapps/ui": "^5.0.36",
34
35
  "@opengis/fastify-auth": "^1.0.40",
35
36
  "@opengis/fastify-file": "^1.0.17",
36
- "@opengis/fastify-table": "^1.1.42",
37
+ "@opengis/fastify-table": "^1.1.44",
37
38
  "@opengis/v3-core": "^0.2.1",
38
39
  "@opengis/v3-filter": "^0.0.31",
39
40
  "@tiptap/core": "^2.8.0",
@@ -53,6 +54,7 @@
53
54
  "cross-env": "^7.0.3",
54
55
  "fastify": "^4.26.1",
55
56
  "fastify-plugin": "^4.0.0",
57
+ "latest": "^0.2.0",
56
58
  "maplibre-gl": "^4.7.0",
57
59
  "moment": "^2.30.1",
58
60
  "vite": "^5.1.4",
@@ -77,4 +79,4 @@
77
79
  "vitepress-plugin-tabs": "^0.5.0",
78
80
  "vitepress-sidebar": "^1.22.0"
79
81
  }
80
- }
82
+ }
@@ -1,12 +1,8 @@
1
- import config from '../../config.js'
2
- import { addHook, getToken, setToken, getTemplate } from '@opengis/fastify-table/utils.js';
1
+ import { addHook, getToken, setToken, getTemplate, config, pgClients } from '@opengis/fastify-table/utils.js';
3
2
 
4
3
  async function getTokenData({
5
- req, mode = 'w', token, uid,
4
+ mode = 'w', token, uid,
6
5
  }) {
7
- if (!req) {
8
- return { message: 'not enough params: req', status: 400 };
9
- }
10
6
  if (!token) {
11
7
  return { message: 'not enough params: token', status: 400 };
12
8
  }
@@ -27,40 +23,44 @@ async function getTokenData({
27
23
 
28
24
  export default async function plugin(fastify) {
29
25
 
30
- addHook('preTable', async ({ req, table, user = {} }) => {
26
+ addHook('preTable', async ({ table, user = {} }) => {
31
27
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
32
-
33
- //const opt = await getTokenData({ req, mode: 'w', token: table, uid });
34
- // return opt;
28
+ const opt = await getTokenData({ mode: 'w', token: table, uid });
29
+ return opt;
30
+ });
31
+ addHook('preCard', async ({ table, user = {} }) => {
32
+ const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
33
+ const opt = await getTokenData({ mode: 'w', token: table, uid });
34
+ return opt;
35
35
  });
36
- addHook('preData', async ({ req, table, id, user = {} }) => {
36
+ addHook('preData', async ({ table, id, user = {} }) => {
37
37
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
38
- const opt = await getTokenData({ req, mode: 'w', token: table, uid });
38
+ const opt = await getTokenData({ mode: 'w', token: table, uid });
39
39
  return opt;
40
40
  });
41
- addHook('preForm', async ({ req, form, user }) => {
41
+ addHook('preForm', async ({ form, user }) => {
42
42
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
43
- const opt = await getTokenData({ req, mode: 'w', token: form, uid });
43
+ const opt = await getTokenData({ mode: 'w', token: form, uid });
44
44
  return opt;
45
45
  });
46
- addHook('preInsert', async ({ req, table, user }) => {
46
+ addHook('preInsert', async ({ table, user }) => {
47
47
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
48
- const opt = await getTokenData({ req, mode: 'a', token: table, uid });
48
+ const opt = await getTokenData({ mode: 'a', token: table, uid });
49
49
  return opt;
50
50
  });
51
- addHook('preUpdate', async ({ req, table, id, user }) => {
51
+ addHook('preUpdate', async ({ table, id, user }) => {
52
52
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
53
- const opt = await getTokenData({ req, mode: 'w', token: table, uid });
53
+ const opt = await getTokenData({ mode: 'w', token: table, uid });
54
54
  return opt;
55
55
  });
56
- addHook('preDelete', async ({ req, table, id, user }) => {
56
+ addHook('preDelete', async ({ table, id, user }) => {
57
57
  const { uid } = config?.auth?.disable ? { uid: '1' } : user || {};
58
- const opt = await getTokenData({ req, mode: 'w', token: table, uid });
58
+ const opt = await getTokenData({ mode: 'w', token: table, uid });
59
59
  return opt;
60
60
  });
61
61
 
62
- addHook('afterTable', async ({ req = {}, table, res = {}, rows = [], user = {} }) => {
63
- const { pg } = req;
62
+ addHook('afterTable', async ({ table, res = {}, payload: rows = [], user = {} }) => {
63
+ const { client: pg } = pgClients || {};
64
64
  const loadTable = await getTemplate('table', table);
65
65
  const { uid } = config?.auth?.disable ? { uid: '1' } : user;
66
66
  if (!uid || !table || !pg?.pk?.[table] || !rows.length || !loadTable?.table) return;
@@ -103,39 +103,34 @@ export default async function plugin(fastify) {
103
103
  });
104
104
 
105
105
  // extract table from form token for user columns - p.2 - read (refactor to global token)
106
- /* addHook('preTemplate', async ({ req = {}, name, type, user }) => {
107
- const { funcs, params = {}, session = {} } = req;
108
- const { uid } = funcs?.config?.auth?.disable ? { uid: '1' } : (session?.passport?.user || {});
109
- if (!uid || params?.type !== 'form' || !params?.name) return null;
110
-
111
- const { table, form } = await getToken({
112
- uid, token: params.name, mode: 'w', json: 1,
113
- }) || {};
114
- if (form) {
115
- Object.assign(req.params || {}, { name: form, table });
116
- }
117
- }); */
106
+ addHook('preTemplate', async ({ name, type, user = {} }) => {
107
+ if (!name || !type) return;
108
+ const { uid } = config?.auth?.disable ? { uid: '1' } : user;
109
+ const tokenData = await getToken({
110
+ uid, token: name, mode: 'w', json: 1,
111
+ }) // edit?
112
+ || await getToken({
113
+ uid, token: name, mode: 'a', json: 1,
114
+ }) || {}; // add?
115
+ return { name: tokenData?.[type] };
116
+ });
118
117
 
119
- addHook('afterTemplate', async ({ req = {}, data = {}, user = {} }) => {
120
- const { funcs } = req;
121
- const { uid } = funcs?.config?.auth?.disable ? { uid: '1' } : user;
122
- const { pg, params = {} } = req;
118
+ addHook('afterTemplate', async ({ name, type, payload: data = {}, user = {} }) => {
119
+ const { client: pg } = pgClients || {};
120
+ const { uid } = config?.auth?.disable ? { uid: '1' } : user;
123
121
  // extract table from form token for user columns - p.1 - assign (refactor to global token)
124
- /* if (params?.type === 'table') {
125
- const { form } = await getTemplate('table', params.name) || {};
126
- if (!form) return;
127
- const editTokens = setToken({
128
- ids: [{ table: params.name, form }],
129
- mode: 'w',
130
- uid,
131
- array: 1,
132
- });
133
- Object.assign(data, { token: editTokens[0] });
134
- } */
135
- if (!uid || !data || params?.type !== 'form' || !params?.name) return null;
122
+ if (!uid || !data || type !== 'form' || !name) return null;
123
+
124
+ const { form, id, table } = await getToken({
125
+ uid, token: name, mode: 'w', json: 1,
126
+ }) // edit?
127
+ || await getToken({
128
+ uid, token: name, mode: 'a', json: 1,
129
+ }) || {}; // add?
136
130
 
137
131
  const { rows: properties = [] } = await pg.query(`select name, title, format, data from admin.custom_column
138
- where entity=$1 and uid=$2`, [params.table || params.name, uid]);
132
+ where entity=$1 and uid=$2`, [table || name, uid]);
133
+
139
134
  await Promise.all(properties.map(async (el) => {
140
135
  const clsData = el.data ? await getTemplate(['cls', 'select'], el.data) : undefined;
141
136
  const type = clsData ? 'Select' : ({ date: 'DatePicker' }[el.format] || 'Text');
@@ -143,52 +138,48 @@ export default async function plugin(fastify) {
143
138
  }));
144
139
  });
145
140
 
146
- addHook('afterUpdate', async ({ req, res = {}, user = {} }) => {
147
- const {
148
- pg, params = {}, body = {},
149
- } = req;
141
+ addHook('afterUpdate', async ({ table, body = {}, payload: res = {}, user = {} }) => {
142
+ const { client: pg } = pgClients || {};
150
143
  const { uid } = config?.auth?.disable ? { uid: '1' } : user;
151
- if (!uid) return null;
144
+ if (!uid || !table || !Object.keys(body)?.length) return null;
152
145
 
153
- const loadTable = await getTemplate('table', params.table);
154
- if (!pg.pk[loadTable?.table || params.table]) return null;
155
- const pk = pg.pk[loadTable?.table || params.table];
146
+ const loadTable = await getTemplate('table', table);
147
+ if (!pg.pk[loadTable?.table || table]) return null;
148
+ const pk = pg.pk[loadTable?.table || table];
156
149
  const id = res[pk];
157
150
 
158
151
  const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column
159
- where entity=$1 and uid=$2`, [params.table, uid]);
152
+ where entity=$1 and uid=$2`, [table, uid]);
160
153
 
161
154
  if (!id || !properties?.length) return null;
162
155
 
163
- const q = `delete from crm.extra_data where property_entity='${params.table}' and object_id='${id}';${properties
156
+ const q = `delete from crm.extra_data where property_entity='${table}' and object_id='${id}';${properties
164
157
  .filter((el) => Object.keys(body).includes(el.name))
165
158
  .map((el) => `insert into crm.extra_data(property_id,property_key,property_entity,object_id,${el.format?.toLowerCase() === 'date' ? 'value_date' : 'value_text'})
166
- select '${el.column_id}', '${el.name}', '${params.table}', '${id}', ${el.format?.toLowerCase() === 'date' ? `'${body[el.name]}'::timestamp without time zone` : `'${body[el.name]}'::text`}`)
159
+ select '${el.column_id}', '${el.name}', '${table}', '${id}', ${el.format?.toLowerCase() === 'date' ? `'${body[el.name]}'::timestamp without time zone` : `'${body[el.name]}'::text`}`)
167
160
  .join(';\n') || ''}`;
168
161
  return pg.query(q);
169
162
  });
170
163
 
171
- addHook('afterInsert', async ({ req, res = {}, user = {} }) => {
172
- const {
173
- pg, params = {}, body = {},
174
- } = req;
164
+ addHook('afterInsert', async ({ table, body = {}, payload: res = {}, user = {} }) => {
165
+ const { client: pg } = pgClients || {};
175
166
  const { uid } = config?.auth?.disable ? { uid: '1' } : user;
176
- if (!uid) return null;
167
+ if (!uid || !table || !Object.keys(body)?.length) return null;
177
168
 
178
- const loadTable = await getTemplate('table', params.table);
179
- if (!pg.pk[loadTable?.table || params.table]) return null;
180
- const pk = pg.pk[loadTable?.table || params.table];
169
+ const loadTable = await getTemplate('table', table);
170
+ if (!pg.pk[loadTable?.table || table]) return null;
171
+ const pk = pg.pk[loadTable?.table || table];
181
172
  const id = res.rows?.[0]?.[pk];
182
173
 
183
174
  const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column
184
- where entity=$1 and uid=$2`, [params.table, uid]);
175
+ where entity=$1 and uid=$2`, [table, uid]);
185
176
 
186
177
  if (!id || !properties?.length) return null;
187
178
 
188
179
  const q = properties
189
180
  .filter((el) => Object.keys(body).includes(el.name))
190
181
  .map((el) => `insert into crm.extra_data(property_id,property_key,property_entity,object_id,${el.format?.toLowerCase() === 'date' ? 'value_date' : 'value_text'})
191
- select '${el.column_id}', '${el.name}', '${params.table}', '${id}', ${el.format?.toLowerCase() === 'date' ? `'${body[el.name]}'::timestamp without time zone` : `'${body[el.name]}'::text`}`)
182
+ select '${el.column_id}', '${el.name}', '${table}', '${id}', ${el.format?.toLowerCase() === 'date' ? `'${body[el.name]}'::timestamp without time zone` : `'${body[el.name]}'::text`}`)
192
183
  .join(';\n');
193
184
  return pg.query(q);
194
185
  });
@@ -50,14 +50,19 @@ async function plugin(fastify) {
50
50
  return reply.type('text/html').send(stream);
51
51
  });
52
52
 
53
+ const fileSize = {}
53
54
  async function staticFile(req, reply) {
54
55
  const assetsDir = 'dist';
55
56
  const filePath = path.join(root, assetsDir, req.url);
56
57
  const ext = path.extname(filePath);
58
+
59
+ if (!fs.existsSync(filePath)) return { status: 404, message: 'not found' }
60
+ fileSize[filePath] = fileSize[filePath] || fs.statSync(filePath).size;
57
61
  const mime = {
58
62
  '.js': 'text/javascript', '.css': 'text/css', '.woff2': 'application/font-woff', '.png': 'image/png', '.svg': 'image/svg+xml', '.jpg': 'image/jpg',
59
63
  }[ext];
60
- reply.headers({ 'Cache-control': 'max-age=3600, public' });
64
+ reply.headers({ 'Cache-control': 'max-age=3600, public', 'Content-length': fileSize[filePath], 'Content-Encoding': 'identity' });
65
+
61
66
  const stream = fs.createReadStream(filePath);
62
67
  return mime ? reply.type(mime).send(stream) : stream;
63
68
  }
@@ -99,7 +99,7 @@ export default async function getTableData(req) {
99
99
  time: Date.now() - time, card: loadTable.card, actions: loadTable.actions, access, total, count: rows.length, pk, form, meta, columns,
100
100
  };
101
101
 
102
- await applyHook('afterTable', { req, table: params?.table, res, rows, user: session?.passport?.user });
102
+ await applyHook('afterTable', { table: params?.table, res, rows, user: session?.passport?.user });
103
103
  await metaFormat({ funcs, rows, table: params.table });
104
104
 
105
105
 
@@ -1,6 +1,6 @@
1
1
 
2
2
  import { join } from 'path';
3
- import { userTemplateDir } from '@opengis/fastify-table/utils.js';
3
+ import { userTemplateDir, config, getAccess } from '@opengis/fastify-table/utils.js';
4
4
 
5
5
  import { existsSync, readdirSync, readFileSync } from 'fs';
6
6
  const menuCache = [];
@@ -29,7 +29,24 @@ async function readMenu() {
29
29
  if (!menuCache.length) menus.forEach(el => menuCache.push(el))
30
30
  return menus;
31
31
  }
32
- export default async function adminMenu() {
32
+ export default async function adminMenu(req) {
33
33
  const menus = isProduction && menuCache.length ? menuCache : await readMenu();
34
+ if (req) {
35
+ const user = req?.session?.passport?.user || {};
36
+ const userMenu = await Promise.all(menus.map(async (menu) => {
37
+ if (menu?.menu?.length) {
38
+ const submenu = await Promise.all(menu.menu?.map(async (submenu) => {
39
+ const access = await getAccess({ table: submenu?.table, user });
40
+ return { ...submenu, access };
41
+ }));
42
+ return { ...menu, menu: submenu.filter((e) => e?.access), access: submenu.filter((e) => e?.access?.actions?.includes('get'))?.length };
43
+ } else if (menu?.table) {
44
+ const access = await getAccess({ table: menu?.table, user });
45
+ return { ...menu, access };
46
+ }
47
+ return menu;
48
+ }));
49
+ return userMenu.filter((e) => e?.access)?.map((e) => ({ ...e, menu: e?.menu ? e?.menu?.filter((el) => el?.access?.actions?.includes('get')) : undefined }));
50
+ }
34
51
  return menus;
35
52
  }
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable camelcase */
2
2
  import {
3
- getSelect, addNotification, sendNotification,
3
+ getSelect, addNotification, sendNotification, config,
4
4
  } from '@opengis/fastify-table/utils.js';
5
5
 
6
6
  function sequence(arr, data, fn) {
@@ -9,7 +9,7 @@ function sequence(arr, data, fn) {
9
9
  })), Promise.resolve());
10
10
  }
11
11
 
12
- export default async function onWidgetSet({ req, type, data = {} }) {
12
+ export default async function onWidgetSet({ link, session, log, type, payload: data = {} }) {
13
13
  const values = data.body?.match(/\B@[a-zA-z0-9а-яА-яіїІЇєЄ]+ [a-zA-z0-9а-яА-яіїІЇєЄ]+/g)
14
14
  ?.filter((el, idx, arr) => el?.replace && arr.indexOf(el) === idx)
15
15
  ?.map((el) => el.replace(/@/g, ''));
@@ -18,11 +18,6 @@ export default async function onWidgetSet({ req, type, data = {} }) {
18
18
  return null;
19
19
  }
20
20
 
21
- const {
22
- pg, funcs, path: link, session = {}, log,
23
- } = req;
24
- const { config = {} } = funcs;
25
-
26
21
  const { sql } = await getSelect('core.user_mentioned');
27
22
 
28
23
  const { rows = [] } = await pg.query(`with data (id,name,email) as (${sql})
@@ -37,12 +32,11 @@ export default async function onWidgetSet({ req, type, data = {} }) {
37
32
 
38
33
  await sequence(rows, {}, async ({ id, name, email }) => {
39
34
  const res = await addNotification({
40
- pg, funcs, session, subject, entity: data.entity_id, body: message, link, uid: id,
35
+ pg, session, subject, entity: data.entity_id, body: message, link, uid: id,
41
36
  });
42
37
  try {
43
38
  const res1 = await sendNotification({
44
39
  pg,
45
- funcs,
46
40
  log,
47
41
  to: email,
48
42
  // template,
@@ -3,13 +3,13 @@ import { applyHook, getTemplate } from "@opengis/fastify-table/utils.js";
3
3
  export default async function getTemplateApi(req) {
4
4
  const { user } = req?.session?.passport || {};
5
5
  const { funcs, params = {}, session = {} } = req;
6
- const res = await applyHook('preTemplate', { req, name: params?.name, type: params?.type, user });
7
- if (res) return res;
8
-
9
-
10
6
  const { type, name } = params;
7
+ const hookData = await applyHook('preTemplate', { name, type, user });
8
+ if (hookData?.message && hookData?.status) {
9
+ return hookData;
10
+ }
11
11
 
12
- const data = await getTemplate(type, name);
12
+ const data = await getTemplate(type, hookData?.name || name);
13
13
  if (!['interface', 'table'].includes(type)
14
14
  && (!data?.public || !data?.ispublic)
15
15
  && !funcs?.config?.auth?.disable
@@ -18,6 +18,6 @@ export default async function getTemplateApi(req) {
18
18
  ) {
19
19
  return `access restricted ${name}`;
20
20
  }
21
- await applyHook('afterTemplate', { req, data, user })
21
+ await applyHook('afterTemplate', { name, type, data, user });
22
22
  return data?.html || data || `template not found "${name}"`;
23
23
  }