@opengis/gis 0.2.139 → 0.2.141
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/{CardIcon-Cmz6uC1l.js → CardIcon-DCczXarc.js} +1 -1
- package/dist/{EntityTablePage-CWaHd8PB.js → EntityTablePage-vD_julb_.js} +1 -1
- package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-wx74T-CS.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-DBdegFCb.js} +1 -1
- package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-BKB0pYYI.js → HeaderActions.vue_vue_type_script_setup_true_lang-CJcEbD_-.js} +1 -1
- package/dist/{MapSettings-CXBDlZuF.js → MapSettings-Cnm5Vl15.js} +1 -1
- package/dist/{RastersTablePage-Cw8WxET9.js → RastersTablePage-CtcpZ5eN.js} +1 -1
- package/dist/{cartocss-CDq3jgBE.js → cartocss-BuZDUW-p.js} +5 -5
- package/dist/{import-utils-CnnPnei7.js → import-utils-DUL4oJas.js} +1 -1
- package/dist/{index-EC3Olk5_.js → index-Cc6sBxOx.js} +10 -10
- package/dist/index.css +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.cjs +3 -3
- package/dist/{raster-CoSyvycn.js → raster-Cu2PP2UD.js} +3 -3
- package/dist/{register-HWv40R1t.js → register-DUXQCiHv.js} +5 -4
- package/dist/{service-DVpo7YeN.js → service-B6o74zWm.js} +19 -8
- package/dist/{vs-datatable-DU071Vhx.js → vs-datatable-BA5JkZ_J.js} +1 -1
- package/module/test/cls/doc_status.json +31 -31
- package/module/test/select/core.user_uid.sql +1 -1
- package/package.json +2 -2
- package/server/routes/mapnik/functions/uploadXML.js +5 -3
package/dist/index.umd.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
`)});return}const p=await fetch("/api/table/"+a.value,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.value)});if(!p.ok){fe.notify({type:"error",title:"Error",message:`Error code: ${p.status}`});return}await p.json(),fe.notify({title:"Success!",message:"Object created."}),i.back()}return e.onMounted(async()=>{const f=c.entityKey||String(s.name??"").split("-")[0],p=await fetch(`/api/form/gis.${f}.table`).then(b=>b.json());a.value=p.token,g.value=p.id,l.value=p.schema,document.title=y.value}),(f,p)=>{const b=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(Yt,{variant:"form"},e.createSlots({breadcrumbs:e.withCtx(()=>[h.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(b,{to:h.value,class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(r.value),1)]),_:1},8,["to"]),e.createElementVNode("span",ig,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})])],64)):e.createCommentVNode("",!0),p[2]||(p[2]=e.createElementVNode("span",{class:"text-gray-900 font-semibold"},"Створення",-1))]),title:e.withCtx(()=>[e.createElementVNode("div",cg,[e.createElementVNode("button",{type:"button",class:"p-0 m-0 border-0 bg-transparent cursor-pointer text-inherit hover:opacity-80",onClick:m,"aria-label":"Назад"},[e.createVNode(e.unref(ie.ArrowLeft),{size:20,class:"shrink-0"})]),e.createElementVNode("span",null,e.toDisplayString(r.value||"Створення"),1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{class:"cursor-pointer flex items-center px-3 py-2 text-sm font-medium text-gray-800 duration-300 bg-white border border-gray-100 rounded-lg shadow gap-x-2 focus:outline-none hover:bg-gray-50 hover:border-gray-100",onClick:m}," Назад "),e.createElementVNode("button",{onClick:x,class:"cursor-pointer inline-flex items-center px-3 py-2 text-sm font-medium text-white duration-300 bg-blue-600 hover:bg-blue-700 border border-transparent rounded-lg gap-x-2 hover:text-white"}," Зберегти ")]),_:2},[d.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(d.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",dg,[e.createElementVNode("div",ug,[e.createElementVNode("div",mg,[e.createElementVNode("div",pg,[l.value?(e.openBlock(),e.createBlock(e.unref(n),{key:0,values:o.value,"onUpdate:values":p[0]||(p[0]=k=>o.value=k),form:u.value,"onUpdate:form":p[1]||(p[1]=k=>u.value=k),schema:l.value,style:{primaryColor:"blue"},formId:g.value},null,8,["values","form","schema","formId"])):e.createCommentVNode("",!0)])])])])],64)}}})},Symbol.toStringTag,{value:"Module"})),fg={class:"mx-1"},gg={class:"mx-1"},yg={class:"flex items-center gap-2 mt-[0.4rem]"},hg={class:"flex-1 px-4 sm:px-6 pb-4 overflow-y-auto"},bg={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden"},xg={class:"w-full relative overflow-auto p-5 [&::-webkit-scrollbar]:w-2 [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar:horizontal]:h-[8px] [&::-webkit-scrollbar-track]:bg-gray-100 [&::-webkit-scrollbar-thumb]:bg-gray-300 dark:[&::-webkit-scrollbar-track]:bg-neutral-700 dark:[&::-webkit-scrollbar-thumb]:bg-neutral-500"},kg={class:"vs-form w-full"},mn=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"EntityEditPage",props:{entityKey:{default:""}},setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/form")),o=e.ref({}),l=e.ref(null),a=e.ref(null),i=e.ref({}),s=e.ref(""),c=Fe.useRoute(),u=Fe.useRouter(),h=t.entityKey||String(c.name??"").split("-")[0],{id:r}=c.params,y=e.computed(()=>c.path.replace(/\/edit\/[^/]+$/,"").replace(/\/[^/]+\/edit$/,"")),d=e.computed(()=>r?`${y.value}/${r}`:y.value||"/"),m=e.computed(()=>{var b;return((b=u.resolve(y.value).meta)==null?void 0:b.title)??""}),x=e.computed(()=>{var b;return((b=c.meta)==null?void 0:b.description)??""});function f(){u.push(y.value||"/")}async function p(){const b=i.value.validate();if(b){fe.notify({type:"warning",title:"Validation",message:Object.entries(b).map(([V,$])=>`${V}: ${$}`).join(`
|
|
4
4
|
`)});return}if(!a.value){fe.notify({type:"error",title:"Error",message:"Edit token is missing."});return}const k=await fetch(`/api/table/${a.value}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.value)});if(!k.ok){fe.notify({type:"error",title:"Error",message:`Error code: ${k.status}`});return}await k.json(),fe.notify({title:"Success!",message:"Your changes have been saved."}),u.back()}return e.onMounted(async()=>{const b=await fetch(`/api/form/gis.${h}.table/${r}`).then(V=>V.json());o.value=b.data,a.value=b.token,l.value=b.schema;const k=b.data;s.value=(k==null?void 0:k.name)||(k==null?void 0:k.title)||(k==null?void 0:k.register_key)||(k==null?void 0:k.map_key)||""}),(b,k)=>{const V=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock(e.Fragment,null,[e.createVNode(Yt,{variant:"form"},e.createSlots({breadcrumbs:e.withCtx(()=>[y.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(V,{to:y.value,class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(m.value),1)]),_:1},8,["to"]),e.createElementVNode("span",fg,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})])],64)):e.createCommentVNode("",!0),s.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[e.createVNode(V,{to:d.value,class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value),1)]),_:1},8,["to"]),e.createElementVNode("span",gg,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})])],64)):e.createCommentVNode("",!0),k[2]||(k[2]=e.createElementVNode("span",{class:"text-gray-900 font-semibold"},"Редагування",-1))]),title:e.withCtx(()=>[e.createElementVNode("div",yg,[e.createElementVNode("button",{type:"button",class:"p-0 m-0 border-0 bg-transparent cursor-pointer text-inherit hover:opacity-80",onClick:f,"aria-label":"Назад"},[e.createVNode(e.unref(ie.ArrowLeft),{size:20,class:"shrink-0"})]),e.createElementVNode("span",null,e.toDisplayString(s.value||m.value||"Редагування"),1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{class:"cursor-pointer flex items-center px-3 py-2 text-sm font-medium text-gray-800 duration-300 bg-white border border-gray-100 rounded-lg shadow gap-x-2 focus:outline-none hover:bg-gray-50 hover:border-gray-100",onClick:f}," Назад "),e.createElementVNode("button",{onClick:p,class:"cursor-pointer inline-flex items-center px-3 py-2 text-sm font-medium text-white duration-300 bg-blue-600 hover:bg-blue-700 border border-transparent rounded-lg gap-x-2 hover:text-white"}," Зберегти ")]),_:2},[x.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(x.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",hg,[e.createElementVNode("div",bg,[e.createElementVNode("div",xg,[e.createElementVNode("div",kg,[l.value?(e.openBlock(),e.createBlock(e.unref(n),{key:0,schema:l.value,values:o.value,"onUpdate:values":k[0]||(k[0]=$=>o.value=$),form:i.value,"onUpdate:form":k[1]||(k[1]=$=>i.value=$),style:{primaryColor:"blue"}},null,8,["schema","values","form"])):e.createCommentVNode("",!0)])])])])],64)}}})},Symbol.toStringTag,{value:"Module"})),wg={class:"flex items-center justify-center col-span-3 gap-2"},_g={class:"flex justify-end p-[20px] gap-[10px] border-t w-full"},Eg=e.defineComponent({__name:"vs-datatable-controls",props:e.mergeModels({index:{},data:{},scheme:{}},{columns:{type:Array,default:()=>[]},columnsModifiers:{}}),emits:["update:columns"],setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/form")),o=e.defineAsyncComponent(()=>import("@opengis/core").then(h=>h.VsModal)),l=t,a=e.useModel(t,"columns"),i=e.ref(!1),s=e.ref({}),c=e.ref({...l.data||{}});e.watch(()=>l.data,h=>{c.value={...h||{}}},{deep:!0});const u=()=>a.value=a.value.filter((h,r)=>r!==l.index),g=async()=>{const h=s.value.validate();if(h){fe.notify({type:"warning",title:"Validation",message:Object.entries(h).map(([r,y])=>`${r}: ${y}`).join(`
|
|
5
5
|
`)});return}a.value[l.index]=c.value,i.value=!1};return(h,r)=>(e.openBlock(),e.createElementBlock("div",wg,[e.createElementVNode("button",{onClick:r[0]||(r[0]=y=>{i.value=!0}),class:"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:text-accent-foreground h-8 w-8 rounded-full hover:bg-gray-100"},[e.createVNode(e.unref(ie.Edit),{class:"w-4 h-4"})]),e.createElementVNode("button",{onClick:u,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 h-8 w-8 rounded-full hover:bg-red-100 text-red-600 hover:text-red-700"},[e.createVNode(e.unref(ie.Trash),{class:"w-4 h-4"})]),e.createVNode(e.unref(o),{teleport:"#modal",size:"lg",visible:i.value,"onUpdate:visible":r[4]||(r[4]=y=>i.value=y),title:"Редагувати поле"},{footer:e.withCtx(()=>[e.createElementVNode("div",_g,[e.createElementVNode("button",{type:"button",class:"py-2 px-3 inline-flex items-center gap-x-2 text-sm whitespace-nowrap text-black border border-gray-200 rounded-lg hover:bg-gray-100 duration-300",onClick:r[3]||(r[3]=y=>i.value=!1)}," Скасувати "),e.createElementVNode("button",{class:"py-2 px-3 inline-flex items-center gap-x-2 text-sm whitespace-nowrap text-white bg-blue-500 rounded-lg !border-gray-200 hover:bg-blue-700 duration-300",onClick:g}," Зберегти ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(n),{values:c.value,"onUpdate:values":r[1]||(r[1]=y=>c.value=y),schema:t.scheme,form:s.value,"onUpdate:form":r[2]||(r[2]=y=>s.value=y)},null,8,["values","schema","form"])]),_:1},8,["visible"])]))}}),Cg={mounted(t){setTimeout(()=>{t.scrollWidth>t.clientWidth?t.setAttribute("title",t.textContent):t.removeAttribute("title")})},updated(t){setTimeout(()=>{t.scrollWidth>t.clientWidth?t.setAttribute("title",t.textContent):t.removeAttribute("title")})}},Ng={array:"purple",boolean:"red",date:"red",datetime:"purple",number:"green",text:"blue",file:"yellow",select:"yellow",slug:"green",image:"blue",badge:"orange",title:"blue",features:"green",status:"red",tags:"yellow",category:"purple",check:"green",range:"orange",autocomplete:"yellow",other:"gray","yes/no":"green"},cr=t=>Ng[t==null?void 0:t.toLowerCase()]||"gray",Vg=["array","boolean","date","datetime","number","text","file","select","slug","image","badge","title","features","status","tags","category","check","range","autocomplete"],dr=t=>{var n;return Vg.includes((n=t||"")==null?void 0:n.toLowerCase())},Bg={},$g={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-type",__v0_r:"0,5361,5384"};function Sg(t,n){return e.openBlock(),e.createElementBlock("svg",$g,[...n[0]||(n[0]=[e.createElementVNode("polyline",{points:"4 7 4 4 20 4 20 7"},null,-1),e.createElementVNode("line",{x1:"9",x2:"15",y1:"20",y2:"20"},null,-1),e.createElementVNode("line",{x1:"12",x2:"12",y1:"4",y2:"20"},null,-1)])])}const vg=Ce(Bg,[["render",Sg]]),Lg={},Ag={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-hash",__v0_r:"0,5361,5384"};function Tg(t,n){return e.openBlock(),e.createElementBlock("svg",Ag,[...n[0]||(n[0]=[e.createElementVNode("line",{x1:"4",x2:"20",y1:"9",y2:"9"},null,-1),e.createElementVNode("line",{x1:"4",x2:"20",y1:"15",y2:"15"},null,-1),e.createElementVNode("line",{x1:"10",x2:"8",y1:"3",y2:"21"},null,-1),e.createElementVNode("line",{x1:"16",x2:"14",y1:"3",y2:"21"},null,-1)])])}const Mg=Ce(Lg,[["render",Tg]]),Fg={},Dg={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-calendar",__v0_r:"0,5361,5384"};function zg(t,n){return e.openBlock(),e.createElementBlock("svg",Dg,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M8 2v4"},null,-1),e.createElementVNode("path",{d:"M16 2v4"},null,-1),e.createElementVNode("rect",{width:"18",height:"18",x:"3",y:"4",rx:"2"},null,-1),e.createElementVNode("path",{d:"M3 10h18"},null,-1)])])}const Ig=Ce(Fg,[["render",zg]]),Pg={},jg={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-calendar",__v0_r:"0,5361,5384"};function Rg(t,n){return e.openBlock(),e.createElementBlock("svg",jg,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M8 2v4"},null,-1),e.createElementVNode("path",{d:"M16 2v4"},null,-1),e.createElementVNode("rect",{width:"18",height:"18",x:"3",y:"4",rx:"2"},null,-1),e.createElementVNode("path",{d:"M3 10h18"},null,-1)])])}const Og=Ce(Pg,[["render",Rg]]),Ug={},qg={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-code",__v0_r:"0,5361,5384"};function Hg(t,n){return e.openBlock(),e.createElementBlock("svg",qg,[...n[0]||(n[0]=[e.createElementVNode("polyline",{points:"16 18 22 12 16 6"},null,-1),e.createElementVNode("polyline",{points:"8 6 2 12 8 18"},null,-1)])])}const Wg=Ce(Ug,[["render",Hg]]),Yg={},Zg={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-toggle-left",__v0_r:"0,5361,5384"};function Gg(t,n){return e.openBlock(),e.createElementBlock("svg",Zg,[...n[0]||(n[0]=[e.createElementVNode("rect",{width:"20",height:"12",x:"2",y:"6",rx:"6",ry:"6"},null,-1),e.createElementVNode("circle",{cx:"8",cy:"12",r:"2"},null,-1)])])}const Kg=Ce(Yg,[["render",Gg]]),Xg={},Qg={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-file-text",__v0_r:"0,5361,5384"};function Jg(t,n){return e.openBlock(),e.createElementBlock("svg",Qg,[...n[0]||(n[0]=[e.createStaticVNode('<path d="M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z"></path><path d="M14 2v4a2 2 0 0 0 2 2h4"></path><path d="M10 9H8"></path><path d="M16 13H8"></path><path d="M16 17H8"></path>',5)])])}const ey=Ce(Xg,[["render",Jg]]),ty={},ny={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-image",__v0_r:"0,5361,5384"};function oy(t,n){return e.openBlock(),e.createElementBlock("svg",ny,[...n[0]||(n[0]=[e.createElementVNode("rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2"},null,-1),e.createElementVNode("circle",{cx:"9",cy:"9",r:"2"},null,-1),e.createElementVNode("path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"},null,-1)])])}const ry=Ce(ty,[["render",oy]]),ly={},ay={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-list",__v0_r:"0,5361,5384"};function sy(t,n){return e.openBlock(),e.createElementBlock("svg",ay,[...n[0]||(n[0]=[e.createStaticVNode('<line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line>',6)])])}const iy=Ce(ly,[["render",sy]]),cy={},dy={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-list",__v0_r:"0,5361,5384"};function uy(t,n){return e.openBlock(),e.createElementBlock("svg",dy,[...n[0]||(n[0]=[e.createStaticVNode('<line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line>',6)])])}const my=Ce(cy,[["render",uy]]),py={},fy={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-link2",__v0_r:"0,5361,5384"};function gy(t,n){return e.openBlock(),e.createElementBlock("svg",fy,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M9 17H7A5 5 0 0 1 7 7h2"},null,-1),e.createElementVNode("path",{d:"M15 7h2a5 5 0 1 1 0 10h-2"},null,-1),e.createElementVNode("line",{x1:"8",x2:"16",y1:"12",y2:"12"},null,-1)])])}const yy=Ce(py,[["render",gy]]),hy={},by={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-list",__v0_r:"0,5361,5384"};function xy(t,n){return e.openBlock(),e.createElementBlock("svg",by,[...n[0]||(n[0]=[e.createStaticVNode('<line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line>',6)])])}const ky=Ce(hy,[["render",xy]]),wy={},_y={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-link2",__v0_r:"0,5361,5384"};function Ey(t,n){return e.openBlock(),e.createElementBlock("svg",_y,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M9 17H7A5 5 0 0 1 7 7h2"},null,-1),e.createElementVNode("path",{d:"M15 7h2a5 5 0 1 1 0 10h-2"},null,-1),e.createElementVNode("line",{x1:"8",x2:"16",y1:"12",y2:"12"},null,-1)])])}const Cy=Ce(wy,[["render",Ey]]),Ny={},Vy={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"w-4 h-4 text-gray-700 lucide lucide-list",__v0_r:"0,5361,5384"};function By(t,n){return e.openBlock(),e.createElementBlock("svg",Vy,[...n[0]||(n[0]=[e.createStaticVNode('<line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line>',6)])])}const $y=Ce(Ny,[["render",By]]),Sy={},vy={xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",height:"800px",width:"800px",version:"1.1",id:"_x32_",viewBox:"0 0 512 512","xml:space":"preserve"};function Ly(t,n){return e.openBlock(),e.createElementBlock("svg",vy,[...n[0]||(n[0]=[e.createElementVNode("g",null,[e.createElementVNode("path",{class:"st0",d:"M511.989,292.396c0.021-16.486-6.344-33.136-18.945-45.703L273.605,27.242 C262.3,15.936,247.175,9.22,231.184,8.407L66.821,0.032l1.184,0.066C66.974,0.044,65.866,0,64.67,0 C47.58,0,31.105,6.783,18.944,18.955C6.783,31.106-0.001,47.58,0.011,64.67c0,1.076,0.034,2.172,0.078,3.27l8.297,163.254 c0.835,15.981,7.54,31.106,18.857,42.421l219.451,219.451c12.578,12.589,29.217,18.955,45.703,18.934 c16.496,0.021,33.124-6.356,45.703-18.934l154.956-154.945l-11.92-11.92l11.932,11.909 C505.645,325.521,512.011,308.881,511.989,292.396z M314.26,469.216c-6.08,6.08-13.895,9.044-21.864,9.067 c-7.969-0.023-15.783-2.986-21.864-9.067L51.082,249.765c-5.4-5.4-8.616-12.633-9.023-20.305L33.762,66.238l-0.034-1.569 c0-8.188,3.238-16.048,9.055-21.875c5.839-5.839,13.697-9.077,21.886-9.077l1.502,0.044l163.288,8.319 c7.683,0.396,14.904,3.6,20.305,9.012l219.45,219.45c6.059,6.069,9.033,13.884,9.056,21.853 c-0.023,7.968-2.986,15.794-9.067,21.886h0.011L314.26,469.216z"}),e.createElementVNode("path",{class:"st0",d:"M105.632,105.642c-15.366,15.378-15.366,40.27,0,55.636c15.366,15.366,40.259,15.366,55.625,0 c15.366-15.366,15.366-40.259,0-55.636C145.891,90.276,120.998,90.276,105.632,105.642z"})],-1)])])}const Ay=Ce(Sy,[["render",Ly]]),Ty={},My={xmlns:"http://www.w3.org/2000/svg",width:"800px",height:"800px",viewBox:"0 0 24 24",fill:"none"};function Fy(t,n){return e.openBlock(),e.createElementBlock("svg",My,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M3 12C3 4.5885 4.5885 3 12 3C19.4115 3 21 4.5885 21 12C21 19.4115 19.4115 21 12 21C4.5885 21 3 19.4115 3 12Z",stroke:"#323232","stroke-width":"2"},null,-1),e.createElementVNode("path",{d:"M9 12L10.6828 13.6828V13.6828C10.858 13.858 11.142 13.858 11.3172 13.6828V13.6828L15 10",stroke:"#323232","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)])])}const ur={IconText:vg,IconNumber:Mg,IconDate:Ig,IconDatetime:Og,IconRichtext:Wg,IconBoolean:Kg,IconFile:ey,IconImage:ry,IconArray:iy,IconSelect:my,IconSlug:yy,IconDatalist:ky,IconReference:Cy,IconReferenceList:$y,IconBadge:Ay,IconCheck:Ce(Ty,[["render",Fy]])},Dy={key:0,class:"flex items-center justify-between mb-6"},zy={class:"flex justify-end w-full"},Iy={class:"overflow-hidden bg-white border border-gray-200 shadow-sm rounded-xl flex flex-col flex-1 min-h-0"},Py={class:"table-scroll-wrapper flex-1 overflow-y-auto min-h-0"},jy={class:"table-fixed w-full text-[13px]"},Ry={class:"bg-gray-50 border-b border-gray-200"},Oy={key:0},Uy=["onDragstart","onDragover","onDrop"],qy={key:0,class:"flex w-fit items-center gap-2 text-left"},Hy={class:"flex-1 min-w-0"},Wy={class:"font-medium text-gray-900 truncate"},Yy={class:"text-xs text-gray-500"},Zy={key:1,class:"flex items-center justify-center"},Gy={key:0,class:"inline-flex items-center px-2 py-1 h-fit text-[13px] font-medium rounded-md ring-1 ring-inset ring-gray-500/10 bg-gray-100"},Ky={key:1,class:"text-gray-500 text-sm"},Xy={key:3},Qy={class:"px-6 py-4"},Jy={key:1},eh=["colspan"],At=Ce(e.defineComponent({__name:"vs-datatable",props:e.mergeModels({columnsScheme:{},formScheme:{},addButton:{type:Boolean,default:!0},mainColWidth:{default:""}},{modelValue:{},modelModifiers:{}}),emits:["update:modelValue"],setup(t,{expose:n}){function o(_){return _.charAt(0).toUpperCase()+_.slice(1)}const l=e.defineAsyncComponent(()=>import("@opengis/core").then(_=>_.VsModal)),a=e.defineAsyncComponent(()=>import("@opengis/form")),i=e.useModel(t,"modelValue"),s=t,c=e.ref({}),u=e.ref(!1),g=e.ref({}),h=e.ref(null),r=e.useSlots(),y=_=>!!(_&&r[_]);n({openCreateDialog:()=>{u.value=!0}});const d=e.computed({get(){return Array.isArray(i.value)?i.value:i.value&&Array.isArray(i.value.columns)?i.value.columns:[]},set(_){Array.isArray(i.value)?i.value=_:i.value&&Array.isArray(i.value.columns)&&(i.value.columns=_)}}),m=e.computed(()=>{const _=s.columnsScheme.map(w=>w.key);return _.includes("name")&&_.includes("label")||_.includes("id")&&_.includes("label")?[{key:"main",label:"Назва",type:"main",width:"100%"},...s.columnsScheme.filter(w=>!["name","id","label"].includes(w.key))]:s.columnsScheme});function x(){u.value=!1,g.value={},h.value=null}async function f(){const _=c.value.validate();if(_){fe.notify({type:"warning",title:"Validation",message:Object.entries(_).map(([w,S])=>`${w}: ${S}`).join(`
|
|
6
|
-
`)});return}if(h.value===null)d.value=[...d.value,{...g.value}];else{const w=[...d.value];w[h.value]={...g.value},d.value=w}x()}const p=e.ref(null),b=e.ref(null),k=_=>{p.value=_},V=_=>{b.value=_},$=_=>{if(p.value===null||p.value===_){p.value=null,b.value=null;return}const w=[...d.value],[S]=w.splice(p.value,1);w.splice(_,0,S),d.value=w,p.value=null,b.value=null};return(_,w)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[t.addButton?(e.openBlock(),e.createElementBlock("div",Dy,[e.createElementVNode("div",zy,[e.createElementVNode("button",{onClick:w[0]||(w[0]=S=>u.value=!0),class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...w[4]||(w[4]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",class:"w-4 h-4 mr-2",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Додати поле ",-1)])])])])):e.createCommentVNode("",!0),e.createElementVNode("div",Iy,[e.createElementVNode("div",Py,[e.createElementVNode("table",jy,[e.createElementVNode("colgroup",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,S=>(e.openBlock(),e.createElementBlock("col",{key:S.key,style:e.normalizeStyle(S.type==="main"?`width: ${t.mainColWidth}`:S.width?`width: ${S.width}`:"auto")},null,4))),128)),w[5]||(w[5]=e.createElementVNode("col",null,null,-1))]),e.createElementVNode("thead",null,[e.createElementVNode("tr",Ry,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,S=>(e.openBlock(),e.createElementBlock("th",{key:S.key,class:"px-6 py-4"},e.toDisplayString(S.label),1))),128)),w[6]||(w[6]=e.createElementVNode("th",{class:"px-6 py-4"},"Дії",-1))])]),d.value.length?(e.openBlock(),e.createElementBlock("tbody",Oy,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(S,A)=>(e.openBlock(),e.createElementBlock("tr",{key:S.id||S.name||A,class:e.normalizeClass(["transition-colors hover:bg-gray-50/50 cursor-move",{"opacity-50":p.value===A,"border-t-2 border-b-2 border-blue-500 bg-blue-50":b.value===A}]),draggable:"true",onDragstart:R=>k(A),onDragover:e.withModifiers(R=>V(A),["prevent"]),onDrop:R=>$(A)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,R=>(e.openBlock(),e.createElementBlock("td",{key:R.key,class:"px-6 py-4 align-middle text-center"},[R.type==="main"?(e.openBlock(),e.createElementBlock("div",qy,[w[7]||(w[7]=e.createElementVNode("span",{class:"drag-handle cursor-move mr-2 text-gray-400"},"☰",-1)),e.unref(dr)(S.format==="yes/no"?"check":S.format||S.type)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["flex items-center justify-center p-1 rounded",`bg-${e.unref(cr)(S.format==="yes/no"?"check":S.format||S.type)}-100`])},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(S.format==="yes/no"?"icon-check":e.unref(ur)["Icon"+o(S.format||S.type)]||e.unref(ur).IconText),{class:"w-4 h-4"}))],2)):e.createCommentVNode("",!0),e.createElementVNode("div",Hy,[e.withDirectives((e.openBlock(),e.createElementBlock("p",Wy,[e.createTextVNode(e.toDisplayString(S.name||S.id),1)])),[[e.unref(Cg)]]),e.createElementVNode("p",Yy,e.toDisplayString(S.ua||S.label||S.name||S.id),1)])])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[R.slot&&y(R.slot)?e.renderSlot(_.$slots,R.slot,{key:0,row:S,column:R,value:S[R.key],rowIndex:A},void 0,!0):R.type==="color"?(e.openBlock(),e.createElementBlock("div",Zy,[e.createElementVNode("div",{class:e.normalizeClass(["w-4 h-4 rounded-full align-middle",`bg-[${S[R.key]}]`])},null,2)])):["format","type","meta"].includes(R.key)?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[S[R.key]?(e.openBlock(),e.createElementBlock("span",Gy,e.toDisplayString(S[R.key]),1)):(e.openBlock(),e.createElementBlock("span",Ky,"Не вказано"))],64)):(e.openBlock(),e.createElementBlock("span",Xy,e.toDisplayString(S[R.key]),1))],64))]))),128)),e.createElementVNode("td",Qy,[e.createVNode(Eg,{columns:d.value,"onUpdate:columns":w[1]||(w[1]=R=>d.value=R),data:S,index:A,scheme:t.formScheme},null,8,["columns","data","index","scheme"])])],42,Uy))),128))])):(e.openBlock(),e.createElementBlock("tr",Jy,[e.createElementVNode("td",{colspan:m.value.length+1,class:"text-gray-500 text-center py-4"}," Поля не знайдені ",8,eh)]))])])]),e.createVNode(e.unref(l),{teleport:"#modal",title:"Створити поле",size:"lg",visible:u.value,"onUpdate:visible":w[3]||(w[3]=S=>u.value=S)},{footer:e.withCtx(()=>[e.createElementVNode("div",{class:"flex justify-end p-[20px] gap-[10px] border-t w-full"},[e.createElementVNode("button",{type:"button",onClick:x,class:"px-4 py-2 rounded bg-gray-100 text-gray-700"}," Скасувати "),e.createElementVNode("button",{type:"button",onClick:f,class:"px-4 py-2 rounded bg-blue-600 text-white"}," Зберегти1 ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(a),{ref_key:"form",ref:c,modelValue:g.value,"onUpdate:modelValue":w[2]||(w[2]=S=>g.value=S),schema:t.formScheme},null,8,["modelValue","schema"])]),_:1},8,["visible"])],64))}}),[["__scopeId","data-v-25566600"]]),th={class:"p-4 text-[13px]"},nh={class:"grid grid-cols-2 gap-x-6 gap-y-2"},oh=["id","checked","onChange"],rh={class:"ml-2 flex-1 min-w-0 flex items-center gap-2"},lh={class:"font-medium text-gray-900 truncate"},ah={class:"text-xs text-gray-500"},sh={key:0,class:"text-xs text-[#B2C9D6]"},ih={class:"flex justify-end gap-2 p-4 border-t w-full"},Zt=e.defineComponent({__name:"import-fields-dialog",props:e.mergeModels({fields:{default:()=>[]},title:{},idPrefix:{default:"import"},confirmText:{default:"Імпортувати"},cancelText:{default:"Скасувати"}},{visible:{type:Boolean,default:!1},visibleModifiers:{},selection:{default:[]},selectionModifiers:{}}),emits:e.mergeModels(["confirm","cancel"],["update:visible","update:selection"]),setup(t,{emit:n}){const o=e.useModel(t,"visible"),l=e.useModel(t,"selection"),a=t,i=n,s=e.defineAsyncComponent(()=>import("@opengis/core").then(k=>k.VsModal)),c=e.computed(()=>Array.isArray(a.fields)?a.fields.filter(Boolean):[]),u=k=>(k==null?void 0:k.name)??(k==null?void 0:k.id)??(k==null?void 0:k.key)??(k==null?void 0:k.code)??(k==null?void 0:k.field)??(k==null?void 0:k.value)??"",g=k=>String(u(k)??"").trim(),h=k=>(k==null?void 0:k.title)??(k==null?void 0:k.label)??g(k),r=k=>String((k==null?void 0:k.type)??"").trim(),y=e.computed(()=>new Set(l.value.map(k=>String(k??"").trim()))),d=k=>y.value.has(g(k)),m=k=>{const V=g(k);if(!V)return;const $=new Set(y.value);$.has(V)?$.delete(V):$.add(V),l.value=Array.from($)},x=e.computed(()=>a.confirmText||"Імпортувати"),f=e.computed(()=>a.cancelText||"Скасувати"),p=()=>{o.value=!1,i("cancel")},b=()=>{i("confirm"),o.value=!1};return(k,V)=>(e.openBlock(),e.createBlock(e.unref(s),{visible:o.value,"onUpdate:visible":V[0]||(V[0]=$=>o.value=$),teleport:"#modal",title:t.title,size:"lg"},{footer:e.withCtx(()=>[e.createElementVNode("div",ih,[e.createElementVNode("button",{onClick:p,class:"px-4 py-2 rounded bg-gray-100 text-gray-700"},e.toDisplayString(f.value),1),e.createElementVNode("button",{onClick:b,class:"px-4 py-2 rounded bg-blue-600 text-white"},e.toDisplayString(x.value),1)])]),default:e.withCtx(()=>[e.createElementVNode("div",th,[e.createElementVNode("div",nh,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,$=>(e.openBlock(),e.createElementBlock("label",{key:g($),class:"flex items-center hover:bg-gray-100 rounded p-2 cursor-pointer"},[e.createElementVNode("input",{type:"checkbox",id:`${t.idPrefix}-${g($)}`,checked:d($),onChange:_=>m($)},null,40,oh),e.createElementVNode("div",rh,[e.unref(dr)($.type)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(`bg-${e.unref(cr)($.type)}-100 p-1 rounded`)},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`icon-${$.type}`),{class:"w-4 h-4"}))],2)):e.createCommentVNode("",!0),e.createElementVNode("div",null,[e.createElementVNode("p",lh,e.toDisplayString(g($)),1),e.createElementVNode("p",ah,e.toDisplayString(h($)),1),r($)?(e.openBlock(),e.createElementBlock("p",sh,e.toDisplayString(r($)),1)):e.createCommentVNode("",!0)])])]))),128))])])]),_:1},8,["visible","title"]))}});function Gt(t){return t==null?"":String(t).trim()}function Tt(t){return Gt((t==null?void 0:t.name)??(t==null?void 0:t.id)??(t==null?void 0:t.key)??(t==null?void 0:t.code)??(t==null?void 0:t.field)??(t==null?void 0:t.value)??"")}function Kt(t,n,o){const l=Array.isArray(t)?[...t]:[],a=Array.isArray(n)?n:[],{selectedKeys:i,resolveKey:s}=o,c=new Set;for(const r of i){const y=Gt(r);y&&c.add(y)}if(c.size===0)return[];const u=r=>Gt(s(r)),g=[],h=new Set;for(const r of l){const y=u(r);!y||!c.has(y)||(g.push(r),h.add(y))}for(const r of a){const y=u(r);!y||h.has(y)||!c.has(y)||(g.push(r),h.add(y))}return g}const ch={class:"vs-form"},dh={class:"vs-form__body auto-rows-max container"},uh={class:"flex flex-wrap"},mh={class:"h-fit w-full mb-6 bg-white border border-gray-200 rounded-lg p-6"},ph={class:"h-fit w-full flex flex-wrap"},fh={class:"w-full"},gh=e.defineComponent({__name:"list-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=b=>Tt(b||{}),s=e.defineAsyncComponent(()=>import("@opengis/form")),c=e.ref(),u=e.ref(!1),g=e.ref([]),h=()=>{const b=y.value.map(k=>i(k)).filter(k=>k.length>0);g.value=[...b],u.value=!0},r=e.computed(()=>{var b,k;return((b=n.value)==null?void 0:b.token)||((k=n.value)==null?void 0:k.id)||"register-form"}),y=e.computed({get:()=>(n.value||(n.value={}),Array.isArray(n.value.columns)||(n.value.columns=[]),n.value.columns),set:b=>{n.value||(n.value={}),n.value.columns=Array.isArray(b)?b:[]}}),d=e.computed({get:()=>n.value||{},set:b=>{var V;const k=Array.isArray((V=n.value)==null?void 0:V.columns)?n.value.columns:[];n.value={...n.value,...b,columns:k}}});e.watch(()=>c.value,b=>{o.value=b||null},{immediate:!0}),e.watch(u,b=>{b||(g.value=[])});const m=()=>{const b=new Set(g.value.map($=>Gt($)).filter($=>$.length>0)),k=Array.isArray(y.value)?[...y.value]:[],V=a.value.filter($=>b.has(i($))).map($=>{const _=i($),w=$.title??$.label??_;return{...$,name:_,label:w,type:$.type||"text",meta:$.meta??"features"}});y.value=Kt(k,V,{selectedKeys:g.value,resolveKey:i}),u.value=!1,g.value=[]},x={table_name:{type:"select",label:"Таблиця",required:!0,data:"pg.table_name",placeholder:"Таблиця в БД",validators:["required"],col:6},name:{type:"text",label:"Назва",required:!0,placeholder:"Назва",validators:["required"],col:6},query:{type:"text",label:"Умова",placeholder:"Умова",col:6},order:{type:"text",label:"Сортування",placeholder:"Сортування",col:6},description:{type:"textarea",label:"Опис",placeholder:"Опис",col:12}},f=[{key:"name",label:"Name",type:"text"},{key:"label",label:"Назва",type:"text"},{key:"meta",label:"Мета",type:"text"}],p={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},format:{type:"radio",label:"Формат",position:"horizontal",options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Badge",id:"badge"},{text:"Tags",id:"tags"}],validators:["required"]},is_export:{type:"switcher",label:"Експорт",info:"Чи експортувати дані колонки?",view:"switcher"},meta:{type:"combobox",label:"Мета",mode:"combo",options:[{text:"Title",id:"title"},{text:"Features",id:"features"},{text:"Status",id:"status"},{text:"Tags",id:"tags"},{text:"Category",id:"category"},{text:"Image",id:"image"}]},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["format","in",["select","badge","tags"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(b,k)=>(e.openBlock(),e.createElementBlock("div",ch,[e.createElementVNode("div",dh,[e.createElementVNode("div",uh,[e.createElementVNode("div",mh,[(e.openBlock(),e.createBlock(e.unref(s),{ref_key:"formEl",ref:c,key:r.value,schema:x,modelValue:d.value,"onUpdate:modelValue":k[0]||(k[0]=V=>d.value=V)},null,8,["modelValue"]))]),e.createElementVNode("div",ph,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...k[4]||(k[4]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",fh,[e.createVNode(At,{modelValue:y.value,"onUpdate:modelValue":k[1]||(k[1]=V=>y.value=V),"columns-scheme":f,"form-scheme":p,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:u.value,"onUpdate:visible":k[2]||(k[2]=V=>u.value=V),selection:g.value,"onUpdate:selection":k[3]||(k[3]=V=>g.value=V),fields:a.value,title:"Імпорт колонок","id-prefix":"import-column",onConfirm:m},null,8,["visible","selection","fields"])]))}}),yh={class:"vs-form"},hh={class:"vs-form__body auto-rows-max container"},bh={class:"flex flex-wrap"},xh={class:"h-fit w-full flex flex-wrap"},kh={class:"w-full"},wh=e.defineComponent({__name:"filter-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=d=>Tt(d||{}),s=e.ref(!1),c=e.ref([]),u=()=>{const d=g.value.map(m=>i(m)).filter(m=>m.length>0);c.value=[...d],s.value=!0},g=e.computed({get:()=>(n.value||(n.value={}),Array.isArray(n.value.filters)||(n.value.filters=[]),n.value.filters),set:d=>{n.value||(n.value={}),n.value.filters=Array.isArray(d)?d:[]}});e.watch(s,d=>{d||(c.value=[])});const h=()=>{const d=new Set(c.value.map(f=>Gt(f)).filter(f=>f.length>0)),m=Array.isArray(g.value)?[...g.value]:[],x=a.value.filter(f=>d.has(i(f))).map(f=>({name:i(f),label:f.title??f.label??i(f),type:f.type||"text"}));g.value=Kt(m,x,{selectedKeys:c.value,resolveKey:i}),s.value=!1,c.value=[]},r=[{key:"id",label:"Name"},{key:"label",label:"Назва"},{key:"type",label:"Тип"}],y={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},type:{type:"radio",label:"Тип",validators:["required"],position:"horizontal",options:[{text:"Check",id:"Check"},{text:"Range",id:"Range"},{text:"Date",id:"Date"},{text:"Text",id:"Text"},{text:"Select",id:"Select"}]},hidden:{label:"Приховати",type:"Switcher"},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["type","in",["Select","Autocomplete","Check"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(d,m)=>(e.openBlock(),e.createElementBlock("div",yh,[e.createElementVNode("div",hh,[e.createElementVNode("div",bh,[m[4]||(m[4]=e.createElementVNode("div",{class:"h-fit w-full flex flex-wrap mb-6 px-2"},[e.createElementVNode("p",{class:"text-sm text-gray-600"}," Налаштуйте фільтри реєстру. Оберіть поля для імпорту або відредагуйте властивості вручну. ")],-1)),e.createElementVNode("div",xh,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:u,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...m[3]||(m[3]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",kh,[e.createVNode(At,{modelValue:g.value,"onUpdate:modelValue":m[0]||(m[0]=x=>g.value=x),"columns-scheme":r,"form-scheme":y,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":m[1]||(m[1]=x=>s.value=x),selection:c.value,"onUpdate:selection":m[2]||(m[2]=x=>c.value=x),fields:a.value,title:"Імпорт фільтрів","id-prefix":"import-filter",onConfirm:h},null,8,["visible","selection","fields"])]))}}),_h={class:"vs-form"},Eh={class:"vs-form__body auto-rows-max container"},Ch={class:"flex flex-wrap"},Nh={class:"h-fit w-full flex flex-wrap"},Vh={class:"w-full"},Bh=e.defineComponent({__name:"card-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=d=>Tt(d||{}),s=e.ref(!1),c=e.ref([]),u=()=>{const d=g.value.map(m=>i(m)).filter(m=>m.length>0);c.value=[...d],s.value=!0},g=e.computed({get:()=>n.value.card,set:d=>{n.value||(n.value={}),n.value.card=Array.isArray(d)?d:[]}});e.watch(s,d=>{var m;if(d){const x=((m=g.value)==null?void 0:m.map(f=>f.name))||[];c.value=[...x]}});const h=()=>{const d=new Set(c.value.map(f=>Gt(f)).filter(f=>f.length>0)),m=Array.isArray(g.value)?[...g.value]:[],x=a.value.filter(f=>d.has(i(f))).map(f=>{const p=i(f),b=f.title??f.label??p;return{...f,name:p,label:b,format:f.format||f.type||"text",meta:f.meta||"title"}});g.value=Kt(m,x,{selectedKeys:c.value,resolveKey:i}),s.value=!1,c.value=[]},r=[{key:"name",label:"Name",type:"text"},{key:"label",label:"Назва",type:"text"},{key:"format",label:"Формат",type:"text"}],y={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},format:{type:"radio",label:"Формат",position:"horizontal",options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Badge",id:"badge"},{text:"Tags",id:"tags"}],validators:["required"]},data:{type:"text",label:"Класифікатор",conditions:["format","in",["select","badge","tags"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(d,m)=>(e.openBlock(),e.createElementBlock("div",_h,[e.createElementVNode("div",Eh,[e.createElementVNode("div",Ch,[m[4]||(m[4]=e.createElementVNode("div",{class:"h-fit w-full flex flex-wrap mb-6 px-2"},[e.createElementVNode("p",{class:"text-sm text-gray-600"}," Налаштуйте відображення картки. Оберіть потрібні поля та відредагуйте їхні властивості. ")],-1)),e.createElementVNode("div",Nh,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:u,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...m[3]||(m[3]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",Vh,[e.createVNode(At,{modelValue:g.value,"onUpdate:modelValue":m[0]||(m[0]=x=>g.value=x),"columns-scheme":r,"form-scheme":y,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":m[1]||(m[1]=x=>s.value=x),selection:c.value,"onUpdate:selection":m[2]||(m[2]=x=>c.value=x),fields:a.value,title:"Імпорт полів картки","id-prefix":"import-card",onConfirm:h},null,8,["visible","selection","fields"])]))}}),mr={template1:rr,template2:lr,template3:ar,template4:sr,template5:ir},$h={class:"space-y-4"},Sh={class:"flex items-center gap-4 bg-white border border-gray-200 rounded-lg px-6 py-4"},vh={class:"text-lg font-semibold mb-4"},Lh={class:"bg-white"},Ah={key:1,class:"text-gray-400 text-center py-12"},Th={key:2,class:"text-gray-400 text-center py-12"},Mh=e.defineComponent({__name:"preview-tab",props:e.mergeModels({hideDetailsButton:{type:Boolean,default:!1}},{data:{default:{}},dataModifiers:{}}),emits:["update:data"],setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/form")),o=e.useModel(t,"data"),l=[{text:"template1",id:"template1"},{text:"template2",id:"template2"},{text:"template3",id:"template3"},{text:"template4",id:"template4"},{text:"template5",id:"template5"}],a={view:{type:"radio",label:"Вигляд",position:"horizontal",required:!0,options:l,col:12}},i=e.computed(()=>{var h;return Array.isArray((h=o.value)==null?void 0:h.columns)?o.value.columns:[]}),s=e.computed(()=>{var h;return((h=o.value)==null?void 0:h.view)||"template1"}),c=e.computed(()=>mr[s.value]||mr.template1),u=e.computed(()=>{var y;const h=(y=o.value)==null?void 0:y.view;if(!h)return"template1";const r=l.find(d=>d.id===h);return(r==null?void 0:r.text)||h}),g=e.computed(()=>(Array.isArray(o.value.tableData)?o.value.tableData:[]).slice(0,5).map(r=>{var y,d;return{...r,service_id:(y=o.value)==null?void 0:y.service_id,is_map:(d=o.value)==null?void 0:d.is_map}}));return(h,r)=>(e.openBlock(),e.createElementBlock("div",$h,[e.createElementVNode("div",Sh,[(e.openBlock(),e.createBlock(e.unref(n),{key:o.value.id,schema:a,modelValue:o.value,"onUpdate:modelValue":r[0]||(r[0]=y=>o.value=y)},null,8,["modelValue"]))]),e.createElementVNode("h2",vh," Превʼю таблиці ("+e.toDisplayString(u.value)+") ",1),e.createElementVNode("div",Lh,[c.value&&g.value.length&&i.value.length?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value),{items:g.value,columns:i.value,path:"#",id_key:"id","hide-details-button":t.hideDetailsButton,key:s.value},null,8,["items","columns","hide-details-button"])):g.value.length?(e.openBlock(),e.createElementBlock("div",Th," Додайте колонки та виберіть вигляд для перегляду ")):(e.openBlock(),e.createElementBlock("div",Ah," Немає даних для превʼю "))])]))}}),Fh={class:"w-full mb-6"},Dh={class:"flex items-center w-full h-10 max-w-md p-1 bg-white border border-gray-200 rounded-md"},zh=["onClick"],pr=e.defineComponent({__name:"MapSettingsTabs",props:{tabs:{},activeTab:{}},emits:["update:activeTab"],setup(t,{emit:n}){const o=n,l=a=>{o("update:activeTab",a)};return(a,i)=>(e.openBlock(),e.createElementBlock("div",Fh,[e.createElementVNode("div",Dh,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.tabs,s=>(e.openBlock(),e.createElementBlock("button",{key:s.id,onClick:c=>l(s.id),class:e.normalizeClass(["inline-flex flex-1 items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all",s.id===t.activeTab?"bg-blue-50 text-blue-700":"text-gray-600 hover:bg-gray-50"])},e.toDisplayString(s.name),11,zh))),128))])]))}}),Ih={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},Ph={class:"mx-1"},jh={class:"text-gray-900 font-semibold"},Rh={key:0,class:"text-center py-12 mt-6 px-[24px]"},Oh={key:1,class:"px-[24px] overflow-y-auto"},Uh={class:"space-y-6"},qh=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"register",props:{hideDetailsButton:{type:Boolean,default:!1}},setup(t){const n=Fe.useRoute(),o=Fe.useRouter(),l=e.computed(()=>n.path.replace(/\/[^/]+$/,"")),a=e.computed(()=>{var p;return((p=o.resolve(l.value).meta)==null?void 0:p.title)??""}),i=e.computed(()=>{var p;return((p=y.value)==null?void 0:p.name)||"Налаштування реєстру"}),s=e.ref("list"),c=e.ref(""),u=e.ref(!0),g=[{name:"Список",id:"list"},{name:"Фільтри",id:"filters"},{name:"Картка",id:"card"},{name:"Перегляд",id:"preview"}],h={list:gh,filters:wh,card:Bh,preview:Mh},r=g.map(p=>p.id),y=e.ref({columns:[],filters:[],card:[],tableData:[]}),d=e.ref([]),m=async()=>{var b;if(!((b=y.value)==null?void 0:b.token)){fe.notify({type:"error",title:"Помилка",message:"Відсутній токен для збереження"});return}try{const k=await fetch(`/api/gis-registry/${n.params.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(y.value)});if(!k.ok)throw new Error(`Failed to save content: ${k.status}`);fe.notify({type:"success",title:"Успіх",message:"Контент збережено"})}catch(k){fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти контент"}),console.error(k)}},x=async p=>{try{const k=await(await fetch(`/api/gis-registry/${p}`)).json(),V=Array.isArray(k==null?void 0:k.rows)?k.rows:[];y.value.tableData=V.slice(0,3)}catch(b){console.error("Помилка завантаження превʼю:",b)}},f=async()=>{var p,b;try{u.value=!0;const V=await(await fetch(`/api/data/gis.registers.table/${n.params.id}`)).json(),$=((p=V==null?void 0:V.rows)==null?void 0:p[0])||{};c.value=$.register_key||"",y.value={...$,columns:Array.isArray($.columns)?$.columns:[],filters:Array.isArray($.filters)?$.filters:[],card:Array.isArray($.card)?$.card:[],tableData:Array.isArray($.tableData)?$.tableData:[]},(b=V==null?void 0:V.tokens)!=null&&b.edit&&(y.value.token=V.tokens.edit),d.value=Array.isArray(V==null?void 0:V.fields)?V.fields:[]}catch(k){console.error("Помилка завантаження даних:",k)}finally{u.value=!1}};return e.onMounted(async()=>{const p=n.query.tab;typeof p=="string"&&r.includes(p)&&(s.value=p),await f(),c.value&&await x(c.value)}),e.watch(s,p=>{n.query.tab!==p&&o.replace({query:{...n.query,tab:p}})}),e.watch(()=>n.query.tab,p=>{typeof p=="string"&&r.includes(p)&&s.value!==p&&(s.value=p)}),e.watch(()=>n.params.id,async(p,b)=>{!p||p===b||(await f(),c.value&&await x(c.value))}),(p,b)=>{const k=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",Ih,[e.createVNode(Yt,{variant:"form",title:i.value},{breadcrumbs:e.withCtx(()=>[l.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(k,{to:l.value,class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.value),1)]),_:1},8,["to"]),e.createElementVNode("span",Ph,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})])],64)):e.createCommentVNode("",!0),e.createElementVNode("span",jh,e.toDisplayString(i.value),1)]),description:e.withCtx(()=>[...b[3]||(b[3]=[e.createTextVNode("Налаштування реєстру",-1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{onClick:b[0]||(b[0]=V=>e.unref(o).back()),class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium border h-10 px-4 py-2 border-gray-300 text-gray-700 hover:bg-gray-50"}," Повернутися "),e.createElementVNode("button",{onClick:m,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap text-white rounded-md text-sm font-medium h-10 px-4 py-2 bg-blue-600 hover:bg-blue-700"}," Зберегти ")]),_:1},8,["title"]),u.value?(e.openBlock(),e.createElementBlock("div",Rh,[...b[4]||(b[4]=[e.createElementVNode("p",{class:"text-gray-500"},"Завантаження...",-1)])])):(e.openBlock(),e.createElementBlock("div",Oh,[e.createVNode(pr,{tabs:g,activeTab:s.value,"onUpdate:activeTab":b[1]||(b[1]=V=>s.value=V)},null,8,["activeTab"]),e.createElementVNode("div",Uh,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(h[s.value]),{data:y.value,"onUpdate:data":b[2]||(b[2]=V=>y.value=V),fields:d.value,"hide-details-button":t.hideDetailsButton,key:s.value},null,40,["data","fields","hide-details-button"]))])]))])}}})},Symbol.toStringTag,{value:"Module"}));/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function fr(t){return typeof t>"u"||t===null}function Hh(t){return typeof t=="object"&&t!==null}function Wh(t){return Array.isArray(t)?t:fr(t)?[]:[t]}function Yh(t,n){var o,l,a,i;if(n)for(i=Object.keys(n),o=0,l=i.length;o<l;o+=1)a=i[o],t[a]=n[a];return t}function Zh(t,n){var o="",l;for(l=0;l<n;l+=1)o+=t;return o}function Gh(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}var Kh=fr,Xh=Hh,Qh=Wh,Jh=Zh,e0=Gh,t0=Yh,st={isNothing:Kh,isObject:Xh,toArray:Qh,repeat:Jh,isNegativeZero:e0,extend:t0};function gr(t,n){var o="",l=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(o+='in "'+t.mark.name+'" '),o+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!n&&t.mark.snippet&&(o+=`
|
|
6
|
+
`)});return}if(h.value===null)d.value=[...d.value,{...g.value}];else{const w=[...d.value];w[h.value]={...g.value},d.value=w}x()}const p=e.ref(null),b=e.ref(null),k=_=>{p.value=_},V=_=>{b.value=_},$=_=>{if(p.value===null||p.value===_){p.value=null,b.value=null;return}const w=[...d.value],[S]=w.splice(p.value,1);w.splice(_,0,S),d.value=w,p.value=null,b.value=null};return(_,w)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[t.addButton?(e.openBlock(),e.createElementBlock("div",Dy,[e.createElementVNode("div",zy,[e.createElementVNode("button",{onClick:w[0]||(w[0]=S=>u.value=!0),class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...w[4]||(w[4]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",class:"w-4 h-4 mr-2",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Додати поле ",-1)])])])])):e.createCommentVNode("",!0),e.createElementVNode("div",Iy,[e.createElementVNode("div",Py,[e.createElementVNode("table",jy,[e.createElementVNode("colgroup",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,S=>(e.openBlock(),e.createElementBlock("col",{key:S.key,style:e.normalizeStyle(S.type==="main"?`width: ${t.mainColWidth}`:S.width?`width: ${S.width}`:"auto")},null,4))),128)),w[5]||(w[5]=e.createElementVNode("col",null,null,-1))]),e.createElementVNode("thead",null,[e.createElementVNode("tr",Ry,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,S=>(e.openBlock(),e.createElementBlock("th",{key:S.key,class:"px-6 py-4"},e.toDisplayString(S.label),1))),128)),w[6]||(w[6]=e.createElementVNode("th",{class:"px-6 py-4"},"Дії",-1))])]),d.value.length?(e.openBlock(),e.createElementBlock("tbody",Oy,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,(S,A)=>(e.openBlock(),e.createElementBlock("tr",{key:S.id||S.name||A,class:e.normalizeClass(["transition-colors hover:bg-gray-50/50 cursor-move",{"opacity-50":p.value===A,"border-t-2 border-b-2 border-blue-500 bg-blue-50":b.value===A}]),draggable:"true",onDragstart:R=>k(A),onDragover:e.withModifiers(R=>V(A),["prevent"]),onDrop:R=>$(A)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(m.value,R=>(e.openBlock(),e.createElementBlock("td",{key:R.key,class:"px-6 py-4 align-middle text-center"},[R.type==="main"?(e.openBlock(),e.createElementBlock("div",qy,[w[7]||(w[7]=e.createElementVNode("span",{class:"drag-handle cursor-move mr-2 text-gray-400"},"☰",-1)),e.unref(dr)(S.format==="yes/no"?"check":S.format||S.type)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["flex items-center justify-center p-1 rounded",`bg-${e.unref(cr)(S.format==="yes/no"?"check":S.format||S.type)}-100`])},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(S.format==="yes/no"?"icon-check":e.unref(ur)["Icon"+o(S.format||S.type)]||e.unref(ur).IconText),{class:"w-4 h-4"}))],2)):e.createCommentVNode("",!0),e.createElementVNode("div",Hy,[e.withDirectives((e.openBlock(),e.createElementBlock("p",Wy,[e.createTextVNode(e.toDisplayString(S.name||S.id),1)])),[[e.unref(Cg)]]),e.createElementVNode("p",Yy,e.toDisplayString(S.ua||S.label||S.name||S.id),1)])])):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[R.slot&&y(R.slot)?e.renderSlot(_.$slots,R.slot,{key:0,row:S,column:R,value:S[R.key],rowIndex:A},void 0,!0):R.type==="color"?(e.openBlock(),e.createElementBlock("div",Zy,[e.createElementVNode("div",{class:e.normalizeClass(["w-4 h-4 rounded-full align-middle",`bg-[${S[R.key]}]`])},null,2)])):["format","type","meta"].includes(R.key)?(e.openBlock(),e.createElementBlock(e.Fragment,{key:2},[S[R.key]?(e.openBlock(),e.createElementBlock("span",Gy,e.toDisplayString(S[R.key]),1)):(e.openBlock(),e.createElementBlock("span",Ky,"Не вказано"))],64)):(e.openBlock(),e.createElementBlock("span",Xy,e.toDisplayString(S[R.key]),1))],64))]))),128)),e.createElementVNode("td",Qy,[e.createVNode(Eg,{columns:d.value,"onUpdate:columns":w[1]||(w[1]=R=>d.value=R),data:S,index:A,scheme:t.formScheme},null,8,["columns","data","index","scheme"])])],42,Uy))),128))])):(e.openBlock(),e.createElementBlock("tr",Jy,[e.createElementVNode("td",{colspan:m.value.length+1,class:"text-gray-500 text-center py-4"}," Поля не знайдені ",8,eh)]))])])]),e.createVNode(e.unref(l),{teleport:"#modal",title:"Створити поле",size:"lg",visible:u.value,"onUpdate:visible":w[3]||(w[3]=S=>u.value=S)},{footer:e.withCtx(()=>[e.createElementVNode("div",{class:"flex justify-end p-[20px] gap-[10px] border-t w-full"},[e.createElementVNode("button",{type:"button",onClick:x,class:"px-4 py-2 rounded bg-gray-100 text-gray-700"}," Скасувати "),e.createElementVNode("button",{type:"button",onClick:f,class:"px-4 py-2 rounded bg-blue-600 text-white"}," Зберегти1 ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(a),{ref_key:"form",ref:c,modelValue:g.value,"onUpdate:modelValue":w[2]||(w[2]=S=>g.value=S),schema:t.formScheme},null,8,["modelValue","schema"])]),_:1},8,["visible"])],64))}}),[["__scopeId","data-v-25566600"]]),th={class:"p-4 text-[13px]"},nh={class:"grid grid-cols-2 gap-x-6 gap-y-2"},oh=["id","checked","onChange"],rh={class:"ml-2 flex-1 min-w-0 flex items-center gap-2"},lh={class:"font-medium text-gray-900 truncate"},ah={class:"text-xs text-gray-500"},sh={key:0,class:"text-xs text-[#B2C9D6]"},ih={class:"flex justify-end gap-2 p-4 border-t w-full"},Zt=e.defineComponent({__name:"import-fields-dialog",props:e.mergeModels({fields:{default:()=>[]},title:{},idPrefix:{default:"import"},confirmText:{default:"Імпортувати"},cancelText:{default:"Скасувати"}},{visible:{type:Boolean,default:!1},visibleModifiers:{},selection:{default:[]},selectionModifiers:{}}),emits:e.mergeModels(["confirm","cancel"],["update:visible","update:selection"]),setup(t,{emit:n}){const o=e.useModel(t,"visible"),l=e.useModel(t,"selection"),a=t,i=n,s=e.defineAsyncComponent(()=>import("@opengis/core").then(k=>k.VsModal)),c=e.computed(()=>Array.isArray(a.fields)?a.fields.filter(Boolean):[]),u=k=>(k==null?void 0:k.name)??(k==null?void 0:k.id)??(k==null?void 0:k.key)??(k==null?void 0:k.code)??(k==null?void 0:k.field)??(k==null?void 0:k.value)??"",g=k=>String(u(k)??"").trim(),h=k=>(k==null?void 0:k.title)??(k==null?void 0:k.label)??g(k),r=k=>String((k==null?void 0:k.type)??"").trim(),y=e.computed(()=>new Set(l.value.map(k=>String(k??"").trim()))),d=k=>y.value.has(g(k)),m=k=>{const V=g(k);if(!V)return;const $=new Set(y.value);$.has(V)?$.delete(V):$.add(V),l.value=Array.from($)},x=e.computed(()=>a.confirmText||"Імпортувати"),f=e.computed(()=>a.cancelText||"Скасувати"),p=()=>{o.value=!1,i("cancel")},b=()=>{i("confirm"),o.value=!1};return(k,V)=>(e.openBlock(),e.createBlock(e.unref(s),{visible:o.value,"onUpdate:visible":V[0]||(V[0]=$=>o.value=$),teleport:"#modal",title:t.title,size:"lg"},{footer:e.withCtx(()=>[e.createElementVNode("div",ih,[e.createElementVNode("button",{onClick:p,class:"px-4 py-2 rounded bg-gray-100 text-gray-700"},e.toDisplayString(f.value),1),e.createElementVNode("button",{onClick:b,class:"px-4 py-2 rounded bg-blue-600 text-white"},e.toDisplayString(x.value),1)])]),default:e.withCtx(()=>[e.createElementVNode("div",th,[e.createElementVNode("div",nh,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(c.value,$=>(e.openBlock(),e.createElementBlock("label",{key:g($),class:"flex items-center hover:bg-gray-100 rounded p-2 cursor-pointer"},[e.createElementVNode("input",{type:"checkbox",id:`${t.idPrefix}-${g($)}`,checked:d($),onChange:_=>m($)},null,40,oh),e.createElementVNode("div",rh,[e.unref(dr)($.type)?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(`bg-${e.unref(cr)($.type)}-100 p-1 rounded`)},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`icon-${$.type}`),{class:"w-4 h-4"}))],2)):e.createCommentVNode("",!0),e.createElementVNode("div",null,[e.createElementVNode("p",lh,e.toDisplayString(g($)),1),e.createElementVNode("p",ah,e.toDisplayString(h($)),1),r($)?(e.openBlock(),e.createElementBlock("p",sh,e.toDisplayString(r($)),1)):e.createCommentVNode("",!0)])])]))),128))])])]),_:1},8,["visible","title"]))}});function Gt(t){return t==null?"":String(t).trim()}function Tt(t){return Gt((t==null?void 0:t.name)??(t==null?void 0:t.id)??(t==null?void 0:t.key)??(t==null?void 0:t.code)??(t==null?void 0:t.field)??(t==null?void 0:t.value)??"")}function Kt(t,n,o){const l=Array.isArray(t)?[...t]:[],a=Array.isArray(n)?n:[],{selectedKeys:i,resolveKey:s}=o,c=new Set;for(const r of i){const y=Gt(r);y&&c.add(y)}if(c.size===0)return[];const u=r=>Gt(s(r)),g=[],h=new Set;for(const r of l){const y=u(r);!y||!c.has(y)||(g.push(r),h.add(y))}for(const r of a){const y=u(r);!y||h.has(y)||!c.has(y)||(g.push(r),h.add(y))}return g}const ch={class:"vs-form"},dh={class:"vs-form__body auto-rows-max container"},uh={class:"flex flex-wrap"},mh={class:"h-fit w-full mb-6 bg-white border border-gray-200 rounded-lg p-6"},ph={class:"h-fit w-full flex flex-wrap"},fh={class:"w-full"},gh=e.defineComponent({__name:"list-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=b=>Tt(b||{}),s=e.defineAsyncComponent(()=>import("@opengis/form")),c=e.ref(),u=e.ref(!1),g=e.ref([]),h=()=>{const b=y.value.map(k=>i(k)).filter(k=>k.length>0);g.value=[...b],u.value=!0},r=e.computed(()=>{var b,k;return((b=n.value)==null?void 0:b.token)||((k=n.value)==null?void 0:k.id)||"register-form"}),y=e.computed({get:()=>(n.value||(n.value={}),Array.isArray(n.value.columns)||(n.value.columns=[]),n.value.columns),set:b=>{n.value||(n.value={}),n.value.columns=Array.isArray(b)?b:[]}}),d=e.computed({get:()=>n.value||{},set:b=>{var V;const k=Array.isArray((V=n.value)==null?void 0:V.columns)?n.value.columns:[];n.value={...n.value,...b,columns:k}}});e.watch(()=>c.value,b=>{o.value=b||null},{immediate:!0}),e.watch(u,b=>{b||(g.value=[])});const m=()=>{const b=new Set(g.value.map($=>Gt($)).filter($=>$.length>0)),k=Array.isArray(y.value)?[...y.value]:[],V=a.value.filter($=>b.has(i($))).map($=>{const _=i($),w=$.title??$.label??_;return{...$,name:_,label:w,type:$.type||"text",meta:$.meta??"features"}});y.value=Kt(k,V,{selectedKeys:g.value,resolveKey:i}),u.value=!1,g.value=[]},x={table_name:{type:"select",label:"Таблиця",required:!0,data:"pg.table_name",placeholder:"Таблиця в БД",validators:["required"],col:6},name:{type:"text",label:"Назва",required:!0,placeholder:"Назва",validators:["required"],col:6},query:{type:"text",label:"Умова",placeholder:"Умова",col:6},order:{type:"text",label:"Сортування",placeholder:"Сортування",col:6},description:{type:"textarea",label:"Опис",placeholder:"Опис",col:12}},f=[{key:"name",label:"Name",type:"text"},{key:"label",label:"Назва",type:"text"},{key:"meta",label:"Мета",type:"text"}],p={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},format:{type:"radio",label:"Формат",position:"horizontal",options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Badge",id:"badge"},{text:"Tags",id:"tags"}],validators:["required"]},is_export:{type:"switcher",label:"Експорт",info:"Чи експортувати дані колонки?",view:"switcher"},meta:{type:"combobox",label:"Мета",mode:"combo",options:[{text:"Title",id:"title"},{text:"Features",id:"features"},{text:"Status",id:"status"},{text:"Tags",id:"tags"},{text:"Category",id:"category"},{text:"Image",id:"image"}]},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["format","in",["select","badge","tags"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(b,k)=>(e.openBlock(),e.createElementBlock("div",ch,[e.createElementVNode("div",dh,[e.createElementVNode("div",uh,[e.createElementVNode("div",mh,[(e.openBlock(),e.createBlock(e.unref(s),{ref_key:"formEl",ref:c,key:r.value,schema:x,modelValue:d.value,"onUpdate:modelValue":k[0]||(k[0]=V=>d.value=V)},null,8,["modelValue"]))]),e.createElementVNode("div",ph,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...k[4]||(k[4]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",fh,[e.createVNode(At,{modelValue:y.value,"onUpdate:modelValue":k[1]||(k[1]=V=>y.value=V),"columns-scheme":f,"form-scheme":p,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:u.value,"onUpdate:visible":k[2]||(k[2]=V=>u.value=V),selection:g.value,"onUpdate:selection":k[3]||(k[3]=V=>g.value=V),fields:a.value,title:"Імпорт колонок","id-prefix":"import-column",onConfirm:m},null,8,["visible","selection","fields"])]))}}),yh={class:"vs-form"},hh={class:"vs-form__body auto-rows-max container"},bh={class:"flex flex-wrap"},xh={class:"h-fit w-full flex flex-wrap"},kh={class:"w-full"},wh=e.defineComponent({__name:"filter-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=d=>Tt(d||{}),s=e.ref(!1),c=e.ref([]),u=()=>{const d=g.value.map(m=>i(m)).filter(m=>m.length>0);c.value=[...d],s.value=!0},g=e.computed({get:()=>(n.value||(n.value={}),Array.isArray(n.value.filters)||(n.value.filters=[]),n.value.filters),set:d=>{n.value||(n.value={}),n.value.filters=Array.isArray(d)?d:[]}});e.watch(s,d=>{d||(c.value=[])});const h=()=>{const d=new Set(c.value.map(f=>Gt(f)).filter(f=>f.length>0)),m=Array.isArray(g.value)?[...g.value]:[],x=a.value.filter(f=>d.has(i(f))).map(f=>({name:i(f),label:f.title??f.label??i(f),type:f.type||"text"}));g.value=Kt(m,x,{selectedKeys:c.value,resolveKey:i}),s.value=!1,c.value=[]},r=[{key:"id",label:"Name"},{key:"label",label:"Назва"},{key:"type",label:"Тип"}],y={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},type:{type:"radio",label:"Тип",validators:["required"],position:"horizontal",options:[{text:"Check",id:"Check"},{text:"Range",id:"Range"},{text:"Date",id:"Date"},{text:"Text",id:"Text"},{text:"Select",id:"Select"}]},hidden:{label:"Приховати",type:"Switcher"},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["type","in",["Select","Autocomplete","Check"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(d,m)=>(e.openBlock(),e.createElementBlock("div",yh,[e.createElementVNode("div",hh,[e.createElementVNode("div",bh,[m[4]||(m[4]=e.createElementVNode("div",{class:"h-fit w-full flex flex-wrap mb-6 px-2"},[e.createElementVNode("p",{class:"text-sm text-gray-600"}," Налаштуйте фільтри реєстру. Оберіть поля для імпорту або відредагуйте властивості вручну. ")],-1)),e.createElementVNode("div",xh,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:u,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...m[3]||(m[3]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",kh,[e.createVNode(At,{modelValue:g.value,"onUpdate:modelValue":m[0]||(m[0]=x=>g.value=x),"columns-scheme":r,"form-scheme":y,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":m[1]||(m[1]=x=>s.value=x),selection:c.value,"onUpdate:selection":m[2]||(m[2]=x=>c.value=x),fields:a.value,title:"Імпорт фільтрів","id-prefix":"import-filter",onConfirm:h},null,8,["visible","selection","fields"])]))}}),_h={class:"vs-form"},Eh={class:"vs-form__body auto-rows-max container"},Ch={class:"flex flex-wrap"},Nh={class:"h-fit w-full flex flex-wrap"},Vh={class:"w-full"},Bh=e.defineComponent({__name:"card-tab",props:e.mergeModels({fields:{}},{data:{default:{}},dataModifiers:{},form:{},formModifiers:{}}),emits:["update:data","update:form"],setup(t){const n=e.useModel(t,"data"),o=e.useModel(t,"form"),l=t,a=e.computed(()=>Array.isArray(l.fields)?l.fields:[]),i=d=>Tt(d||{}),s=e.ref(!1),c=e.ref([]),u=()=>{const d=g.value.map(m=>i(m)).filter(m=>m.length>0);c.value=[...d],s.value=!0},g=e.computed({get:()=>n.value.card,set:d=>{n.value||(n.value={}),n.value.card=Array.isArray(d)?d:[]}});e.watch(s,d=>{var m;if(d){const x=((m=g.value)==null?void 0:m.map(f=>f.name))||[];c.value=[...x]}});const h=()=>{const d=new Set(c.value.map(f=>Gt(f)).filter(f=>f.length>0)),m=Array.isArray(g.value)?[...g.value]:[],x=a.value.filter(f=>d.has(i(f))).map(f=>{const p=i(f),b=f.title??f.label??p;return{...f,name:p,label:b,format:f.format||f.type||"text",meta:f.meta||"title"}});g.value=Kt(m,x,{selectedKeys:c.value,resolveKey:i}),s.value=!1,c.value=[]},r=[{key:"name",label:"Name",type:"text"},{key:"label",label:"Назва",type:"text"},{key:"format",label:"Формат",type:"text"}],y={name:{type:"text",label:"Назва колонки",validators:["required"],disabled:!0},ua:{type:"text",label:"Назва",validators:["required"]},format:{type:"radio",label:"Формат",position:"horizontal",options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Badge",id:"badge"},{text:"Tags",id:"tags"}],validators:["required"]},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["format","in",["select","badge","tags"]]}};return e.onBeforeUnmount(()=>{o.value=null}),(d,m)=>(e.openBlock(),e.createElementBlock("div",_h,[e.createElementVNode("div",Eh,[e.createElementVNode("div",Ch,[m[4]||(m[4]=e.createElementVNode("div",{class:"h-fit w-full flex flex-wrap mb-6 px-2"},[e.createElementVNode("p",{class:"text-sm text-gray-600"}," Налаштуйте відображення картки. Оберіть потрібні поля та відредагуйте їхні властивості. ")],-1)),e.createElementVNode("div",Nh,[e.createElementVNode("div",{class:"flex justify-end mb-3 gap-2 w-full"},[e.createElementVNode("button",{onClick:u,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 bg-primary hover:bg-primary/90 h-10 px-4 py-2 bg-gradient-to-r from-blue-600 to-blue-500 hover:from-blue-700 hover:to-blue-600 text-white"},[...m[3]||(m[3]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2",class:"mr-1"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M12 4v16m8-8H4"})],-1),e.createTextVNode(" Імпорт ",-1)])])]),e.createElementVNode("div",Vh,[e.createVNode(At,{modelValue:g.value,"onUpdate:modelValue":m[0]||(m[0]=x=>g.value=x),"columns-scheme":r,"form-scheme":y,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])])])])]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":m[1]||(m[1]=x=>s.value=x),selection:c.value,"onUpdate:selection":m[2]||(m[2]=x=>c.value=x),fields:a.value,title:"Імпорт полів картки","id-prefix":"import-card",onConfirm:h},null,8,["visible","selection","fields"])]))}}),mr={template1:rr,template2:lr,template3:ar,template4:sr,template5:ir},$h={class:"space-y-4"},Sh={class:"flex items-center gap-4 bg-white border border-gray-200 rounded-lg px-6 py-4"},vh={class:"text-lg font-semibold mb-4"},Lh={class:"bg-white"},Ah={key:1,class:"text-gray-400 text-center py-12"},Th={key:2,class:"text-gray-400 text-center py-12"},Mh=e.defineComponent({__name:"preview-tab",props:e.mergeModels({hideDetailsButton:{type:Boolean,default:!1}},{data:{default:{}},dataModifiers:{}}),emits:["update:data"],setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/form")),o=e.useModel(t,"data"),l=[{text:"template1",id:"template1"},{text:"template2",id:"template2"},{text:"template3",id:"template3"},{text:"template4",id:"template4"},{text:"template5",id:"template5"}],a={view:{type:"radio",label:"Вигляд",position:"horizontal",required:!0,options:l,col:12}},i=e.computed(()=>{var h;return Array.isArray((h=o.value)==null?void 0:h.columns)?o.value.columns:[]}),s=e.computed(()=>{var h;return((h=o.value)==null?void 0:h.view)||"template1"}),c=e.computed(()=>mr[s.value]||mr.template1),u=e.computed(()=>{var y;const h=(y=o.value)==null?void 0:y.view;if(!h)return"template1";const r=l.find(d=>d.id===h);return(r==null?void 0:r.text)||h}),g=e.computed(()=>(Array.isArray(o.value.tableData)?o.value.tableData:[]).slice(0,5).map(r=>{var y,d;return{...r,service_id:(y=o.value)==null?void 0:y.service_id,is_map:(d=o.value)==null?void 0:d.is_map}}));return(h,r)=>(e.openBlock(),e.createElementBlock("div",$h,[e.createElementVNode("div",Sh,[(e.openBlock(),e.createBlock(e.unref(n),{key:o.value.id,schema:a,modelValue:o.value,"onUpdate:modelValue":r[0]||(r[0]=y=>o.value=y)},null,8,["modelValue"]))]),e.createElementVNode("h2",vh," Превʼю таблиці ("+e.toDisplayString(u.value)+") ",1),e.createElementVNode("div",Lh,[c.value&&g.value.length&&i.value.length?(e.openBlock(),e.createBlock(e.resolveDynamicComponent(c.value),{items:g.value,columns:i.value,path:"#",id_key:"id","hide-details-button":t.hideDetailsButton,key:s.value},null,8,["items","columns","hide-details-button"])):g.value.length?(e.openBlock(),e.createElementBlock("div",Th," Додайте колонки та виберіть вигляд для перегляду ")):(e.openBlock(),e.createElementBlock("div",Ah," Немає даних для превʼю "))])]))}}),Fh={class:"w-full mb-6"},Dh={class:"flex items-center w-full h-10 max-w-md p-1 bg-white border border-gray-200 rounded-md"},zh=["onClick"],pr=e.defineComponent({__name:"MapSettingsTabs",props:{tabs:{},activeTab:{}},emits:["update:activeTab"],setup(t,{emit:n}){const o=n,l=a=>{o("update:activeTab",a)};return(a,i)=>(e.openBlock(),e.createElementBlock("div",Fh,[e.createElementVNode("div",Dh,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.tabs,s=>(e.openBlock(),e.createElementBlock("button",{key:s.id,onClick:c=>l(s.id),class:e.normalizeClass(["inline-flex flex-1 items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all",s.id===t.activeTab?"bg-blue-50 text-blue-700":"text-gray-600 hover:bg-gray-50"])},e.toDisplayString(s.name),11,zh))),128))])]))}}),Ih={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},Ph={class:"mx-1"},jh={class:"text-gray-900 font-semibold"},Rh={key:0,class:"text-center py-12 mt-6 px-[24px]"},Oh={key:1,class:"px-[24px] overflow-y-auto"},Uh={class:"space-y-6"},qh=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"register",props:{hideDetailsButton:{type:Boolean,default:!1}},setup(t){const n=Fe.useRoute(),o=Fe.useRouter(),l=e.computed(()=>n.path.replace(/\/[^/]+$/,"")),a=e.computed(()=>{var p;return((p=o.resolve(l.value).meta)==null?void 0:p.title)??""}),i=e.computed(()=>{var p;return((p=y.value)==null?void 0:p.name)||"Налаштування реєстру"}),s=e.ref("list"),c=e.ref(""),u=e.ref(!0),g=[{name:"Список",id:"list"},{name:"Фільтри",id:"filters"},{name:"Картка",id:"card"},{name:"Перегляд",id:"preview"}],h={list:gh,filters:wh,card:Bh,preview:Mh},r=g.map(p=>p.id),y=e.ref({columns:[],filters:[],card:[],tableData:[]}),d=e.ref([]),m=async()=>{var b;if(!((b=y.value)==null?void 0:b.token)){fe.notify({type:"error",title:"Помилка",message:"Відсутній токен для збереження"});return}try{const k=await fetch(`/api/gis-registry/${n.params.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(y.value)});if(!k.ok)throw new Error(`Failed to save content: ${k.status}`);fe.notify({type:"success",title:"Успіх",message:"Контент збережено"})}catch(k){fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти контент"}),console.error(k)}},x=async p=>{try{const k=await(await fetch(`/api/gis-registry/${p}`)).json(),V=Array.isArray(k==null?void 0:k.rows)?k.rows:[];y.value.tableData=V.slice(0,3)}catch(b){console.error("Помилка завантаження превʼю:",b)}},f=async()=>{var p,b;try{u.value=!0;const V=await(await fetch(`/api/data/gis.registers.table/${n.params.id}`)).json(),$=((p=V==null?void 0:V.rows)==null?void 0:p[0])||{};c.value=$.register_key||"",y.value={...$,columns:Array.isArray($.columns)?$.columns:[],filters:Array.isArray($.filters)?$.filters:[],card:Array.isArray($.card)?$.card:[],tableData:Array.isArray($.tableData)?$.tableData:[]},(b=V==null?void 0:V.tokens)!=null&&b.edit&&(y.value.token=V.tokens.edit),d.value=Array.isArray(V==null?void 0:V.fields)?V.fields:[]}catch(k){console.error("Помилка завантаження даних:",k)}finally{u.value=!1}};return e.onMounted(async()=>{const p=n.query.tab;typeof p=="string"&&r.includes(p)&&(s.value=p),await f(),c.value&&await x(c.value)}),e.watch(s,p=>{n.query.tab!==p&&o.replace({query:{...n.query,tab:p}})}),e.watch(()=>n.query.tab,p=>{typeof p=="string"&&r.includes(p)&&s.value!==p&&(s.value=p)}),e.watch(()=>n.params.id,async(p,b)=>{!p||p===b||(await f(),c.value&&await x(c.value))}),(p,b)=>{const k=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",Ih,[e.createVNode(Yt,{variant:"form",title:i.value},{breadcrumbs:e.withCtx(()=>[l.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(k,{to:l.value,class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(a.value),1)]),_:1},8,["to"]),e.createElementVNode("span",Ph,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})])],64)):e.createCommentVNode("",!0),e.createElementVNode("span",jh,e.toDisplayString(i.value),1)]),description:e.withCtx(()=>[...b[3]||(b[3]=[e.createTextVNode("Налаштування реєстру",-1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{onClick:b[0]||(b[0]=V=>e.unref(o).back()),class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium border h-10 px-4 py-2 border-gray-300 text-gray-700 hover:bg-gray-50"}," Повернутися "),e.createElementVNode("button",{onClick:m,class:"inline-flex items-center justify-center gap-2 whitespace-nowrap text-white rounded-md text-sm font-medium h-10 px-4 py-2 bg-blue-600 hover:bg-blue-700"}," Зберегти ")]),_:1},8,["title"]),u.value?(e.openBlock(),e.createElementBlock("div",Rh,[...b[4]||(b[4]=[e.createElementVNode("p",{class:"text-gray-500"},"Завантаження...",-1)])])):(e.openBlock(),e.createElementBlock("div",Oh,[e.createVNode(pr,{tabs:g,activeTab:s.value,"onUpdate:activeTab":b[1]||(b[1]=V=>s.value=V)},null,8,["activeTab"]),e.createElementVNode("div",Uh,[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(h[s.value]),{data:y.value,"onUpdate:data":b[2]||(b[2]=V=>y.value=V),fields:d.value,"hide-details-button":t.hideDetailsButton,key:s.value},null,40,["data","fields","hide-details-button"]))])]))])}}})},Symbol.toStringTag,{value:"Module"}));/*! js-yaml 4.1.1 https://github.com/nodeca/js-yaml @license MIT */function fr(t){return typeof t>"u"||t===null}function Hh(t){return typeof t=="object"&&t!==null}function Wh(t){return Array.isArray(t)?t:fr(t)?[]:[t]}function Yh(t,n){var o,l,a,i;if(n)for(i=Object.keys(n),o=0,l=i.length;o<l;o+=1)a=i[o],t[a]=n[a];return t}function Zh(t,n){var o="",l;for(l=0;l<n;l+=1)o+=t;return o}function Gh(t){return t===0&&Number.NEGATIVE_INFINITY===1/t}var Kh=fr,Xh=Hh,Qh=Wh,Jh=Zh,e0=Gh,t0=Yh,st={isNothing:Kh,isObject:Xh,toArray:Qh,repeat:Jh,isNegativeZero:e0,extend:t0};function gr(t,n){var o="",l=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(o+='in "'+t.mark.name+'" '),o+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!n&&t.mark.snippet&&(o+=`
|
|
7
7
|
|
|
8
8
|
`+t.mark.snippet),l+" "+o):l}function pn(t,n){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=n,this.message=gr(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}pn.prototype=Object.create(Error.prototype),pn.prototype.constructor=pn,pn.prototype.toString=function(n){return this.name+": "+gr(this,n)};var gt=pn;function mo(t,n,o,l,a){var i="",s="",c=Math.floor(a/2)-1;return l-n>c&&(i=" ... ",n=l-c+i.length),o-l>c&&(s=" ...",o=l+c-s.length),{str:i+t.slice(n,o).replace(/\t/g,"→")+s,pos:l-n+i.length}}function po(t,n){return st.repeat(" ",n-t.length)+t}function n0(t,n){if(n=Object.create(n||null),!t.buffer)return null;n.maxLength||(n.maxLength=79),typeof n.indent!="number"&&(n.indent=1),typeof n.linesBefore!="number"&&(n.linesBefore=3),typeof n.linesAfter!="number"&&(n.linesAfter=2);for(var o=/\r?\n|\r|\0/g,l=[0],a=[],i,s=-1;i=o.exec(t.buffer);)a.push(i.index),l.push(i.index+i[0].length),t.position<=i.index&&s<0&&(s=l.length-2);s<0&&(s=l.length-1);var c="",u,g,h=Math.min(t.line+n.linesAfter,a.length).toString().length,r=n.maxLength-(n.indent+h+3);for(u=1;u<=n.linesBefore&&!(s-u<0);u++)g=mo(t.buffer,l[s-u],a[s-u],t.position-(l[s]-l[s-u]),r),c=st.repeat(" ",n.indent)+po((t.line-u+1).toString(),h)+" | "+g.str+`
|
|
9
9
|
`+c;for(g=mo(t.buffer,l[s],a[s],t.position,r),c+=st.repeat(" ",n.indent)+po((t.line+1).toString(),h)+" | "+g.str+`
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
`)});return}}$.value=!0;try{const q=new Set(w.value.map(v=>v.name)),ne=Object.fromEntries(Object.entries(k.value).filter(([v])=>q.has(v))),Y=a.entityType==="css"?{url:`/api/gis-css/${encodeURIComponent(a.entityId)}`,method:"POST"}:{url:`/api/gis-metadata/${encodeURIComponent(a.entityType)}/${encodeURIComponent(a.entityId)}`,method:"POST"},D=await fetch(Y.url,{method:Y.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(ne)});if(!D.ok)throw new Error(`Failed to save metadata: ${D.status}`);fe.notify({type:"success",title:"Збережено",message:"Метадані оновлено"}),b.value=!1,i("saved")}catch(q){console.error("Failed to save metadata",q),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти метадані"})}finally{$.value=!1}}}return(I,K)=>(e.openBlock(),e.createElementBlock("div",Ax,[e.createElementVNode("div",Tx,[e.createElementVNode("div",Mx,[e.createElementVNode("div",{class:"flex items-center justify-between mb-3"},[K[5]||(K[5]=e.createElementVNode("h2",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider"}," Загальна інформація ",-1)),e.createElementVNode("button",{type:"button",onClick:S,class:"inline-flex items-center gap-1 px-2 py-1 rounded-md text-xs font-medium transition-colors bg-sky-50 text-sky-600 hover:bg-sky-100"},[...K[4]||(K[4]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"})],-1),e.createTextVNode(" Редагувати ",-1)])])]),d.value.length?(e.openBlock(),e.createElementBlock("div",Fx,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,q=>(e.openBlock(),e.createElementBlock("div",{key:q.label,class:"bg-gray-50 rounded-md p-2 border border-gray-100"},[e.createElementVNode("p",Dx,e.toDisplayString(q.label),1),e.createElementVNode("p",zx,e.toDisplayString(q.value),1)]))),128))])):(e.openBlock(),e.createElementBlock("p",Ix,e.toDisplayString(St)))]),e.createElementVNode("div",Px,[K[6]||(K[6]=e.createElementVNode("h2",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider mb-3"}," Повний опис ",-1)),e.createElementVNode("p",jx,e.toDisplayString(m.value),1)]),e.createElementVNode("div",Rx,[e.createElementVNode("div",Ox,[K[8]||(K[8]=e.createElementVNode("h2",{class:"text-xs font-semibold text-gray-500 uppercase tracking-wider"}," Метадані ",-1)),p.value?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"inline-flex items-center gap-1 px-2 py-1 rounded-md text-xs font-medium transition-colors bg-sky-50 text-sky-600 hover:bg-sky-100",onClick:A},[...K[7]||(K[7]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-3.5 w-3.5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M15.232 5.232l3.536 3.536m-2.036-5.036a2.5 2.5 0 113.536 3.536L6.5 21.036H3v-3.572L16.732 3.732z"})],-1),e.createTextVNode(" Редагувати ",-1)])])):e.createCommentVNode("",!0)]),x.value.length?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass([f.value,"grid gap-2"])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(x.value,q=>(e.openBlock(),e.createElementBlock("div",{key:q.label,class:e.normalizeClass(["bg-gray-50 rounded-md p-2 border border-gray-100",{"col-span-2":R(q.label)}])},[e.createElementVNode("p",Ux,e.toDisplayString(q.label),1),e.createElementVNode("p",qx,e.toDisplayString(q.value),1)],2))),128))],2)):(e.openBlock(),e.createElementBlock("p",Hx,e.toDisplayString(St)))])]),e.createVNode(e.unref(o),{teleport:"#modal",visible:b.value,"onUpdate:visible":K[3]||(K[3]=q=>b.value=q),title:"Редагування метаданих",size:"lg"},{footer:e.withCtx(()=>[e.createElementVNode("div",Wx,[e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-gray-100 text-gray-700 text-sm",disabled:$.value,onClick:K[2]||(K[2]=q=>b.value=!1)}," Скасувати ",8,Yx),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white text-sm",disabled:$.value,onClick:Z},e.toDisplayString($.value?"Збереження…":"Зберегти"),9,Zx)])]),default:e.withCtx(()=>[e.createVNode(e.unref(l),{values:k.value,"onUpdate:values":K[0]||(K[0]=q=>k.value=q),form:V.value,"onUpdate:form":K[1]||(K[1]=q=>V.value=q),schema:w.value},null,8,["values","form","schema"])]),_:1},8,["visible"])]))}}),Gx=["href"],Kx=["href"],Xx=["href"],Qx={key:0,class:"py-6 px-4 text-sm text-gray-500"},Jx={key:1,class:"py-6 px-4 text-sm text-red-600"},e1={class:"flex justify-end gap-2 px-4 py-3 border-t border-gray-100 w-full"},t1=["disabled"],n1=["disabled"],o1=192,_l=8,bn=8,So=e.defineComponent({__name:"HeaderActions",props:{entityId:{},entityInfo:{},table:{},formEndpoint:{},saveEndpoint:{},entityLabel:{},editButtonText:{},saveMethod:{},showXmlItem:{type:Boolean,default:!0},clearTilesHandler:{}},emits:["saved"],setup(t,{emit:n}){const o=t,l=n,a=e.defineAsyncComponent(()=>import("@opengis/core").then(te=>te.VsModal)),i=e.defineAsyncComponent(()=>import("@opengis/form")),s=e.ref(!1),c=e.ref(null),u=e.ref(null),g=e.ref(null),h=e.ref(null),r=e.computed(()=>h.value?{position:"fixed",top:`${h.value.top}px`,left:`${h.value.left}px`}:{});e.watch(s,te=>{te&&e.nextTick(N)});const y=e.ref(!1),d=e.ref(null),m=e.ref({}),x=e.ref(null),f=e.ref(""),p=e.ref(!1),b=e.ref(!1),k=e.ref(null),V=e.computed(()=>o.entityId||""),$=(te,oe)=>te?typeof te=="function"?te(oe):typeof te!="string"?"":te.includes(":id")?oe?te.replace(":id",encodeURIComponent(oe)):"":te:"",_=e.computed(()=>{var te;return(te=o.table)==null?void 0:te.trim()}),w=e.computed(()=>{if(o.formEndpoint)return o.formEndpoint;if(_.value)return te=>`/api/form/${_.value}/${te}`}),S=e.computed(()=>{if(o.saveEndpoint)return o.saveEndpoint;if(_.value)return te=>`/api/table/${te}`}),A=e.computed(()=>$(w.value,V.value)),R=e.computed(()=>o.saveEndpoint?$(o.saveEndpoint,V.value):k.value?`/api/table/${encodeURIComponent(k.value)}`:$(S.value,V.value)),Z=e.computed(()=>$("/api/gis-clear-rtile/:id",V.value)),I=e.computed(()=>$("/api/gis-xml/:id",V.value)),K=e.computed(()=>$("/api/gis-pretile/:id?zoom=10&max=12",V.value)),q=e.computed(()=>{var ge,he,ce;const te=(he=(ge=o.entityInfo)==null?void 0:ge.name)==null?void 0:he.trim();if(te)return`Редагування ${te}`;const oe=(ce=o.entityLabel)==null?void 0:ce.trim();return oe?`Редагування ${oe}`:"Редагування"}),ne=e.computed(()=>o.editButtonText||"Редагувати"),Y=e.computed(()=>(o.saveMethod||"POST").toUpperCase());function D(){s.value||N(),s.value=!s.value}function v(){s.value=!1}async function F(){const te=o.clearTilesHandler;!te||!V.value||(v(),await te(V.value))}function N(){var Ge;if(typeof window>"u"||!u.value)return;const te=u.value.getBoundingClientRect(),oe=window.innerWidth,ge=window.innerHeight,he=te.left,ce=Math.max(oe-o1-bn,bn),Be=Math.min(Math.max(he,bn),ce),We=((Ge=g.value)==null?void 0:Ge.offsetHeight)??0,qe=te.bottom+_l;let Re=qe;if(We&&qe+We>ge-bn){const Ke=te.top-_l-We;Re=Math.max(Ke,bn)}h.value={top:Re,left:Be}}function E(te){var ge,he;if(!c.value&&!g.value)return;const oe=te.target;oe&&((ge=c.value)!=null&&ge.contains(oe)||(he=g.value)!=null&&he.contains(oe))||(s.value=!1)}function T(){s.value&&N()}e.onMounted(()=>{window.addEventListener("click",E),window.addEventListener("resize",T),window.addEventListener("scroll",T,!0)}),e.onUnmounted(()=>{window.removeEventListener("click",E),window.removeEventListener("resize",T),window.removeEventListener("scroll",T,!0)});async function z(){var te,oe,ge;if(!(!V.value||!A.value)){v(),y.value=!0,p.value=!0,f.value="",d.value=null,m.value={},k.value=null;try{const he=await fetch(A.value);if(!he.ok)throw new Error(`Failed to load form: ${he.status}`);const ce=await he.json();m.value=(ce==null?void 0:ce.data)||{},d.value=(ce==null?void 0:ce.schema)||null;const Be=typeof(ce==null?void 0:ce.token)=="string"&&ce.token||typeof((te=ce==null?void 0:ce.tokens)==null?void 0:te.edit)=="string"&&ce.tokens.edit||typeof((oe=ce==null?void 0:ce.tokens)==null?void 0:oe.edit_token)=="string"&&ce.tokens.edit_token||typeof((ge=ce==null?void 0:ce.data)==null?void 0:ge.token)=="string"&&ce.data.token||null;k.value=Be,x.value=null}catch(he){console.error("Failed to load edit form",he),f.value="Не вдалося завантажити форму редагування"}finally{p.value=!1}}}function Q(){y.value=!1,d.value=null,f.value="",k.value=null}async function se(){var te,oe;if(!(!V.value||!R.value)){if(x.value){const ge=(oe=(te=x.value).validate)==null?void 0:oe.call(te);if(ge){fe.notify({type:"warning",title:"Validation",message:Object.entries(ge).map(([he,ce])=>`${he}: ${ce}`).join(`
|
|
39
39
|
`)});return}}b.value=!0;try{const ge=await fetch(R.value,{method:Y.value,headers:{"Content-Type":"application/json"},body:JSON.stringify(m.value)});if(!ge.ok)throw new Error(`Failed to save: ${ge.status}`);fe.notify({type:"success",title:"Збережено",message:"Зміни збережено"}),l("saved",m.value),Q()}catch(ge){console.error("Failed to save edit form",ge),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти зміни"})}finally{b.value=!1}}}return(te,oe)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"root",ref:c,class:"relative flex items-center"},[e.createElementVNode("button",{ref_key:"triggerButton",ref:u,type:"button",onClick:e.withModifiers(D,["stop"]),class:"flex items-center justify-center w-9 h-9 hover:rounded-md hover:border hover:border-gray-200 bg-white text-gray-600 hover:bg-gray-50 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-sky-500","aria-label":"Дії"},[...oe[3]||(oe[3]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",class:"h-5 w-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5.5v.01M12 12v.01M12 18.5v.01"})],-1)])],512),(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[s.value?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuContainer",ref:g,style:e.normalizeStyle(r.value),class:"absolute top-0 left-0 mt-2 w-48 rounded-xl border border-gray-200 bg-white shadow-lg text-sm z-[1000]"},[Z.value||t.clearTilesHandler?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[t.clearTilesHandler?(e.openBlock(),e.createElementBlock("button",{key:0,type:"button",class:"flex items-center gap-2 w-full px-4 py-2 text-left text-gray-700 hover:bg-slate-50 hover:rounded-t-xl",onClick:F},[e.createVNode(e.unref(ie.BrushCleaning),{size:16,class:"lucide lucide-brush-cleaning text-gray-500"}),oe[4]||(oe[4]=e.createElementVNode("span",null,"Очистити тайли",-1))])):(e.openBlock(),e.createElementBlock("a",{key:1,href:Z.value,target:"_blank",rel:"noreferrer",class:"flex items-center gap-2 px-4 py-2 text-left text-gray-700 hover:bg-slate-50 hover:rounded-t-xl",onClick:v},[e.createVNode(e.unref(ie.BrushCleaning),{size:16,class:"lucide lucide-brush-cleaning text-gray-500"}),oe[5]||(oe[5]=e.createElementVNode("span",null,"Очистити тайли",-1))],8,Gx))],64)):e.createCommentVNode("",!0),t.showXmlItem?(e.openBlock(),e.createElementBlock("a",{key:1,href:I.value,target:"_blank",rel:"noreferrer",class:"flex items-center gap-2 px-4 py-2 text-left text-gray-700 hover:bg-slate-50 hover:rounded-t-xl",onClick:v},[e.createVNode(e.unref(ie.SquareCode),{size:16,class:"lucide lucide-square-code text-gray-500"}),oe[6]||(oe[6]=e.createElementVNode("span",null,"Створити XML",-1))],8,Kx)):e.createCommentVNode("",!0),t.showXmlItem?(e.openBlock(),e.createElementBlock("a",{key:2,href:K.value,target:"_blank",rel:"noreferrer",class:"flex items-center gap-2 px-4 py-2 text-left text-gray-700 hover:bg-slate-50 hover:rounded-t-xl",onClick:v},[e.createVNode(e.unref(ie.SquareCode),{size:16,class:"lucide lucide-square-code text-gray-500"}),oe[7]||(oe[7]=e.createElementVNode("span",null,"Pretile",-1))],8,Xx)):e.createCommentVNode("",!0),e.createElementVNode("button",{type:"button",class:"flex items-center gap-2 w-full px-4 py-2 text-left text-gray-700 hover:bg-slate-50 hover:rounded-b-xl",onClick:z},[e.createVNode(e.unref(ie.Pencil),{size:16,class:"lucide lucide-pencil text-gray-500"}),e.createElementVNode("span",null,e.toDisplayString(ne.value),1)])],4)):e.createCommentVNode("",!0)])),e.createVNode(e.unref(a),{teleport:"#modal",visible:y.value,"onUpdate:visible":oe[2]||(oe[2]=ge=>y.value=ge),title:q.value,size:"lg"},{footer:e.withCtx(()=>[e.createElementVNode("div",e1,[e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-gray-100 text-gray-700",onClick:Q,disabled:b.value}," Скасувати ",8,t1),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white",onClick:se,disabled:b.value},e.toDisplayString(b.value?"Зберігається…":"Зберегти"),9,n1)])]),default:e.withCtx(()=>[p.value?(e.openBlock(),e.createElementBlock("div",Qx," Завантаження форми редагування… ")):f.value?(e.openBlock(),e.createElementBlock("div",Jx,e.toDisplayString(f.value),1)):(e.openBlock(),e.createBlock(e.unref(i),{key:2,values:m.value,"onUpdate:values":oe[0]||(oe[0]=ge=>m.value=ge),form:x.value,"onUpdate:form":oe[1]||(oe[1]=ge=>x.value=ge),schema:d.value},null,8,["values","form","schema"]))]),_:1},8,["visible","title"])],512))}}),xn="cartocss",r1={defaultToken:"",tokenPostfix:".cartocss",ignoreCase:!0,tokenizer:{root:[[/\s*\/\*/,"comment","@comment"],[/\s*"(?:[^"\\]|\\.)*"/,"string"],[/\s*'(?:[^'\\]|\\.)*'/,"string"],[/#[a-zA-Z_][a-zA-Z0-9_-]*/,"type"],[/\.[a-zA-Z_][a-zA-Z0-9_-]*/,"type"],[/\[[^\]]*\]/,"keyword"],[/::[a-zA-Z_][a-zA-Z0-9_-]*/,"tag"],[/[a-zA-Z_][a-zA-Z0-9_-]*(?=\s*:)/,"attribute.name"],[/[-]?\d+\.?\d*(px|em|%|pt)?/,"number"],[/#[0-9a-fA-F]{3,8}\b/,"string"],[/[,{};:()[\]]/,"delimiter"],[/\s+/,""]],comment:[[/\*\//,"comment","@pop"],[/[^*]+/,"comment"],[/./,"comment"]]}},l1={comments:{blockComment:["/*","*/"]},brackets:[["{","}"],["[","]"],["(",")"]],autoClosingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}],surroundingPairs:[{open:"{",close:"}"},{open:"[",close:"]"},{open:"(",close:")"},{open:'"',close:'"'},{open:"'",close:"'"}]},El=["image-filters","image-filters-inflate","direct-image-filters","comp-op","opacity","polygon","polygon-fill","polygon-opacity","polygon-gamma","polygon-gamma-method","polygon-clip","polygon-simplify","polygon-simplify-algorithm","polygon-smooth","polygon-geometry-transform","polygon-comp-op","polygon-pattern-file","polygon-pattern-opacity","polygon-pattern-clip","polygon-pattern-alignment","polygon-pattern-gamma","polygon-pattern-simplify","polygon-pattern-simplify-algorithm","polygon-pattern-smooth","polygon-pattern-geometry-transform","polygon-pattern-transform","polygon-pattern-comp-op","line","line-color","line-width","line-opacity","line-join","line-cap","line-gamma","line-gamma-method","line-dasharray","line-dash-offset","line-miterlimit","line-clip","line-simplify","line-simplify-algorithm","line-smooth","line-offset","line-rasterizer","line-geometry-transform","line-comp-op","line-pattern-file","line-pattern-opacity","line-pattern-clip","line-pattern-simplify","line-pattern-simplify-algorithm","line-pattern-smooth","line-pattern-offset","line-pattern-geometry-transform","line-pattern-transform","line-pattern-comp-op","marker","marker-file","marker-opacity","marker-fill-opacity","marker-line-color","marker-line-width","marker-line-opacity","marker-placement","marker-multi-policy","marker-type","marker-width","marker-height","marker-fill","marker-allow-overlap","marker-avoid-edges","marker-ignore-placement","marker-spacing","marker-max-error","marker-transform","marker-clip","marker-simplify","marker-simplify-algorithm","marker-smooth","marker-geometry-transform","marker-offset","marker-comp-op","marker-direction","shield","shield-name","shield-file","shield-face-name","shield-unlock-image","shield-size","shield-fill","shield-placement","shield-avoid-edges","shield-allow-overlap","shield-margin","shield-repeat-distance","shield-min-distance","shield-spacing","shield-min-padding","shield-label-position-tolerance","shield-wrap-width","shield-wrap-before","shield-wrap-character","shield-halo-fill","shield-halo-radius","shield-halo-rasterizer","shield-halo-transform","shield-halo-comp-op","shield-halo-opacity","shield-character-spacing","shield-line-spacing","shield-text-dx","shield-text-dy","shield-dx","shield-dy","shield-opacity","shield-text-opacity","shield-horizontal-alignment","shield-vertical-alignment","shield-placement-type","shield-placements","shield-text-transform","shield-justify-alignment","shield-transform","shield-clip","shield-simplify","shield-simplify-algorithm","shield-smooth","shield-comp-op","shield-grid-cell-width","shield-grid-cell-height","raster","raster-opacity","raster-filter-factor","raster-scaling","raster-mesh-size","raster-comp-op","raster-colorizer-default-mode","raster-colorizer-default-color","raster-colorizer-epsilon","raster-colorizer-stops","point","point-file","point-allow-overlap","point-ignore-placement","point-opacity","point-placement","point-transform","point-comp-op","text","text-name","text-face-name","text-size","text-ratio","text-wrap-width","text-wrap-before","text-wrap-character","text-repeat-wrap-character","text-spacing","text-character-spacing","text-line-spacing","text-label-position-tolerance","text-max-char-angle-delta","text-fill","text-opacity","text-halo-opacity","text-halo-fill","text-halo-radius","text-halo-rasterizer","text-halo-transform","text-dx","text-dy","text-vertical-alignment","text-avoid-edges","text-margin","text-repeat-distance","text-min-distance","text-min-padding","text-min-path-length","text-allow-overlap","text-orientation","text-rotate-displacement","text-upright","text-placement","text-placement-type","text-placements","text-transform","text-horizontal-alignment","text-align","text-clip","text-simplify","text-simplify-algorithm","text-smooth","text-comp-op","text-halo-comp-op","text-font-feature-settings","text-largest-bbox-only","text-grid-cell-width","text-grid-cell-height","building","building-fill","building-fill-opacity","building-height","debug-mode","dot","dot-fill","dot-opacity","dot-width","dot-height","dot-comp-op"],a1={"polygon-fill":"Fill color to assign to a polygon. Type: color.","polygon-opacity":"The opacity of the polygon (0-1). Type: float.","line-color":"The color of a drawn line. Type: color.","line-width":"The width of a line in pixels. Type: float.","line-opacity":"The opacity of a line (0-1). Type: float.","line-dasharray":"Dash pattern: pair of length values [a,b] or more. Type: numbers.","marker-fill":"The color of the area of the marker. Type: color.","marker-width":"The width of the marker in pixels. Type: float.","marker-height":"The height of the marker in pixels. Type: float.","marker-file":"A file that this marker shows at each placement. Type: uri (e.g. url('marker.png')).","text-name":"Value to use for a text label. Data columns: [column_name]. Type: string.","text-face-name":"Font name and style to render a label in. Type: string.","text-size":"Text size in pixels. Type: float.","text-fill":"Specifies the color for the text. Type: color.","text-halo-fill":"Specifies the color of the halo around the text. Type: color.","text-halo-radius":"Specify the radius of the halo in pixels. Type: float.","comp-op":"Composite operation. Defines how this layer behaves relative to layers atop or below it. Type: keyword.",opacity:"An alpha value for the style (0-1). Type: float."};let Cl=!1;function s1(t,n){if(n<1)return null;const l=t.substring(0,n-1).match(/[a-zA-Z_-]+$/);if(!l)return null;const a=l[0],i=n-a.length;return{prefix:a,startColumn:i,endColumn:n}}function i1(t,n){const o=/[a-zA-Z_-]+\s*:/g;let l;for(;(l=o.exec(t))!==null;){const a=l[0].replace(/\s*:$/,"").trim(),i=l.index+1,s=l.index+l[0].length,u=t.substring(s).indexOf(";"),g=u>=0?s+u+1:t.length+1;if(n>=i&&n<=g)return El.includes(a)?a:null}return null}function c1(t){Cl||(Cl=!0,t.languages.register({id:xn}),t.languages.setMonarchTokensProvider(xn,r1),t.languages.setLanguageConfiguration(xn,l1),t.languages.registerCompletionItemProvider(xn,{provideCompletionItems(n,o){const l=n.getLineContent(o.lineNumber),a=s1(l,o.column),i=((a==null?void 0:a.prefix)??"").toLowerCase(),s=a&&a.startColumn>=1?{startLineNumber:o.lineNumber,startColumn:a.startColumn,endLineNumber:o.lineNumber,endColumn:a.endColumn}:void 0;return{suggestions:El.filter(u=>!i||u.toLowerCase().includes(i)||u.toLowerCase().startsWith(i)).map(u=>({label:u,kind:t.languages.CompletionItemKind.Property,insertText:u+": ",...s&&{range:s}}))}}}),t.languages.registerHoverProvider(xn,{provideHover(n,o){const l=n.getLineContent(o.lineNumber),a=i1(l,o.column);if(!a)return;const i=a1[a];return{contents:[{value:`**${a}**
|
|
40
40
|
|
|
41
|
-
${i??"CartoCSS property (Mapnik)."}`}]}}}))}const kn=e.defineComponent({__name:"MonacoEditor",props:{modelValue:{},language:{},theme:{}},emits:["update:modelValue","load"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(null);let i=null,s=null,c=!1;function u(){return new Promise((h,r)=>{if(s)return h(s);if(window.monaco)return s=window.monaco,h(s);const y=m=>{if([...document.styleSheets].some(f=>{var p;return(p=f==null?void 0:f.href)==null?void 0:p.includes(m)}))return;const x=document.createElement("link");x.rel="stylesheet",x.href=m,document.head.appendChild(x)},d=m=>new Promise((x,f)=>{const p=document.createElement("script");p.src=m,p.onload=()=>x(!0),p.onerror=f,document.body.appendChild(p)});y("https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs/editor/editor.main.min.css"),d("https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs/loader.min.js").then(()=>{window.require.config({paths:{vs:"https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs"}}),window.require(["vs/editor/editor.main"],()=>{s=window.monaco,h(s)})}).catch(r)})}function g(){var m,x;if(!a.value||!s)return;i&&i.dispose();const h=o.language||"yaml",r=s.editor.createModel(o.modelValue||"",h),y=h==="cartocss"?{acceptSuggestionOnCommitCharacter:!1,acceptSuggestionOnEnter:"off",snippetSuggestions:"none",tabCompletion:"off",wordBasedSuggestions:"off"}:{};i=s.editor.create(a.value,{model:r,theme:o.theme||"vs-light",automaticLayout:!0,minimap:{enabled:!1},...y});const d=h;s.editor.setModelLanguage(r,d),d==="css"&&((x=(m=s.languages)==null?void 0:m.css)!=null&&x.cssDefaults)&&s.languages.css.cssDefaults.setDiagnosticsOptions({validate:!1,lint:{}}),i.onDidChangeModelContent(()=>{c||l("update:modelValue",i.getValue())})}return e.watch(()=>o.modelValue,h=>{if(!i)return;const r=i.getModel();if(!r)return;const y=r.getValue();if(h!==y){const d=i.getPosition(),m=i.getSelection(),x=i.getScrollTop(),f=i.getScrollLeft();c=!0,i.executeEdits("external-model-sync",[{range:r.getFullModelRange(),text:h||"",forceMoveMarkers:!0}]),m&&i.setSelection(m),d&&i.setPosition(d),i.setScrollTop(x),i.setScrollLeft(f),c=!1}}),e.watch(()=>o.language,h=>{i&&s&&s.editor.setModelLanguage(i.getModel(),h||"yaml")}),e.watch(()=>o.theme,h=>{i&&s&&s.editor.setTheme(h||"vs-light")}),e.onMounted(async()=>{await u(),c1(s),g()}),e.onBeforeUnmount(()=>{i&&i.dispose()}),(h,r)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"editorContainer",ref:a,class:"w-full h-full"},null,512))}}),d1={class:"flex flex-col flex-1 overflow-hidden"},u1={class:"flex justify-end gap-2"},m1=["href"],p1={class:"flex flex-col flex-1 overflow-hidden"},f1={class:"bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden mt-3 flex flex-col flex-1"},g1={class:"relative bg-gradient-to-br from-slate-50 to-white flex-1"},y1=e.defineComponent({__name:"vs-tab-style",props:{token:{},styleYaml:{},styleText:{}},emits:["update:style-yaml","update:style-text","update"],setup(t,{emit:n}){const o=t,l=n,a=e.ref("");e.watch(()=>o.styleText,u=>{const g=u??"";a.value!==g&&(a.value=g)},{immediate:!0}),e.watch(a,async u=>{var h,r;const g=u??"";o.styleText!==g&&l("update:style-text",g);try{const y=u?hl(u):null;if((h=y==null?void 0:y.colorAttr)!=null&&h.length&&((r=o.styleYaml)==null?void 0:r.colorAttr)!==y.colorAttr){const d=await i(y.colorAttr);y.colors=d.reduce((x,f,p)=>({...x,[f.id.toString()]:s[p]}),{});const m=bl(y);m!==a.value&&(a.value=m)}JSON.stringify(y)!==JSON.stringify(o.styleYaml)&&l("update:style-yaml",y&&typeof y=="object"?y:null)}catch{o.styleYaml!==null&&l("update:style-yaml",null)}});async function i(u){return(await fetch(`/api/gis-service/${o.token}/${u}`).then(h=>h.json())).rows}const s=["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd"],c=async()=>{const u=o.styleYaml?JSON.stringify(o.styleYaml):o.styleText?o.styleText:"null";try{await fetch(`/api/gis-service/${o.token}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({style:u})}),l("update"),fe.notify({type:"success",title:"Успіх",message:"Стилі збережено"})}catch(g){fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти стилі"}),console.log(g)}};return(u,g)=>(e.openBlock(),e.createElementBlock("div",d1,[e.createElementVNode("div",u1,[e.createElementVNode("a",{target:"_blank",href:"/api/gis-service/"+o.token+"/col",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Атрибути ",8,m1),e.createElementVNode("button",{onClick:c,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"},[...g[1]||(g[1]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-save h-3 w-3 mr-1"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти стилі ",-1)])])]),e.createElementVNode("div",p1,[e.createElementVNode("div",f1,[g[2]||(g[2]=e.createElementVNode("div",{class:"bg-gradient-to-r from-gray-50 to-gray-100 px-4 py-2 border-b border-gray-200 flex items-center justify-between"},[e.createElementVNode("div",{class:"text-xs text-gray-400"},"YAML")],-1)),e.createElementVNode("div",g1,[e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h),language:"yaml",theme:"vs-light"},null,8,["modelValue"])])])])]))}}),h1={class:"flex flex-col flex-1 min-h-0"},b1={class:"flex flex-col flex-1 min-h-0"},x1=e.defineComponent({__name:"vs-tab-popup",props:{token:{},fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>a.value=m||[],{immediate:!0}),e.watch(a,m=>{const x=Ue(o.token);x&&(x.popup=m),l("update:columns",m)});const i=e.ref("list"),s=e.ref(!1),c=e.ref([]),u=[{key:"name",label:"Назва",type:"main"}],g={name:{type:"text",label:"Назва",disabled:!0,validators:["required"]},label:{type:"text",label:"Найменування",validators:["required"]},meta:{type:"radio",label:"Meta",mode:"combo",options:[{text:"Заголовок",id:"title"},{text:"Властивість",id:"feature"},{text:"Бейдж",id:"badge"}]},data:{type:"text",label:"Data"}};function h(){c.value=a.value.map(m=>m.name||m.id),s.value=!0}function r(){var p;const m=[...a.value],x=((p=o.fields)==null?void 0:p.filter(b=>c.value.includes(b.name)))||[],f=Kt(m,x,{selectedKeys:c.value,resolveKey:b=>Tt(b)});a.value=f,s.value=!1,c.value=[]}function y(){s.value=!1,c.value=[]}function d(){let m=[];i.value==="all"?m=o.fields||[]:i.value==="none"?m=[]:m=a.value,m.filter(x=>!x.label).forEach(x=>x.label=x.ua),l("save",m)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",h1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти попап ")]),e.createElementVNode("div",b1,[i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":x[1]||(x[1]=f=>s.value=f),selection:c.value,"onUpdate:selection":x[2]||(x[2]=f=>c.value=f),fields:t.fields,title:"Імпорт полів","id-prefix":"import-popup",onConfirm:r,onCancel:y},null,8,["visible","selection","fields"])]))}}),k1={class:"flex flex-col flex-1 min-h-0"},w1={class:"flex justify-between mb-3 gap-2"},_1={class:"p-4 space-y-4 text-sm"},E1={class:"space-y-1"},C1={class:"space-y-1"},N1={class:"flex items-center gap-3"},V1={class:"flex justify-end gap-2 p-4 border-t"},B1=e.defineComponent({__name:"vs-tab-legend",props:{mapInfo:{},token:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>{a.value=m||[]}),e.watch(a,m=>{l("update:columns",m)});const i=e.ref(!1),s=e.ref({name:"",color:"#2E86DE"}),c=e.defineAsyncComponent(()=>import("@opengis/core").then(m=>m.VsModal)),u=[{key:"name",label:"Назва"},{key:"color",label:"Колір",type:"color"}],g={name:{type:"text",label:"Назва",validators:["required"]},color:{type:"color",label:"Колір",validators:["required"]}};function h(m){m&&r(),i.value=m}function r(){s.value={name:"",color:"#2E86DE"}}function y(){var p,b;const m=(p=s.value.name)==null?void 0:p.trim();if(!m){fe.notify({type:"warning",title:"Перевірка",message:"Вкажіть назву елементу легенди"});return}const x=((b=s.value.color)==null?void 0:b.trim())||"#2E86DE";if(a.value.some(k=>Tt(k)===Tt({name:m}))){fe.notify({type:"warning",title:"Дубль",message:"Такий елемент легенди вже існує"});return}a.value=[...a.value,{name:m,color:x}],r(),i.value=!1}function d(){l("save",a.value)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",k1,[e.createElementVNode("div",w1,[e.createElementVNode("button",{onClick:x[0]||(x[0]=f=>i.value=!0),class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Додати "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти легенду ")]),e.createVNode(At,{modelValue:a.value,"onUpdate:modelValue":x[1]||(x[1]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"]),e.createVNode(e.unref(c),{teleport:"#modal",visible:i.value,title:"Новий елемент легенди","onUpdate:visible":h},{footer:e.withCtx(()=>[e.createElementVNode("div",V1,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed",onClick:x[5]||(x[5]=f=>h(!1))}," Скасувати "),e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed",onClick:y}," Додати ")])]),default:e.withCtx(()=>[e.createElementVNode("div",_1,[e.createElementVNode("div",E1,[x[6]||(x[6]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Назва ",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[2]||(x[2]=f=>s.value.name=f),type:"text",class:"w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200",placeholder:"Наприклад, Житлова зона"},null,512),[[e.vModelText,s.value.name]])]),e.createElementVNode("div",C1,[x[7]||(x[7]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Колір ",-1)),e.createElementVNode("div",N1,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[3]||(x[3]=f=>s.value.color=f),type:"color",class:"h-10 w-16 rounded border border-gray-300"},null,512),[[e.vModelText,s.value.color]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[4]||(x[4]=f=>s.value.color=f),type:"text",class:"flex-1 rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200",placeholder:"#FFFFFF"},null,512),[[e.vModelText,s.value.color]])])])])]),_:1},8,["visible"])]))}}),$1={class:"space-y-3 bg-gradient-to-br from-sky-50 to-blue-50 p-4 rounded-xl border border-sky-100 shadow-sm"},S1=["onClick"],v1=["aria-checked","value"],L1={key:0},A1=e.defineComponent({__name:"view-mode-toggle",props:{modelValue:{},options:{},showHtml:{type:Boolean}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,l=n,a=s=>l("update:modelValue",s),i=o.options||[{value:"all",label:"All"},{value:"list",label:"List"},{value:"none",label:"None"}];return(s,c)=>(e.openBlock(),e.createElementBlock("div",$1,[c[1]||(c[1]=e.createElementVNode("label",{class:"text-sm font-medium text-gray-600"},"Режим відображення",-1)),e.createElementVNode("div",{role:"radiogroup",class:e.normalizeClass(["grid gap-2",`grid-cols-${e.unref(i).length}`])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(i),u=>(e.openBlock(),e.createElementBlock("div",{key:u.value,onClick:g=>a(u.value),class:e.normalizeClass(["flex items-center justify-center space-x-2 rounded-lg p-2 border transition-all duration-300 cursor-pointer",[t.modelValue===u.value?"bg-gradient-to-r from-sky-200 to-blue-200 border-transparent shadow-sm":"bg-white border-gray-100 hover:border-sky-200 hover:shadow-sm"]])},[e.createElementVNode("button",{type:"button",role:"radio","aria-checked":t.modelValue===u.value,value:u.value,class:"aspect-square rounded-full border border-primary h-4 w-4 flex items-center justify-center text-sky-500"},[t.modelValue===u.value?(e.openBlock(),e.createElementBlock("span",L1,[...c[0]||(c[0]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-circle h-2.5 w-2.5 fill-current text-current"},[e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"})],-1)])])):e.createCommentVNode("",!0)],8,v1),e.createElementVNode("label",{class:e.normalizeClass(["text-xs font-medium cursor-pointer",t.modelValue===u.value?"text-gray-700":"text-gray-600"])},e.toDisplayString(u.label),3)],10,S1))),128))],2)]))}}),T1={class:"flex flex-col flex-1 min-h-0"},M1={class:"flex flex-col flex-1 min-h-0"},F1=e.defineComponent({__name:"vs-tab-card",props:{fields:{},columns:{},viewMode:{},html:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,f=>a.value=f||[],{immediate:!0}),e.watch(a,f=>l("update:columns",f));const i=e.ref(o.viewMode??"list");e.watch(()=>o.viewMode,f=>{f&&f!==i.value&&(i.value=f)});const s=e.ref(o.html??"");e.watch(()=>o.html,f=>{typeof f=="string"&&f!==s.value&&(s.value=f)},{immediate:!0});const c=e.ref(!1),u=e.ref([]),g=[{key:"name",label:"Name",type:"main"}],h={name:{type:"text",label:"Name",validators:["required"],disabled:!0},label:{type:"text",label:"Label",validators:["required"]},format:{type:"radio",label:"Format",mode:"inline",validators:["required"],options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Tags",id:"tags"}]},is_admin:{type:"Switcher",label:"Тільки для адміністративної частини"},data:{type:"text",label:"Data"}};function r(){u.value=i.value==="html"?[]:a.value.map(f=>f.name||f.id),c.value=!0}function y(){var k;const f=[...a.value],p=((k=o.fields)==null?void 0:k.filter(V=>u.value.includes(V.name)).map(V=>{const{type:$,format:_,...w}=V;return{...w,format:_??$??"text"}}))||[],b=Kt(f,p,{selectedKeys:u.value,resolveKey:V=>Tt(V)});if(a.value=b,i.value==="html"&&p.length){const V=p.map(w=>{const S=w.label??"",A=w.name??w.id??"";return`<dd>${S}</dd>
|
|
41
|
+
${i??"CartoCSS property (Mapnik)."}`}]}}}))}const kn=e.defineComponent({__name:"MonacoEditor",props:{modelValue:{},language:{},theme:{}},emits:["update:modelValue","load"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(null);let i=null,s=null,c=!1;function u(){return new Promise((h,r)=>{if(s)return h(s);if(window.monaco)return s=window.monaco,h(s);const y=m=>{if([...document.styleSheets].some(f=>{var p;return(p=f==null?void 0:f.href)==null?void 0:p.includes(m)}))return;const x=document.createElement("link");x.rel="stylesheet",x.href=m,document.head.appendChild(x)},d=m=>new Promise((x,f)=>{const p=document.createElement("script");p.src=m,p.onload=()=>x(!0),p.onerror=f,document.body.appendChild(p)});y("https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs/editor/editor.main.min.css"),d("https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs/loader.min.js").then(()=>{window.require.config({paths:{vs:"https://cdnjs.cloudflare.com/ajax/libs/monaco-editor/0.52.0/min/vs"}}),window.require(["vs/editor/editor.main"],()=>{s=window.monaco,h(s)})}).catch(r)})}function g(){var m,x;if(!a.value||!s)return;i&&i.dispose();const h=o.language||"yaml",r=s.editor.createModel(o.modelValue||"",h),y=h==="cartocss"?{acceptSuggestionOnCommitCharacter:!1,acceptSuggestionOnEnter:"off",snippetSuggestions:"none",tabCompletion:"off",wordBasedSuggestions:"off"}:{};i=s.editor.create(a.value,{model:r,theme:o.theme||"vs-light",automaticLayout:!0,minimap:{enabled:!1},...y});const d=h;s.editor.setModelLanguage(r,d),d==="css"&&((x=(m=s.languages)==null?void 0:m.css)!=null&&x.cssDefaults)&&s.languages.css.cssDefaults.setDiagnosticsOptions({validate:!1,lint:{}}),i.onDidChangeModelContent(()=>{c||l("update:modelValue",i.getValue())})}return e.watch(()=>o.modelValue,h=>{if(!i)return;const r=i.getModel();if(!r)return;const y=r.getValue();if(h!==y){const d=i.getPosition(),m=i.getSelection(),x=i.getScrollTop(),f=i.getScrollLeft();c=!0,i.executeEdits("external-model-sync",[{range:r.getFullModelRange(),text:h||"",forceMoveMarkers:!0}]),m&&i.setSelection(m),d&&i.setPosition(d),i.setScrollTop(x),i.setScrollLeft(f),c=!1}}),e.watch(()=>o.language,h=>{i&&s&&s.editor.setModelLanguage(i.getModel(),h||"yaml")}),e.watch(()=>o.theme,h=>{i&&s&&s.editor.setTheme(h||"vs-light")}),e.onMounted(async()=>{await u(),c1(s),g()}),e.onBeforeUnmount(()=>{i&&i.dispose()}),(h,r)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"editorContainer",ref:a,class:"w-full h-full"},null,512))}}),d1={class:"flex flex-col flex-1 overflow-hidden"},u1={class:"flex justify-end gap-2"},m1=["href"],p1={class:"flex flex-col flex-1 overflow-hidden"},f1={class:"bg-white rounded-xl border border-gray-200 shadow-sm overflow-hidden mt-3 flex flex-col flex-1"},g1={class:"relative bg-gradient-to-br from-slate-50 to-white flex-1"},y1=e.defineComponent({__name:"vs-tab-style",props:{token:{},styleYaml:{},styleText:{}},emits:["update:style-yaml","update:style-text","update"],setup(t,{emit:n}){const o=t,l=n,a=e.ref("");e.watch(()=>o.styleText,u=>{const g=u??"";a.value!==g&&(a.value=g)},{immediate:!0}),e.watch(a,async u=>{var h,r;const g=u??"";o.styleText!==g&&l("update:style-text",g);try{const y=u?hl(u):null;if((h=y==null?void 0:y.colorAttr)!=null&&h.length&&((r=o.styleYaml)==null?void 0:r.colorAttr)!==y.colorAttr){const d=await i(y.colorAttr);y.colors=d.reduce((x,f,p)=>({...x,[f.id.toString()]:s[p]}),{});const m=bl(y);m!==a.value&&(a.value=m)}JSON.stringify(y)!==JSON.stringify(o.styleYaml)&&l("update:style-yaml",y&&typeof y=="object"?y:null)}catch{o.styleYaml!==null&&l("update:style-yaml",null)}});async function i(u){return(await fetch(`/api/gis-service/${o.token}/${u}`).then(h=>h.json())).rows}const s=["#8dd3c7","#ffffb3","#bebada","#fb8072","#80b1d3","#fdb462","#b3de69","#fccde5","#d9d9d9","#bc80bd"],c=async()=>{const u=o.styleYaml?JSON.stringify(o.styleYaml):o.styleText?o.styleText:"null";try{await fetch(`/api/gis-service/${o.token}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({style:u})}),l("update"),fe.notify({type:"success",title:"Успіх",message:"Стилі збережено"})}catch(g){fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти стилі"}),console.log(g)}};return(u,g)=>(e.openBlock(),e.createElementBlock("div",d1,[e.createElementVNode("div",u1,[e.createElementVNode("a",{target:"_blank",href:"/api/gis-service/"+o.token+"/col",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Атрибути ",8,m1),e.createElementVNode("button",{onClick:c,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"},[...g[1]||(g[1]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-save h-3 w-3 mr-1"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти стилі ",-1)])])]),e.createElementVNode("div",p1,[e.createElementVNode("div",f1,[g[2]||(g[2]=e.createElementVNode("div",{class:"bg-gradient-to-r from-gray-50 to-gray-100 px-4 py-2 border-b border-gray-200 flex items-center justify-between"},[e.createElementVNode("div",{class:"text-xs text-gray-400"},"YAML")],-1)),e.createElementVNode("div",g1,[e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h),language:"yaml",theme:"vs-light"},null,8,["modelValue"])])])])]))}}),h1={class:"flex flex-col flex-1 min-h-0"},b1={class:"flex flex-col flex-1 min-h-0"},x1=e.defineComponent({__name:"vs-tab-popup",props:{token:{},fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>a.value=m||[],{immediate:!0}),e.watch(a,m=>{const x=Ue(o.token);x&&(x.popup=m),l("update:columns",m)});const i=e.ref("list"),s=e.ref(!1),c=e.ref([]),u=[{key:"name",label:"Назва",type:"main"}],g={name:{type:"text",label:"Назва",disabled:!0,validators:["required"]},label:{type:"text",label:"Найменування",validators:["required"]},meta:{type:"radio",label:"Meta",mode:"combo",options:[{text:"Заголовок",id:"title"},{text:"Властивість",id:"feature"},{text:"Бейдж",id:"badge"}]},data:{type:"select",label:"Класифікатор",data:"admin.cls.name"}};function h(){c.value=a.value.map(m=>m.name||m.id),s.value=!0}function r(){var p;const m=[...a.value],x=((p=o.fields)==null?void 0:p.filter(b=>c.value.includes(b.name)))||[],f=Kt(m,x,{selectedKeys:c.value,resolveKey:b=>Tt(b)});a.value=f,s.value=!1,c.value=[]}function y(){s.value=!1,c.value=[]}function d(){let m=[];i.value==="all"?m=o.fields||[]:i.value==="none"?m=[]:m=a.value,m.filter(x=>!x.label).forEach(x=>x.label=x.ua),l("save",m)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",h1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти попап ")]),e.createElementVNode("div",b1,[i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":x[1]||(x[1]=f=>s.value=f),selection:c.value,"onUpdate:selection":x[2]||(x[2]=f=>c.value=f),fields:t.fields,title:"Імпорт полів","id-prefix":"import-popup",onConfirm:r,onCancel:y},null,8,["visible","selection","fields"])]))}}),k1={class:"flex flex-col flex-1 min-h-0"},w1={class:"flex justify-between mb-3 gap-2"},_1={class:"p-4 space-y-4 text-sm"},E1={class:"space-y-1"},C1={class:"space-y-1"},N1={class:"flex items-center gap-3"},V1={class:"flex justify-end gap-2 p-4 border-t"},B1=e.defineComponent({__name:"vs-tab-legend",props:{mapInfo:{},token:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>{a.value=m||[]}),e.watch(a,m=>{l("update:columns",m)});const i=e.ref(!1),s=e.ref({name:"",color:"#2E86DE"}),c=e.defineAsyncComponent(()=>import("@opengis/core").then(m=>m.VsModal)),u=[{key:"name",label:"Назва"},{key:"color",label:"Колір",type:"color"}],g={name:{type:"text",label:"Назва",validators:["required"]},color:{type:"color",label:"Колір",validators:["required"]}};function h(m){m&&r(),i.value=m}function r(){s.value={name:"",color:"#2E86DE"}}function y(){var p,b;const m=(p=s.value.name)==null?void 0:p.trim();if(!m){fe.notify({type:"warning",title:"Перевірка",message:"Вкажіть назву елементу легенди"});return}const x=((b=s.value.color)==null?void 0:b.trim())||"#2E86DE";if(a.value.some(k=>Tt(k)===Tt({name:m}))){fe.notify({type:"warning",title:"Дубль",message:"Такий елемент легенди вже існує"});return}a.value=[...a.value,{name:m,color:x}],r(),i.value=!1}function d(){l("save",a.value)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",k1,[e.createElementVNode("div",w1,[e.createElementVNode("button",{onClick:x[0]||(x[0]=f=>i.value=!0),class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Додати "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти легенду ")]),e.createVNode(At,{modelValue:a.value,"onUpdate:modelValue":x[1]||(x[1]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"]),e.createVNode(e.unref(c),{teleport:"#modal",visible:i.value,title:"Новий елемент легенди","onUpdate:visible":h},{footer:e.withCtx(()=>[e.createElementVNode("div",V1,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed",onClick:x[5]||(x[5]=f=>h(!1))}," Скасувати "),e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed",onClick:y}," Додати ")])]),default:e.withCtx(()=>[e.createElementVNode("div",_1,[e.createElementVNode("div",E1,[x[6]||(x[6]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Назва ",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[2]||(x[2]=f=>s.value.name=f),type:"text",class:"w-full rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200",placeholder:"Наприклад, Житлова зона"},null,512),[[e.vModelText,s.value.name]])]),e.createElementVNode("div",C1,[x[7]||(x[7]=e.createElementVNode("label",{class:"block text-xs font-medium text-gray-500 uppercase tracking-wide"}," Колір ",-1)),e.createElementVNode("div",N1,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[3]||(x[3]=f=>s.value.color=f),type:"color",class:"h-10 w-16 rounded border border-gray-300"},null,512),[[e.vModelText,s.value.color]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":x[4]||(x[4]=f=>s.value.color=f),type:"text",class:"flex-1 rounded-md border border-gray-300 px-3 py-2 text-sm focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-200",placeholder:"#FFFFFF"},null,512),[[e.vModelText,s.value.color]])])])])]),_:1},8,["visible"])]))}}),$1={class:"space-y-3 bg-gradient-to-br from-sky-50 to-blue-50 p-4 rounded-xl border border-sky-100 shadow-sm"},S1=["onClick"],v1=["aria-checked","value"],L1={key:0},A1=e.defineComponent({__name:"view-mode-toggle",props:{modelValue:{},options:{},showHtml:{type:Boolean}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,l=n,a=s=>l("update:modelValue",s),i=o.options||[{value:"all",label:"All"},{value:"list",label:"List"},{value:"none",label:"None"}];return(s,c)=>(e.openBlock(),e.createElementBlock("div",$1,[c[1]||(c[1]=e.createElementVNode("label",{class:"text-sm font-medium text-gray-600"},"Режим відображення",-1)),e.createElementVNode("div",{role:"radiogroup",class:e.normalizeClass(["grid gap-2",`grid-cols-${e.unref(i).length}`])},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(i),u=>(e.openBlock(),e.createElementBlock("div",{key:u.value,onClick:g=>a(u.value),class:e.normalizeClass(["flex items-center justify-center space-x-2 rounded-lg p-2 border transition-all duration-300 cursor-pointer",[t.modelValue===u.value?"bg-gradient-to-r from-sky-200 to-blue-200 border-transparent shadow-sm":"bg-white border-gray-100 hover:border-sky-200 hover:shadow-sm"]])},[e.createElementVNode("button",{type:"button",role:"radio","aria-checked":t.modelValue===u.value,value:u.value,class:"aspect-square rounded-full border border-primary h-4 w-4 flex items-center justify-center text-sky-500"},[t.modelValue===u.value?(e.openBlock(),e.createElementBlock("span",L1,[...c[0]||(c[0]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-circle h-2.5 w-2.5 fill-current text-current"},[e.createElementVNode("circle",{cx:"12",cy:"12",r:"10"})],-1)])])):e.createCommentVNode("",!0)],8,v1),e.createElementVNode("label",{class:e.normalizeClass(["text-xs font-medium cursor-pointer",t.modelValue===u.value?"text-gray-700":"text-gray-600"])},e.toDisplayString(u.label),3)],10,S1))),128))],2)]))}}),T1={class:"flex flex-col flex-1 min-h-0"},M1={class:"flex flex-col flex-1 min-h-0"},F1=e.defineComponent({__name:"vs-tab-card",props:{fields:{},columns:{},viewMode:{},html:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.columns||[]);e.watch(()=>o.columns,f=>a.value=f||[],{immediate:!0}),e.watch(a,f=>l("update:columns",f));const i=e.ref(o.viewMode??"list");e.watch(()=>o.viewMode,f=>{f&&f!==i.value&&(i.value=f)});const s=e.ref(o.html??"");e.watch(()=>o.html,f=>{typeof f=="string"&&f!==s.value&&(s.value=f)},{immediate:!0});const c=e.ref(!1),u=e.ref([]),g=[{key:"name",label:"Name",type:"main"}],h={name:{type:"text",label:"Name",validators:["required"],disabled:!0},label:{type:"text",label:"Label",validators:["required"]},format:{type:"radio",label:"Format",mode:"inline",validators:["required"],options:[{text:"Text",id:"text"},{text:"Number",id:"number"},{text:"Date",id:"date"},{text:"File",id:"file"},{text:"Select",id:"select"},{text:"Tags",id:"tags"}]},is_admin:{type:"Switcher",label:"Тільки для адміністративної частини"},data:{type:"select",label:"Класифікатор",data:"admin.cls.name"}};function r(){u.value=i.value==="html"?[]:a.value.map(f=>f.name||f.id),c.value=!0}function y(){var k;const f=[...a.value],p=((k=o.fields)==null?void 0:k.filter(V=>u.value.includes(V.name)).map(V=>{const{type:$,format:_,...w}=V;return{...w,format:_??$??"text"}}))||[],b=Kt(f,p,{selectedKeys:u.value,resolveKey:V=>Tt(V)});if(a.value=b,i.value==="html"&&p.length){const V=p.map(w=>{const S=w.label??"",A=w.name??w.id??"";return`<dd>${S}</dd>
|
|
42
42
|
<dt>{{ ${A} }}</dt>`}).join(`
|
|
43
43
|
`),_=(s.value??"").trimEnd();s.value=_?`${_}
|
|
44
|
-
${V}`:V}c.value=!1,u.value=[]}function d(){c.value=!1,u.value=[]}function m(){const f=i.value==="html"?"html":"list",p={card_mode:f};f==="html"?p.html=s.value:f==="list"&&(p.list=a.value),l("save","card",p)}const x=[{value:"all",label:"Всі"},{value:"list",label:"Список"},{value:"none",label:"Жодне"},{value:"html",label:"HTML"}];return(f,p)=>(e.openBlock(),e.createElementBlock("div",T1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:r,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:m,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти ")]),e.createVNode(A1,{modelValue:i.value,"onUpdate:modelValue":p[0]||(p[0]=b=>i.value=b),options:x},null,8,["modelValue"]),e.createElementVNode("div",M1,[i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":p[1]||(p[1]=b=>a.value=b),"columns-scheme":g,"form-scheme":h,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):i.value==="html"?(e.openBlock(),e.createBlock(kn,{key:1,modelValue:s.value,"onUpdate:modelValue":p[2]||(p[2]=b=>s.value=b),language:"html",theme:"vs-light",class:"flex-1 min-h-0"},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(Zt,{visible:c.value,"onUpdate:visible":p[3]||(p[3]=b=>c.value=b),selection:u.value,"onUpdate:selection":p[4]||(p[4]=b=>u.value=b),fields:t.fields,title:"Імпорт полів для картки","id-prefix":"import-card",onConfirm:y,onCancel:d},null,8,["visible","selection","fields"])]))}}),D1={class:"flex flex-col flex-1 min-h-0"},z1=e.defineComponent({__name:"vs-tab-filter",props:{fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n;console.log(o.columns);const a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>a.value=m||[],{immediate:!0}),e.watch(a,m=>l("update:columns",m),{deep:!0,immediate:!0});const i=e.ref("list"),s=e.ref(!1),c=e.ref([]),u=[{key:"id",label:"Name"},{key:"label",label:"UA"}],g={name:{type:"text",label:"Name",disabled:!0,validators:["required"]},label:{type:"text",label:"UA",validators:["required"]},type:{type:"radio",label:"Тип",position:"horizontal",validators:["required"],options:[{text:"Check",id:"check"},{text:"Range",id:"range"},{text:"Date",id:"date"},{text:"Text",id:"text"},{text:"Select",id:"autocomplete"}]},hidden:{label:"Приховати",type:"Switcher"},data:{type:"text",label:"Класифікатор",conditions:["type","in",["autocomplete","select","check"]],validators:["required"]}};function h(){c.value=a.value.map(m=>m.name||m.id),s.value=!0}function r(){var p;const m=[...a.value],x=((p=o.fields)==null?void 0:p.filter(b=>c.value.includes(b.name)))||[],f=Kt(m,x,{selectedKeys:c.value,resolveKey:b=>Tt(b)});a.value=f,s.value=!1,c.value=[]}function y(){s.value=!1,c.value=[]}function d(){let m=[];i.value==="all"?m=o.fields||[]:i.value==="none"?m=[]:m=a.value,l("save",m)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",D1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти фільтр ")]),i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":x[1]||(x[1]=f=>s.value=f),selection:c.value,"onUpdate:selection":x[2]||(x[2]=f=>c.value=f),fields:t.fields,title:"Імпорт полів","id-prefix":"import-filter",onConfirm:r,onCancel:y},null,8,["visible","selection","fields"])]))}}),I1=e.defineComponent({__name:"MapDataLayer",props:{id:{},layer:{},styleSpec:{},autoCenter:{type:[Boolean,null]}},setup(t,{expose:n}){var m,x,f,p;const{map:o,flyTo:l,setZoom:a}=tt(),i=((x=(m=e.getCurrentInstance())==null?void 0:m.appContext.config.globalProperties)==null?void 0:x.$settings)||null,s=t,c=s.id;String(s.id);const u=`${location.origin}/api/vtile/${s.id}/ua/{z}/{x}/{y}.vmt?all=1`,g=Ue(c,{source:{type:"vector",tiles:[u],minzoom:0,maxzoom:14},popup:s.layer.popup,layer:{style:(f=s.layer)==null?void 0:f.style}});n({layerHandle:g}),(s.autoCenter??!0)&&l({center:s.layer.center||((p=i==null?void 0:i.map)==null?void 0:p.center)||[30,50],animate:!1});let h=null;function r(){if(!(g!=null&&g.setTiles))return;const b=u.includes("?")?"&":"?",k=`${u}${b}_=${Date.now()}`;g.setTiles([k])}function y(){h&&clearTimeout(h),h=setTimeout(()=>{h=null,d().catch(b=>console.error("Failed to update map layer",b))},300)}async function d(){o.value&&(r(),g.setStyle(s.styleSpec??null))}return e.watch(()=>s.styleSpec,y,{deep:!0}),e.onBeforeUnmount(()=>{g.remove()}),(b,k)=>null}}),P1={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},j1={class:"flex-1 relative overflow-hidden"},R1={class:"absolute top-0 left-0 w-full z-20"},O1={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},U1={class:"flex items-start justify-between gap-4"},q1={class:"flex-1 min-w-0"},H1={class:"flex items-center text-sm text-gray-500 mb-3"},W1={class:"text-gray-900 font-medium truncate max-w-xs"},Y1={class:"flex items-center justify-between gap-4"},Z1={class:"flex-1 min-w-0"},G1={class:"flex items-center gap-3 mb-1"},K1={class:"text-base font-semibold text-gray-900 truncate"},X1={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},Q1={class:"text-xs font-medium text-green-700"},J1=["title"],ek={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[115px]"},tk={class:"relative w-full h-full"},nk={style:{top:"17px",left:"230px",position:"absolute","z-index":"1"}},ok={class:"absolute top-4 left-4 z-20"},rk={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},lk={class:"absolute bottom-4 left-4 z-20"},ak={class:"flex-1 flex flex-col h-full"},sk={class:"px-3 pt-3 pb-2 border-b border-gray-100"},ik={class:"items-center justify-center text-muted-foreground grid w-full grid-cols-6 h-12 p-1 bg-gray-50 rounded-xl shadow-sm"},ck=["aria-selected","onClick"],dk={class:"leading-none"},uk={class:"flex flex-col flex-1 overflow-y-hidden p-3"},mk="OpenGIS",Nl=2,Rn=5,pk=1e3,fk=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"service",props:{hideServiceKey:{type:Boolean,default:!1}},setup(t){var Ke,wt;const n=t,o=e.toRef(n,"hideServiceKey"),l=Fe.useRoute(),a=Fe.useRouter(),{id:i}=l.params,s=e.ref(null),c=e.ref(null),u=e.ref({}),g=e.ref(null),h=((wt=(Ke=e.getCurrentInstance())==null?void 0:Ke.appContext.config.globalProperties)==null?void 0:wt.$settings)||null;function r(G){typeof document>"u"||(document.title=G?`${G} — Сервіс`:mk)}let y=null;const d=e.ref(!1);function m(){var G;return(G=s.value)==null?void 0:G.ctx}function x(G){typeof window>"u"||window.dispatchEvent(new CustomEvent(vn,{detail:G}))}function f(G){var Te,ke,He;const ee=(ke=(Te=m())==null?void 0:Te.map)==null?void 0:ke.value;if(!ee||!G)return[];const xe=(He=g.value)!=null&&He.service_id?String(g.value.service_id):null;return(ee.queryRenderedFeatures(G)||[]).filter(ve=>{var X,le,de,be,P,O;const lt=((X=ve==null?void 0:ve.properties)==null?void 0:X.id)??(ve==null?void 0:ve.id);if(lt==null||!(ve!=null&&ve.source)||xe&&String(ve.source)!==xe)return!1;const W=Ue(ve.source)||Ue((le=ve.layer)==null?void 0:le.id);if(!W)return!1;const B=(be=(de=W==null?void 0:W.opts)==null?void 0:de.source)==null?void 0:be.type,M=(O=(P=W==null?void 0:W.opts)==null?void 0:P.layer)==null?void 0:O.type;return B!=="raster"&&M!=="raster"})}function p(G){const ee=f(G==null?void 0:G.point);x({features:ee,externalItems:[]})}function b(G){if(Array.isArray(G))return b(G[0]);if(typeof G!="string"&&typeof G!="number")return null;const ee=typeof G=="number"?G:Number(G.trim());return Number.isFinite(ee)?ee:null}function k(G,ee){return G.toFixed(ee)}function V(G,ee,xe){const Pe=.5*10**-xe;return Math.abs(G-ee)>Pe}function $(){var ve,lt,W,B;const G=(lt=(ve=m())==null?void 0:ve.map)==null?void 0:lt.value;if(!G)return;const ee=b(l.query.z),xe=b(l.query.x),Pe=b(l.query.y);if(ee==null||xe==null||Pe==null)return;const Te=(W=G.getCenter)==null?void 0:W.call(G),ke=(B=G.getZoom)==null?void 0:B.call(G);(!Te||V(Te.lng,xe,Rn)||V(Te.lat,Pe,Rn)||V(ke??0,ee,Nl))&&(d.value=!0,G.jumpTo({center:[xe,Pe],zoom:ee}),d.value=!1)}function _(){var Te,ke,He,ve;if(d.value)return;const G=(ke=(Te=m())==null?void 0:Te.map)==null?void 0:ke.value;if(!G)return;const ee=(He=G.getCenter)==null?void 0:He.call(G),xe=(ve=G.getZoom)==null?void 0:ve.call(G);if(!ee||xe==null)return;const Pe={...l.query,z:k(xe,Nl),x:k(ee.lng,Rn),y:k(ee.lat,Rn)};l.query.z===Pe.z&&l.query.x===Pe.x&&l.query.y===Pe.y||a.replace({query:Pe})}const w=e.ref(null),S=e.ref(""),A=e.ref([]),R=e.ref([]),Z=e.ref([]),I=e.ref("list"),K=e.ref(""),q=e.ref([]),ne=e.ref(!0);let Y=null;const D=e.computed(()=>{var G,ee;return((G=g.value)==null?void 0:G.id)??((ee=g.value)==null?void 0:ee.service_id)??null}),v=e.computed(()=>{const G=(h==null?void 0:h.map)||null,ee=(G==null?void 0:G.boundary)??null,xe=(G==null?void 0:G.katottg)??null;return!ee&&!xe?null:{boundary:ee,katottg:xe}}),F=e.computed(()=>{const G=g.value;if(!G)return"";const ee=[];!o.value&&G.service_key&&ee.push(`Сервіс: ${G.service_key}`),G.description&&ee.push(G.description);const xe=G.group_name||G.group_id;return xe&&ee.push(`Група: ${xe}`),typeof G.is_public<"u"&&ee.push(G.is_public?"Публічний":"Не публічний"),typeof G.is_active<"u"&&ee.push(G.is_active?"Активний":"Неактивний"),ee.join(", ")}),N=e.computed(()=>{const G=g.value,ee=(G==null?void 0:G.group_name)||(G==null?void 0:G.group_id);return ee?String(ee).toUpperCase():""}),E=[{key:"style",label:"Стиль",icon:kl},{key:"popup",label:"Попап",icon:Vx},{key:"filter",label:"Фільтр",icon:vx},{key:"legend",label:"Легенда",icon:xx},{key:"card",label:"Картка",icon:wl},{key:"metadata",label:"Метадані",icon:Bo}],T=E.map(G=>G.key),z=e.ref("style");e.onMounted(async()=>{const G=l.query.tab;G&&T.includes(G)&&(z.value=G),await ce(),Q()});async function Q(){var Pe;const G=m();if(!(G!=null&&G.ready))return;await G.ready(),$();const ee=(Pe=G.map)==null?void 0:Pe.value;if(!ee)return;const xe=()=>_();ee.on("moveend",xe),ee.on("zoomend",xe),ee.on("click",p),y=()=>{ee.off("moveend",xe),ee.off("zoomend",xe),ee.off("click",p)}}e.watch(()=>[l.query.z,l.query.x,l.query.y],()=>{$()}),e.watch(z,G=>{l.query.tab!==G&&a.replace({query:{...l.query,tab:G}})}),e.watch(()=>l.query.tab,G=>{G&&T.includes(G)&&z.value!==G&&(z.value=G)}),e.watch(()=>{var G;return(G=g.value)==null?void 0:G.name},G=>r(G),{immediate:!0});function se(G){if(!G)return null;try{return JSON.parse(JSON.stringify(G))}catch(ee){return console.warn("Failed to clone style",ee),null}}function te(G){if(!G)return null;if(typeof G=="string")try{return Jn(xl.load(G)||null)}catch(ee){return console.warn("Failed to parse style yaml",ee),null}return Jn(se(G))}function oe(G,ee){try{return JSON.stringify(G)===JSON.stringify(ee)}catch{return!1}}function ge(){var ee;if(!g.value)return;const G=te(w.value);oe(G,((ee=g.value)==null?void 0:ee.style)??null)||(g.value={...g.value,style:G})}function he(){Y&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,ge()},pk)}const ce=async()=>{try{const G=await fetch(`/api/gis-service/${i}`);if(!G.ok)throw new Error(`${G.status}`);const ee=await G.json();u.value=ee||{},c.value=i;const xe=te(ee.style);g.value=ee?{...ee,style:se(xe)}:null,w.value=xe,S.value=typeof(ee==null?void 0:ee.style)=="string"?ee.style:xe?xl.dump(xe):"",R.value=(ee==null?void 0:ee.popup)||[],I.value=ee.card_mode==="html"?"html":"list",Z.value=ee.card,K.value=ee.html,A.value=(ee==null?void 0:ee.legend)||[],q.value=(ee==null?void 0:ee.filters)||[]}catch(G){console.error("Failed to fetch map info",G)}};e.watch(()=>{var G;return(G=g.value)==null?void 0:G.style},G=>{w.value=te(G)},{deep:!0}),e.watch(()=>w.value,()=>{he()},{deep:!0}),e.onBeforeUnmount(()=>{Y&&(clearTimeout(Y),Y=null),y==null||y(),y=null});async function Be(G){try{const ee=await fetch(`/api/gis-clear-vtile/${G}`),{message:xe,error:Pe,code:Te}=await ee.json();if(Te===200)return fe.notify({type:"success",title:"Успіх",message:xe});fe.notify({type:"error",title:"Помилка",message:Pe})}catch(ee){fe.notify({type:"error",title:"Помилка",message:"Не вдалося очистити тайли"}),console.error(ee)}}async function We(G,ee){await Re({[G]:ee},G)}function qe(){const G=se(w.value);g.value=g.value?{...g.value,style:G}:g.value}async function Re(G,ee){if(g.value={...g.value||{},...G},typeof G.html<"u"&&(u.value={...u.value||{},html:G.html}),!!D.value)try{if(!(await fetch(`/api/gis-service/${D.value}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(G)})).ok)throw new Error("Save failed");fe.notify({type:"success",title:"Успіх",message:`${ee} saved`}),await ce()}catch(xe){fe.notify({type:"error",title:"Помилка",message:`Failed to save ${ee}`}),console.error(xe)}}async function Ge(G,ee){if(G!=="card"){await We(G,ee);return}const xe=(ee==null?void 0:ee.card_mode)==="html"?"html":"list",Pe=xe==="html"&&typeof(ee==null?void 0:ee.html)=="string"?ee.html:"",Te=(xe==="html"?[]:null)||(Array.isArray(ee==null?void 0:ee.list)?ee.list:[]);Z.value=Te,I.value=xe,K.value=Pe;const ke={card_mode:xe};xe==="html"&&(ke.html=Pe),xe==="list"&&(ke.card=Te),await Re(ke,"card")}return(G,ee)=>{var xe,Pe,Te;return e.openBlock(),e.createElementBlock("div",P1,[e.createElementVNode("div",j1,[e.createElementVNode("div",R1,[e.createElementVNode("div",O1,[e.createElementVNode("div",U1,[e.createElementVNode("div",q1,[e.createElementVNode("div",H1,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:ee[0]||(ee[0]=ke=>e.unref(a).push("/gis.datasets"))}," Datasets "),ee[11]||(ee[11]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",W1,e.toDisplayString(((xe=g.value)==null?void 0:xe.name)||"Dataset"),1)]),e.createElementVNode("div",Y1,[e.createElementVNode("div",Z1,[e.createElementVNode("div",G1,[e.createElementVNode("h1",K1,e.toDisplayString(((Pe=g.value)==null?void 0:Pe.name)||"Dataset"),1),N.value?(e.openBlock(),e.createElementBlock("div",X1,[e.createElementVNode("span",Q1,e.toDisplayString(N.value),1)])):e.createCommentVNode("",!0)]),F.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:F.value},e.toDisplayString(F.value),9,J1)):e.createCommentVNode("",!0)])])]),D.value?(e.openBlock(),e.createBlock(So,{key:0,class:"flex-shrink-0","entity-id":D.value,"entity-info":{name:(Te=g.value)==null?void 0:Te.name},table:"gis.services.table","entity-label":"Сервіс","save-method":"put","show-xml-item":!1,"clear-tiles-handler":Be,onSaved:ce},null,8,["entity-id","entity-info"])):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",ek,[e.createElementVNode("div",tk,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:s},{default:e.withCtx(()=>{var ke,He,ve,lt,W,B,M;return[(ke=g.value)!=null&&ke.service_id?(e.openBlock(),e.createBlock(I1,{key:0,id:(He=g.value)==null?void 0:He.service_id,layer:g.value,"style-spec":((ve=g.value)==null?void 0:ve.style)||null,autoCenter:!1},null,8,["id","layer","style-spec"])):e.createCommentVNode("",!0),D.value?(e.openBlock(),e.createBlock(or,{key:1,"layer-id":D.value,boundary:((lt=g.value)==null?void 0:lt.boundary)||((W=v.value)==null?void 0:W.boundary)||null,katottg:((B=g.value)==null?void 0:B.katottg)||((M=v.value)==null?void 0:M.katottg)||null},null,8,["layer-id","boundary","katottg"])):e.createCommentVNode("",!0),e.createElementVNode("div",nk,[D.value?(e.openBlock(),e.createBlock(uo,{key:0,"layer-id":D.value,filters:q.value},null,8,["layer-id","filters"])):e.createCommentVNode("",!0)]),ee[12]||(ee[12]=e.createElementVNode("div",{id:"map-filter-popover-host",class:"map-widget__filter-host"},null,-1)),e.createElementVNode("div",ok,[e.createVNode(Wt)]),e.createElementVNode("div",rk,[e.createVNode(It),u.value.center?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:u.value.center,targetLabel:"Ценр даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),e.createElementVNode("div",lk,[e.createVNode(co,{items:A.value||null},null,8,["items"])]),e.createVNode(Zo),e.createVNode(io,{html:u.value.html},null,8,["html"])]}),_:1},512)])]),e.createVNode(Vo,{open:ne.value,onToggle:ee[1]||(ee[1]=ke=>ne.value=!ne.value),"top-class":"top-4"},null,8,["open"])]),e.createElementVNode("div",{class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",ne.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",ak,[e.createElementVNode("div",sk,[e.createElementVNode("div",ik,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(E,ke=>e.createElementVNode("button",{key:ke.key,type:"button",role:"tab","aria-selected":z.value===ke.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",z.value===ke.key?"bg-white shadow-sm text-gray-700":""]),onClick:He=>z.value=ke.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(ke.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",dk,e.toDisplayString(ke.label),1)],10,ck)),64))])]),e.createElementVNode("div",uk,[z.value==="style"?(e.openBlock(),e.createBlock(y1,{key:0,token:D.value,"style-text":S.value,"style-yaml":w.value,"onUpdate:styleYaml":ee[2]||(ee[2]=ke=>w.value=ke),"onUpdate:styleText":ee[3]||(ee[3]=ke=>S.value=ke),onUpdate:qe},null,8,["token","style-text","style-yaml"])):z.value==="legend"?(e.openBlock(),e.createBlock(B1,{key:1,token:D.value,columns:A.value,"onUpdate:columns":ee[4]||(ee[4]=ke=>A.value=ke),onSave:ee[5]||(ee[5]=ke=>We("legend",ke))},null,8,["token","columns"])):z.value==="popup"?(e.openBlock(),e.createBlock(x1,{key:2,token:D.value,columns:R.value,fields:u.value.fields,"onUpdate:columns":ee[6]||(ee[6]=ke=>R.value=ke),onSave:ee[7]||(ee[7]=ke=>We("popup",ke))},null,8,["token","columns","fields"])):z.value==="card"?(e.openBlock(),e.createBlock(F1,{key:3,token:D.value,columns:Z.value,fields:u.value.fields,"view-mode":I.value,html:K.value,"onUpdate:columns":ee[8]||(ee[8]=ke=>Z.value=ke),onSave:Ge},null,8,["token","columns","fields","view-mode","html"])):z.value==="filter"?(e.openBlock(),e.createBlock(z1,{key:4,token:D.value,fields:u.value.fields,columns:q.value,"onUpdate:columns":ee[9]||(ee[9]=ke=>q.value=ke),onSave:ee[10]||(ee[10]=ke=>We("filters",ke))},null,8,["token","fields","columns"])):z.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:5,data:g.value,"entity-id":String(e.unref(i)),"entity-type":"service",onSaved:ce},null,8,["data","entity-id"])):e.createCommentVNode("",!0)])])],2)])}}}),[["__scopeId","data-v-008c5939"]])},Symbol.toStringTag,{value:"Module"})),gk={class:"flex-1 flex flex-col bg-gray-50 h-screen overflow-hidden p-0 m-0"},yk={href:"/api/gis-create-xml",target:"_blank",rel:"noreferrer",class:"flex h-[2rem] items-center gap-1.5 px-3 py-1.5 bg-slate-50 text-slate-700 rounded-md border border-slate-200 hover:bg-slate-100 transition-colors text-sm"},hk={class:"flex-1 px-4 sm:px-6 pb-4 overflow-y-auto overflow-x-visible"},bk={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-visible"},xk={class:"p-3 border-b border-gray-200"},kk={class:"flex flex-col sm:flex-row gap-2"},wk={class:"entity-table-root"},_k={class:"gap-2 inline-flex"},Ek=["onClick"],Ck={key:0,class:"flex flex-col gap-3 border-t border-gray-200 px-4 py-3 sm:flex-row sm:items-center sm:justify-between bg-gray-50"},Nk={class:"text-sm text-gray-500"},Vk={class:"font-medium text-gray-700"},Bk={class:"font-medium text-gray-700"},$k={class:"font-medium text-gray-700"},Sk={class:"flex items-center justify-end gap-3"},vk=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"RastersTablePage",props:{entityKey:{default:"rasters"},entityBasePath:{default:"/gis.rasters"},columnsConfig:{default:()=>[]}},setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/table")),o=Fe.useRoute(),l=Fe.useRouter(),a=t,i=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.title)||"Растри")}),s=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.description)||"")}),c=e.computed(()=>`Пошук ${String(i.value).trim()}...`),u=e.computed(()=>a.entityKey||"rasters"),g=e.computed(()=>a.entityBasePath||"/gis.rasters"),h=e.ref([]),r=e.ref(!0),y=e.ref([]),d=e.ref([]),m=e.ref({}),x=e.ref([]),f=e.ref(String(o.query.search??"")),p=e.ref(Math.max(1,Number(o.query.page)||1)),b=e.ref(15),k=e.ref(0),V=e.computed(()=>k.value>0),$=e.computed(()=>k.value?(p.value-1)*b.value+1:0),_=e.computed(()=>k.value?Math.min(p.value*b.value,k.value):0);function w(v){const F=new URLSearchParams;return Object.entries(v).forEach(([N,E])=>{if(!(E==null||E==="")){if(Array.isArray(E)){E.forEach(T=>{T!=null&&T!==""&&F.append(N,String(T))});return}F.append(N,String(E))}}),F.toString()}function S(){return`${g.value}/new`}function A(v){return`${g.value}/${v}/edit`}async function R(){try{r.value=!0;const v=`/api/data/gis.${u.value}.table`,F=w({...m.value,page:p.value,limit:b.value}),N=await fetch(F?`${v}?${F}`:v);if(!N.ok)throw new Error(`Rows fetch failed: ${N.status}`);const E=await N.json();h.value=E.rows||[],k.value=Number(E.filtered??E.total??E.count??h.value.length)||0,y.value=a.columnsConfig.length?a.columnsConfig:E.columns||[],d.value=E.filters||[],x.value=E.actions||[],y.value.length&&!y.value[0].link?y.value[0].link=`${g.value}/{id}`:y.value.length&&(y.value[0].link=`${g.value}/{id}`)}catch{h.value=[],k.value=0}finally{r.value=!1}}function Z(v){m.value=v,p.value=1,D(),R()}async function I(v,F,N){const E=await fetch(`/api/form/gis.${u.value}.table/${v.id}`);if(!E.ok)throw new Error(`Form fetch failed: ${E.status}`);const z=(await E.json()).token,Q=await fetch(`/api/table/${z}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({[F]:N})});if(!Q.ok)throw fe.notify({type:"error",title:"Помилка збереження",message:`Поле "${F}" не оновлено`}),new Error(`Save failed: ${Q.status}`);fe.notify({title:"Збережено",message:`Поле "${F}" оновлено`})}function K(v,F){m.value={...m.value,[v]:F},p.value=1,D(),R()}function q(v){K((v==null?void 0:v.name)||"search",(v==null?void 0:v.value)??f.value)}function ne(v){f.value="",K(v||"search",void 0)}function Y(v){!v||v===p.value||(p.value=v,D(),R())}function D(){const v={...o.query,page:String(p.value),...f.value?{search:f.value}:{}};f.value||delete v.search,delete v.view,l.replace({query:v})}return e.onMounted(()=>{R(),document.title=i.value}),e.watch(()=>o.name,()=>{p.value=1,f.value="",R(),document.title=i.value}),e.watch(()=>o.query,v=>{const F=Math.max(1,Number(v.page)||1),N=String(v.search??""),E=F!==p.value,T=N!==f.value;!E&&!T||(p.value=F,f.value=N,m.value={...m.value,search:N||void 0},R())}),(v,F)=>(e.openBlock(),e.createElementBlock("div",gk,[e.createVNode(Yt,{variant:"table"},e.createSlots({title:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.value),1)]),actions:e.withCtx(()=>[e.createElementVNode("a",yk,[e.createVNode(e.unref(ie.RefreshCw),{size:16}),F[2]||(F[2]=e.createTextVNode(" Оновити растри ",-1))]),e.createElementVNode("a",{onClick:F[0]||(F[0]=N=>e.unref(l).push(S())),class:"hover:cursor-pointer flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors text-sm"},[e.createVNode(e.unref(ie.Plus),{size:16}),F[3]||(F[3]=e.createTextVNode(" Додати ",-1))])]),_:2},[s.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",hk,[e.createElementVNode("div",bk,[e.createElementVNode("div",xk,[e.createElementVNode("div",kk,[e.createVNode(e.unref(Nn.FilterField),{modelValue:f.value,"onUpdate:modelValue":F[1]||(F[1]=N=>f.value=N),name:"search",type:"text",layout:"inline",class:"flex-1",width:"100%",cleanable:!0,onChange:q,onClear:ne,placeholder:c.value},null,8,["modelValue","placeholder"]),e.createVNode(e.unref(Nn.Filter),{schema:d.value,value:m.value,onChange:Z,layout:"inline",mode:"soft",view:"popover",limit:8,class:"flex-shrink-0"},null,8,["schema","value"])])]),e.createElementVNode("div",wk,[e.createVNode(e.unref(n),{rows:h.value,columns:y.value,loading:r.value,router:e.unref(l),selectable:!1,onCellUpdate:I,classWrapper:"overflow-x-auto overflow-y-visible",TableStyle:"w-full",classTable:"w-full min-w-[640px]",classThead:"bg-gray-50 border-b border-gray-200",classTh:"px-3 sm:px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",classTbody:"bg-white divide-y divide-gray-200",classTr:"hover:bg-gray-50 transition-colors",classTd:"px-3 sm:px-4 py-2.5 whitespace-nowrap",classLink:"text-sm font-medium text-blue-600 hover:text-blue-800 hover:underline text-left"},{action:e.withCtx(({row:N})=>[e.createElementVNode("div",_k,[e.createElementVNode("button",{onClick:E=>e.unref(l).push(A(N.id)),class:"inline-flex items-center justify-center bg-white border rounded-md size-7 gap-x-2 hover:bg-gray-100",title:"Редагувати","aria-label":"Редагувати"},[e.createVNode(Vn)],8,Ek)])]),_:1},8,["rows","columns","loading","router"])]),V.value?(e.openBlock(),e.createElementBlock("div",Ck,[e.createElementVNode("div",Nk,[F[4]||(F[4]=e.createTextVNode(" Показано ",-1)),e.createElementVNode("span",Vk,e.toDisplayString($.value),1),F[5]||(F[5]=e.createTextVNode(" - ",-1)),e.createElementVNode("span",Bk,e.toDisplayString(_.value),1),F[6]||(F[6]=e.createTextVNode(" з ",-1)),e.createElementVNode("span",$k,e.toDisplayString(k.value),1)]),e.createElementVNode("div",Sk,[e.createVNode(e.unref(fe.VsPagination),{total:k.value,page:p.value,"page-size":b.value,showPageSizes:!1,pageRange:5,view:"button",color:"gray","onUpdate:page":Y,onPageChange:Y},null,8,["total","page","page-size"])])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-63309b89"]])},Symbol.toStringTag,{value:"Module"})),Lk={class:"flex-1 overflow-y-auto p-4 sm:p-6"},Ak={class:"space-y-3"},Tk={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},Mk={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2"},Fk={class:"text-xs text-gray-500 mb-1"},Dk={key:0,class:"text-base text-md font-semibold text-gray-900"},zk={key:1,class:"text-base text-md font-semibold text-gray-900"},Ik={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},Pk={class:"space-y-2"},jk={class:"bg-gradient-to-br from-blue-50 to-blue-100/30 p-4 rounded-lg border border-blue-200"},Rk={class:"text-sm font-semibold text-gray-900"},Ok={class:"text-xs text-gray-600 mt-1"},Uk={class:"grid grid-cols-2 gap-3"},qk={class:"text-xs text-gray-500 mb-1"},Hk={class:"text-sm font-semibold text-gray-900"},Wk={class:"bg-gray-50 p-4 rounded-lg"},Yk={class:"grid grid-cols-2 gap-4"},Zk={class:"text-xs text-gray-500 mb-1"},Gk={class:"text-sm font-semibold text-gray-900"},Kk=e.defineComponent({directives:{tooltip:fe.TooltipDirective},__name:"raster-info-tab",props:{details:{}},setup(t){return(n,o)=>{const l=e.resolveDirective("tooltip");return e.openBlock(),e.createElementBlock("div",Lk,[e.createElementVNode("div",Ak,[e.createElementVNode("div",Tk,[o[0]||(o[0]=e.createElementVNode("div",{class:"mb-4"},[e.createElementVNode("h4",{class:"text-sm font-semibold text-gray-900 uppercase tracking-wide"},"Основні параметри")],-1)),e.createElementVNode("div",Mk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.baseParams,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label,class:"bg-gray-50 p-2 rounded-lg"},[e.createElementVNode("p",Fk,e.toDisplayString(a.label),1),a.tooltip?e.withDirectives((e.openBlock(),e.createElementBlock("p",Dk,[e.createTextVNode(e.toDisplayString(a.value),1)])),[[l,a.tooltip]]):(e.openBlock(),e.createElementBlock("p",zk,e.toDisplayString(a.value),1))]))),128))])]),e.createElementVNode("div",Ik,[o[3]||(o[3]=e.createElementVNode("div",{class:"mb-2"},[e.createElementVNode("h4",{class:"text-sm font-semibold text-gray-900 uppercase tracking-wide"},"Просторова інформація")],-1)),e.createElementVNode("div",Pk,[e.createElementVNode("div",null,[o[1]||(o[1]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Система координат",-1)),e.createElementVNode("div",jk,[e.createElementVNode("p",Rk,e.toDisplayString(t.details.spatial.crs.code),1),e.createElementVNode("p",Ok,e.toDisplayString(t.details.spatial.crs.description),1)])]),e.createElementVNode("div",null,[o[2]||(o[2]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Межі покриття",-1)),e.createElementVNode("div",Uk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.bounds,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label,class:"bg-gray-50 p-2 rounded-lg border border-gray-200"},[e.createElementVNode("p",qk,e.toDisplayString(a.label),1),e.createElementVNode("p",Hk,e.toDisplayString(a.value),1)]))),128))])]),e.createElementVNode("div",Wk,[e.createElementVNode("div",Yk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.resolution,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label},[e.createElementVNode("p",Zk,e.toDisplayString(a.label),1),e.createElementVNode("p",Gk,e.toDisplayString(a.value),1)]))),128))])])])])])])}}}),Xk={class:"flex-1 overflow-y-auto space-y-3 pr-1"},Qk={class:"font-medium text-sm text-gray-800"},Jk={class:"text-xs text-gray-500"},ew=e.defineComponent({__name:"raster-files-tab",props:{files:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",Xk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.files,l=>(e.openBlock(),e.createElementBlock("div",{key:l.name,class:"border border-gray-100 rounded-xl p-4 shadow-sm bg-white flex items-start justify-between"},[e.createElementVNode("div",null,[e.createElementVNode("p",Qk,e.toDisplayString(l.name),1),e.createElementVNode("p",Jk,e.toDisplayString(l.resolution)+" • "+e.toDisplayString(l.size)+"MB",1)]),e.createElementVNode("span",{class:e.normalizeClass(["text-[11px] font-semibold px-2 py-0.5 rounded-full",l.statusClass])},e.toDisplayString(l.status),3)]))),128))]))}}),tw={},nw={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"};function ow(t,n){return e.openBlock(),e.createElementBlock("svg",nw,[...n[0]||(n[0]=[e.createElementVNode("circle",{cx:"12",cy:"12",r:"9"},null,-1),e.createElementVNode("line",{x1:"12",y1:"8",x2:"12",y2:"8"},null,-1),e.createElementVNode("path",{d:"M11 12h1v4h1"},null,-1)])])}const rw=Ce(tw,[["render",ow]]),lw={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},aw={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},sw={class:"flex items-center gap-2"},iw={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},cw={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},dw=["checked"],uw=e.defineComponent({__name:"RasterLayer",props:{tileUrl:{},extent:{},layerId:{},beforeId:{},showRasterExtent:{type:Boolean}},emits:["toggle-extent"],setup(t){const n=t,o=n.layerId||"raster-preview-layer",l=`${o}-source`,a=n.extent&&n.extent.length===4?[...n.extent]:void 0,i=Ue(o,{sourceId:l,source:{type:"raster",tiles:n.tileUrl?[n.tileUrl+"?nottl=1"]:[],tileSize:256,...a?{bounds:a}:{}},layer:{id:`${o}-raster`,type:"raster",paint:{"raster-opacity":1}},beforeId:n.beforeId??null}),{fitBounds:s}=tt(),c=e.ref(1);e.watch(()=>n.tileUrl,r=>{if(!r){i.setVisible(!1);return}i.setVisible(!0),i.setTiles([r])},{immediate:!0}),e.watch(()=>c.value,r=>{i.setOpacity(r)},{immediate:!0});let u=null,g=!1;e.watch(()=>n.extent,r=>{if(!r||r.length!==4)return;const y=r.join(",");if(y!==u){if(u=y,!g){g=!0;return}s==null||s([[r[0],r[1]],[r[2],r[3]]],{padding:40,maxZoom:17})}},{immediate:!0});const h=e.computed(()=>`${Math.round(c.value*100)}%`);return(r,y)=>(e.openBlock(),e.createElementBlock("div",lw,[e.createElementVNode("div",aw,[e.createElementVNode("div",sw,[y[2]||(y[2]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":y[0]||(y[0]=d=>c.value=d),class:"h-1 w-28 cursor-pointer appearance-none rounded-full bg-slate-300 focus:outline-none",style:{"accent-color":"#3b82f6"}},null,512),[[e.vModelText,c.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(h.value),1)])]),e.createElementVNode("div",iw,[e.createElementVNode("label",cw,[e.createElementVNode("input",{type:"checkbox",class:"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-200",checked:t.showRasterExtent,onChange:y[1]||(y[1]=d=>r.$emit("toggle-extent",d.target.checked))},null,40,dw),y[3]||(y[3]=e.createElementVNode("span",null,"Межі растру",-1))])])]))}}),On=e.defineComponent({__name:"ExtentOutlineLayer",props:{extent:{},layerId:{},beforeId:{},lineColor:{},lineWidth:{}},setup(t){const n=t,o=n.layerId||"extent-outline-layer",l=`${o}-source`,a=e.computed(()=>{const{extent:c}=n;if(!c||c.length!==4)return null;const[u,g,h,r]=c;return[u,g,h,r].some(y=>typeof y!="number"||Number.isNaN(y))?null:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[u,g],[h,g],[h,r],[u,r],[u,g]]]}}]}}),i=tt(),s=Ue(o,{sourceId:l,source:{type:"geojson",data:a.value||{type:"FeatureCollection",features:[]}},layer:{id:o,type:"line",paint:{"line-color":n.lineColor??"#ef4444","line-width":n.lineWidth??2}},beforeId:n.beforeId??null});return e.watch(()=>a.value,c=>{var g;if(!c){s.setVisible(!1),s.setData({type:"FeatureCollection",features:[]});return}s.setVisible(!0),s.setData(c);const u=(g=i.map)==null?void 0:g.value;u!=null&&u.moveLayer&&u.getLayer(o)&&u.moveLayer(o)},{immediate:!0}),(c,u)=>e.createCommentVNode("",!0)}}),mw={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},pw={class:"flex-1 relative overflow-hidden"},fw={class:"absolute top-0 left-0 w-full z-20"},gw={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},yw={class:"flex items-start justify-between gap-4"},hw={class:"flex-1 min-w-0"},bw={class:"flex items-center text-sm text-gray-500 mb-3"},xw={class:"text-gray-900 font-medium truncate max-w-xs"},kw={class:"flex items-center justify-between gap-4"},ww={class:"flex-1 min-w-0"},_w={class:"flex items-center gap-3 mb-1"},Ew={class:"text-base font-semibold text-gray-900 truncate"},Cw=["title"],Nw={class:"flex items-center gap-4 min-w-0"},Vw={class:"flex-1 min-w-0"},Bw=["title"],$w={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[105px]"},Sw={class:"relative w-full h-full"},vw={class:"absolute top-4 left-4 z-20"},Lw={key:1,class:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2 rounded-2xl border border-sky-200 bg-white/95 px-4 py-2 text-xs font-medium text-slate-700 shadow-lg backdrop-blur"},Aw={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},Tw={class:"flex-1 flex flex-col h-full"},Mw={class:"px-3 pt-3 pb-2 border-b border-gray-100"},Fw={class:"items-center justify-center text-muted-foreground grid w-full grid-cols-3 h-12 p-1 bg-gray-50 rounded-xl shadow-sm"},Dw=["aria-selected","onClick"],zw={class:"leading-none"},Iw={class:"flex flex-col flex-1 overflow-y-hidden p-3"},Pw={key:0,class:"mb-3 text-xs text-slate-500"},jw={key:1,class:"mb-3 text-xs text-rose-600"},Rw="OpenGIS",Vl=2,Un=5,Ow=5,Uw=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"raster",setup(t){const n=[{cardClass:"bg-gradient-to-br from-green-50 to-green-100/30 border-green-200",titleClass:"text-green-900"},{cardClass:"bg-gradient-to-br from-blue-50 to-blue-100/30 border-blue-200",titleClass:"text-blue-900"},{cardClass:"bg-gradient-to-br from-purple-50 to-purple-100/30 border-purple-200",titleClass:"text-purple-900"},{cardClass:"bg-gradient-to-br from-gray-50 to-gray-100/30 border-gray-200",titleClass:"text-gray-900"}],o=Fe.useRouter(),l=Fe.useRoute(),a=e.ref(null),i=e.computed(()=>{var M;const B=(M=l.params)==null?void 0:M.id;return typeof B=="string"?B:void 0}),s=e.ref(null),c=e.ref(!1),u=e.ref(!1),g=e.ref(null),h=e.ref(!0),r=e.ref(!1),y=e.ref(null);let d=null,m=null;const x=e.ref(!1);let f=null,p=!1;function b(B){if(Array.isArray(B))return b(B[0]);if(typeof B!="string"&&typeof B!="number")return null;const M=typeof B=="number"?B:Number(B.trim());return Number.isFinite(M)?M:null}function k(B,M){return B.toFixed(M)}function V(B,M,X){const le=.5*10**-X;return Math.abs(B-M)>le}function $(){var B;return(B=a.value)==null?void 0:B.ctx}function _(){var O,H,ae,ye;const B=(H=(O=$())==null?void 0:O.map)==null?void 0:H.value;if(!B)return;const M=b(l.query.z),X=b(l.query.x),le=b(l.query.y);if(M==null||X==null||le==null)return;const de=(ae=B.getCenter)==null?void 0:ae.call(B),be=(ye=B.getZoom)==null?void 0:ye.call(B);(!de||V(de.lng,X,Un)||V(de.lat,le,Un)||V(be??0,M,Vl))&&(x.value=!0,B.jumpTo({center:[X,le],zoom:M}),x.value=!1)}function w(){var de,be,P,O;if(x.value)return;const B=(be=(de=$())==null?void 0:de.map)==null?void 0:be.value;if(!B)return;const M=(P=B.getCenter)==null?void 0:P.call(B),X=(O=B.getZoom)==null?void 0:O.call(B);if(!M||X==null)return;const le={...l.query,z:k(X,Vl),x:k(M.lng,Un),y:k(M.lat,Un)};l.query.z===le.z&&l.query.x===le.x&&l.query.y===le.y||o.replace({query:le})}function S(){var M;if(typeof document>"u")return;const B=(M=te.value)==null?void 0:M.name;document.title=B?`${B} — Растер`:Rw}function A(B){return Number(B.toFixed(Ow))}function R(B,M){const[X,le]=B,[de,be]=M;return[A(Math.min(X,de)),A(Math.min(le,be)),A(Math.max(X,de)),A(Math.max(le,be))]}function Z(B){const[M,X,le,de]=B;return{type:"Polygon",coordinates:[[[M,X],[le,X],[le,de],[M,de],[M,X]]]}}function I(B){var le,de,be;const M=(de=(le=$())==null?void 0:le.map)==null?void 0:de.value,X=(be=M==null?void 0:M.getCanvas)==null?void 0:be.call(M);X!=null&&X.style&&(X.style.cursor=B)}async function K(B,M){if(!(!i.value||!s.value))try{const X=Z(B),le=await fetch(`/api/gis-metadata/raster/${encodeURIComponent(i.value)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:X})});if(!le.ok)throw new Error(`Failed to save raster metadata geom: ${le.status}`);fe.notify({type:"success",title:"Extent збережено",message:"Нові межі успішно збережено."}),await Ke()}catch(X){console.error("Failed to save raster extent",X),s.value&&(s.value={...s.value,extent:M?[...M]:void 0}),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Extent"})}}function q(B){var X,le,de;const M=(le=(X=$())==null?void 0:X.map)==null?void 0:le.value;if((de=M==null?void 0:M.dragPan)!=null&&de.enable&&M.dragPan.enable(),(B==null?void 0:B.length)===4&&s.value){const be=Array.isArray(s.value.extent)?[...s.value.extent]:null;s.value={...s.value,extent:[...B]},K(B,be)}f=null,p=!1,y.value=null,r.value=!1,I("")}function ne(){q(null)}function Y(){var be,P;const B=(P=(be=$())==null?void 0:be.map)==null?void 0:P.value;if(!B)return;const M=O=>{var ae,ye,Ne;if(!r.value||((ae=O==null?void 0:O.originalEvent)==null?void 0:ae.button)!=null&&O.originalEvent.button!==0)return;const H=O==null?void 0:O.lngLat;H&&(f=[H.lng,H.lat],p=!0,y.value=[H.lng,H.lat,H.lng,H.lat],(Ne=(ye=B.dragPan)==null?void 0:ye.disable)==null||Ne.call(ye))},X=O=>{if(!r.value||!p||!f)return;const H=O==null?void 0:O.lngLat;H&&(y.value=R(f,[H.lng,H.lat]))},le=O=>{if(!r.value||!p||!f)return;const H=O==null?void 0:O.lngLat;if(!H){ne();return}const ae=R(f,[H.lng,H.lat]),[ye,Ne,Le,Se]=ae;if(!(Math.abs(Le-ye)>0&&Math.abs(Se-Ne)>0)){fe.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),ne();return}q(ae)},de=O=>{r.value&&O.key==="Escape"&&(O.preventDefault(),ne())};B.on("mousedown",M),B.on("mousemove",X),B.on("mouseup",le),window.addEventListener("keydown",de),m=()=>{B.off("mousedown",M),B.off("mousemove",X),B.off("mouseup",le),window.removeEventListener("keydown",de)}}async function D(){var X;if(r.value)return;const B=$();!(B!=null&&B.ready)||(await B.ready(),!((X=B.map)==null?void 0:X.value))||(m||Y(),r.value=!0,p=!1,f=null,y.value=null,I("crosshair"),fe.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}const v=e.computed(()=>{var M;const B=(M=s.value)==null?void 0:M.url;return B?/^https?:\/\//i.test(B)||typeof window>"u"||typeof location>"u"?B:`${location.origin}${B}`:""}),F=e.computed(()=>{var B;return((B=s.value)==null?void 0:B.extent)??null}),N=e.computed(()=>i.value?`raster-${i.value}`:void 0),E=e.computed(()=>i.value?`raster-extent-${i.value}`:"raster-extent"),T=e.computed(()=>i.value?`raster-extent-draft-${i.value}`:"raster-extent-draft"),z=e.computed(()=>{const B=N.value??"raster",M=F.value&&F.value.length===4?F.value.join(","):"no-extent";return`${B}-${M}`}),Q=e.computed(()=>!!v.value),se=e.computed(()=>{const B=F.value;if(!B||B.length!==4)return null;const[M,X,le,de]=B;return[M,X,le,de].some(be=>typeof be!="number"||Number.isNaN(be))?null:[(M+le)/2,(X+de)/2]}),te=e.computed(()=>{var be,P;const B=s.value,M=B==null?void 0:B.extent,le=i.value??"—",de=[B!=null&&B.extension?`Формат ${String(B.extension).toUpperCase()}`:null,(B==null?void 0:B.resolution)||null].filter(Boolean).join(", ");return{id:le,name:(B==null?void 0:B.name)||((P=(be=B==null?void 0:B.files)==null?void 0:be[0])==null?void 0:P.name),description:(B==null?void 0:B.description)||de||"Попередній перегляд растрового шару.",coverage:M&&M.length===4?`${W(M[0])}, ${W(M[1])} → ${W(M[2])}, ${W(M[3])}`:"Покриття уточнюється",crs:B!=null&&B.srid?`EPSG:${B.srid}`:"EPSG:4326",source:B!=null&&B.proj4?B.proj4:"Джерело: Mapnik",updatedAt:B!=null&&B.cache?"Дані кешовано":"Нові дані"}}),oe=e.computed(()=>{const B=s.value;return B?[B.source_path,B.srid?`SRID: ${B.srid}`:null,B.is_public?"Публічна":"Не публічна",B.is_active?"Активна":"Неактивна",B.cache?"Кешовано":null].filter(M=>M).join(", "):""}),ge=[{key:"info",label:"Інформація",icon:rw},{key:"files",label:"Файли",icon:Vn},{key:"metadata",label:"Метадані",icon:Bo}],he=ge.map(B=>B.key),ce=e.ref(he.includes(l.query.tab)?l.query.tab:"info"),Be=e.ref(!0);e.watch(()=>l.query.tab,B=>{B&&he.includes(B)&&ce.value!==B&&(ce.value=B)}),e.watch(ce,B=>{l.query.tab!==B&&o.replace({query:{...l.query,tab:B}})});const We=e.computed(()=>G(s.value)),qe=e.computed(()=>xe(s.value));e.watch(()=>s.value,()=>{S()},{immediate:!0});async function Re(){var le;const B=$();if(!(B!=null&&B.ready))return;await B.ready(),_();const M=(le=B.map)==null?void 0:le.value;if(!M)return;const X=()=>w();M.on("moveend",X),M.on("zoomend",X),d=()=>{M.off("moveend",X),M.off("zoomend",X)}}e.watch(()=>[l.query.z,l.query.x,l.query.y],()=>{_()}),e.onMounted(()=>{Re()}),e.onBeforeUnmount(()=>{d==null||d(),d=null,m==null||m(),m=null,I("")}),e.watch(i,()=>{Ke()},{immediate:!0});async function Ge(B){var M;Ke(),((M=s.value)==null?void 0:M.srid)!==B.srid&&(fe.notify({title:"XML start",type:"info",message:"зміна системи координат, оновлюємо карту ..."}),await wt(`/api/gis-xml/${encodeURIComponent(i.value)}`),fe.notify({title:"XML created",type:"info",message:"карта створена"}),location.reload())}async function Ke(){const B=i.value;if(!B){s.value=null,g.value=null;return}c.value=!0,g.value=null;try{const M=await fetch(`/api/gis-raster/${encodeURIComponent(B)}`);if(!M.ok)throw new Error(`HTTP ${M.status}`);const X=await M.json();X.xml&&(u.value=!0),s.value=X,X.xml||(fe.notify({title:"XML not found",type:"info",message:"йде створення xml ... зачекайте"}),await wt(`/api/gis-xml/${encodeURIComponent(B)}`),fe.notify({title:"XML created",type:"info",message:"карта створена"}),fetch(`/api/gis-raster/${encodeURIComponent(B)}?nocache=1`),u.value=!0)}catch(M){console.error("Failed to load raster info",M),s.value=null,g.value=M instanceof Error?M.message:String(M)}finally{c.value=!1}}function wt(B){return new Promise((M,X)=>{const le=new EventSource(B),de=[];le.onmessage=be=>{de.push(be.data),console.log("Received:",be.data)},le.addEventListener("end",()=>{le.close(),M(de)}),le.onerror=be=>{le.close(),M(be)}})}function G(B){var M;return(M=B==null?void 0:B.files)!=null&&M.length?B.files.map(X=>({name:X.name,resolution:ee(X.name,B),size:X.size||"—",status:"Готово",statusClass:"bg-emerald-50 text-emerald-600 border border-emerald-100"})):[]}function ee(B,M){const X=B.toLowerCase();return X.endsWith(".tfw")?"Georeference":X.endsWith(".xml")?"Опис":X.endsWith(".tif")||X.endsWith(".tiff")?M!=null&&M.resolution?M.resolution:"Растер":(M==null?void 0:M.resolution)??"Файл"}function xe(B){return B?{baseParams:Te(B),spatial:{crs:{code:B.srid?`EPSG:${B.srid}`:"EPSG:4326",description:B.proj4||"WGS 84 — World Geodetic System 1984"},bounds:ke(B.extent),resolution:He(B)},statistics:ve(B),technical:lt(B)}:null}function Pe(B){return B!=null&&B.length?B.map(X=>{var de;if(!X)return"";const le=X.trim().split(/\s+/)[0];return((de=le==null?void 0:le[0])==null?void 0:de.toUpperCase())||""}).filter(Boolean).join(""):""}function Te(B){var be,P;const M=B.bands_count??((be=B.bands)==null?void 0:be.length)??"—",X=Pe(B.bands),le=(B.bands??[]).map(O=>O.trim()).filter(O=>O.length>0),de=le.length?le.join(", "):void 0;return[{label:"Розмір растру, px",value:B.width&&B.height?`${B.width}×${B.height}`:"—"},{label:"Формат файлу",value:((P=B.extension)==null?void 0:P.toUpperCase())??"—"},{label:"Розмір файлу, mb",value:B.total_size?`${B.total_size}`:"—"},{label:"Кількість каналів",value:typeof M=="number"?`${M}${X?` (${X})`:""}`:`${M}${X?` (${X})`:""}`,tooltip:de},{label:"Глибина кольору",value:B.color_depth?`${B.color_depth} біт/канал`:"—"},{label:"Стиснення",value:B.compression||"—"}]}function ke(B){return!B||B.length!==4?[]:[{label:"Північ",value:W(B[3],"N")},{label:"Схід",value:W(B[2],"E")},{label:"Південь",value:W(B[1],"S")},{label:"Захід",value:W(B[0],"W")}]}function He(B){const M=[{label:"Роздільна здатність",value:B.resolution||"—"}];return B.width&&B.height&&M.push({label:"Розмір пікселя",value:`${B.width} × ${B.height} px`}),M}function ve(B){var M;return(M=B.bands)!=null&&M.length?B.bands.map((X,le)=>{const de=n[le%n.length];return{label:`Канал ${le+1}${X?` (${X})`:""}`,cardClass:de.cardClass,titleClass:de.titleClass,metrics:[{label:"Назва",value:X||`Канал ${le+1}`},{label:"Глибина",value:B.color_depth?`${B.color_depth} біт`:"—"},{label:"Статус",value:B.cache?"Кешовано":"Готово"}]}}):[]}function lt(B){var M;return[{label:"Тип даних",value:B.color_depth?`Unsigned Integer ${B.color_depth}-bit`:"—"},{label:"Компресія",value:B.compression||"—"},{label:"Кольорова інтерпретація",value:((M=B.bands)==null?void 0:M.join(", "))||"—"},{label:"SRID",value:B.srid?`EPSG:${B.srid}`:"—"},{label:"Проекція (proj4)",value:B.proj4||"—"},{label:"URL тайла",value:B.url||"—"}]}function W(B,M){if(B==null||Number.isNaN(B))return"—";const X=`${B.toFixed(5)}°`;return M?`${X} ${M}`:X}return(B,M)=>(e.openBlock(),e.createElementBlock("div",mw,[e.createElementVNode("div",pw,[e.createElementVNode("div",fw,[e.createElementVNode("div",gw,[e.createElementVNode("div",yw,[e.createElementVNode("div",hw,[e.createElementVNode("div",bw,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:M[0]||(M[0]=X=>e.unref(o).push("/gis.rasters"))}," Растри "),M[3]||(M[3]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",xw,e.toDisplayString(te.value.name||"Растер"),1)]),e.createElementVNode("div",kw,[e.createElementVNode("div",ww,[e.createElementVNode("div",_w,[e.createElementVNode("h1",Ew,e.toDisplayString(te.value.name||"Растер"),1)]),oe.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:oe.value},e.toDisplayString(oe.value),9,Cw)):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",Nw,[e.createElementVNode("div",Vw,[e.createElementVNode("div",{class:"w-full text-xs text-gray-600 truncate",title:te.value.description},e.toDisplayString(te.value.description),9,Bw)]),e.createVNode(So,{"entity-id":i.value||"","entity-info":{name:te.value.name},table:"gis.rasters.table","entity-label":"Растер","save-method":"put","edit-button-text":"Редагувати",onSaved:Ge},null,8,["entity-id","entity-info"])])])])]),e.createElementVNode("div",$w,[e.createElementVNode("div",Sw,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:a},{default:e.withCtx(()=>[Q.value&&u.value?(e.openBlock(),e.createBlock(uw,{key:z.value,"tile-url":v.value,extent:F.value,"layer-id":N.value,"show-raster-extent":h.value,onToggleExtent:M[1]||(M[1]=X=>h.value=X)},null,8,["tile-url","extent","layer-id","show-raster-extent"])):e.createCommentVNode("",!0),e.createVNode(On,{extent:h.value?F.value:null,"layer-id":E.value},null,8,["extent","layer-id"]),e.createVNode(On,{extent:y.value,"layer-id":T.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createElementVNode("div",vw,[e.createVNode(Wt)]),r.value?(e.openBlock(),e.createElementBlock("div",Lw," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),e.createElementVNode("div",Aw,[e.createVNode(It),se.value?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:se.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)])]),_:1},512)])]),e.createVNode(Vo,{open:Be.value,onToggle:M[2]||(M[2]=X=>Be.value=!Be.value)},null,8,["open"])]),e.createElementVNode("div",{class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",Be.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",Tw,[e.createElementVNode("div",Mw,[e.createElementVNode("div",Fw,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(ge,X=>e.createElementVNode("button",{key:X.key,type:"button",role:"tab","aria-selected":ce.value===X.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",ce.value===X.key?"bg-white shadow-sm text-gray-700":""]),onClick:le=>ce.value=X.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(X.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",zw,e.toDisplayString(X.label),1)],10,Dw)),64))])]),e.createElementVNode("div",Iw,[c.value?(e.openBlock(),e.createElementBlock("div",Pw," Завантаження метаданих растру… ")):g.value?(e.openBlock(),e.createElementBlock("div",jw," Не вдалося отримати дані: "+e.toDisplayString(g.value),1)):e.createCommentVNode("",!0),ce.value==="files"?(e.openBlock(),e.createBlock(ew,{key:2,files:We.value},null,8,["files"])):ce.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:3,data:s.value,"entity-id":i.value,"entity-type":"raster",onSaved:Ke,onEditCssBounds:D},null,8,["data","entity-id"])):qe.value?(e.openBlock(),e.createBlock(Kk,{key:4,details:qe.value},null,8,["details"])):e.createCommentVNode("",!0)])])],2)]))}})},Symbol.toStringTag,{value:"Module"})),qw={},Hw={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-table"};function Ww(t,n){return e.openBlock(),e.createElementBlock("svg",Hw,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M12 3v18"},null,-1),e.createElementVNode("rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"},null,-1),e.createElementVNode("path",{d:"M3 9h18"},null,-1),e.createElementVNode("path",{d:"M3 15h18"},null,-1)])])}const Yw=Ce(qw,[["render",Ww]]),Zw={class:"flex flex-col h-full"},Gw={class:"flex justify-end mb-3 gap-2"},Kw=e.defineComponent({__name:"cartocss-css-tab",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,l=n,a=e.computed({get:()=>o.modelValue,set:i=>l("update:modelValue",i)});return(i,s)=>(e.openBlock(),e.createElementBlock("div",Zw,[e.createElementVNode("div",Gw,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:s[0]||(s[0]=c=>i.$emit("save"))},[...s[2]||(s[2]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-3.5 w-3.5"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти ",-1)])])]),e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":s[1]||(s[1]=c=>a.value=c),language:"cartocss",class:"flex-1 rounded-lg overflow-hidden"},null,8,["modelValue"])]))}}),Xw={class:"flex flex-col flex-1 min-h-0"},Qw={class:"flex justify-between mb-3 gap-2"},Jw={class:"text-left"},e2={class:"font-medium text-gray-900"},t2={class:"text-xs text-gray-500"},n2={class:"flex justify-center gap-2"},o2=["checked","onChange"],r2={class:"text-sm font-medium text-gray-900"},l2=e.defineComponent({__name:"cartocss-data-tab",props:{modelValue:{default:[]},modelModifiers:{}},emits:e.mergeModels(["save"],["update:modelValue"]),setup(t,{emit:n}){const o=[{key:"table",label:"Таблиця",slot:"datasetCell"},{key:"active",label:"Активний",slot:"activeCell",width:"140px"},{key:"zoom",label:"Min Зум",slot:"zoomCell",width:"140px"}],l=e.defineAsyncComponent(()=>import("@opengis/core").then(m=>m.VsModal)),a=e.defineAsyncComponent(()=>import("@opengis/form")),i=e.useModel(t,"modelValue"),s=n,c=e.ref(!1),u=e.ref({table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0}),g={table:{type:"text",label:"Таблиця",validators:["required"]},key:{type:"text",label:"Ключ",validators:["required"]},query:{type:"text",label:"Query"},columns:{type:"text",label:"Колонки"},gcol:{type:"text",label:"Колонка geometry"},srid:{type:"number",label:"SRID"},proj4text:{type:"text",label:"PROJ4"},active:{type:"switcher",label:"Активна"},minzoom:{type:"number",label:"Min Зум",col:6},maxzoom:{type:"number",label:"Max Зум",col:6}};function h(){u.value={table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0},c.value=!0}function r(){c.value=!1}function y(){var f,p;const m=(f=u.value.table)==null?void 0:f.trim(),x=(p=u.value.key)==null?void 0:p.trim();if(!m||!x){fe.notify({type:"warning",title:"Перевірка",message:"Вкажіть таблицю та підпис"});return}i.value=[...Array.isArray(i.value)?i.value:[],{...u.value,table:m,key:x}],c.value=!1}function d(m,x){var p;const f=((p=x==null?void 0:x.target)==null?void 0:p.checked)??!1;m.active=f,i.value=Array.isArray(i.value)?[...i.value]:[]}return(m,x)=>(e.openBlock(),e.createElementBlock("div",Xw,[e.createElementVNode("div",Qw,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium bg-gradient-to-r from-gray-500 to-gray-400 text-white h-9 px-4 py-2 hover:from-gray-600 hover:to-gray-500",onClick:h}," Додати таблицю "),e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:x[0]||(x[0]=f=>s("save"))}," Зберегти ")]),e.createVNode(At,{modelValue:i.value,"onUpdate:modelValue":x[1]||(x[1]=f=>i.value=f),"columns-scheme":o,"form-scheme":g,"add-button":!1,"main-col-width":"260px"},{datasetCell:e.withCtx(({row:f})=>[e.createElementVNode("div",Jw,[e.createElementVNode("div",e2,e.toDisplayString(f.table),1),e.createElementVNode("div",t2,e.toDisplayString(f.key),1)])]),activeCell:e.withCtx(({row:f})=>[e.createElementVNode("label",n2,[e.createElementVNode("input",{type:"checkbox",class:"h-4 w-4 text-sky-500 border-gray-300 rounded focus:ring-sky-300",checked:f.active,onChange:p=>d(f,p)},null,40,o2)])]),zoomCell:e.withCtx(({row:f})=>[e.createElementVNode("div",r2,e.toDisplayString(f.zoom),1)]),_:1},8,["modelValue"]),e.createVNode(e.unref(l),{teleport:"#modal",visible:c.value,"onUpdate:visible":x[3]||(x[3]=f=>c.value=f),title:"Нова таблиця CartoCSS"},{footer:e.withCtx(()=>[e.createElementVNode("div",{class:"flex justify-end gap-2 p-4 border-т"},[e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-gray-100 text-gray-700",onClick:r}," Скасувати "),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white",onClick:y}," Додати ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(a),{values:u.value,"onUpdate:values":x[2]||(x[2]=f=>u.value=f),schema:g},null,8,["values"])]),_:1},8,["visible"])]))}}),a2={class:"flex flex-col flex-1 min-h-0 gap-4"},s2={class:"h-[calc(100vh-230px)] rounded-md border border-gray-200 bg-white"},i2=e.defineComponent({__name:"cartocss-card-tab",props:{card:{},table:{}},emits:["save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.table),i=e.ref(o.card),s=e.defineAsyncComponent(()=>import("@opengis/form").then(u=>u.VsInputText));function c(){l("save",{card_html:i.value,card_table:a.value})}return(u,g)=>(e.openBlock(),e.createElementBlock("div",a2,[e.createElementVNode("div",{class:"flex items-center justify-end gap-3"},[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:c},[...g[2]||(g[2]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-3.5 w-3.5"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти картку ",-1)])])]),e.createElementVNode("div",null,[e.createVNode(e.unref(s),{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h)},null,8,["modelValue"])]),e.createElementVNode("div",s2,[e.createVNode(kn,{modelValue:i.value,"onUpdate:modelValue":g[1]||(g[1]=h=>i.value=h),language:"html",theme:"vs-light",class:"h-full w-full rounded-md"},null,8,["modelValue"])])]))}}),c2=e.defineComponent({__name:"CartocssLayerLoader",props:{layerId:{type:String,required:!0},tileUrl:{type:String,default:""},title:{type:String,default:""},active:{type:Boolean,default:!1},owner:{type:String,default:""},opacity:{type:Number,default:1}},setup(t){const n=t,o=tt(),{activateTemporaryLayer:l,deactivateTemporaryLayer:a,setTemporaryLayerOpacity:i}=lo(o.map),s=e.computed(()=>{var r;const h=`${(r=n==null?void 0:n.tileUrl)==null?void 0:r.trim()}`;return h?typeof window>"u"||typeof location>"u"||/^https?:\/\//i.test(h)?h:h.startsWith("//")?`${window.location.protocol}${h}`:h.startsWith("/")?`${location.origin}${h}`:`${location.origin}/${h}`:""});let c="",u="";function g(){const h=n.active&&!!s.value;c&&(!h||c!==n.layerId)&&(a(c,u||void 0),c="",u=""),h&&(l({id:n.layerId,title:n.title||n.layerId,url:s.value,opacity:n.opacity},{},n.owner),c=n.layerId,u=n.owner||"")}return e.watch(()=>[n.layerId,s.value,n.active,n.owner],g,{immediate:!0}),e.watch(()=>n.opacity,h=>{!c||!n.active||i(c,h,u||void 0)},{immediate:!0}),e.onUnmounted(()=>{c&&(a(c,u||void 0),c="",u="")}),(h,r)=>e.createCommentVNode("",!0)}}),d2=e.defineComponent({__name:"CartocssMapClickListener",props:{cartocssId:{},infoEnabled:{type:[Boolean,null]}},setup(t){const n=t,o=e.computed(()=>n.cartocssId??null),l=e.computed(()=>!!n.infoEnabled),{map:a,ready:i}=tt(),s=d=>{!d||typeof window>"u"||window.dispatchEvent(new CustomEvent(so,{detail:d}))},c=async d=>{const m=await fetch(`/api/map-format?${d.toString()}`);if(!m.ok)throw new Error(`API returned ${m.status}`);return m.json()};let u=null,g=null;const h=d=>{if(!d)return null;if(typeof d=="string")try{return JSON.parse(d)}catch{return null}return d},r=async(d,m)=>{var p;const x=o.value?`external:${o.value},${String(d)}`:null,f=new URLSearchParams({layer:o.value??"",id:String(d)});try{const b=await c(f),k=typeof b.html=="string"?b.html:null,V=h(((p=b==null?void 0:b.data)==null?void 0:p.geom)??(b==null?void 0:b.geom)??null);(k||V)&&s({html:k,geometry:V??m,infoToken:x})}catch(b){console.warn("CartoCSS map-format (id) error",b)}},y=async d=>{var p,b,k,V;if(!o.value)return;if(!l.value){fe.notify({type:"error",title:"CartoCSS",message:"Картка не налаштована"});return}const m=(p=d==null?void 0:d.lngLat)==null?void 0:p.lng,x=(b=d==null?void 0:d.lngLat)==null?void 0:b.lat;if(typeof m!="number"||typeof x!="number")return;const f=new URLSearchParams({layer:o.value,lat:x.toFixed(6),lng:m.toFixed(6)});try{const $=await c(f),_=h(((k=$==null?void 0:$.data)==null?void 0:k.geom)??($==null?void 0:$.geom)??null),w=((V=$==null?void 0:$.data)==null?void 0:V.id)??($==null?void 0:$.id);if(w!=null){await r(w,_);return}Ko({html:$==null?void 0:$.html})&&s({html:$==null?void 0:$.html,geometry:_,infoToken:null})}catch($){console.warn("CartoCSS map-format error",$)}};return i().then(()=>{g=a.value,g&&(g.on("click",y),u=()=>g==null?void 0:g.off("click",y))}),e.onBeforeUnmount(()=>{u==null||u(),u=null,g=null}),()=>{}}}),u2={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},m2={class:"flex-1 relative overflow-hidden"},p2={class:"absolute top-0 left-0 w-full z-20"},f2={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},g2={class:"flex items-start justify-between gap-4"},y2={class:"flex-1 min-w-0"},h2={class:"flex items-center text-sm text-gray-500 mb-3"},b2={class:"text-gray-900 font-medium truncate max-w-xs"},x2={class:"flex items-center justify-between gap-4"},k2={class:"flex-1 min-w-0"},w2={class:"flex items-center gap-3 mb-1"},_2={class:"text-base font-semibold text-gray-900 truncate"},E2={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},C2={class:"text-xs font-medium text-green-700"},N2=["title"],V2={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[115px]"},B2={class:"relative w-full h-full"},$2={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},S2={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},v2={class:"flex items-center gap-2"},L2={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},A2={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},T2=["checked"],M2={class:"absolute top-4 left-4 z-20"},F2={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},D2={key:0,class:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2 rounded-2xl border border-sky-200 bg-white/95 px-4 py-2 text-xs font-medium text-slate-700 shadow-lg backdrop-blur"},z2={class:"flex-1 flex flex-col h-full"},I2={key:0,class:"px-3 pt-3 pb-2 border-b border-gray-100"},P2=["aria-selected","onClick"],j2={class:"leading-none"},R2={class:"flex flex-col flex-1 overflow-y-hidden p-3"},O2={key:0,class:"flex-1 flex items-center justify-center text-sm text-gray-500"},U2="cartocss-demo-001",q2="OpenGIS",Bl=2,qn=5,H2=5,W2=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"cartocss",setup(t){const n=Fe.useRouter(),o=Fe.useRoute(),l=e.ref(null),a=[{key:"css",label:"CSS",icon:kl},{key:"data",label:"Дані",icon:Yw},{key:"metadata",label:"Метадані",icon:Bo},{key:"card",label:"Картка",icon:wl}],i=a.map(W=>W.key),s=e.ref(i.includes(o.query.tab)?o.query.tab:"css"),c=e.ref(!0),u=e.ref(null),g=e.computed(()=>{var W;return(W=u.value)!=null&&W.source_path?a.filter(B=>B.key==="card"||B.key==="metadata"):a}),h=e.computed(()=>o.params.id||U2),r=e.ref({id:h.value,name:"",description:""});let y=null;const d=e.ref(!1);function m(W){if(Array.isArray(W))return m(W[0]);if(typeof W!="string"&&typeof W!="number")return null;const B=typeof W=="number"?W:Number(W.trim());return Number.isFinite(B)?B:null}function x(W,B){return W.toFixed(B)}function f(W,B,M){const X=.5*10**-M;return Math.abs(W-B)>X}function p(){var W;return(W=l.value)==null?void 0:W.ctx}function b(){var P,O,H,ae;const W=(O=(P=p())==null?void 0:P.map)==null?void 0:O.value;if(!W)return;const B=m(o.query.z),M=m(o.query.x),X=m(o.query.y);if(B==null||M==null||X==null)return;const le=(H=W.getCenter)==null?void 0:H.call(W),de=(ae=W.getZoom)==null?void 0:ae.call(W);(!le||f(le.lng,M,qn)||f(le.lat,X,qn)||f(de??0,B,Bl))&&(d.value=!0,W.jumpTo({center:[M,X],zoom:B}),d.value=!1)}function k(){var le,de,be,P;if(d.value)return;const W=(de=(le=p())==null?void 0:le.map)==null?void 0:de.value;if(!W)return;const B=(be=W.getCenter)==null?void 0:be.call(W),M=(P=W.getZoom)==null?void 0:P.call(W);if(!B||M==null)return;const X={...o.query,z:x(M,Bl),x:x(B.lng,qn),y:x(B.lat,qn)};o.query.z===X.z&&o.query.x===X.x&&o.query.y===X.y||n.replace({query:X})}function V(W){typeof document>"u"||(document.title=W?`${W} — CartoCSS`:q2)}const $=e.ref(""),_=e.ref([]),w=e.ref(!1),S=e.ref(!1),A=e.ref(""),R=e.ref(0),Z=e.ref(!1),I=e.ref(1),K=e.ref(!0),q=e.ref(!1),ne=e.ref(null),Y=e.computed(()=>`cartocss-layer-${h.value}`),D=e.computed(()=>`${Math.round(I.value*100)}%`),v=e.computed(()=>`cartocss-extent-${h.value}`),F=e.computed(()=>`cartocss-extent-draft-${h.value}`),N=e.computed(()=>{var le;const W=(le=A.value)==null?void 0:le.trim();if(!W)return"";const B=W.includes("?")?"&":"?",M=`${W}${B}nottl=1`,X=R.value;return X?`${W}${B}ts=${X}&nocache=1`:M}),E=e.ref(""),T=e.ref(""),z=e.computed(()=>{var de;const W=(de=u.value)==null?void 0:de.bounds;if(!Array.isArray(W)||W.length<4)return null;const[B,M,X,le]=W;return[B,M,X,le].some(be=>typeof be!="number"||Number.isNaN(be))?null:[(B+X)/2,(M+le)/2]}),Q=e.computed(()=>{var de;const W=(de=u.value)==null?void 0:de.bounds;if(!Array.isArray(W)||W.length<4)return null;const[B,M,X,le]=W;return[B,M,X,le].some(be=>typeof be!="number"||Number.isNaN(be))?null:[B,M,X,le]}),se=e.computed(()=>{const W=u.value;return W?[W.description,W.group_id?`Група: ${W.group_id}`:null,W.source_path?`Шлях: ${W.source_path}`:null,W.is_public===!0?"Публічний":"Не публічний",W.enabled===!0?"Активний":"Неактивний"].filter(Boolean).join(", "):""}),te=e.computed(()=>{var B;const W=(B=u.value)==null?void 0:B.group_id;return W?String(W).toUpperCase():""});let oe=null,ge=!1,he=null;function ce(W){return Number(W.toFixed(H2))}function Be(W,B){const[M,X]=W,[le,de]=B;return[ce(Math.min(M,le)),ce(Math.min(X,de)),ce(Math.max(M,le)),ce(Math.max(X,de))]}function We(W){const[B,M,X,le]=W;return{type:"Polygon",coordinates:[[[B,M],[X,M],[X,le],[B,le],[B,M]]]}}function qe(W){var X,le,de;const B=(le=(X=p())==null?void 0:X.map)==null?void 0:le.value,M=(de=B==null?void 0:B.getCanvas)==null?void 0:de.call(B);M!=null&&M.style&&(M.style.cursor=W)}async function Re(W,B){if(!(!h.value||!u.value)){S.value=!0;try{const M=We(W),X=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:M})});if(!X.ok)throw new Error(`Failed to save cartocss bounds: ${X.status}`);fe.notify({type:"success",title:"Bounds збережено",message:"Нові межі успішно збережено."}),await He(h.value,{bustCache:!0})}catch(M){console.error("Failed to save CartoCSS bounds",M),u.value&&(u.value={...u.value,bounds:B?[...B]:null}),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Bounds"})}finally{S.value=!1}}}function Ge(W){var M,X,le;const B=(X=(M=p())==null?void 0:M.map)==null?void 0:X.value;if((le=B==null?void 0:B.dragPan)!=null&&le.enable&&B.dragPan.enable(),(W==null?void 0:W.length)===4&&u.value){const de=Array.isArray(u.value.bounds)?[...u.value.bounds]:null;u.value={...u.value,bounds:[...W]},Re(W,de)}oe=null,ge=!1,ne.value=null,q.value=!1,qe("")}function Ke(){Ge(null)}function wt(){var de,be;const W=(be=(de=p())==null?void 0:de.map)==null?void 0:be.value;if(!W)return;const B=P=>{var H,ae,ye;if(!q.value||((H=P==null?void 0:P.originalEvent)==null?void 0:H.button)!=null&&P.originalEvent.button!==0)return;const O=P==null?void 0:P.lngLat;O&&(oe=[O.lng,O.lat],ge=!0,ne.value=[O.lng,O.lat,O.lng,O.lat],(ye=(ae=W.dragPan)==null?void 0:ae.disable)==null||ye.call(ae))},M=P=>{if(!q.value||!ge||!oe)return;const O=P==null?void 0:P.lngLat;O&&(ne.value=Be(oe,[O.lng,O.lat]))},X=P=>{if(!q.value||!ge||!oe)return;const O=P==null?void 0:P.lngLat;if(!O){Ke();return}const H=Be(oe,[O.lng,O.lat]),[ae,ye,Ne,Le]=H;if(!(Math.abs(Ne-ae)>0&&Math.abs(Le-ye)>0)){fe.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),Ke();return}Ge(H)},le=P=>{q.value&&P.key==="Escape"&&(P.preventDefault(),Ke())};W.on("mousedown",B),W.on("mousemove",M),W.on("mouseup",X),window.addEventListener("keydown",le),he=()=>{W.off("mousedown",B),W.off("mousemove",M),W.off("mouseup",X),window.removeEventListener("keydown",le)}}async function G(){var M;const W=p();!(W!=null&&W.ready)||(await W.ready(),!((M=W.map)==null?void 0:M.value))||(he||wt(),q.value=!0,ge=!1,oe=null,ne.value=null,qe("crosshair"),fe.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}e.watch(h,W=>{W&&He(W)},{immediate:!0}),e.watch(()=>{var W;return(W=r.value)==null?void 0:W.name},W=>V(W),{immediate:!0});async function ee(){var X;const W=p();if(!(W!=null&&W.ready))return;await W.ready(),b();const B=(X=W.map)==null?void 0:X.value;if(!B)return;const M=()=>k();B.on("moveend",M),B.on("zoomend",M),y=()=>{B.off("moveend",M),B.off("zoomend",M)}}e.watch(()=>[o.query.z,o.query.x,o.query.y],()=>{b()}),e.onMounted(()=>{ee()}),e.onBeforeUnmount(()=>{y==null||y(),y=null,he==null||he(),he=null,qe("")}),e.watch(()=>o.query.tab,W=>{W&&g.value.some(B=>B.key===W)&&s.value!==W&&(s.value=W)}),e.watch(g,W=>{W.length&&!W.some(B=>B.key===s.value)&&(s.value=W[0].key)},{immediate:!0}),e.watch(s,W=>{o.query.tab!==W&&g.value.some(B=>B.key===W)&&n.replace({query:{...o.query,tab:W}})}),e.watch(()=>u.value,W=>{const B=W==null?void 0:W.card_html;E.value=B,T.value=W==null?void 0:W.card_table},{immediate:!0});function xe(){h.value&&He(h.value,{bustCache:!0})}async function Pe(W,B){if(h.value){S.value=!0;try{const M=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(W)});if(!M.ok)throw new Error(`Failed to save cartocss: ${M.status}`);fe.notify({type:"success",title:"Збережено",message:B}),await He(h.value,{bustCache:!0})}catch(M){console.error("Failed to save CartoCSS",M),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти CartoCSS"})}finally{S.value=!1}}}function Te(W){if(!W)return null;if(typeof W=="string")try{return JSON.parse(W)}catch(B){return console.warn("Failed to parse CartoCSS config",B),null}return typeof W=="object"?W:null}function ke(W){const B=Array.isArray(W)?W:W==null?void 0:W.datasets;return Array.isArray(B)?B.map((M,X)=>({table:(M==null?void 0:M.table)||(M==null?void 0:M.id)||`dataset_${X+1}`,query:(M==null?void 0:M.query)||"",srid:(M==null?void 0:M.srid)||"",gcol:(M==null?void 0:M.gcol)||"",key:(M==null?void 0:M.key)||(M==null?void 0:M.label)||"Без підпису",active:typeof(M==null?void 0:M.active)=="boolean"?M.active:!0,minzoom:typeof(M==null?void 0:M.zoom)>"u"?"":String(M.zoom),maxzoom:typeof(M==null?void 0:M.maxzoom)>"u"?"":String(M.maxzoom),columns:(M==null?void 0:M.columns)||"",proj4text:(M==null?void 0:M.proj4text)||""})):[]}async function He(W,B){w.value=!0;try{const M=await fetch(`/api/gis-css/${W}`);if(!M.ok)throw new Error(`Failed to load cartocss: ${M.status}`);const X=await M.json(),le=(X==null?void 0:X.message)||X||{};u.value=le,r.value={id:le.cartocss_key||W,name:le.name||r.value.name,description:le.description||r.value.description},$.value=typeof le.style=="string"?le.style:"";const de=Te(le.config??[]);_.value=ke(de);const be=typeof le.url=="string"?le.url:"";A.value=be,Z.value=!!(be&&le.enabled!==!1),R.value=B!=null&&B.bustCache?Date.now():0}catch(M){console.error("Failed to fetch CartoCSS",M),Z.value=!1,A.value="",R.value=0,u.value=null}finally{w.value=!1}}async function ve(){await Pe({style:$.value||"",config:_.value},"CartoCSS оновлено")}async function lt(W){const B=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(W)});if(!B.ok)throw new Error(`Failed to save cartocss: ${B.status}`);fe.notify({type:"success",title:"Збережено",message:"Картка CartoCSS оновлена"})}return(W,B)=>(e.openBlock(),e.createElementBlock("div",u2,[e.createElementVNode("div",m2,[e.createElementVNode("div",p2,[e.createElementVNode("div",f2,[e.createElementVNode("div",g2,[e.createElementVNode("div",y2,[e.createElementVNode("div",h2,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:B[0]||(B[0]=M=>e.unref(n).push("/gis.cartocss"))}," CartoCSS "),B[6]||(B[6]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",b2,e.toDisplayString(r.value.name||"CartoCSS"),1)]),e.createElementVNode("div",x2,[e.createElementVNode("div",k2,[e.createElementVNode("div",w2,[e.createElementVNode("h1",_2,e.toDisplayString(r.value.name||"CartoCSS"),1),te.value?(e.openBlock(),e.createElementBlock("div",E2,[e.createElementVNode("span",C2,e.toDisplayString(te.value),1)])):e.createCommentVNode("",!0)]),se.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:se.value},e.toDisplayString(se.value),9,N2)):e.createCommentVNode("",!0)])])]),e.createVNode(So,{class:"flex-shrink-0","entity-id":h.value,"entity-info":r.value,"form-endpoint":M=>`/api/form/gis.cartocss.table/${M}`,"save-endpoint":M=>`/api/gis-css/${M}`,"entity-label":"CartoCSS","save-method":"post",onSaved:xe},null,8,["entity-id","entity-info","form-endpoint","save-endpoint"])])])]),e.createElementVNode("div",V2,[e.createElementVNode("div",B2,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:l},{default:e.withCtx(()=>{var M,X;return[e.createElementVNode("div",$2,[e.createElementVNode("div",S2,[e.createElementVNode("div",v2,[B[7]||(B[7]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":B[1]||(B[1]=le=>I.value=le),type:"range",min:"0",max:"1",step:"0.01",class:"h-1 w-28 cursor-pointer appearance-none rounded-full bg-slate-300 focus:outline-none",style:{"accent-color":"#3b82f6"}},null,512),[[e.vModelText,I.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(D.value),1)])]),e.createElementVNode("div",L2,[e.createElementVNode("label",A2,[e.createElementVNode("input",{type:"checkbox",class:"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-200",checked:K.value,onChange:B[2]||(B[2]=le=>K.value=le.target.checked)},null,40,T2),B[8]||(B[8]=e.createElementVNode("span",null,"Межі css",-1))])])]),e.createElementVNode("div",M2,[e.createVNode(Wt)]),e.createElementVNode("div",F2,[e.createVNode(It),z.value?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:z.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),q.value?(e.openBlock(),e.createElementBlock("div",D2," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),N.value?(e.openBlock(),e.createBlock(c2,{key:1,"layer-id":Y.value,"tile-url":N.value,active:Z.value,opacity:I.value,title:r.value.name,owner:h.value},null,8,["layer-id","tile-url","active","opacity","title","owner"])):e.createCommentVNode("",!0),e.createVNode(On,{extent:K.value?Q.value:null,"layer-id":v.value},null,8,["extent","layer-id"]),e.createVNode(On,{extent:ne.value,"layer-id":F.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createVNode(d2,{"cartocss-id":h.value,bounds:((M=u.value)==null?void 0:M.bounds)??null,active:Z.value&&!q.value,"info-enabled":(X=u.value)==null?void 0:X.info},null,8,["cartocss-id","bounds","active","info-enabled"]),e.createVNode(io,{"map-id":h.value},null,8,["map-id"])]}),_:1},512)])]),u.value?(e.openBlock(),e.createBlock(Vo,{key:0,open:c.value,onToggle:B[3]||(B[3]=M=>c.value=!c.value)},null,8,["open"])):e.createCommentVNode("",!0)]),u.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",c.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",z2,[g.value.length>1?(e.openBlock(),e.createElementBlock("div",I2,[e.createElementVNode("div",{class:"items-center justify-center text-muted-foreground grid w-full h-12 p-1 bg-gray-50 rounded-xl shadow-sm",style:e.normalizeStyle({gridTemplateColumns:`repeat(${g.value.length}, minmax(0, 1fr))`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value,M=>(e.openBlock(),e.createElementBlock("button",{key:M.key,type:"button",role:"tab","aria-selected":s.value===M.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",s.value===M.key?"bg-white shadow-sm text-gray-700":""]),onClick:X=>s.value=M.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(M.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",j2,e.toDisplayString(M.label),1)],10,P2))),128))],4)])):e.createCommentVNode("",!0),e.createElementVNode("div",R2,[w.value?(e.openBlock(),e.createElementBlock("div",O2," Завантаження стилю… ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[s.value==="css"?(e.openBlock(),e.createBlock(Kw,{key:0,modelValue:$.value,"onUpdate:modelValue":B[4]||(B[4]=M=>$.value=M),class:"flex-1 min-h-0",onSave:ve},null,8,["modelValue"])):s.value==="data"?(e.openBlock(),e.createBlock(l2,{key:1,modelValue:_.value,"onUpdate:modelValue":B[5]||(B[5]=M=>_.value=M),class:"flex-1 min-h-0 flex flex-col",onSave:ve},null,8,["modelValue"])):s.value==="card"?(e.openBlock(),e.createBlock(i2,{key:2,card:E.value,table:T.value,class:"flex-1 min-h-0",onSave:lt},null,8,["card","table"])):s.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:3,data:u.value,"entity-id":h.value,"entity-type":"css",onSaved:xe,onEditCssBounds:G},null,8,["data","entity-id"])):e.createCommentVNode("",!0)],64))])])],2)):e.createCommentVNode("",!0)]))}})},Symbol.toStringTag,{value:"Module"})),Y2={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},Z2=e.defineComponent({__name:"GeneralSettings",props:{schema:{},modelValue:{},loading:{type:Boolean},form:{}},emits:["update:modelValue","update:form"],setup(t,{emit:n}){const o=e.defineAsyncComponent(()=>import("@opengis/form")),l=t,a=n,i=e.computed({get:()=>l.modelValue,set:c=>a("update:modelValue",c)}),s=e.computed({get:()=>l.form,set:c=>a("update:form",c)});return(c,u)=>(e.openBlock(),e.createElementBlock("section",Y2,[u[2]||(u[2]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"}," Основна інформація ",-1)),t.loading?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(o),{key:0,schema:t.schema,values:i.value,"onUpdate:values":u[0]||(u[0]=g=>i.value=g),form:s.value,"onUpdate:form":u[1]||(u[1]=g=>s.value=g)},null,8,["schema","values","form"]))]))}}),G2={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},K2=e.defineComponent({__name:"LayerSettings",props:{layerIDs:{},options:{}},emits:["update:layerIDs"],setup(t,{emit:n}){const o=t,l=n,a=e.computed({get:()=>o.layerIDs,set:i=>l("update:layerIDs",i)});return(i,s)=>(e.openBlock(),e.createElementBlock("section",G2,[s[1]||(s[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"},"Шари",-1)),s[2]||(s[2]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Доступні шари",-1)),e.createVNode(e.unref(Do.VsInputArraySelect),{data:"layer_list",api:"/api/suggest/layer_list",modelValue:a.value,"onUpdate:modelValue":s[0]||(s[0]=c=>a.value=c),placeholder:"Шари"},null,8,["modelValue"])]))}}),X2={class:"w-full"},Q2=e.defineComponent({__name:"MapPreview",props:{id:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",X2,[e.createVNode(Tn,{class:"w-full h-[calc(100vh-200px)]",height:"h-[calc(100vh-200px)]",id:t.id},null,8,["id"])]))}}),J2={class:"bg-white rounded-lg shadow-xl w-full max-w-4xl flex flex-col h-[80vh] m-4"},e_={class:"flex items-center justify-between px-6 py-4 border-b border-gray-200"},t_={key:0,class:"absolute top-0 left-0 right-0 bg-red-100 text-red-700 text-sm px-4 py-2 z-10 border-b border-red-200"},n_={class:"flex-1 overflow-hidden relative bg-[#fffffe]"},o_={class:"px-6 py-4 border-t border-gray-200 flex justify-end gap-3"},r_=["disabled"],l_=e.defineComponent({__name:"ConfigEditor",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(""),i=e.ref(null);e.watch(()=>o.modelValue,u=>{if(u){try{a.value=JSON.stringify(u,null,2)}catch{a.value="{}"}i.value=null}},{immediate:!0}),e.watch(a,u=>{if(!u.trim()){i.value=null;return}try{JSON.parse(u),i.value=null}catch(g){i.value=g.message}}),e.watch(()=>o.modelValue,()=>{setTimeout(()=>{const{monaco:u}=window;if(u&&u.editor){const g=u.editor.getEditors();g.length>0&&g[g.length-1].updateOptions({wordWrap:"on"})}},300)},{immediate:!0});function s(){l("update:modelValue",null),a.value="",i.value=null}function c(){if(!i.value)try{const u=JSON.parse(a.value);l("save",u),s()}catch(u){console.error("Failed to parse JSON",u)}}return(u,g)=>t.modelValue!==null?(e.openBlock(),e.createElementBlock("div",{key:0,class:"fixed inset-0 flex items-center justify-center bg-black/50 backdrop-blur-sm",onClick:e.withModifiers(s,["self"])},[e.createElementVNode("div",J2,[e.createElementVNode("div",e_,[g[1]||(g[1]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-800"}," Редагування конфігурації (JSON) ",-1)),e.createElementVNode("button",{onClick:s,class:"text-gray-500 hover:text-gray-700 transition-colors"},[e.createVNode(e.unref(ie.X),{size:20})])]),i.value?(e.openBlock(),e.createElementBlock("div",t_," Помилка JSON: "+e.toDisplayString(i.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",n_,[e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h),language:"json",theme:"vs-light",class:"w-full h-full"},null,8,["modelValue"])]),e.createElementVNode("div",o_,[e.createElementVNode("button",{onClick:s,class:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"}," Скасувати "),e.createElementVNode("button",{onClick:c,disabled:!!i.value,class:"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"}," Зберегти ",8,r_)])])])):e.createCommentVNode("",!0)}}),a_={key:0,class:"text-center py-8 text-gray-500 border rounded-lg bg-[rgba(252,252,252,0.8)]"},s_={key:1,class:"rounded-lg border border-gray-200 overflow-hidden"},i_={class:"w-full text-sm"},c_={class:"divide-y divide-gray-200"},d_={class:"px-4 py-3"},u_=["onUpdate:modelValue","onChange"],m_=["value"],p_={class:"px-4 py-3"},f_=["onUpdate:modelValue","onChange"],g_=["value"],y_={class:"px-4 py-3 text-center"},h_=["checked","onChange"],b_={class:"px-4 py-3"},x_={key:0,class:"flex items-center gap-2"},k_=["onClick"],w_=["onClick"],__={key:1},E_=["onClick"],C_={class:"px-4 py-3 text-right"},N_=["onClick"],V_=e.defineComponent({__name:"WidgetSettings",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,l=n,a=["catalog","legend","basemaps","info","layers","dataset","filters","search"],i=["top-left","top-right","bottom-left","bottom-right"],s=e.ref(null),c=e.ref(-1),u=e.computed(()=>o.modelValue||[]);function g(){const p=[...u.value,{type:"info",position:"top-left",visible:!0,config:{}}];l("update:modelValue",p)}function h(p){fe.confirm({title:"Видалити віджет?",message:"Ви впевнені, що хочете видалити цей віджет?",type:"warning",onConfirm:()=>{const b=u.value.filter((k,V)=>V!==p);l("update:modelValue",b)}})}function r(p,b,k){const V=[...u.value];V[p]={...V[p],[b]:k},l("update:modelValue",V)}function y(p){return!!p&&Object.keys(p).length>0}function d(p,b){c.value=p,s.value=b||{}}function m(p){d(p,{})}function x(p){fe.confirm({title:"Видалити конфігурацію?",message:"Ви впевнені, що хочете видалити конфігурацію цього віджета?",type:"warning",onConfirm:()=>{r(p,"config",void 0)}})}function f(p){c.value>-1&&r(c.value,"config",p),s.value=null,c.value=-1}return(p,b)=>{var k;return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",{class:"flex items-center justify-between mb-4"},[b[1]||(b[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800"},"Віджети",-1)),e.createElementVNode("button",{onClick:g,class:"px-3 py-1.5 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"}," + Додати віджет ")]),(k=u.value)!=null&&k.length?(e.openBlock(),e.createElementBlock("div",s_,[e.createElementVNode("table",i_,[b[2]||(b[2]=e.createElementVNode("thead",{class:"bg-[rgba(252,252,252,0.8)] border-b border-gray-200"},[e.createElementVNode("tr",null,[e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700 w-1/4"},"Тип"),e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700 w-1/4"},"Розташування"),e.createElementVNode("th",{class:"px-4 py-3 text-center font-medium text-gray-700 w-24"},"Видимість"),e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700"},"Конфігурація"),e.createElementVNode("th",{class:"px-4 py-3 text-right font-medium text-gray-700 w-24"},"Дії")])],-1)),e.createElementVNode("tbody",c_,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(V,$)=>(e.openBlock(),e.createElementBlock("tr",{key:$,class:"hover:bg-gray-50"},[e.createElementVNode("td",d_,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":_=>V.type=_,onChange:_=>r($,"type",V.type),class:"w-full px-2 py-1.5 bg-white border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-700"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(a,_=>e.createElementVNode("option",{key:_,value:_},e.toDisplayString(_),9,m_)),64))],40,u_),[[e.vModelSelect,V.type]])]),e.createElementVNode("td",p_,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":_=>V.position=_,onChange:_=>r($,"position",V.position),class:"w-full px-2 py-1.5 bg-white border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-700"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(i,_=>e.createElementVNode("option",{key:_,value:_},e.toDisplayString(_),9,g_)),64))],40,f_),[[e.vModelSelect,V.position]])]),e.createElementVNode("td",y_,[e.createElementVNode("input",{type:"checkbox",checked:V.visible!==!1,onChange:_=>r($,"visible",_.target.checked),class:"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"},null,40,h_)]),e.createElementVNode("td",b_,[y(V.config)?(e.openBlock(),e.createElementBlock("div",x_,[e.createElementVNode("button",{onClick:_=>d($,V.config),class:"p-1 text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded transition-colors",title:"Редагувати конфігурацію"},[e.createVNode(e.unref(ie.Pen),{size:16})],8,k_),e.createElementVNode("button",{onClick:_=>x($),class:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors",title:"Видалити конфігурацію"},[e.createVNode(e.unref(ie.X),{size:16})],8,w_)])):(e.openBlock(),e.createElementBlock("div",__,[e.createElementVNode("button",{onClick:_=>m($),class:"p-1 text-green-600 hover:text-green-800 hover:bg-green-50 rounded transition-colors",title:"Додати конфігурацію"},[e.createVNode(e.unref(ie.Plus),{size:16})],8,E_)]))]),e.createElementVNode("td",C_,[e.createElementVNode("button",{onClick:_=>h($),class:"p-1 text-gray-400 hover:text-red-500 transition-colors",title:"Видалити віджет"},[e.createVNode(e.unref(ie.Trash2),{size:16})],8,N_)])]))),128))])])])):(e.openBlock(),e.createElementBlock("div",a_," Немає віджетів. Додайте перший віджет. ")),e.createVNode(l_,{teleport:"#modal",modelValue:s.value,"onUpdate:modelValue":b[0]||(b[0]=V=>s.value=V),onSave:f},null,8,["modelValue"])])}}}),B_={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},$_={class:"mx-1"},S_={class:"text-gray-900 font-semibold"},v_=["disabled"],L_={key:0,class:"text-center py-12 mt-6 px-[24px]"},A_={key:1,class:"px-[24px] overflow-y-auto"},T_={class:"space-y-6"},M_={class:"space-y-6"},F_={class:"space-y-6"},D_=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"MapSettings",setup(t){const n=Fe.useRouter(),o=Fe.useRoute(),l=e.computed(()=>{var _;return((_=n.resolve("/gis.maps").meta)==null?void 0:_.title)??"Карти"}),a=e.ref(!0),i=e.ref(!1),s=e.ref({}),c=e.ref({}),u=[{name:"Загальна",id:"general"},{name:"Шари",id:"layers"},{name:"Віджети",id:"widgets"},{name:"Карта",id:"map"}],g=u.map(_=>_.id),h=_=>_?Array.isArray(_)?_[0]:_:null,r=(()=>{const _=h(o.query.tab);return _&&g.includes(_)?_:"general"})(),y=e.ref(r);e.watch(()=>o.query.tab,_=>{const w=h(_);w&&g.includes(w)&&y.value!==w&&(y.value=w)}),e.watch(y,_=>{o.query.tab!==_&&n.replace({query:{...o.query,tab:_}})});const d=e.ref({name:"",map_key:"",description:"",holder:"",image:"",keywords:[],center:null,zoom:11,widgets:[],layers:[]}),m=e.computed({get:()=>(d.value.layers||[]).map(_=>_.id||_),set:_=>{d.value.layers=_}});async function x(_){if(!_.length){c.value={};return}try{const w=new URLSearchParams({json:"1",val:Array.from(new Set(_)).join(",")}),S=await fetch(`/api/suggest/layer_list?${w.toString()}`);if(!S.ok)return;const A=await S.json(),R=(A==null?void 0:A.data)??A??[],Z=Array.isArray(R)?R:[],I={...c.value};Z.forEach(K=>{const q=K.id!=null?String(K.id):"";q&&(I[q]=K.text??K.name??q)}),c.value=I}catch(w){console.error("Failed to fetch layer labels:",w)}}const f=e.computed({get:()=>m.value.map(_=>c.value[_]??_),set:_=>{const w=Object.entries(c.value).reduce((A,[R,Z])=>(A[Z]=R,A),{}),S=_.map(A=>w[A]??null).filter(A=>A!=null);m.value=S}}),p=e.computed(()=>{const _=d.value.center;if(!Array.isArray(_)||_.length<2)return"Не задано";const[w,S]=_;return w===void 0||S===void 0||w===null||S===null||Number.isNaN(Number(w))||Number.isNaN(Number(S))?"Не задано":`Lng ${Number(w).toFixed(6)}, Lat ${Number(S).toFixed(6)}`}),b=e.computed(()=>{const _=d.value.zoom;if(_==null||_==="")return"Не задано";const w=Number(_);return Number.isNaN(w)?"Не задано":w.toFixed(2)}),k=[{name:"name",type:"text",label:"Назва",col:6,validators:["required"]},{name:"map_key",type:"text",label:"Унікальний ключ",col:6,validators:["required"]},{name:"description",type:"textarea",label:"Опис",col:12},{name:"holder",type:"text",label:"Власник/Утримувач/Відповідальний",col:6},{name:"keywords",type:"Tags",label:"Ключові слова",placeholder:"Введіть тег та натисніть Enter",col:6},{name:"center",type:"array",label:"Центр",inputType:"number",limit:2,count:2,col:6},{name:"zoom",type:"number",label:"Зум",col:6,validators:["required"]},{name:"is_public",type:"switcher",label:"Чи публічна карта?",col:6,data:"yes_no"},{name:"is_active",type:"switcher",label:"Чи активна?",col:6,data:"yes_no"},{name:"image",type:"File",label:"Фото",col:12}];async function V(){try{const w=await(await fetch(`/api/gis-map/${o.params.id}?original=1`)).json();d.value={...w,keywords:w.keywords||[],center:w.center??null,widgets:Array.isArray(w.widgets)?w.widgets:[],layers:(w.layers||[]).map(S=>S.id||S)},await x(d.value.layers??[])}catch(_){console.error("Failed to load map:",_),fe.notify({type:"error",title:"Помилка",message:"Не вдалося завантажити карту"})}finally{a.value=!1}}async function $(){var w,S;const _=(S=(w=s.value)==null?void 0:w.validate)==null?void 0:S.call(w);if(_){fe.notify({type:"warning",title:"Валідація",message:Object.entries(_).map(([A,R])=>`${A}: ${R}`).join(`
|
|
44
|
+
${V}`:V}c.value=!1,u.value=[]}function d(){c.value=!1,u.value=[]}function m(){const f=i.value==="html"?"html":"list",p={card_mode:f};f==="html"?p.html=s.value:f==="list"&&(p.list=a.value),l("save","card",p)}const x=[{value:"all",label:"Всі"},{value:"list",label:"Список"},{value:"none",label:"Жодне"},{value:"html",label:"HTML"}];return(f,p)=>(e.openBlock(),e.createElementBlock("div",T1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:r,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:m,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти ")]),e.createVNode(A1,{modelValue:i.value,"onUpdate:modelValue":p[0]||(p[0]=b=>i.value=b),options:x},null,8,["modelValue"]),e.createElementVNode("div",M1,[i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":p[1]||(p[1]=b=>a.value=b),"columns-scheme":g,"form-scheme":h,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):i.value==="html"?(e.openBlock(),e.createBlock(kn,{key:1,modelValue:s.value,"onUpdate:modelValue":p[2]||(p[2]=b=>s.value=b),language:"html",theme:"vs-light",class:"flex-1 min-h-0"},null,8,["modelValue"])):e.createCommentVNode("",!0)]),e.createVNode(Zt,{visible:c.value,"onUpdate:visible":p[3]||(p[3]=b=>c.value=b),selection:u.value,"onUpdate:selection":p[4]||(p[4]=b=>u.value=b),fields:t.fields,title:"Імпорт полів для картки","id-prefix":"import-card",onConfirm:y,onCancel:d},null,8,["visible","selection","fields"])]))}}),D1={class:"flex flex-col flex-1 min-h-0"},z1=e.defineComponent({__name:"vs-tab-filter",props:{fields:{},columns:{}},emits:["update:columns","save"],setup(t,{emit:n}){const o=t,l=n;console.log(o.columns);const a=e.ref(o.columns||[]);e.watch(()=>o.columns,m=>a.value=m||[],{immediate:!0}),e.watch(a,m=>l("update:columns",m),{deep:!0,immediate:!0});const i=e.ref("list"),s=e.ref(!1),c=e.ref([]),u=[{key:"id",label:"Name"},{key:"label",label:"UA"}],g={name:{type:"text",label:"Name",disabled:!0,validators:["required"]},label:{type:"text",label:"UA",validators:["required"]},type:{type:"radio",label:"Тип",position:"horizontal",validators:["required"],options:[{text:"Check",id:"check"},{text:"Range",id:"range"},{text:"Date",id:"date"},{text:"Text",id:"text"},{text:"Select",id:"autocomplete"}]},hidden:{label:"Приховати",type:"Switcher"},data:{type:"select",label:"Класифікатор",data:"admin.cls.name",conditions:["type","in",["autocomplete","select","check"]],validators:["required"]}};function h(){c.value=a.value.map(m=>m.name||m.id),s.value=!0}function r(){var p;const m=[...a.value],x=((p=o.fields)==null?void 0:p.filter(b=>c.value.includes(b.name)))||[],f=Kt(m,x,{selectedKeys:c.value,resolveKey:b=>Tt(b)});a.value=f,s.value=!1,c.value=[]}function y(){s.value=!1,c.value=[]}function d(){let m=[];i.value==="all"?m=o.fields||[]:i.value==="none"?m=[]:m=a.value,l("save",m)}return(m,x)=>(e.openBlock(),e.createElementBlock("div",D1,[e.createElementVNode("div",{class:"flex justify-between mb-3 gap-2"},[e.createElementVNode("button",{onClick:h,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Імпорт "),e.createElementVNode("button",{onClick:d,class:"inline-flex items-center justify-center gap-1 px-3 py-1.5 rounded-md bg-sky-100 hover:bg-sky-200 text-sky-700 font-medium text-sm transition disabled:opacity-70 disabled:cursor-not-allowed"}," Зберегти фільтр ")]),i.value==="list"?(e.openBlock(),e.createBlock(At,{key:0,modelValue:a.value,"onUpdate:modelValue":x[0]||(x[0]=f=>a.value=f),"columns-scheme":u,"form-scheme":g,"main-col-width":"250px","add-button":!1},null,8,["modelValue"])):e.createCommentVNode("",!0),e.createVNode(Zt,{visible:s.value,"onUpdate:visible":x[1]||(x[1]=f=>s.value=f),selection:c.value,"onUpdate:selection":x[2]||(x[2]=f=>c.value=f),fields:t.fields,title:"Імпорт полів","id-prefix":"import-filter",onConfirm:r,onCancel:y},null,8,["visible","selection","fields"])]))}}),I1=e.defineComponent({__name:"MapDataLayer",props:{id:{},layer:{},styleSpec:{},autoCenter:{type:[Boolean,null]}},setup(t,{expose:n}){var m,x,f,p;const{map:o,flyTo:l,setZoom:a}=tt(),i=((x=(m=e.getCurrentInstance())==null?void 0:m.appContext.config.globalProperties)==null?void 0:x.$settings)||null,s=t,c=s.id;String(s.id);const u=`${location.origin}/api/vtile/${s.id}/ua/{z}/{x}/{y}.vmt?all=1`,g=Ue(c,{source:{type:"vector",tiles:[u],minzoom:0,maxzoom:14},popup:s.layer.popup,layer:{style:(f=s.layer)==null?void 0:f.style}});n({layerHandle:g}),(s.autoCenter??!0)&&l({center:s.layer.center||((p=i==null?void 0:i.map)==null?void 0:p.center)||[30,50],animate:!1});let h=null;function r(){if(!(g!=null&&g.setTiles))return;const b=u.includes("?")?"&":"?",k=`${u}${b}_=${Date.now()}`;g.setTiles([k])}function y(){h&&clearTimeout(h),h=setTimeout(()=>{h=null,d().catch(b=>console.error("Failed to update map layer",b))},300)}async function d(){o.value&&(r(),g.setStyle(s.styleSpec??null))}return e.watch(()=>s.styleSpec,y,{deep:!0}),e.onBeforeUnmount(()=>{g.remove()}),(b,k)=>null}}),P1={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},j1={class:"flex-1 relative overflow-hidden"},R1={class:"absolute top-0 left-0 w-full z-20"},O1={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},U1={class:"flex items-start justify-between gap-4"},q1={class:"flex-1 min-w-0"},H1={class:"flex items-center text-sm text-gray-500 mb-3"},W1={class:"text-gray-900 font-medium truncate max-w-xs"},Y1={class:"flex items-center justify-between gap-4"},Z1={class:"flex-1 min-w-0"},G1={class:"flex items-center gap-3 mb-1"},K1={class:"text-base font-semibold text-gray-900 truncate"},X1={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},Q1={class:"text-xs font-medium text-green-700"},J1=["title"],ek={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[115px]"},tk={class:"relative w-full h-full"},nk={style:{top:"17px",left:"230px",position:"absolute","z-index":"1"}},ok={class:"absolute top-4 left-4 z-20"},rk={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},lk={class:"absolute bottom-4 left-4 z-20"},ak={class:"flex-1 flex flex-col h-full"},sk={class:"px-3 pt-3 pb-2 border-b border-gray-100"},ik={class:"items-center justify-center text-muted-foreground grid w-full grid-cols-6 h-12 p-1 bg-gray-50 rounded-xl shadow-sm"},ck=["aria-selected","onClick"],dk={class:"leading-none"},uk={class:"flex flex-col flex-1 overflow-y-hidden p-3"},mk="OpenGIS",Nl=2,Rn=5,pk=1e3,fk=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"service",props:{hideServiceKey:{type:Boolean,default:!1}},setup(t){var Ke,wt;const n=t,o=e.toRef(n,"hideServiceKey"),l=Fe.useRoute(),a=Fe.useRouter(),{id:i}=l.params,s=e.ref(null),c=e.ref(null),u=e.ref({}),g=e.ref(null),h=((wt=(Ke=e.getCurrentInstance())==null?void 0:Ke.appContext.config.globalProperties)==null?void 0:wt.$settings)||null;function r(G){typeof document>"u"||(document.title=G?`${G} — Сервіс`:mk)}let y=null;const d=e.ref(!1);function m(){var G;return(G=s.value)==null?void 0:G.ctx}function x(G){typeof window>"u"||window.dispatchEvent(new CustomEvent(vn,{detail:G}))}function f(G){var Te,ke,He;const ee=(ke=(Te=m())==null?void 0:Te.map)==null?void 0:ke.value;if(!ee||!G)return[];const xe=(He=g.value)!=null&&He.service_id?String(g.value.service_id):null;return(ee.queryRenderedFeatures(G)||[]).filter(ve=>{var X,le,de,be,P,O;const lt=((X=ve==null?void 0:ve.properties)==null?void 0:X.id)??(ve==null?void 0:ve.id);if(lt==null||!(ve!=null&&ve.source)||xe&&String(ve.source)!==xe)return!1;const W=Ue(ve.source)||Ue((le=ve.layer)==null?void 0:le.id);if(!W)return!1;const B=(be=(de=W==null?void 0:W.opts)==null?void 0:de.source)==null?void 0:be.type,M=(O=(P=W==null?void 0:W.opts)==null?void 0:P.layer)==null?void 0:O.type;return B!=="raster"&&M!=="raster"})}function p(G){const ee=f(G==null?void 0:G.point);x({features:ee,externalItems:[]})}function b(G){if(Array.isArray(G))return b(G[0]);if(typeof G!="string"&&typeof G!="number")return null;const ee=typeof G=="number"?G:Number(G.trim());return Number.isFinite(ee)?ee:null}function k(G,ee){return G.toFixed(ee)}function V(G,ee,xe){const Pe=.5*10**-xe;return Math.abs(G-ee)>Pe}function $(){var ve,lt,W,B;const G=(lt=(ve=m())==null?void 0:ve.map)==null?void 0:lt.value;if(!G)return;const ee=b(l.query.z),xe=b(l.query.x),Pe=b(l.query.y);if(ee==null||xe==null||Pe==null)return;const Te=(W=G.getCenter)==null?void 0:W.call(G),ke=(B=G.getZoom)==null?void 0:B.call(G);(!Te||V(Te.lng,xe,Rn)||V(Te.lat,Pe,Rn)||V(ke??0,ee,Nl))&&(d.value=!0,G.jumpTo({center:[xe,Pe],zoom:ee}),d.value=!1)}function _(){var Te,ke,He,ve;if(d.value)return;const G=(ke=(Te=m())==null?void 0:Te.map)==null?void 0:ke.value;if(!G)return;const ee=(He=G.getCenter)==null?void 0:He.call(G),xe=(ve=G.getZoom)==null?void 0:ve.call(G);if(!ee||xe==null)return;const Pe={...l.query,z:k(xe,Nl),x:k(ee.lng,Rn),y:k(ee.lat,Rn)};l.query.z===Pe.z&&l.query.x===Pe.x&&l.query.y===Pe.y||a.replace({query:Pe})}const w=e.ref(null),S=e.ref(""),A=e.ref([]),R=e.ref([]),Z=e.ref([]),I=e.ref("list"),K=e.ref(""),q=e.ref([]),ne=e.ref(!0);let Y=null;const D=e.computed(()=>{var G,ee;return((G=g.value)==null?void 0:G.id)??((ee=g.value)==null?void 0:ee.service_id)??null}),v=e.computed(()=>{const G=(h==null?void 0:h.map)||null,ee=(G==null?void 0:G.boundary)??null,xe=(G==null?void 0:G.katottg)??null;return!ee&&!xe?null:{boundary:ee,katottg:xe}}),F=e.computed(()=>{const G=g.value;if(!G)return"";const ee=[];!o.value&&G.service_key&&ee.push(`Сервіс: ${G.service_key}`),G.description&&ee.push(G.description);const xe=G.group_name||G.group_id;return xe&&ee.push(`Група: ${xe}`),typeof G.is_public<"u"&&ee.push(G.is_public?"Публічний":"Не публічний"),typeof G.is_active<"u"&&ee.push(G.is_active?"Активний":"Неактивний"),ee.join(", ")}),N=e.computed(()=>{const G=g.value,ee=(G==null?void 0:G.group_name)||(G==null?void 0:G.group_id);return ee?String(ee).toUpperCase():""}),E=[{key:"style",label:"Стиль",icon:kl},{key:"popup",label:"Попап",icon:Vx},{key:"filter",label:"Фільтр",icon:vx},{key:"legend",label:"Легенда",icon:xx},{key:"card",label:"Картка",icon:wl},{key:"metadata",label:"Метадані",icon:Bo}],T=E.map(G=>G.key),z=e.ref("style");e.onMounted(async()=>{const G=l.query.tab;G&&T.includes(G)&&(z.value=G),await ce(),Q()});async function Q(){var Pe;const G=m();if(!(G!=null&&G.ready))return;await G.ready(),$();const ee=(Pe=G.map)==null?void 0:Pe.value;if(!ee)return;const xe=()=>_();ee.on("moveend",xe),ee.on("zoomend",xe),ee.on("click",p),y=()=>{ee.off("moveend",xe),ee.off("zoomend",xe),ee.off("click",p)}}e.watch(()=>[l.query.z,l.query.x,l.query.y],()=>{$()}),e.watch(z,G=>{l.query.tab!==G&&a.replace({query:{...l.query,tab:G}})}),e.watch(()=>l.query.tab,G=>{G&&T.includes(G)&&z.value!==G&&(z.value=G)}),e.watch(()=>{var G;return(G=g.value)==null?void 0:G.name},G=>r(G),{immediate:!0});function se(G){if(!G)return null;try{return JSON.parse(JSON.stringify(G))}catch(ee){return console.warn("Failed to clone style",ee),null}}function te(G){if(!G)return null;if(typeof G=="string")try{return Jn(xl.load(G)||null)}catch(ee){return console.warn("Failed to parse style yaml",ee),null}return Jn(se(G))}function oe(G,ee){try{return JSON.stringify(G)===JSON.stringify(ee)}catch{return!1}}function ge(){var ee;if(!g.value)return;const G=te(w.value);oe(G,((ee=g.value)==null?void 0:ee.style)??null)||(g.value={...g.value,style:G})}function he(){Y&&clearTimeout(Y),Y=setTimeout(()=>{Y=null,ge()},pk)}const ce=async()=>{try{const G=await fetch(`/api/gis-service/${i}`);if(!G.ok)throw new Error(`${G.status}`);const ee=await G.json();u.value=ee||{},c.value=i;const xe=te(ee.style);g.value=ee?{...ee,style:se(xe)}:null,w.value=xe,S.value=typeof(ee==null?void 0:ee.style)=="string"?ee.style:xe?xl.dump(xe):"",R.value=(ee==null?void 0:ee.popup)||[],I.value=ee.card_mode==="html"?"html":"list",Z.value=ee.card,K.value=ee.html,A.value=(ee==null?void 0:ee.legend)||[],q.value=(ee==null?void 0:ee.filters)||[]}catch(G){console.error("Failed to fetch map info",G)}};e.watch(()=>{var G;return(G=g.value)==null?void 0:G.style},G=>{w.value=te(G)},{deep:!0}),e.watch(()=>w.value,()=>{he()},{deep:!0}),e.onBeforeUnmount(()=>{Y&&(clearTimeout(Y),Y=null),y==null||y(),y=null});async function Be(G){try{const ee=await fetch(`/api/gis-clear-vtile/${G}`),{message:xe,error:Pe,code:Te}=await ee.json();if(Te===200)return fe.notify({type:"success",title:"Успіх",message:xe});fe.notify({type:"error",title:"Помилка",message:Pe})}catch(ee){fe.notify({type:"error",title:"Помилка",message:"Не вдалося очистити тайли"}),console.error(ee)}}async function We(G,ee){await Re({[G]:ee},G)}function qe(){const G=se(w.value);g.value=g.value?{...g.value,style:G}:g.value}async function Re(G,ee){if(g.value={...g.value||{},...G},typeof G.html<"u"&&(u.value={...u.value||{},html:G.html}),!!D.value)try{if(!(await fetch(`/api/gis-service/${D.value}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(G)})).ok)throw new Error("Save failed");fe.notify({type:"success",title:"Успіх",message:`${ee} saved`}),await ce()}catch(xe){fe.notify({type:"error",title:"Помилка",message:`Failed to save ${ee}`}),console.error(xe)}}async function Ge(G,ee){if(G!=="card"){await We(G,ee);return}const xe=(ee==null?void 0:ee.card_mode)==="html"?"html":"list",Pe=xe==="html"&&typeof(ee==null?void 0:ee.html)=="string"?ee.html:"",Te=(xe==="html"?[]:null)||(Array.isArray(ee==null?void 0:ee.list)?ee.list:[]);Z.value=Te,I.value=xe,K.value=Pe;const ke={card_mode:xe};xe==="html"&&(ke.html=Pe),xe==="list"&&(ke.card=Te),await Re(ke,"card")}return(G,ee)=>{var xe,Pe,Te;return e.openBlock(),e.createElementBlock("div",P1,[e.createElementVNode("div",j1,[e.createElementVNode("div",R1,[e.createElementVNode("div",O1,[e.createElementVNode("div",U1,[e.createElementVNode("div",q1,[e.createElementVNode("div",H1,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:ee[0]||(ee[0]=ke=>e.unref(a).push("/gis.datasets"))}," Datasets "),ee[11]||(ee[11]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",W1,e.toDisplayString(((xe=g.value)==null?void 0:xe.name)||"Dataset"),1)]),e.createElementVNode("div",Y1,[e.createElementVNode("div",Z1,[e.createElementVNode("div",G1,[e.createElementVNode("h1",K1,e.toDisplayString(((Pe=g.value)==null?void 0:Pe.name)||"Dataset"),1),N.value?(e.openBlock(),e.createElementBlock("div",X1,[e.createElementVNode("span",Q1,e.toDisplayString(N.value),1)])):e.createCommentVNode("",!0)]),F.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:F.value},e.toDisplayString(F.value),9,J1)):e.createCommentVNode("",!0)])])]),D.value?(e.openBlock(),e.createBlock(So,{key:0,class:"flex-shrink-0","entity-id":D.value,"entity-info":{name:(Te=g.value)==null?void 0:Te.name},table:"gis.services.table","entity-label":"Сервіс","save-method":"put","show-xml-item":!1,"clear-tiles-handler":Be,onSaved:ce},null,8,["entity-id","entity-info"])):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",ek,[e.createElementVNode("div",tk,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:s},{default:e.withCtx(()=>{var ke,He,ve,lt,W,B,M;return[(ke=g.value)!=null&&ke.service_id?(e.openBlock(),e.createBlock(I1,{key:0,id:(He=g.value)==null?void 0:He.service_id,layer:g.value,"style-spec":((ve=g.value)==null?void 0:ve.style)||null,autoCenter:!1},null,8,["id","layer","style-spec"])):e.createCommentVNode("",!0),D.value?(e.openBlock(),e.createBlock(or,{key:1,"layer-id":D.value,boundary:((lt=g.value)==null?void 0:lt.boundary)||((W=v.value)==null?void 0:W.boundary)||null,katottg:((B=g.value)==null?void 0:B.katottg)||((M=v.value)==null?void 0:M.katottg)||null},null,8,["layer-id","boundary","katottg"])):e.createCommentVNode("",!0),e.createElementVNode("div",nk,[D.value?(e.openBlock(),e.createBlock(uo,{key:0,"layer-id":D.value,filters:q.value},null,8,["layer-id","filters"])):e.createCommentVNode("",!0)]),ee[12]||(ee[12]=e.createElementVNode("div",{id:"map-filter-popover-host",class:"map-widget__filter-host"},null,-1)),e.createElementVNode("div",ok,[e.createVNode(Wt)]),e.createElementVNode("div",rk,[e.createVNode(It),u.value.center?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:u.value.center,targetLabel:"Ценр даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),e.createElementVNode("div",lk,[e.createVNode(co,{items:A.value||null},null,8,["items"])]),e.createVNode(Zo),e.createVNode(io,{html:u.value.html},null,8,["html"])]}),_:1},512)])]),e.createVNode(Vo,{open:ne.value,onToggle:ee[1]||(ee[1]=ke=>ne.value=!ne.value),"top-class":"top-4"},null,8,["open"])]),e.createElementVNode("div",{class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",ne.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",ak,[e.createElementVNode("div",sk,[e.createElementVNode("div",ik,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(E,ke=>e.createElementVNode("button",{key:ke.key,type:"button",role:"tab","aria-selected":z.value===ke.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",z.value===ke.key?"bg-white shadow-sm text-gray-700":""]),onClick:He=>z.value=ke.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(ke.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",dk,e.toDisplayString(ke.label),1)],10,ck)),64))])]),e.createElementVNode("div",uk,[z.value==="style"?(e.openBlock(),e.createBlock(y1,{key:0,token:D.value,"style-text":S.value,"style-yaml":w.value,"onUpdate:styleYaml":ee[2]||(ee[2]=ke=>w.value=ke),"onUpdate:styleText":ee[3]||(ee[3]=ke=>S.value=ke),onUpdate:qe},null,8,["token","style-text","style-yaml"])):z.value==="legend"?(e.openBlock(),e.createBlock(B1,{key:1,token:D.value,columns:A.value,"onUpdate:columns":ee[4]||(ee[4]=ke=>A.value=ke),onSave:ee[5]||(ee[5]=ke=>We("legend",ke))},null,8,["token","columns"])):z.value==="popup"?(e.openBlock(),e.createBlock(x1,{key:2,token:D.value,columns:R.value,fields:u.value.fields,"onUpdate:columns":ee[6]||(ee[6]=ke=>R.value=ke),onSave:ee[7]||(ee[7]=ke=>We("popup",ke))},null,8,["token","columns","fields"])):z.value==="card"?(e.openBlock(),e.createBlock(F1,{key:3,token:D.value,columns:Z.value,fields:u.value.fields,"view-mode":I.value,html:K.value,"onUpdate:columns":ee[8]||(ee[8]=ke=>Z.value=ke),onSave:Ge},null,8,["token","columns","fields","view-mode","html"])):z.value==="filter"?(e.openBlock(),e.createBlock(z1,{key:4,token:D.value,fields:u.value.fields,columns:q.value,"onUpdate:columns":ee[9]||(ee[9]=ke=>q.value=ke),onSave:ee[10]||(ee[10]=ke=>We("filters",ke))},null,8,["token","fields","columns"])):z.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:5,data:g.value,"entity-id":String(e.unref(i)),"entity-type":"service",onSaved:ce},null,8,["data","entity-id"])):e.createCommentVNode("",!0)])])],2)])}}}),[["__scopeId","data-v-008c5939"]])},Symbol.toStringTag,{value:"Module"})),gk={class:"flex-1 flex flex-col bg-gray-50 h-screen overflow-hidden p-0 m-0"},yk={href:"/api/gis-create-xml",target:"_blank",rel:"noreferrer",class:"flex h-[2rem] items-center gap-1.5 px-3 py-1.5 bg-slate-50 text-slate-700 rounded-md border border-slate-200 hover:bg-slate-100 transition-colors text-sm"},hk={class:"flex-1 px-4 sm:px-6 pb-4 overflow-y-auto overflow-x-visible"},bk={class:"bg-white rounded-lg shadow-sm border border-gray-200 overflow-visible"},xk={class:"p-3 border-b border-gray-200"},kk={class:"flex flex-col sm:flex-row gap-2"},wk={class:"entity-table-root"},_k={class:"gap-2 inline-flex"},Ek=["onClick"],Ck={key:0,class:"flex flex-col gap-3 border-t border-gray-200 px-4 py-3 sm:flex-row sm:items-center sm:justify-between bg-gray-50"},Nk={class:"text-sm text-gray-500"},Vk={class:"font-medium text-gray-700"},Bk={class:"font-medium text-gray-700"},$k={class:"font-medium text-gray-700"},Sk={class:"flex items-center justify-end gap-3"},vk=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"RastersTablePage",props:{entityKey:{default:"rasters"},entityBasePath:{default:"/gis.rasters"},columnsConfig:{default:()=>[]}},setup(t){const n=e.defineAsyncComponent(()=>import("@opengis/table")),o=Fe.useRoute(),l=Fe.useRouter(),a=t,i=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.title)||"Растри")}),s=e.computed(()=>{var v;return String(((v=o.meta)==null?void 0:v.description)||"")}),c=e.computed(()=>`Пошук ${String(i.value).trim()}...`),u=e.computed(()=>a.entityKey||"rasters"),g=e.computed(()=>a.entityBasePath||"/gis.rasters"),h=e.ref([]),r=e.ref(!0),y=e.ref([]),d=e.ref([]),m=e.ref({}),x=e.ref([]),f=e.ref(String(o.query.search??"")),p=e.ref(Math.max(1,Number(o.query.page)||1)),b=e.ref(15),k=e.ref(0),V=e.computed(()=>k.value>0),$=e.computed(()=>k.value?(p.value-1)*b.value+1:0),_=e.computed(()=>k.value?Math.min(p.value*b.value,k.value):0);function w(v){const F=new URLSearchParams;return Object.entries(v).forEach(([N,E])=>{if(!(E==null||E==="")){if(Array.isArray(E)){E.forEach(T=>{T!=null&&T!==""&&F.append(N,String(T))});return}F.append(N,String(E))}}),F.toString()}function S(){return`${g.value}/new`}function A(v){return`${g.value}/${v}/edit`}async function R(){try{r.value=!0;const v=`/api/data/gis.${u.value}.table`,F=w({...m.value,page:p.value,limit:b.value}),N=await fetch(F?`${v}?${F}`:v);if(!N.ok)throw new Error(`Rows fetch failed: ${N.status}`);const E=await N.json();h.value=E.rows||[],k.value=Number(E.filtered??E.total??E.count??h.value.length)||0,y.value=a.columnsConfig.length?a.columnsConfig:E.columns||[],d.value=E.filters||[],x.value=E.actions||[],y.value.length&&!y.value[0].link?y.value[0].link=`${g.value}/{id}`:y.value.length&&(y.value[0].link=`${g.value}/{id}`)}catch{h.value=[],k.value=0}finally{r.value=!1}}function Z(v){m.value=v,p.value=1,D(),R()}async function I(v,F,N){const E=await fetch(`/api/form/gis.${u.value}.table/${v.id}`);if(!E.ok)throw new Error(`Form fetch failed: ${E.status}`);const z=(await E.json()).token,Q=await fetch(`/api/table/${z}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({[F]:N})});if(!Q.ok)throw fe.notify({type:"error",title:"Помилка збереження",message:`Поле "${F}" не оновлено`}),new Error(`Save failed: ${Q.status}`);fe.notify({title:"Збережено",message:`Поле "${F}" оновлено`})}function K(v,F){m.value={...m.value,[v]:F},p.value=1,D(),R()}function q(v){K((v==null?void 0:v.name)||"search",(v==null?void 0:v.value)??f.value)}function ne(v){f.value="",K(v||"search",void 0)}function Y(v){!v||v===p.value||(p.value=v,D(),R())}function D(){const v={...o.query,page:String(p.value),...f.value?{search:f.value}:{}};f.value||delete v.search,delete v.view,l.replace({query:v})}return e.onMounted(()=>{R(),document.title=i.value}),e.watch(()=>o.name,()=>{p.value=1,f.value="",R(),document.title=i.value}),e.watch(()=>o.query,v=>{const F=Math.max(1,Number(v.page)||1),N=String(v.search??""),E=F!==p.value,T=N!==f.value;!E&&!T||(p.value=F,f.value=N,m.value={...m.value,search:N||void 0},R())}),(v,F)=>(e.openBlock(),e.createElementBlock("div",gk,[e.createVNode(Yt,{variant:"table"},e.createSlots({title:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(i.value),1)]),actions:e.withCtx(()=>[e.createElementVNode("a",yk,[e.createVNode(e.unref(ie.RefreshCw),{size:16}),F[2]||(F[2]=e.createTextVNode(" Оновити растри ",-1))]),e.createElementVNode("a",{onClick:F[0]||(F[0]=N=>e.unref(l).push(S())),class:"hover:cursor-pointer flex items-center gap-1.5 px-3 py-1.5 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors text-sm"},[e.createVNode(e.unref(ie.Plus),{size:16}),F[3]||(F[3]=e.createTextVNode(" Додати ",-1))])]),_:2},[s.value?{name:"description",fn:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(s.value),1)]),key:"0"}:void 0]),1024),e.createElementVNode("div",hk,[e.createElementVNode("div",bk,[e.createElementVNode("div",xk,[e.createElementVNode("div",kk,[e.createVNode(e.unref(Nn.FilterField),{modelValue:f.value,"onUpdate:modelValue":F[1]||(F[1]=N=>f.value=N),name:"search",type:"text",layout:"inline",class:"flex-1",width:"100%",cleanable:!0,onChange:q,onClear:ne,placeholder:c.value},null,8,["modelValue","placeholder"]),e.createVNode(e.unref(Nn.Filter),{schema:d.value,value:m.value,onChange:Z,layout:"inline",mode:"soft",view:"popover",limit:8,class:"flex-shrink-0"},null,8,["schema","value"])])]),e.createElementVNode("div",wk,[e.createVNode(e.unref(n),{rows:h.value,columns:y.value,loading:r.value,router:e.unref(l),selectable:!1,onCellUpdate:I,classWrapper:"overflow-x-auto overflow-y-visible",TableStyle:"w-full",classTable:"w-full min-w-[640px]",classThead:"bg-gray-50 border-b border-gray-200",classTh:"px-3 sm:px-4 py-2 text-left text-xs font-medium text-gray-500 uppercase tracking-wider",classTbody:"bg-white divide-y divide-gray-200",classTr:"hover:bg-gray-50 transition-colors",classTd:"px-3 sm:px-4 py-2.5 whitespace-nowrap",classLink:"text-sm font-medium text-blue-600 hover:text-blue-800 hover:underline text-left"},{action:e.withCtx(({row:N})=>[e.createElementVNode("div",_k,[e.createElementVNode("button",{onClick:E=>e.unref(l).push(A(N.id)),class:"inline-flex items-center justify-center bg-white border rounded-md size-7 gap-x-2 hover:bg-gray-100",title:"Редагувати","aria-label":"Редагувати"},[e.createVNode(Vn)],8,Ek)])]),_:1},8,["rows","columns","loading","router"])]),V.value?(e.openBlock(),e.createElementBlock("div",Ck,[e.createElementVNode("div",Nk,[F[4]||(F[4]=e.createTextVNode(" Показано ",-1)),e.createElementVNode("span",Vk,e.toDisplayString($.value),1),F[5]||(F[5]=e.createTextVNode(" - ",-1)),e.createElementVNode("span",Bk,e.toDisplayString(_.value),1),F[6]||(F[6]=e.createTextVNode(" з ",-1)),e.createElementVNode("span",$k,e.toDisplayString(k.value),1)]),e.createElementVNode("div",Sk,[e.createVNode(e.unref(fe.VsPagination),{total:k.value,page:p.value,"page-size":b.value,showPageSizes:!1,pageRange:5,view:"button",color:"gray","onUpdate:page":Y,onPageChange:Y},null,8,["total","page","page-size"])])])):e.createCommentVNode("",!0)])])]))}}),[["__scopeId","data-v-63309b89"]])},Symbol.toStringTag,{value:"Module"})),Lk={class:"flex-1 overflow-y-auto p-4 sm:p-6"},Ak={class:"space-y-3"},Tk={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},Mk={class:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2"},Fk={class:"text-xs text-gray-500 mb-1"},Dk={key:0,class:"text-base text-md font-semibold text-gray-900"},zk={key:1,class:"text-base text-md font-semibold text-gray-900"},Ik={class:"bg-white p-3 rounded-xl border border-gray-200 shadow-sm"},Pk={class:"space-y-2"},jk={class:"bg-gradient-to-br from-blue-50 to-blue-100/30 p-4 rounded-lg border border-blue-200"},Rk={class:"text-sm font-semibold text-gray-900"},Ok={class:"text-xs text-gray-600 mt-1"},Uk={class:"grid grid-cols-2 gap-3"},qk={class:"text-xs text-gray-500 mb-1"},Hk={class:"text-sm font-semibold text-gray-900"},Wk={class:"bg-gray-50 p-4 rounded-lg"},Yk={class:"grid grid-cols-2 gap-4"},Zk={class:"text-xs text-gray-500 mb-1"},Gk={class:"text-sm font-semibold text-gray-900"},Kk=e.defineComponent({directives:{tooltip:fe.TooltipDirective},__name:"raster-info-tab",props:{details:{}},setup(t){return(n,o)=>{const l=e.resolveDirective("tooltip");return e.openBlock(),e.createElementBlock("div",Lk,[e.createElementVNode("div",Ak,[e.createElementVNode("div",Tk,[o[0]||(o[0]=e.createElementVNode("div",{class:"mb-4"},[e.createElementVNode("h4",{class:"text-sm font-semibold text-gray-900 uppercase tracking-wide"},"Основні параметри")],-1)),e.createElementVNode("div",Mk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.baseParams,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label,class:"bg-gray-50 p-2 rounded-lg"},[e.createElementVNode("p",Fk,e.toDisplayString(a.label),1),a.tooltip?e.withDirectives((e.openBlock(),e.createElementBlock("p",Dk,[e.createTextVNode(e.toDisplayString(a.value),1)])),[[l,a.tooltip]]):(e.openBlock(),e.createElementBlock("p",zk,e.toDisplayString(a.value),1))]))),128))])]),e.createElementVNode("div",Ik,[o[3]||(o[3]=e.createElementVNode("div",{class:"mb-2"},[e.createElementVNode("h4",{class:"text-sm font-semibold text-gray-900 uppercase tracking-wide"},"Просторова інформація")],-1)),e.createElementVNode("div",Pk,[e.createElementVNode("div",null,[o[1]||(o[1]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Система координат",-1)),e.createElementVNode("div",jk,[e.createElementVNode("p",Rk,e.toDisplayString(t.details.spatial.crs.code),1),e.createElementVNode("p",Ok,e.toDisplayString(t.details.spatial.crs.description),1)])]),e.createElementVNode("div",null,[o[2]||(o[2]=e.createElementVNode("p",{class:"text-xs text-gray-500 mb-2"},"Межі покриття",-1)),e.createElementVNode("div",Uk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.bounds,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label,class:"bg-gray-50 p-2 rounded-lg border border-gray-200"},[e.createElementVNode("p",qk,e.toDisplayString(a.label),1),e.createElementVNode("p",Hk,e.toDisplayString(a.value),1)]))),128))])]),e.createElementVNode("div",Wk,[e.createElementVNode("div",Yk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.details.spatial.resolution,a=>(e.openBlock(),e.createElementBlock("div",{key:a.label},[e.createElementVNode("p",Zk,e.toDisplayString(a.label),1),e.createElementVNode("p",Gk,e.toDisplayString(a.value),1)]))),128))])])])])])])}}}),Xk={class:"flex-1 overflow-y-auto space-y-3 pr-1"},Qk={class:"font-medium text-sm text-gray-800"},Jk={class:"text-xs text-gray-500"},ew=e.defineComponent({__name:"raster-files-tab",props:{files:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",Xk,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.files,l=>(e.openBlock(),e.createElementBlock("div",{key:l.name,class:"border border-gray-100 rounded-xl p-4 shadow-sm bg-white flex items-start justify-between"},[e.createElementVNode("div",null,[e.createElementVNode("p",Qk,e.toDisplayString(l.name),1),e.createElementVNode("p",Jk,e.toDisplayString(l.resolution)+" • "+e.toDisplayString(l.size)+"MB",1)]),e.createElementVNode("span",{class:e.normalizeClass(["text-[11px] font-semibold px-2 py-0.5 rounded-full",l.statusClass])},e.toDisplayString(l.status),3)]))),128))]))}}),tw={},nw={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"};function ow(t,n){return e.openBlock(),e.createElementBlock("svg",nw,[...n[0]||(n[0]=[e.createElementVNode("circle",{cx:"12",cy:"12",r:"9"},null,-1),e.createElementVNode("line",{x1:"12",y1:"8",x2:"12",y2:"8"},null,-1),e.createElementVNode("path",{d:"M11 12h1v4h1"},null,-1)])])}const rw=Ce(tw,[["render",ow]]),lw={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},aw={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},sw={class:"flex items-center gap-2"},iw={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},cw={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},dw=["checked"],uw=e.defineComponent({__name:"RasterLayer",props:{tileUrl:{},extent:{},layerId:{},beforeId:{},showRasterExtent:{type:Boolean}},emits:["toggle-extent"],setup(t){const n=t,o=n.layerId||"raster-preview-layer",l=`${o}-source`,a=n.extent&&n.extent.length===4?[...n.extent]:void 0,i=Ue(o,{sourceId:l,source:{type:"raster",tiles:n.tileUrl?[n.tileUrl+"?nottl=1"]:[],tileSize:256,...a?{bounds:a}:{}},layer:{id:`${o}-raster`,type:"raster",paint:{"raster-opacity":1}},beforeId:n.beforeId??null}),{fitBounds:s}=tt(),c=e.ref(1);e.watch(()=>n.tileUrl,r=>{if(!r){i.setVisible(!1);return}i.setVisible(!0),i.setTiles([r])},{immediate:!0}),e.watch(()=>c.value,r=>{i.setOpacity(r)},{immediate:!0});let u=null,g=!1;e.watch(()=>n.extent,r=>{if(!r||r.length!==4)return;const y=r.join(",");if(y!==u){if(u=y,!g){g=!0;return}s==null||s([[r[0],r[1]],[r[2],r[3]]],{padding:40,maxZoom:17})}},{immediate:!0});const h=e.computed(()=>`${Math.round(c.value*100)}%`);return(r,y)=>(e.openBlock(),e.createElementBlock("div",lw,[e.createElementVNode("div",aw,[e.createElementVNode("div",sw,[y[2]||(y[2]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{type:"range",min:"0",max:"1",step:"0.01","onUpdate:modelValue":y[0]||(y[0]=d=>c.value=d),class:"h-1 w-28 cursor-pointer appearance-none rounded-full bg-slate-300 focus:outline-none",style:{"accent-color":"#3b82f6"}},null,512),[[e.vModelText,c.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(h.value),1)])]),e.createElementVNode("div",iw,[e.createElementVNode("label",cw,[e.createElementVNode("input",{type:"checkbox",class:"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-200",checked:t.showRasterExtent,onChange:y[1]||(y[1]=d=>r.$emit("toggle-extent",d.target.checked))},null,40,dw),y[3]||(y[3]=e.createElementVNode("span",null,"Межі растру",-1))])])]))}}),On=e.defineComponent({__name:"ExtentOutlineLayer",props:{extent:{},layerId:{},beforeId:{},lineColor:{},lineWidth:{}},setup(t){const n=t,o=n.layerId||"extent-outline-layer",l=`${o}-source`,a=e.computed(()=>{const{extent:c}=n;if(!c||c.length!==4)return null;const[u,g,h,r]=c;return[u,g,h,r].some(y=>typeof y!="number"||Number.isNaN(y))?null:{type:"FeatureCollection",features:[{type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[u,g],[h,g],[h,r],[u,r],[u,g]]]}}]}}),i=tt(),s=Ue(o,{sourceId:l,source:{type:"geojson",data:a.value||{type:"FeatureCollection",features:[]}},layer:{id:o,type:"line",paint:{"line-color":n.lineColor??"#ef4444","line-width":n.lineWidth??2}},beforeId:n.beforeId??null});return e.watch(()=>a.value,c=>{var g;if(!c){s.setVisible(!1),s.setData({type:"FeatureCollection",features:[]});return}s.setVisible(!0),s.setData(c);const u=(g=i.map)==null?void 0:g.value;u!=null&&u.moveLayer&&u.getLayer(o)&&u.moveLayer(o)},{immediate:!0}),(c,u)=>e.createCommentVNode("",!0)}}),mw={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},pw={class:"flex-1 relative overflow-hidden"},fw={class:"absolute top-0 left-0 w-full z-20"},gw={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},yw={class:"flex items-start justify-between gap-4"},hw={class:"flex-1 min-w-0"},bw={class:"flex items-center text-sm text-gray-500 mb-3"},xw={class:"text-gray-900 font-medium truncate max-w-xs"},kw={class:"flex items-center justify-between gap-4"},ww={class:"flex-1 min-w-0"},_w={class:"flex items-center gap-3 mb-1"},Ew={class:"text-base font-semibold text-gray-900 truncate"},Cw=["title"],Nw={class:"flex items-center gap-4 min-w-0"},Vw={class:"flex-1 min-w-0"},Bw=["title"],$w={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[105px]"},Sw={class:"relative w-full h-full"},vw={class:"absolute top-4 left-4 z-20"},Lw={key:1,class:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2 rounded-2xl border border-sky-200 bg-white/95 px-4 py-2 text-xs font-medium text-slate-700 shadow-lg backdrop-blur"},Aw={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},Tw={class:"flex-1 flex flex-col h-full"},Mw={class:"px-3 pt-3 pb-2 border-b border-gray-100"},Fw={class:"items-center justify-center text-muted-foreground grid w-full grid-cols-3 h-12 p-1 bg-gray-50 rounded-xl shadow-sm"},Dw=["aria-selected","onClick"],zw={class:"leading-none"},Iw={class:"flex flex-col flex-1 overflow-y-hidden p-3"},Pw={key:0,class:"mb-3 text-xs text-slate-500"},jw={key:1,class:"mb-3 text-xs text-rose-600"},Rw="OpenGIS",Vl=2,Un=5,Ow=5,Uw=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"raster",setup(t){const n=[{cardClass:"bg-gradient-to-br from-green-50 to-green-100/30 border-green-200",titleClass:"text-green-900"},{cardClass:"bg-gradient-to-br from-blue-50 to-blue-100/30 border-blue-200",titleClass:"text-blue-900"},{cardClass:"bg-gradient-to-br from-purple-50 to-purple-100/30 border-purple-200",titleClass:"text-purple-900"},{cardClass:"bg-gradient-to-br from-gray-50 to-gray-100/30 border-gray-200",titleClass:"text-gray-900"}],o=Fe.useRouter(),l=Fe.useRoute(),a=e.ref(null),i=e.computed(()=>{var M;const B=(M=l.params)==null?void 0:M.id;return typeof B=="string"?B:void 0}),s=e.ref(null),c=e.ref(!1),u=e.ref(!1),g=e.ref(null),h=e.ref(!0),r=e.ref(!1),y=e.ref(null);let d=null,m=null;const x=e.ref(!1);let f=null,p=!1;function b(B){if(Array.isArray(B))return b(B[0]);if(typeof B!="string"&&typeof B!="number")return null;const M=typeof B=="number"?B:Number(B.trim());return Number.isFinite(M)?M:null}function k(B,M){return B.toFixed(M)}function V(B,M,X){const le=.5*10**-X;return Math.abs(B-M)>le}function $(){var B;return(B=a.value)==null?void 0:B.ctx}function _(){var O,H,ae,ye;const B=(H=(O=$())==null?void 0:O.map)==null?void 0:H.value;if(!B)return;const M=b(l.query.z),X=b(l.query.x),le=b(l.query.y);if(M==null||X==null||le==null)return;const de=(ae=B.getCenter)==null?void 0:ae.call(B),be=(ye=B.getZoom)==null?void 0:ye.call(B);(!de||V(de.lng,X,Un)||V(de.lat,le,Un)||V(be??0,M,Vl))&&(x.value=!0,B.jumpTo({center:[X,le],zoom:M}),x.value=!1)}function w(){var de,be,P,O;if(x.value)return;const B=(be=(de=$())==null?void 0:de.map)==null?void 0:be.value;if(!B)return;const M=(P=B.getCenter)==null?void 0:P.call(B),X=(O=B.getZoom)==null?void 0:O.call(B);if(!M||X==null)return;const le={...l.query,z:k(X,Vl),x:k(M.lng,Un),y:k(M.lat,Un)};l.query.z===le.z&&l.query.x===le.x&&l.query.y===le.y||o.replace({query:le})}function S(){var M;if(typeof document>"u")return;const B=(M=te.value)==null?void 0:M.name;document.title=B?`${B} — Растер`:Rw}function A(B){return Number(B.toFixed(Ow))}function R(B,M){const[X,le]=B,[de,be]=M;return[A(Math.min(X,de)),A(Math.min(le,be)),A(Math.max(X,de)),A(Math.max(le,be))]}function Z(B){const[M,X,le,de]=B;return{type:"Polygon",coordinates:[[[M,X],[le,X],[le,de],[M,de],[M,X]]]}}function I(B){var le,de,be;const M=(de=(le=$())==null?void 0:le.map)==null?void 0:de.value,X=(be=M==null?void 0:M.getCanvas)==null?void 0:be.call(M);X!=null&&X.style&&(X.style.cursor=B)}async function K(B,M){if(!(!i.value||!s.value))try{const X=Z(B),le=await fetch(`/api/gis-metadata/raster/${encodeURIComponent(i.value)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:X})});if(!le.ok)throw new Error(`Failed to save raster metadata geom: ${le.status}`);fe.notify({type:"success",title:"Extent збережено",message:"Нові межі успішно збережено."}),await Ke()}catch(X){console.error("Failed to save raster extent",X),s.value&&(s.value={...s.value,extent:M?[...M]:void 0}),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Extent"})}}function q(B){var X,le,de;const M=(le=(X=$())==null?void 0:X.map)==null?void 0:le.value;if((de=M==null?void 0:M.dragPan)!=null&&de.enable&&M.dragPan.enable(),(B==null?void 0:B.length)===4&&s.value){const be=Array.isArray(s.value.extent)?[...s.value.extent]:null;s.value={...s.value,extent:[...B]},K(B,be)}f=null,p=!1,y.value=null,r.value=!1,I("")}function ne(){q(null)}function Y(){var be,P;const B=(P=(be=$())==null?void 0:be.map)==null?void 0:P.value;if(!B)return;const M=O=>{var ae,ye,Ne;if(!r.value||((ae=O==null?void 0:O.originalEvent)==null?void 0:ae.button)!=null&&O.originalEvent.button!==0)return;const H=O==null?void 0:O.lngLat;H&&(f=[H.lng,H.lat],p=!0,y.value=[H.lng,H.lat,H.lng,H.lat],(Ne=(ye=B.dragPan)==null?void 0:ye.disable)==null||Ne.call(ye))},X=O=>{if(!r.value||!p||!f)return;const H=O==null?void 0:O.lngLat;H&&(y.value=R(f,[H.lng,H.lat]))},le=O=>{if(!r.value||!p||!f)return;const H=O==null?void 0:O.lngLat;if(!H){ne();return}const ae=R(f,[H.lng,H.lat]),[ye,Ne,Le,Se]=ae;if(!(Math.abs(Le-ye)>0&&Math.abs(Se-Ne)>0)){fe.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),ne();return}q(ae)},de=O=>{r.value&&O.key==="Escape"&&(O.preventDefault(),ne())};B.on("mousedown",M),B.on("mousemove",X),B.on("mouseup",le),window.addEventListener("keydown",de),m=()=>{B.off("mousedown",M),B.off("mousemove",X),B.off("mouseup",le),window.removeEventListener("keydown",de)}}async function D(){var X;if(r.value)return;const B=$();!(B!=null&&B.ready)||(await B.ready(),!((X=B.map)==null?void 0:X.value))||(m||Y(),r.value=!0,p=!1,f=null,y.value=null,I("crosshair"),fe.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}const v=e.computed(()=>{var M;const B=(M=s.value)==null?void 0:M.url;return B?/^https?:\/\//i.test(B)||typeof window>"u"||typeof location>"u"?B:`${location.origin}${B}`:""}),F=e.computed(()=>{var B;return((B=s.value)==null?void 0:B.extent)??null}),N=e.computed(()=>i.value?`raster-${i.value}`:void 0),E=e.computed(()=>i.value?`raster-extent-${i.value}`:"raster-extent"),T=e.computed(()=>i.value?`raster-extent-draft-${i.value}`:"raster-extent-draft"),z=e.computed(()=>{const B=N.value??"raster",M=F.value&&F.value.length===4?F.value.join(","):"no-extent";return`${B}-${M}`}),Q=e.computed(()=>!!v.value),se=e.computed(()=>{const B=F.value;if(!B||B.length!==4)return null;const[M,X,le,de]=B;return[M,X,le,de].some(be=>typeof be!="number"||Number.isNaN(be))?null:[(M+le)/2,(X+de)/2]}),te=e.computed(()=>{var be,P;const B=s.value,M=B==null?void 0:B.extent,le=i.value??"—",de=[B!=null&&B.extension?`Формат ${String(B.extension).toUpperCase()}`:null,(B==null?void 0:B.resolution)||null].filter(Boolean).join(", ");return{id:le,name:(B==null?void 0:B.name)||((P=(be=B==null?void 0:B.files)==null?void 0:be[0])==null?void 0:P.name),description:(B==null?void 0:B.description)||de||"Попередній перегляд растрового шару.",coverage:M&&M.length===4?`${W(M[0])}, ${W(M[1])} → ${W(M[2])}, ${W(M[3])}`:"Покриття уточнюється",crs:B!=null&&B.srid?`EPSG:${B.srid}`:"EPSG:4326",source:B!=null&&B.proj4?B.proj4:"Джерело: Mapnik",updatedAt:B!=null&&B.cache?"Дані кешовано":"Нові дані"}}),oe=e.computed(()=>{const B=s.value;return B?[B.source_path,B.srid?`SRID: ${B.srid}`:null,B.is_public?"Публічна":"Не публічна",B.is_active?"Активна":"Неактивна",B.cache?"Кешовано":null].filter(M=>M).join(", "):""}),ge=[{key:"info",label:"Інформація",icon:rw},{key:"files",label:"Файли",icon:Vn},{key:"metadata",label:"Метадані",icon:Bo}],he=ge.map(B=>B.key),ce=e.ref(he.includes(l.query.tab)?l.query.tab:"info"),Be=e.ref(!0);e.watch(()=>l.query.tab,B=>{B&&he.includes(B)&&ce.value!==B&&(ce.value=B)}),e.watch(ce,B=>{l.query.tab!==B&&o.replace({query:{...l.query,tab:B}})});const We=e.computed(()=>G(s.value)),qe=e.computed(()=>xe(s.value));e.watch(()=>s.value,()=>{S()},{immediate:!0});async function Re(){var le;const B=$();if(!(B!=null&&B.ready))return;await B.ready(),_();const M=(le=B.map)==null?void 0:le.value;if(!M)return;const X=()=>w();M.on("moveend",X),M.on("zoomend",X),d=()=>{M.off("moveend",X),M.off("zoomend",X)}}e.watch(()=>[l.query.z,l.query.x,l.query.y],()=>{_()}),e.onMounted(()=>{Re()}),e.onBeforeUnmount(()=>{d==null||d(),d=null,m==null||m(),m=null,I("")}),e.watch(i,()=>{Ke()},{immediate:!0});async function Ge(B){var M;Ke(),((M=s.value)==null?void 0:M.srid)!==B.srid&&(fe.notify({title:"XML start",type:"info",message:"зміна системи координат, оновлюємо карту ..."}),await wt(`/api/gis-xml/${encodeURIComponent(i.value)}`),fe.notify({title:"XML created",type:"info",message:"карта створена"}),location.reload())}async function Ke(){const B=i.value;if(!B){s.value=null,g.value=null;return}c.value=!0,g.value=null;try{const M=await fetch(`/api/gis-raster/${encodeURIComponent(B)}`);if(!M.ok)throw new Error(`HTTP ${M.status}`);const X=await M.json();X.xml&&(u.value=!0),s.value=X,X.xml||(fe.notify({title:"XML not found",type:"info",message:"йде створення xml ... зачекайте"}),await wt(`/api/gis-xml/${encodeURIComponent(B)}`),fe.notify({title:"XML created",type:"info",message:"карта створена"}),fetch(`/api/gis-raster/${encodeURIComponent(B)}?nocache=1`),u.value=!0)}catch(M){console.error("Failed to load raster info",M),s.value=null,g.value=M instanceof Error?M.message:String(M)}finally{c.value=!1}}function wt(B){return new Promise((M,X)=>{const le=new EventSource(B),de=[];le.onmessage=be=>{de.push(be.data),console.log("Received:",be.data)},le.addEventListener("end",()=>{le.close(),M(de)}),le.onerror=be=>{le.close(),M(be)}})}function G(B){var M;return(M=B==null?void 0:B.files)!=null&&M.length?B.files.map(X=>({name:X.name,resolution:ee(X.name,B),size:X.size||"—",status:"Готово",statusClass:"bg-emerald-50 text-emerald-600 border border-emerald-100"})):[]}function ee(B,M){const X=B.toLowerCase();return X.endsWith(".tfw")?"Georeference":X.endsWith(".xml")?"Опис":X.endsWith(".tif")||X.endsWith(".tiff")?M!=null&&M.resolution?M.resolution:"Растер":(M==null?void 0:M.resolution)??"Файл"}function xe(B){return B?{baseParams:Te(B),spatial:{crs:{code:B.srid?`EPSG:${B.srid}`:"EPSG:4326",description:B.proj4||"WGS 84 — World Geodetic System 1984"},bounds:ke(B.extent),resolution:He(B)},statistics:ve(B),technical:lt(B)}:null}function Pe(B){return B!=null&&B.length?B.map(X=>{var de;if(!X)return"";const le=X.trim().split(/\s+/)[0];return((de=le==null?void 0:le[0])==null?void 0:de.toUpperCase())||""}).filter(Boolean).join(""):""}function Te(B){var be,P;const M=B.bands_count??((be=B.bands)==null?void 0:be.length)??"—",X=Pe(B.bands),le=(B.bands??[]).map(O=>O.trim()).filter(O=>O.length>0),de=le.length?le.join(", "):void 0;return[{label:"Розмір растру, px",value:B.width&&B.height?`${B.width}×${B.height}`:"—"},{label:"Формат файлу",value:((P=B.extension)==null?void 0:P.toUpperCase())??"—"},{label:"Розмір файлу, mb",value:B.total_size?`${B.total_size}`:"—"},{label:"Кількість каналів",value:typeof M=="number"?`${M}${X?` (${X})`:""}`:`${M}${X?` (${X})`:""}`,tooltip:de},{label:"Глибина кольору",value:B.color_depth?`${B.color_depth} біт/канал`:"—"},{label:"Стиснення",value:B.compression||"—"}]}function ke(B){return!B||B.length!==4?[]:[{label:"Північ",value:W(B[3],"N")},{label:"Схід",value:W(B[2],"E")},{label:"Південь",value:W(B[1],"S")},{label:"Захід",value:W(B[0],"W")}]}function He(B){const M=[{label:"Роздільна здатність",value:B.resolution||"—"}];return B.width&&B.height&&M.push({label:"Розмір пікселя",value:`${B.width} × ${B.height} px`}),M}function ve(B){var M;return(M=B.bands)!=null&&M.length?B.bands.map((X,le)=>{const de=n[le%n.length];return{label:`Канал ${le+1}${X?` (${X})`:""}`,cardClass:de.cardClass,titleClass:de.titleClass,metrics:[{label:"Назва",value:X||`Канал ${le+1}`},{label:"Глибина",value:B.color_depth?`${B.color_depth} біт`:"—"},{label:"Статус",value:B.cache?"Кешовано":"Готово"}]}}):[]}function lt(B){var M;return[{label:"Тип даних",value:B.color_depth?`Unsigned Integer ${B.color_depth}-bit`:"—"},{label:"Компресія",value:B.compression||"—"},{label:"Кольорова інтерпретація",value:((M=B.bands)==null?void 0:M.join(", "))||"—"},{label:"SRID",value:B.srid?`EPSG:${B.srid}`:"—"},{label:"Проекція (proj4)",value:B.proj4||"—"},{label:"URL тайла",value:B.url||"—"}]}function W(B,M){if(B==null||Number.isNaN(B))return"—";const X=`${B.toFixed(5)}°`;return M?`${X} ${M}`:X}return(B,M)=>(e.openBlock(),e.createElementBlock("div",mw,[e.createElementVNode("div",pw,[e.createElementVNode("div",fw,[e.createElementVNode("div",gw,[e.createElementVNode("div",yw,[e.createElementVNode("div",hw,[e.createElementVNode("div",bw,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:M[0]||(M[0]=X=>e.unref(o).push("/gis.rasters"))}," Растри "),M[3]||(M[3]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",xw,e.toDisplayString(te.value.name||"Растер"),1)]),e.createElementVNode("div",kw,[e.createElementVNode("div",ww,[e.createElementVNode("div",_w,[e.createElementVNode("h1",Ew,e.toDisplayString(te.value.name||"Растер"),1)]),oe.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:oe.value},e.toDisplayString(oe.value),9,Cw)):e.createCommentVNode("",!0)])])]),e.createElementVNode("div",Nw,[e.createElementVNode("div",Vw,[e.createElementVNode("div",{class:"w-full text-xs text-gray-600 truncate",title:te.value.description},e.toDisplayString(te.value.description),9,Bw)]),e.createVNode(So,{"entity-id":i.value||"","entity-info":{name:te.value.name},table:"gis.rasters.table","entity-label":"Растер","save-method":"put","edit-button-text":"Редагувати",onSaved:Ge},null,8,["entity-id","entity-info"])])])])]),e.createElementVNode("div",$w,[e.createElementVNode("div",Sw,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:a},{default:e.withCtx(()=>[Q.value&&u.value?(e.openBlock(),e.createBlock(uw,{key:z.value,"tile-url":v.value,extent:F.value,"layer-id":N.value,"show-raster-extent":h.value,onToggleExtent:M[1]||(M[1]=X=>h.value=X)},null,8,["tile-url","extent","layer-id","show-raster-extent"])):e.createCommentVNode("",!0),e.createVNode(On,{extent:h.value?F.value:null,"layer-id":E.value},null,8,["extent","layer-id"]),e.createVNode(On,{extent:y.value,"layer-id":T.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createElementVNode("div",vw,[e.createVNode(Wt)]),r.value?(e.openBlock(),e.createElementBlock("div",Lw," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),e.createElementVNode("div",Aw,[e.createVNode(It),se.value?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:se.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)])]),_:1},512)])]),e.createVNode(Vo,{open:Be.value,onToggle:M[2]||(M[2]=X=>Be.value=!Be.value)},null,8,["open"])]),e.createElementVNode("div",{class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",Be.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",Tw,[e.createElementVNode("div",Mw,[e.createElementVNode("div",Fw,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(ge,X=>e.createElementVNode("button",{key:X.key,type:"button",role:"tab","aria-selected":ce.value===X.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",ce.value===X.key?"bg-white shadow-sm text-gray-700":""]),onClick:le=>ce.value=X.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(X.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",zw,e.toDisplayString(X.label),1)],10,Dw)),64))])]),e.createElementVNode("div",Iw,[c.value?(e.openBlock(),e.createElementBlock("div",Pw," Завантаження метаданих растру… ")):g.value?(e.openBlock(),e.createElementBlock("div",jw," Не вдалося отримати дані: "+e.toDisplayString(g.value),1)):e.createCommentVNode("",!0),ce.value==="files"?(e.openBlock(),e.createBlock(ew,{key:2,files:We.value},null,8,["files"])):ce.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:3,data:s.value,"entity-id":i.value,"entity-type":"raster",onSaved:Ke,onEditCssBounds:D},null,8,["data","entity-id"])):qe.value?(e.openBlock(),e.createBlock(Kk,{key:4,details:qe.value},null,8,["details"])):e.createCommentVNode("",!0)])])],2)]))}})},Symbol.toStringTag,{value:"Module"})),qw={},Hw={xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-table"};function Ww(t,n){return e.openBlock(),e.createElementBlock("svg",Hw,[...n[0]||(n[0]=[e.createElementVNode("path",{d:"M12 3v18"},null,-1),e.createElementVNode("rect",{width:"18",height:"18",x:"3",y:"3",rx:"2"},null,-1),e.createElementVNode("path",{d:"M3 9h18"},null,-1),e.createElementVNode("path",{d:"M3 15h18"},null,-1)])])}const Yw=Ce(qw,[["render",Ww]]),Zw={class:"flex flex-col h-full"},Gw={class:"flex justify-end mb-3 gap-2"},Kw=e.defineComponent({__name:"cartocss-css-tab",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,l=n,a=e.computed({get:()=>o.modelValue,set:i=>l("update:modelValue",i)});return(i,s)=>(e.openBlock(),e.createElementBlock("div",Zw,[e.createElementVNode("div",Gw,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:s[0]||(s[0]=c=>i.$emit("save"))},[...s[2]||(s[2]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-3.5 w-3.5"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти ",-1)])])]),e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":s[1]||(s[1]=c=>a.value=c),language:"cartocss",class:"flex-1 rounded-lg overflow-hidden"},null,8,["modelValue"])]))}}),Xw={class:"flex flex-col flex-1 min-h-0"},Qw={class:"flex justify-between mb-3 gap-2"},Jw={class:"text-left"},e2={class:"font-medium text-gray-900"},t2={class:"text-xs text-gray-500"},n2={class:"flex justify-center gap-2"},o2=["checked","onChange"],r2={class:"text-sm font-medium text-gray-900"},l2=e.defineComponent({__name:"cartocss-data-tab",props:{modelValue:{default:[]},modelModifiers:{}},emits:e.mergeModels(["save"],["update:modelValue"]),setup(t,{emit:n}){const o=[{key:"table",label:"Таблиця",slot:"datasetCell"},{key:"active",label:"Активний",slot:"activeCell",width:"140px"},{key:"zoom",label:"Min Зум",slot:"zoomCell",width:"140px"}],l=e.defineAsyncComponent(()=>import("@opengis/core").then(m=>m.VsModal)),a=e.defineAsyncComponent(()=>import("@opengis/form")),i=e.useModel(t,"modelValue"),s=n,c=e.ref(!1),u=e.ref({table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0}),g={table:{type:"text",label:"Таблиця",validators:["required"]},key:{type:"text",label:"Ключ",validators:["required"]},query:{type:"text",label:"Query"},columns:{type:"text",label:"Колонки"},gcol:{type:"text",label:"Колонка geometry"},srid:{type:"number",label:"SRID"},proj4text:{type:"text",label:"PROJ4"},active:{type:"switcher",label:"Активна"},minzoom:{type:"number",label:"Min Зум",col:6},maxzoom:{type:"number",label:"Max Зум",col:6}};function h(){u.value={table:"",query:"",srid:"",key:"",columns:"",gcol:"",minzoom:"",maxzoom:"",proj4text:"",active:!0},c.value=!0}function r(){c.value=!1}function y(){var f,p;const m=(f=u.value.table)==null?void 0:f.trim(),x=(p=u.value.key)==null?void 0:p.trim();if(!m||!x){fe.notify({type:"warning",title:"Перевірка",message:"Вкажіть таблицю та підпис"});return}i.value=[...Array.isArray(i.value)?i.value:[],{...u.value,table:m,key:x}],c.value=!1}function d(m,x){var p;const f=((p=x==null?void 0:x.target)==null?void 0:p.checked)??!1;m.active=f,i.value=Array.isArray(i.value)?[...i.value]:[]}return(m,x)=>(e.openBlock(),e.createElementBlock("div",Xw,[e.createElementVNode("div",Qw,[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium bg-gradient-to-r from-gray-500 to-gray-400 text-white h-9 px-4 py-2 hover:from-gray-600 hover:to-gray-500",onClick:h}," Додати таблицю "),e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:x[0]||(x[0]=f=>s("save"))}," Зберегти ")]),e.createVNode(At,{modelValue:i.value,"onUpdate:modelValue":x[1]||(x[1]=f=>i.value=f),"columns-scheme":o,"form-scheme":g,"add-button":!1,"main-col-width":"260px"},{datasetCell:e.withCtx(({row:f})=>[e.createElementVNode("div",Jw,[e.createElementVNode("div",e2,e.toDisplayString(f.table),1),e.createElementVNode("div",t2,e.toDisplayString(f.key),1)])]),activeCell:e.withCtx(({row:f})=>[e.createElementVNode("label",n2,[e.createElementVNode("input",{type:"checkbox",class:"h-4 w-4 text-sky-500 border-gray-300 rounded focus:ring-sky-300",checked:f.active,onChange:p=>d(f,p)},null,40,o2)])]),zoomCell:e.withCtx(({row:f})=>[e.createElementVNode("div",r2,e.toDisplayString(f.zoom),1)]),_:1},8,["modelValue"]),e.createVNode(e.unref(l),{teleport:"#modal",visible:c.value,"onUpdate:visible":x[3]||(x[3]=f=>c.value=f),title:"Нова таблиця CartoCSS"},{footer:e.withCtx(()=>[e.createElementVNode("div",{class:"flex justify-end gap-2 p-4 border-т"},[e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-gray-100 text-gray-700",onClick:r}," Скасувати "),e.createElementVNode("button",{type:"button",class:"px-4 py-2 rounded bg-blue-600 text-white",onClick:y}," Додати ")])]),default:e.withCtx(()=>[e.createVNode(e.unref(a),{values:u.value,"onUpdate:values":x[2]||(x[2]=f=>u.value=f),schema:g},null,8,["values"])]),_:1},8,["visible"])]))}}),a2={class:"flex flex-col flex-1 min-h-0 gap-4"},s2={class:"h-[calc(100vh-230px)] rounded-md border border-gray-200 bg-white"},i2=e.defineComponent({__name:"cartocss-card-tab",props:{card:{},table:{}},emits:["save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(o.table),i=e.ref(o.card),s=e.defineAsyncComponent(()=>import("@opengis/form").then(u=>u.VsInputText));function c(){l("save",{card_html:i.value,card_table:a.value})}return(u,g)=>(e.openBlock(),e.createElementBlock("div",a2,[e.createElementVNode("div",{class:"flex items-center justify-end gap-3"},[e.createElementVNode("button",{type:"button",class:"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md font-medium bg-gradient-to-r from-sky-400 to-blue-400 hover:from-sky-500 hover:to-blue-500 text-white shadow-sm px-4 py-2 h-9 text-xs transition-all duration-300",onClick:c},[...g[2]||(g[2]=[e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"h-3.5 w-3.5"},[e.createElementVNode("path",{d:"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a 2 2 0 0 1-2-2V5a 2 2 0 0 1 2-2z"}),e.createElementVNode("path",{d:"M17 21v-7a1 1 0 0 0-1-1H8a 1 1 0 0 0-1 1v7"}),e.createElementVNode("path",{d:"M7 3v4a1 1 0 0 0 1 1h7"})],-1),e.createTextVNode(" Зберегти картку ",-1)])])]),e.createElementVNode("div",null,[e.createVNode(e.unref(s),{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h)},null,8,["modelValue"])]),e.createElementVNode("div",s2,[e.createVNode(kn,{modelValue:i.value,"onUpdate:modelValue":g[1]||(g[1]=h=>i.value=h),language:"html",theme:"vs-light",class:"h-full w-full rounded-md"},null,8,["modelValue"])])]))}}),c2=e.defineComponent({__name:"CartocssLayerLoader",props:{layerId:{type:String,required:!0},tileUrl:{type:String,default:""},title:{type:String,default:""},active:{type:Boolean,default:!1},owner:{type:String,default:""},opacity:{type:Number,default:1}},setup(t){const n=t,o=tt(),{activateTemporaryLayer:l,deactivateTemporaryLayer:a,setTemporaryLayerOpacity:i}=lo(o.map),s=e.computed(()=>{var r;const h=`${(r=n==null?void 0:n.tileUrl)==null?void 0:r.trim()}`;return h?typeof window>"u"||typeof location>"u"||/^https?:\/\//i.test(h)?h:h.startsWith("//")?`${window.location.protocol}${h}`:h.startsWith("/")?`${location.origin}${h}`:`${location.origin}/${h}`:""});let c="",u="";function g(){const h=n.active&&!!s.value;c&&(!h||c!==n.layerId)&&(a(c,u||void 0),c="",u=""),h&&(l({id:n.layerId,title:n.title||n.layerId,url:s.value,opacity:n.opacity},{},n.owner),c=n.layerId,u=n.owner||"")}return e.watch(()=>[n.layerId,s.value,n.active,n.owner],g,{immediate:!0}),e.watch(()=>n.opacity,h=>{!c||!n.active||i(c,h,u||void 0)},{immediate:!0}),e.onUnmounted(()=>{c&&(a(c,u||void 0),c="",u="")}),(h,r)=>e.createCommentVNode("",!0)}}),d2=e.defineComponent({__name:"CartocssMapClickListener",props:{cartocssId:{},infoEnabled:{type:[Boolean,null]}},setup(t){const n=t,o=e.computed(()=>n.cartocssId??null),l=e.computed(()=>!!n.infoEnabled),{map:a,ready:i}=tt(),s=d=>{!d||typeof window>"u"||window.dispatchEvent(new CustomEvent(so,{detail:d}))},c=async d=>{const m=await fetch(`/api/map-format?${d.toString()}`);if(!m.ok)throw new Error(`API returned ${m.status}`);return m.json()};let u=null,g=null;const h=d=>{if(!d)return null;if(typeof d=="string")try{return JSON.parse(d)}catch{return null}return d},r=async(d,m)=>{var p;const x=o.value?`external:${o.value},${String(d)}`:null,f=new URLSearchParams({layer:o.value??"",id:String(d)});try{const b=await c(f),k=typeof b.html=="string"?b.html:null,V=h(((p=b==null?void 0:b.data)==null?void 0:p.geom)??(b==null?void 0:b.geom)??null);(k||V)&&s({html:k,geometry:V??m,infoToken:x})}catch(b){console.warn("CartoCSS map-format (id) error",b)}},y=async d=>{var p,b,k,V;if(!o.value)return;if(!l.value){fe.notify({type:"error",title:"CartoCSS",message:"Картка не налаштована"});return}const m=(p=d==null?void 0:d.lngLat)==null?void 0:p.lng,x=(b=d==null?void 0:d.lngLat)==null?void 0:b.lat;if(typeof m!="number"||typeof x!="number")return;const f=new URLSearchParams({layer:o.value,lat:x.toFixed(6),lng:m.toFixed(6)});try{const $=await c(f),_=h(((k=$==null?void 0:$.data)==null?void 0:k.geom)??($==null?void 0:$.geom)??null),w=((V=$==null?void 0:$.data)==null?void 0:V.id)??($==null?void 0:$.id);if(w!=null){await r(w,_);return}Ko({html:$==null?void 0:$.html})&&s({html:$==null?void 0:$.html,geometry:_,infoToken:null})}catch($){console.warn("CartoCSS map-format error",$)}};return i().then(()=>{g=a.value,g&&(g.on("click",y),u=()=>g==null?void 0:g.off("click",y))}),e.onBeforeUnmount(()=>{u==null||u(),u=null,g=null}),()=>{}}}),u2={class:"flex h-full bg-gradient-to-br from-slate-50 to-white"},m2={class:"flex-1 relative overflow-hidden"},p2={class:"absolute top-0 left-0 w-full z-20"},f2={class:"px-4 sm:px-6 py-4 border-b border-gray-200 bg-white shadow-sm"},g2={class:"flex items-start justify-between gap-4"},y2={class:"flex-1 min-w-0"},h2={class:"flex items-center text-sm text-gray-500 mb-3"},b2={class:"text-gray-900 font-medium truncate max-w-xs"},x2={class:"flex items-center justify-between gap-4"},k2={class:"flex-1 min-w-0"},w2={class:"flex items-center gap-3 mb-1"},_2={class:"text-base font-semibold text-gray-900 truncate"},E2={key:0,class:"px-2 py-0.5 bg-green-50 border border-green-200 rounded flex-shrink-0"},C2={class:"text-xs font-medium text-green-700"},N2=["title"],V2={class:"w-full h-full bg-gradient-to-br from-sky-50 via-white to-blue-50 flex items-center justify-center relative pt-[115px]"},B2={class:"relative w-full h-full"},$2={class:"absolute top-[5.5rem] left-4 z-30 flex flex-col items-start gap-2"},S2={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},v2={class:"flex items-center gap-2"},L2={class:"rounded-2xl bg-white/90 px-3 py-2 text-xs font-medium text-slate-600 shadow-sm backdrop-blur"},A2={class:"inline-flex items-center gap-2 text-[11px] text-slate-600"},T2=["checked"],M2={class:"absolute top-4 left-4 z-20"},F2={class:"absolute top-[6.5rem] right-2 space-y-1 z-20"},D2={key:0,class:"absolute bottom-4 left-1/2 z-30 -translate-x-1/2 rounded-2xl border border-sky-200 bg-white/95 px-4 py-2 text-xs font-medium text-slate-700 shadow-lg backdrop-blur"},z2={class:"flex-1 flex flex-col h-full"},I2={key:0,class:"px-3 pt-3 pb-2 border-b border-gray-100"},P2=["aria-selected","onClick"],j2={class:"leading-none"},R2={class:"flex flex-col flex-1 overflow-y-hidden p-3"},O2={key:0,class:"flex-1 flex items-center justify-center text-sm text-gray-500"},U2="cartocss-demo-001",q2="OpenGIS",Bl=2,qn=5,H2=5,W2=Object.freeze(Object.defineProperty({__proto__:null,default:e.defineComponent({__name:"cartocss",setup(t){const n=Fe.useRouter(),o=Fe.useRoute(),l=e.ref(null),a=[{key:"css",label:"CSS",icon:kl},{key:"data",label:"Дані",icon:Yw},{key:"metadata",label:"Метадані",icon:Bo},{key:"card",label:"Картка",icon:wl}],i=a.map(W=>W.key),s=e.ref(i.includes(o.query.tab)?o.query.tab:"css"),c=e.ref(!0),u=e.ref(null),g=e.computed(()=>{var W;return(W=u.value)!=null&&W.source_path?a.filter(B=>B.key==="card"||B.key==="metadata"):a}),h=e.computed(()=>o.params.id||U2),r=e.ref({id:h.value,name:"",description:""});let y=null;const d=e.ref(!1);function m(W){if(Array.isArray(W))return m(W[0]);if(typeof W!="string"&&typeof W!="number")return null;const B=typeof W=="number"?W:Number(W.trim());return Number.isFinite(B)?B:null}function x(W,B){return W.toFixed(B)}function f(W,B,M){const X=.5*10**-M;return Math.abs(W-B)>X}function p(){var W;return(W=l.value)==null?void 0:W.ctx}function b(){var P,O,H,ae;const W=(O=(P=p())==null?void 0:P.map)==null?void 0:O.value;if(!W)return;const B=m(o.query.z),M=m(o.query.x),X=m(o.query.y);if(B==null||M==null||X==null)return;const le=(H=W.getCenter)==null?void 0:H.call(W),de=(ae=W.getZoom)==null?void 0:ae.call(W);(!le||f(le.lng,M,qn)||f(le.lat,X,qn)||f(de??0,B,Bl))&&(d.value=!0,W.jumpTo({center:[M,X],zoom:B}),d.value=!1)}function k(){var le,de,be,P;if(d.value)return;const W=(de=(le=p())==null?void 0:le.map)==null?void 0:de.value;if(!W)return;const B=(be=W.getCenter)==null?void 0:be.call(W),M=(P=W.getZoom)==null?void 0:P.call(W);if(!B||M==null)return;const X={...o.query,z:x(M,Bl),x:x(B.lng,qn),y:x(B.lat,qn)};o.query.z===X.z&&o.query.x===X.x&&o.query.y===X.y||n.replace({query:X})}function V(W){typeof document>"u"||(document.title=W?`${W} — CartoCSS`:q2)}const $=e.ref(""),_=e.ref([]),w=e.ref(!1),S=e.ref(!1),A=e.ref(""),R=e.ref(0),Z=e.ref(!1),I=e.ref(1),K=e.ref(!0),q=e.ref(!1),ne=e.ref(null),Y=e.computed(()=>`cartocss-layer-${h.value}`),D=e.computed(()=>`${Math.round(I.value*100)}%`),v=e.computed(()=>`cartocss-extent-${h.value}`),F=e.computed(()=>`cartocss-extent-draft-${h.value}`),N=e.computed(()=>{var le;const W=(le=A.value)==null?void 0:le.trim();if(!W)return"";const B=W.includes("?")?"&":"?",M=`${W}${B}nottl=1`,X=R.value;return X?`${W}${B}ts=${X}&nocache=1`:M}),E=e.ref(""),T=e.ref(""),z=e.computed(()=>{var de;const W=(de=u.value)==null?void 0:de.bounds;if(!Array.isArray(W)||W.length<4)return null;const[B,M,X,le]=W;return[B,M,X,le].some(be=>typeof be!="number"||Number.isNaN(be))?null:[(B+X)/2,(M+le)/2]}),Q=e.computed(()=>{var de;const W=(de=u.value)==null?void 0:de.bounds;if(!Array.isArray(W)||W.length<4)return null;const[B,M,X,le]=W;return[B,M,X,le].some(be=>typeof be!="number"||Number.isNaN(be))?null:[B,M,X,le]}),se=e.computed(()=>{const W=u.value;return W?[W.description,W.group_id?`Група: ${W.group_id}`:null,W.source_path?`Шлях: ${W.source_path}`:null,W.is_public===!0?"Публічний":"Не публічний",W.enabled===!0?"Активний":"Неактивний"].filter(Boolean).join(", "):""}),te=e.computed(()=>{var B;const W=(B=u.value)==null?void 0:B.group_id;return W?String(W).toUpperCase():""});let oe=null,ge=!1,he=null;function ce(W){return Number(W.toFixed(H2))}function Be(W,B){const[M,X]=W,[le,de]=B;return[ce(Math.min(M,le)),ce(Math.min(X,de)),ce(Math.max(M,le)),ce(Math.max(X,de))]}function We(W){const[B,M,X,le]=W;return{type:"Polygon",coordinates:[[[B,M],[X,M],[X,le],[B,le],[B,M]]]}}function qe(W){var X,le,de;const B=(le=(X=p())==null?void 0:X.map)==null?void 0:le.value,M=(de=B==null?void 0:B.getCanvas)==null?void 0:de.call(B);M!=null&&M.style&&(M.style.cursor=W)}async function Re(W,B){if(!(!h.value||!u.value)){S.value=!0;try{const M=We(W),X=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({geom:M})});if(!X.ok)throw new Error(`Failed to save cartocss bounds: ${X.status}`);fe.notify({type:"success",title:"Bounds збережено",message:"Нові межі успішно збережено."}),await He(h.value,{bustCache:!0})}catch(M){console.error("Failed to save CartoCSS bounds",M),u.value&&(u.value={...u.value,bounds:B?[...B]:null}),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти Bounds"})}finally{S.value=!1}}}function Ge(W){var M,X,le;const B=(X=(M=p())==null?void 0:M.map)==null?void 0:X.value;if((le=B==null?void 0:B.dragPan)!=null&&le.enable&&B.dragPan.enable(),(W==null?void 0:W.length)===4&&u.value){const de=Array.isArray(u.value.bounds)?[...u.value.bounds]:null;u.value={...u.value,bounds:[...W]},Re(W,de)}oe=null,ge=!1,ne.value=null,q.value=!1,qe("")}function Ke(){Ge(null)}function wt(){var de,be;const W=(be=(de=p())==null?void 0:de.map)==null?void 0:be.value;if(!W)return;const B=P=>{var H,ae,ye;if(!q.value||((H=P==null?void 0:P.originalEvent)==null?void 0:H.button)!=null&&P.originalEvent.button!==0)return;const O=P==null?void 0:P.lngLat;O&&(oe=[O.lng,O.lat],ge=!0,ne.value=[O.lng,O.lat,O.lng,O.lat],(ye=(ae=W.dragPan)==null?void 0:ae.disable)==null||ye.call(ae))},M=P=>{if(!q.value||!ge||!oe)return;const O=P==null?void 0:P.lngLat;O&&(ne.value=Be(oe,[O.lng,O.lat]))},X=P=>{if(!q.value||!ge||!oe)return;const O=P==null?void 0:P.lngLat;if(!O){Ke();return}const H=Be(oe,[O.lng,O.lat]),[ae,ye,Ne,Le]=H;if(!(Math.abs(Ne-ae)>0&&Math.abs(Le-ye)>0)){fe.notify({type:"warning",title:"Bounds не змінено",message:"Потрібно протягнути прямокутник з ненульовою площею."}),Ke();return}Ge(H)},le=P=>{q.value&&P.key==="Escape"&&(P.preventDefault(),Ke())};W.on("mousedown",B),W.on("mousemove",M),W.on("mouseup",X),window.addEventListener("keydown",le),he=()=>{W.off("mousedown",B),W.off("mousemove",M),W.off("mouseup",X),window.removeEventListener("keydown",le)}}async function G(){var M;const W=p();!(W!=null&&W.ready)||(await W.ready(),!((M=W.map)==null?void 0:M.value))||(he||wt(),q.value=!0,ge=!1,oe=null,ne.value=null,qe("crosshair"),fe.notify({type:"info",title:"Редагування Bounds",message:"Протягніть прямокутник на карті, щоб задати нові межі."}))}e.watch(h,W=>{W&&He(W)},{immediate:!0}),e.watch(()=>{var W;return(W=r.value)==null?void 0:W.name},W=>V(W),{immediate:!0});async function ee(){var X;const W=p();if(!(W!=null&&W.ready))return;await W.ready(),b();const B=(X=W.map)==null?void 0:X.value;if(!B)return;const M=()=>k();B.on("moveend",M),B.on("zoomend",M),y=()=>{B.off("moveend",M),B.off("zoomend",M)}}e.watch(()=>[o.query.z,o.query.x,o.query.y],()=>{b()}),e.onMounted(()=>{ee()}),e.onBeforeUnmount(()=>{y==null||y(),y=null,he==null||he(),he=null,qe("")}),e.watch(()=>o.query.tab,W=>{W&&g.value.some(B=>B.key===W)&&s.value!==W&&(s.value=W)}),e.watch(g,W=>{W.length&&!W.some(B=>B.key===s.value)&&(s.value=W[0].key)},{immediate:!0}),e.watch(s,W=>{o.query.tab!==W&&g.value.some(B=>B.key===W)&&n.replace({query:{...o.query,tab:W}})}),e.watch(()=>u.value,W=>{const B=W==null?void 0:W.card_html;E.value=B,T.value=W==null?void 0:W.card_table},{immediate:!0});function xe(){h.value&&He(h.value,{bustCache:!0})}async function Pe(W,B){if(h.value){S.value=!0;try{const M=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(W)});if(!M.ok)throw new Error(`Failed to save cartocss: ${M.status}`);fe.notify({type:"success",title:"Збережено",message:B}),await He(h.value,{bustCache:!0})}catch(M){console.error("Failed to save CartoCSS",M),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти CartoCSS"})}finally{S.value=!1}}}function Te(W){if(!W)return null;if(typeof W=="string")try{return JSON.parse(W)}catch(B){return console.warn("Failed to parse CartoCSS config",B),null}return typeof W=="object"?W:null}function ke(W){const B=Array.isArray(W)?W:W==null?void 0:W.datasets;return Array.isArray(B)?B.map((M,X)=>({table:(M==null?void 0:M.table)||(M==null?void 0:M.id)||`dataset_${X+1}`,query:(M==null?void 0:M.query)||"",srid:(M==null?void 0:M.srid)||"",gcol:(M==null?void 0:M.gcol)||"",key:(M==null?void 0:M.key)||(M==null?void 0:M.label)||"Без підпису",active:typeof(M==null?void 0:M.active)=="boolean"?M.active:!0,minzoom:typeof(M==null?void 0:M.zoom)>"u"?"":String(M.zoom),maxzoom:typeof(M==null?void 0:M.maxzoom)>"u"?"":String(M.maxzoom),columns:(M==null?void 0:M.columns)||"",proj4text:(M==null?void 0:M.proj4text)||""})):[]}async function He(W,B){w.value=!0;try{const M=await fetch(`/api/gis-css/${W}`);if(!M.ok)throw new Error(`Failed to load cartocss: ${M.status}`);const X=await M.json(),le=(X==null?void 0:X.message)||X||{};u.value=le,r.value={id:le.cartocss_key||W,name:le.name||r.value.name,description:le.description||r.value.description},$.value=typeof le.style=="string"?le.style:"";const de=Te(le.config??[]);_.value=ke(de);const be=typeof le.url=="string"?le.url:"";A.value=be,Z.value=!!(be&&le.enabled!==!1),R.value=B!=null&&B.bustCache?Date.now():0}catch(M){console.error("Failed to fetch CartoCSS",M),Z.value=!1,A.value="",R.value=0,u.value=null}finally{w.value=!1}}async function ve(){await Pe({style:$.value||"",config:_.value},"CartoCSS оновлено")}async function lt(W){const B=await fetch(`/api/gis-css/${h.value}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(W)});if(!B.ok)throw new Error(`Failed to save cartocss: ${B.status}`);fe.notify({type:"success",title:"Збережено",message:"Картка CartoCSS оновлена"})}return(W,B)=>(e.openBlock(),e.createElementBlock("div",u2,[e.createElementVNode("div",m2,[e.createElementVNode("div",p2,[e.createElementVNode("div",f2,[e.createElementVNode("div",g2,[e.createElementVNode("div",y2,[e.createElementVNode("div",h2,[e.createElementVNode("button",{type:"button",class:"hover:text-gray-700 cursor-pointer transition-colors",onClick:B[0]||(B[0]=M=>e.unref(n).push("/gis.cartocss"))}," CartoCSS "),B[6]||(B[6]=e.createElementVNode("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-chevron-right w-4 h-4 mx-1"},[e.createElementVNode("path",{d:"m9 18 6-6-6-6"})],-1)),e.createElementVNode("span",b2,e.toDisplayString(r.value.name||"CartoCSS"),1)]),e.createElementVNode("div",x2,[e.createElementVNode("div",k2,[e.createElementVNode("div",w2,[e.createElementVNode("h1",_2,e.toDisplayString(r.value.name||"CartoCSS"),1),te.value?(e.openBlock(),e.createElementBlock("div",E2,[e.createElementVNode("span",C2,e.toDisplayString(te.value),1)])):e.createCommentVNode("",!0)]),se.value?(e.openBlock(),e.createElementBlock("p",{key:0,class:"text-xs text-gray-500 truncate",title:se.value},e.toDisplayString(se.value),9,N2)):e.createCommentVNode("",!0)])])]),e.createVNode(So,{class:"flex-shrink-0","entity-id":h.value,"entity-info":r.value,"form-endpoint":M=>`/api/form/gis.cartocss.table/${M}`,"save-endpoint":M=>`/api/gis-css/${M}`,"entity-label":"CartoCSS","save-method":"post",onSaved:xe},null,8,["entity-id","entity-info","form-endpoint","save-endpoint"])])])]),e.createElementVNode("div",V2,[e.createElementVNode("div",B2,[e.createVNode(Bn,{ref_key:"mapViewRef",ref:l},{default:e.withCtx(()=>{var M,X;return[e.createElementVNode("div",$2,[e.createElementVNode("div",S2,[e.createElementVNode("div",v2,[B[7]||(B[7]=e.createElementVNode("span",null,"Прозорість:",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":B[1]||(B[1]=le=>I.value=le),type:"range",min:"0",max:"1",step:"0.01",class:"h-1 w-28 cursor-pointer appearance-none rounded-full bg-slate-300 focus:outline-none",style:{"accent-color":"#3b82f6"}},null,512),[[e.vModelText,I.value,void 0,{number:!0}]]),e.createElementVNode("span",null,e.toDisplayString(D.value),1)])]),e.createElementVNode("div",L2,[e.createElementVNode("label",A2,[e.createElementVNode("input",{type:"checkbox",class:"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-200",checked:K.value,onChange:B[2]||(B[2]=le=>K.value=le.target.checked)},null,40,T2),B[8]||(B[8]=e.createElementVNode("span",null,"Межі css",-1))])])]),e.createElementVNode("div",M2,[e.createVNode(Wt)]),e.createElementVNode("div",F2,[e.createVNode(It),z.value?(e.openBlock(),e.createBlock(It,{key:0,targetCenter:z.value,targetLabel:"Центр даних",targetAriaLabel:"Перейти до центру даних"},null,8,["targetCenter"])):e.createCommentVNode("",!0)]),q.value?(e.openBlock(),e.createElementBlock("div",D2," Потягніть на карті, щоб намалювати нові Bounds. Esc скасовує редагування. ")):e.createCommentVNode("",!0),N.value?(e.openBlock(),e.createBlock(c2,{key:1,"layer-id":Y.value,"tile-url":N.value,active:Z.value,opacity:I.value,title:r.value.name,owner:h.value},null,8,["layer-id","tile-url","active","opacity","title","owner"])):e.createCommentVNode("",!0),e.createVNode(On,{extent:K.value?Q.value:null,"layer-id":v.value},null,8,["extent","layer-id"]),e.createVNode(On,{extent:ne.value,"layer-id":F.value,"line-color":"#0ea5e9","line-width":3},null,8,["extent","layer-id"]),e.createVNode(d2,{"cartocss-id":h.value,bounds:((M=u.value)==null?void 0:M.bounds)??null,active:Z.value&&!q.value,"info-enabled":(X=u.value)==null?void 0:X.info},null,8,["cartocss-id","bounds","active","info-enabled"]),e.createVNode(io,{"map-id":h.value},null,8,["map-id"])]}),_:1},512)])]),u.value?(e.openBlock(),e.createBlock(Vo,{key:0,open:c.value,onToggle:B[3]||(B[3]=M=>c.value=!c.value)},null,8,["open"])):e.createCommentVNode("",!0)]),u.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:e.normalizeClass(["bg-white border-l border-gray-100 flex flex-col overflow-hidden shadow-lg flex-shrink-0 transition-[width] duration-100 ease-in-out",c.value?"w-[650px]":"w-0"])},[e.createElementVNode("div",z2,[g.value.length>1?(e.openBlock(),e.createElementBlock("div",I2,[e.createElementVNode("div",{class:"items-center justify-center text-muted-foreground grid w-full h-12 p-1 bg-gray-50 rounded-xl shadow-sm",style:e.normalizeStyle({gridTemplateColumns:`repeat(${g.value.length}, minmax(0, 1fr))`})},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value,M=>(e.openBlock(),e.createElementBlock("button",{key:M.key,type:"button",role:"tab","aria-selected":s.value===M.key,class:e.normalizeClass(["whitespace-nowrap flex flex-col items-center justify-center gap-0.5 py-1 px-1 text-[9px] font-medium transition-all duration-300 hover:bg-white/70 rounded-lg group",s.value===M.key?"bg-white shadow-sm text-gray-700":""]),onClick:X=>s.value=M.key},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(M.icon),{class:"h-3.5 w-3.5 mb-0.5"})),e.createElementVNode("span",j2,e.toDisplayString(M.label),1)],10,P2))),128))],4)])):e.createCommentVNode("",!0),e.createElementVNode("div",R2,[w.value?(e.openBlock(),e.createElementBlock("div",O2," Завантаження стилю… ")):(e.openBlock(),e.createElementBlock(e.Fragment,{key:1},[s.value==="css"?(e.openBlock(),e.createBlock(Kw,{key:0,modelValue:$.value,"onUpdate:modelValue":B[4]||(B[4]=M=>$.value=M),class:"flex-1 min-h-0",onSave:ve},null,8,["modelValue"])):s.value==="data"?(e.openBlock(),e.createBlock(l2,{key:1,modelValue:_.value,"onUpdate:modelValue":B[5]||(B[5]=M=>_.value=M),class:"flex-1 min-h-0 flex flex-col",onSave:ve},null,8,["modelValue"])):s.value==="card"?(e.openBlock(),e.createBlock(i2,{key:2,card:E.value,table:T.value,class:"flex-1 min-h-0",onSave:lt},null,8,["card","table"])):s.value==="metadata"?(e.openBlock(),e.createBlock($o,{key:3,data:u.value,"entity-id":h.value,"entity-type":"css",onSaved:xe,onEditCssBounds:G},null,8,["data","entity-id"])):e.createCommentVNode("",!0)],64))])])],2)):e.createCommentVNode("",!0)]))}})},Symbol.toStringTag,{value:"Module"})),Y2={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},Z2=e.defineComponent({__name:"GeneralSettings",props:{schema:{},modelValue:{},loading:{type:Boolean},form:{}},emits:["update:modelValue","update:form"],setup(t,{emit:n}){const o=e.defineAsyncComponent(()=>import("@opengis/form")),l=t,a=n,i=e.computed({get:()=>l.modelValue,set:c=>a("update:modelValue",c)}),s=e.computed({get:()=>l.form,set:c=>a("update:form",c)});return(c,u)=>(e.openBlock(),e.createElementBlock("section",Y2,[u[2]||(u[2]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"}," Основна інформація ",-1)),t.loading?e.createCommentVNode("",!0):(e.openBlock(),e.createBlock(e.unref(o),{key:0,schema:t.schema,values:i.value,"onUpdate:values":u[0]||(u[0]=g=>i.value=g),form:s.value,"onUpdate:form":u[1]||(u[1]=g=>s.value=g)},null,8,["schema","values","form"]))]))}}),G2={class:"rounded-lg border border-gray-200 bg-[rgba(252,252,252,0.8)] p-6"},K2=e.defineComponent({__name:"LayerSettings",props:{layerIDs:{},options:{}},emits:["update:layerIDs"],setup(t,{emit:n}){const o=t,l=n,a=e.computed({get:()=>o.layerIDs,set:i=>l("update:layerIDs",i)});return(i,s)=>(e.openBlock(),e.createElementBlock("section",G2,[s[1]||(s[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800 mb-4"},"Шари",-1)),s[2]||(s[2]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-2"},"Доступні шари",-1)),e.createVNode(e.unref(Do.VsInputArraySelect),{data:"layer_list",api:"/api/suggest/layer_list",modelValue:a.value,"onUpdate:modelValue":s[0]||(s[0]=c=>a.value=c),placeholder:"Шари"},null,8,["modelValue"])]))}}),X2={class:"w-full"},Q2=e.defineComponent({__name:"MapPreview",props:{id:{}},setup(t){return(n,o)=>(e.openBlock(),e.createElementBlock("div",X2,[e.createVNode(Tn,{class:"w-full h-[calc(100vh-200px)]",height:"h-[calc(100vh-200px)]",id:t.id},null,8,["id"])]))}}),J2={class:"bg-white rounded-lg shadow-xl w-full max-w-4xl flex flex-col h-[80vh] m-4"},e_={class:"flex items-center justify-between px-6 py-4 border-b border-gray-200"},t_={key:0,class:"absolute top-0 left-0 right-0 bg-red-100 text-red-700 text-sm px-4 py-2 z-10 border-b border-red-200"},n_={class:"flex-1 overflow-hidden relative bg-[#fffffe]"},o_={class:"px-6 py-4 border-t border-gray-200 flex justify-end gap-3"},r_=["disabled"],l_=e.defineComponent({__name:"ConfigEditor",props:{modelValue:{}},emits:["update:modelValue","save"],setup(t,{emit:n}){const o=t,l=n,a=e.ref(""),i=e.ref(null);e.watch(()=>o.modelValue,u=>{if(u){try{a.value=JSON.stringify(u,null,2)}catch{a.value="{}"}i.value=null}},{immediate:!0}),e.watch(a,u=>{if(!u.trim()){i.value=null;return}try{JSON.parse(u),i.value=null}catch(g){i.value=g.message}}),e.watch(()=>o.modelValue,()=>{setTimeout(()=>{const{monaco:u}=window;if(u&&u.editor){const g=u.editor.getEditors();g.length>0&&g[g.length-1].updateOptions({wordWrap:"on"})}},300)},{immediate:!0});function s(){l("update:modelValue",null),a.value="",i.value=null}function c(){if(!i.value)try{const u=JSON.parse(a.value);l("save",u),s()}catch(u){console.error("Failed to parse JSON",u)}}return(u,g)=>t.modelValue!==null?(e.openBlock(),e.createElementBlock("div",{key:0,class:"fixed inset-0 flex items-center justify-center bg-black/50 backdrop-blur-sm",onClick:e.withModifiers(s,["self"])},[e.createElementVNode("div",J2,[e.createElementVNode("div",e_,[g[1]||(g[1]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-800"}," Редагування конфігурації (JSON) ",-1)),e.createElementVNode("button",{onClick:s,class:"text-gray-500 hover:text-gray-700 transition-colors"},[e.createVNode(e.unref(ie.X),{size:20})])]),i.value?(e.openBlock(),e.createElementBlock("div",t_," Помилка JSON: "+e.toDisplayString(i.value),1)):e.createCommentVNode("",!0),e.createElementVNode("div",n_,[e.createVNode(kn,{modelValue:a.value,"onUpdate:modelValue":g[0]||(g[0]=h=>a.value=h),language:"json",theme:"vs-light",class:"w-full h-full"},null,8,["modelValue"])]),e.createElementVNode("div",o_,[e.createElementVNode("button",{onClick:s,class:"px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50 transition-colors"}," Скасувати "),e.createElementVNode("button",{onClick:c,disabled:!!i.value,class:"px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed"}," Зберегти ",8,r_)])])])):e.createCommentVNode("",!0)}}),a_={key:0,class:"text-center py-8 text-gray-500 border rounded-lg bg-[rgba(252,252,252,0.8)]"},s_={key:1,class:"rounded-lg border border-gray-200 overflow-hidden"},i_={class:"w-full text-sm"},c_={class:"divide-y divide-gray-200"},d_={class:"px-4 py-3"},u_=["onUpdate:modelValue","onChange"],m_=["value"],p_={class:"px-4 py-3"},f_=["onUpdate:modelValue","onChange"],g_=["value"],y_={class:"px-4 py-3 text-center"},h_=["checked","onChange"],b_={class:"px-4 py-3"},x_={key:0,class:"flex items-center gap-2"},k_=["onClick"],w_=["onClick"],__={key:1},E_=["onClick"],C_={class:"px-4 py-3 text-right"},N_=["onClick"],V_=e.defineComponent({__name:"WidgetSettings",props:{modelValue:{}},emits:["update:modelValue"],setup(t,{emit:n}){const o=t,l=n,a=["catalog","legend","basemaps","info","layers","dataset","filters","search"],i=["top-left","top-right","bottom-left","bottom-right"],s=e.ref(null),c=e.ref(-1),u=e.computed(()=>o.modelValue||[]);function g(){const p=[...u.value,{type:"info",position:"top-left",visible:!0,config:{}}];l("update:modelValue",p)}function h(p){fe.confirm({title:"Видалити віджет?",message:"Ви впевнені, що хочете видалити цей віджет?",type:"warning",onConfirm:()=>{const b=u.value.filter((k,V)=>V!==p);l("update:modelValue",b)}})}function r(p,b,k){const V=[...u.value];V[p]={...V[p],[b]:k},l("update:modelValue",V)}function y(p){return!!p&&Object.keys(p).length>0}function d(p,b){c.value=p,s.value=b||{}}function m(p){d(p,{})}function x(p){fe.confirm({title:"Видалити конфігурацію?",message:"Ви впевнені, що хочете видалити конфігурацію цього віджета?",type:"warning",onConfirm:()=>{r(p,"config",void 0)}})}function f(p){c.value>-1&&r(c.value,"config",p),s.value=null,c.value=-1}return(p,b)=>{var k;return e.openBlock(),e.createElementBlock("div",null,[e.createElementVNode("div",{class:"flex items-center justify-between mb-4"},[b[1]||(b[1]=e.createElementVNode("h2",{class:"text-lg font-semibold text-gray-800"},"Віджети",-1)),e.createElementVNode("button",{onClick:g,class:"px-3 py-1.5 text-sm bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors"}," + Додати віджет ")]),(k=u.value)!=null&&k.length?(e.openBlock(),e.createElementBlock("div",s_,[e.createElementVNode("table",i_,[b[2]||(b[2]=e.createElementVNode("thead",{class:"bg-[rgba(252,252,252,0.8)] border-b border-gray-200"},[e.createElementVNode("tr",null,[e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700 w-1/4"},"Тип"),e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700 w-1/4"},"Розташування"),e.createElementVNode("th",{class:"px-4 py-3 text-center font-medium text-gray-700 w-24"},"Видимість"),e.createElementVNode("th",{class:"px-4 py-3 text-left font-medium text-gray-700"},"Конфігурація"),e.createElementVNode("th",{class:"px-4 py-3 text-right font-medium text-gray-700 w-24"},"Дії")])],-1)),e.createElementVNode("tbody",c_,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(u.value,(V,$)=>(e.openBlock(),e.createElementBlock("tr",{key:$,class:"hover:bg-gray-50"},[e.createElementVNode("td",d_,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":_=>V.type=_,onChange:_=>r($,"type",V.type),class:"w-full px-2 py-1.5 bg-white border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-700"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(a,_=>e.createElementVNode("option",{key:_,value:_},e.toDisplayString(_),9,m_)),64))],40,u_),[[e.vModelSelect,V.type]])]),e.createElementVNode("td",p_,[e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":_=>V.position=_,onChange:_=>r($,"position",V.position),class:"w-full px-2 py-1.5 bg-white border border-gray-300 rounded focus:outline-none focus:ring-1 focus:ring-blue-500 text-gray-700"},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(i,_=>e.createElementVNode("option",{key:_,value:_},e.toDisplayString(_),9,g_)),64))],40,f_),[[e.vModelSelect,V.position]])]),e.createElementVNode("td",y_,[e.createElementVNode("input",{type:"checkbox",checked:V.visible!==!1,onChange:_=>r($,"visible",_.target.checked),class:"w-4 h-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500"},null,40,h_)]),e.createElementVNode("td",b_,[y(V.config)?(e.openBlock(),e.createElementBlock("div",x_,[e.createElementVNode("button",{onClick:_=>d($,V.config),class:"p-1 text-blue-600 hover:text-blue-800 hover:bg-blue-50 rounded transition-colors",title:"Редагувати конфігурацію"},[e.createVNode(e.unref(ie.Pen),{size:16})],8,k_),e.createElementVNode("button",{onClick:_=>x($),class:"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors",title:"Видалити конфігурацію"},[e.createVNode(e.unref(ie.X),{size:16})],8,w_)])):(e.openBlock(),e.createElementBlock("div",__,[e.createElementVNode("button",{onClick:_=>m($),class:"p-1 text-green-600 hover:text-green-800 hover:bg-green-50 rounded transition-colors",title:"Додати конфігурацію"},[e.createVNode(e.unref(ie.Plus),{size:16})],8,E_)]))]),e.createElementVNode("td",C_,[e.createElementVNode("button",{onClick:_=>h($),class:"p-1 text-gray-400 hover:text-red-500 transition-colors",title:"Видалити віджет"},[e.createVNode(e.unref(ie.Trash2),{size:16})],8,N_)])]))),128))])])])):(e.openBlock(),e.createElementBlock("div",a_," Немає віджетів. Додайте перший віджет. ")),e.createVNode(l_,{teleport:"#modal",modelValue:s.value,"onUpdate:modelValue":b[0]||(b[0]=V=>s.value=V),onSave:f},null,8,["modelValue"])])}}}),B_={class:"relative h-full flex flex-col flex-1 min-h-0 overflow-hidden mx-auto w-full"},$_={class:"mx-1"},S_={class:"text-gray-900 font-semibold"},v_=["disabled"],L_={key:0,class:"text-center py-12 mt-6 px-[24px]"},A_={key:1,class:"px-[24px] overflow-y-auto"},T_={class:"space-y-6"},M_={class:"space-y-6"},F_={class:"space-y-6"},D_=Object.freeze(Object.defineProperty({__proto__:null,default:Ce(e.defineComponent({__name:"MapSettings",setup(t){const n=Fe.useRouter(),o=Fe.useRoute(),l=e.computed(()=>{var _;return((_=n.resolve("/gis.maps").meta)==null?void 0:_.title)??"Карти"}),a=e.ref(!0),i=e.ref(!1),s=e.ref({}),c=e.ref({}),u=[{name:"Загальна",id:"general"},{name:"Шари",id:"layers"},{name:"Віджети",id:"widgets"},{name:"Карта",id:"map"}],g=u.map(_=>_.id),h=_=>_?Array.isArray(_)?_[0]:_:null,r=(()=>{const _=h(o.query.tab);return _&&g.includes(_)?_:"general"})(),y=e.ref(r);e.watch(()=>o.query.tab,_=>{const w=h(_);w&&g.includes(w)&&y.value!==w&&(y.value=w)}),e.watch(y,_=>{o.query.tab!==_&&n.replace({query:{...o.query,tab:_}})});const d=e.ref({name:"",map_key:"",description:"",holder:"",image:"",keywords:[],center:null,zoom:11,widgets:[],layers:[]}),m=e.computed({get:()=>(d.value.layers||[]).map(_=>_.id||_),set:_=>{d.value.layers=_}});async function x(_){if(!_.length){c.value={};return}try{const w=new URLSearchParams({json:"1",val:Array.from(new Set(_)).join(",")}),S=await fetch(`/api/suggest/layer_list?${w.toString()}`);if(!S.ok)return;const A=await S.json(),R=(A==null?void 0:A.data)??A??[],Z=Array.isArray(R)?R:[],I={...c.value};Z.forEach(K=>{const q=K.id!=null?String(K.id):"";q&&(I[q]=K.text??K.name??q)}),c.value=I}catch(w){console.error("Failed to fetch layer labels:",w)}}const f=e.computed({get:()=>m.value.map(_=>c.value[_]??_),set:_=>{const w=Object.entries(c.value).reduce((A,[R,Z])=>(A[Z]=R,A),{}),S=_.map(A=>w[A]??null).filter(A=>A!=null);m.value=S}}),p=e.computed(()=>{const _=d.value.center;if(!Array.isArray(_)||_.length<2)return"Не задано";const[w,S]=_;return w===void 0||S===void 0||w===null||S===null||Number.isNaN(Number(w))||Number.isNaN(Number(S))?"Не задано":`Lng ${Number(w).toFixed(6)}, Lat ${Number(S).toFixed(6)}`}),b=e.computed(()=>{const _=d.value.zoom;if(_==null||_==="")return"Не задано";const w=Number(_);return Number.isNaN(w)?"Не задано":w.toFixed(2)}),k=[{name:"name",type:"text",label:"Назва",col:6,validators:["required"]},{name:"map_key",type:"text",label:"Унікальний ключ",col:6,validators:["required"]},{name:"description",type:"textarea",label:"Опис",col:12},{name:"holder",type:"text",label:"Власник/Утримувач/Відповідальний",col:6},{name:"keywords",type:"Tags",label:"Ключові слова",placeholder:"Введіть тег та натисніть Enter",col:6},{name:"center",type:"array",label:"Центр",inputType:"number",limit:2,count:2,col:6},{name:"zoom",type:"number",label:"Зум",col:6,validators:["required"]},{name:"is_public",type:"switcher",label:"Чи публічна карта?",col:6,data:"yes_no"},{name:"is_active",type:"switcher",label:"Чи активна?",col:6,data:"yes_no"},{name:"image",type:"File",label:"Фото",col:12}];async function V(){try{const w=await(await fetch(`/api/gis-map/${o.params.id}?original=1`)).json();d.value={...w,keywords:w.keywords||[],center:w.center??null,widgets:Array.isArray(w.widgets)?w.widgets:[],layers:(w.layers||[]).map(S=>S.id||S)},await x(d.value.layers??[])}catch(_){console.error("Failed to load map:",_),fe.notify({type:"error",title:"Помилка",message:"Не вдалося завантажити карту"})}finally{a.value=!1}}async function $(){var w,S;const _=(S=(w=s.value)==null?void 0:w.validate)==null?void 0:S.call(w);if(_){fe.notify({type:"warning",title:"Валідація",message:Object.entries(_).map(([A,R])=>`${A}: ${R}`).join(`
|
|
45
45
|
`)});return}i.value=!0;try{const A=JSON.parse(JSON.stringify(d.value));if(A.zoom=Number(A.zoom),Array.isArray(A.center)&&(A.center.every(I=>I==null||I===""||I===0)||A.center.length===0)&&(A.center=null),delete A.created_at,delete A.updated_at,delete A.created_by,delete A.updated_by,delete A.history,delete A.maps,!(await fetch(`/api/gis-map/${o.params.id}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(A)})).ok)throw new Error("Save failed");fe.notify({type:"success",title:"Успіх",message:"Збережено!"})}catch(A){console.error("Save error:",A),fe.notify({type:"error",title:"Помилка",message:"Не вдалося зберегти"})}finally{i.value=!1}}return e.watch(()=>{var _;return((_=d.value)==null?void 0:_.layers)??[]},_=>x(Array.isArray(_)?_.map(w=>(w==null?void 0:w.id)??w):[]),{immediate:!1}),e.onMounted(async()=>{await V()}),(_,w)=>{const S=e.resolveComponent("router-link");return e.openBlock(),e.createElementBlock("div",B_,[e.createVNode(Yt,{variant:"form",title:d.value.name||"Налаштування карти"},{breadcrumbs:e.withCtx(()=>[e.createVNode(S,{to:"/gis.maps",class:"text-gray-500 hover:text-gray-700"},{default:e.withCtx(()=>[e.createTextVNode(e.toDisplayString(l.value),1)]),_:1}),e.createElementVNode("span",$_,[e.createVNode(e.unref(ie.LucideChevronRight),{size:16,class:"shrink-0"})]),e.createElementVNode("span",S_,e.toDisplayString(d.value.name||"Налаштування карти"),1)]),description:e.withCtx(()=>[...w[6]||(w[6]=[e.createTextVNode("Редагування параметрів карти",-1)])]),actions:e.withCtx(()=>[e.createElementVNode("button",{onClick:w[0]||(w[0]=A=>e.unref(n).back()),class:"inline-flex items-center justify-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50"}," Повернутися "),e.createElementVNode("button",{onClick:$,disabled:i.value,class:"inline-flex items-center justify-center px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-md hover:bg-blue-700 disabled:opacity-50"},e.toDisplayString(i.value?"Збереження...":"Зберегти"),9,v_)]),_:1},8,["title"]),a.value?(e.openBlock(),e.createElementBlock("div",L_,[...w[7]||(w[7]=[e.createElementVNode("p",{class:"text-gray-500"},"Завантаження...",-1)])])):(e.openBlock(),e.createElementBlock("div",A_,[e.createVNode(pr,{tabs:u,activeTab:y.value,"onUpdate:activeTab":w[1]||(w[1]=A=>y.value=A)},null,8,["activeTab"]),e.withDirectives(e.createElementVNode("div",T_,[e.createVNode(Z2,{schema:k,loading:a.value,modelValue:d.value,"onUpdate:modelValue":w[2]||(w[2]=A=>d.value=A),form:s.value,"onUpdate:form":w[3]||(w[3]=A=>s.value=A)},null,8,["loading","modelValue","form"])],512),[[e.vShow,y.value==="general"]]),e.withDirectives(e.createElementVNode("div",M_,[e.createVNode(K2,{layerIDs:m.value,"onUpdate:layerIDs":w[4]||(w[4]=A=>m.value=A)},null,8,["layerIDs"])],512),[[e.vShow,y.value==="layers"]]),e.withDirectives(e.createVNode(V_,{modelValue:d.value.widgets,"onUpdate:modelValue":w[5]||(w[5]=A=>d.value.widgets=A)},null,8,["modelValue"]),[[e.vShow,y.value==="widgets"]]),e.withDirectives(e.createElementVNode("div",F_,[e.createVNode(Q2,{"center-display":p.value,"zoom-display":b.value,"layer-names":f.value,id:e.unref(o).params.id},null,8,["center-display","zoom-display","layer-names","id"])],512),[[e.vShow,y.value==="map"]])]))])}}}),[["__scopeId","data-v-df90fbac"]])},Symbol.toStringTag,{value:"Module"}));Ye.CartoCSS=Hl,Ye.Classifiers=$s,Ye.MapSettings=Ql,Ye.MapWidget=Tn,Ye.Permissions=Js,Ye.Raster=Ol,Ye.Register=Dl,Ye.Service=Pl,Ye.default=Tn,Ye.install=Of,Ye.template1=rr,Ye.template2=lr,Ye.template3=ar,Ye.template4=sr,Ye.template5=ir,Object.defineProperties(Ye,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})}));
|